1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "softbus_proxychannel_manager.h"
16 
17 #include <securec.h>
18 #include <string.h>
19 
20 #include "access_control.h"
21 #include "auth_interface.h"
22 #include "auth_manager.h"
23 #include "auth_session_fsm.h"
24 #include "bus_center_event.h"
25 #include "bus_center_info_key.h"
26 #include "bus_center_manager.h"
27 #include "common_list.h"
28 #include "data_bus_native.h"
29 #include "lnn_distributed_net_ledger.h"
30 #include "softbus_adapter_crypto.h"
31 #include "softbus_adapter_hitrace.h"
32 #include "softbus_adapter_mem.h"
33 #include "softbus_adapter_thread.h"
34 #include "softbus_conn_interface.h"
35 #include "softbus_def.h"
36 #include "softbus_feature_config.h"
37 #include "softbus_hisysevt_transreporter.h"
38 #include "softbus_proxychannel_callback.h"
39 #include "softbus_proxychannel_control.h"
40 #include "softbus_proxychannel_listener.h"
41 #include "softbus_proxychannel_message.h"
42 #include "softbus_proxychannel_session.h"
43 #include "softbus_proxychannel_transceiver.h"
44 #include "softbus_utils.h"
45 #include "trans_auth_negotiation.h"
46 #include "trans_channel_limit.h"
47 #include "trans_channel_manager.h"
48 #include "trans_event.h"
49 #include "trans_log.h"
50 #include "trans_session_manager.h"
51 
52 #define ID_OFFSET (1)
53 
54 #define PROXY_CHANNEL_CONTROL_TIMEOUT  19    // 19s
55 #define PROXY_CHANNEL_BT_IDLE_TIMEOUT  240   // 4min
56 #define PROXY_CHANNEL_IDLE_TIMEOUT     15    // 10800 = 3 hour
57 #define PROXY_CHANNEL_TCP_IDLE_TIMEOUT 43200 // tcp 24 hour
58 #define PROXY_CHANNEL_CLIENT           0
59 #define PROXY_CHANNEL_SERVER           1
60 static SoftBusList *g_proxyChannelList = NULL;
61 
62 typedef struct {
63     int32_t channelType;
64     int32_t businessType;
65     ConfigType configType;
66 } ConfigTypeMap;
67 
GetProxyChannelMgrHead(void)68 SoftBusList *GetProxyChannelMgrHead(void)
69 {
70     return g_proxyChannelList;
71 }
72 
GetProxyChannelLock(void)73 int32_t GetProxyChannelLock(void)
74 {
75     if (g_proxyChannelList == NULL) {
76         return SOFTBUS_NO_INIT;
77     }
78     if (SoftBusMutexLock(&g_proxyChannelList->lock) != SOFTBUS_OK) {
79         TRANS_LOGE(TRANS_CTRL, "lock failed");
80         return SOFTBUS_LOCK_ERR;
81     }
82     return SOFTBUS_OK;
83 }
84 
ReleaseProxyChannelLock(void)85 void ReleaseProxyChannelLock(void)
86 {
87     if (g_proxyChannelList == NULL) {
88         return;
89     }
90     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
91 }
92 
ChanIsEqual(ProxyChannelInfo * a,ProxyChannelInfo * b)93 static bool ChanIsEqual(ProxyChannelInfo *a, ProxyChannelInfo *b)
94 {
95     if ((a->myId == b->myId) &&
96         (a->peerId == b->peerId) &&
97         (strncmp(a->identity, b->identity, sizeof(a->identity)) == 0)) {
98         return true;
99     }
100     return false;
101 }
102 
ResetChanIsEqual(int8_t status,ProxyChannelInfo * a,ProxyChannelInfo * b)103 static bool ResetChanIsEqual(int8_t status, ProxyChannelInfo *a, ProxyChannelInfo *b)
104 {
105     if (status == PROXY_CHANNEL_STATUS_HANDSHAKEING) {
106         if ((a->myId == b->myId) &&
107             (strncmp(a->identity, b->identity, sizeof(a->identity)) == 0)) {
108             return true;
109         }
110     }
111 
112     if ((a->myId == b->myId) &&
113         (a->peerId == b->peerId) &&
114         (strncmp(a->identity, b->identity, sizeof(a->identity)) == 0)) {
115         return true;
116     }
117     return false;
118 }
119 
TransProxyGetAppInfoType(int16_t myId,const char * identity,AppType * appType)120 int32_t TransProxyGetAppInfoType(int16_t myId, const char *identity, AppType *appType)
121 {
122     TRANS_CHECK_AND_RETURN_RET_LOGE(
123         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "fail to lock mutex!");
124     ProxyChannelInfo *item = NULL;
125     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
126         if ((item->myId == myId) && (strcmp(item->identity, identity) == 0)) {
127             *appType = item->appInfo.appType;
128             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
129             return SOFTBUS_OK;
130         }
131     }
132     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
133     return SOFTBUS_TRANS_PROXY_ERROR_APP_TYPE;
134 }
135 
TransProxyUpdateAckInfo(ProxyChannelInfo * info)136 static int32_t TransProxyUpdateAckInfo(ProxyChannelInfo *info)
137 {
138     TRANS_CHECK_AND_RETURN_RET_LOGE((g_proxyChannelList != NULL && info != NULL), SOFTBUS_INVALID_PARAM, TRANS_CTRL,
139         "g_proxyChannelList or item is null");
140     TRANS_CHECK_AND_RETURN_RET_LOGE(
141         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
142     ProxyChannelInfo *item = NULL;
143     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
144         if ((item->myId == info->myId) && (strncmp(item->identity, info->identity, sizeof(item->identity)) == 0)) {
145             item->peerId = info->peerId;
146             item->status = PROXY_CHANNEL_STATUS_COMPLETED;
147             item->timeout = 0;
148             item->appInfo.encrypt = info->appInfo.encrypt;
149             item->appInfo.algorithm = info->appInfo.algorithm;
150             item->appInfo.crc = info->appInfo.crc;
151             item->appInfo.myData.dataConfig = info->appInfo.myData.dataConfig;
152             item->appInfo.peerHandleId = info->appInfo.peerHandleId;
153             if (memcpy_s(&(item->appInfo.peerData), sizeof(item->appInfo.peerData),
154                 &(info->appInfo.peerData), sizeof(info->appInfo.peerData)) != EOK ||
155                 memcpy_s(info, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
156                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
157                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
158                 return SOFTBUS_MEM_ERR;
159             }
160             SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)(item->channelId + ID_OFFSET));
161             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
162             return SOFTBUS_OK;
163         }
164     }
165     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
166     return SOFTBUS_TRANS_NODE_NOT_FOUND;
167 }
168 
TransRefreshProxyTimesNative(int32_t channelId)169 int32_t TransRefreshProxyTimesNative(int32_t channelId)
170 {
171     TRANS_CHECK_AND_RETURN_RET_LOGE(
172         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
173     TRANS_CHECK_AND_RETURN_RET_LOGE(
174         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
175 
176     ProxyChannelInfo *item = NULL;
177     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
178         if (item->myId == channelId) {
179             item->timeout = 0;
180             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
181             return SOFTBUS_OK;
182         }
183     }
184     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
185     return SOFTBUS_TRANS_NODE_NOT_FOUND;
186 }
187 
TransProxyAddChanItem(ProxyChannelInfo * chan)188 static int32_t TransProxyAddChanItem(ProxyChannelInfo *chan)
189 {
190     TRANS_CHECK_AND_RETURN_RET_LOGE((g_proxyChannelList != NULL && chan != NULL), SOFTBUS_INVALID_PARAM, TRANS_CTRL,
191         "trans proxy add channel param nullptr!");
192     TRANS_CHECK_AND_RETURN_RET_LOGE(
193         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
194 
195     ListAdd(&(g_proxyChannelList->list), &(chan->node));
196     g_proxyChannelList->cnt++;
197     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
198     return SOFTBUS_OK;
199 }
200 
TransProxySpecialUpdateChanInfo(ProxyChannelInfo * channelInfo)201 int32_t TransProxySpecialUpdateChanInfo(ProxyChannelInfo *channelInfo)
202 {
203     TRANS_CHECK_AND_RETURN_RET_LOGE((g_proxyChannelList != NULL && channelInfo != NULL), SOFTBUS_INVALID_PARAM,
204         TRANS_CTRL, "g_proxyChannelList or channelInfo is NULL!");
205     TRANS_CHECK_AND_RETURN_RET_LOGE(
206         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
207 
208     ProxyChannelInfo *item = NULL;
209     ProxyChannelInfo *nextNode = NULL;
210     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
211         if (item->channelId == channelInfo->channelId) {
212             if (channelInfo->reqId != -1) {
213                 item->reqId = channelInfo->reqId;
214             }
215             if (channelInfo->isServer != -1) {
216                 item->isServer = channelInfo->isServer;
217             }
218             if (channelInfo->type != CONNECT_TYPE_MAX) {
219                 item->type = channelInfo->type;
220             }
221             if (channelInfo->status != -1) {
222                 item->status = channelInfo->status;
223             }
224             if (channelInfo->status == PROXY_CHANNEL_STATUS_HANDSHAKEING) {
225                 item->connId = channelInfo->connId;
226             }
227             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
228             return SOFTBUS_OK;
229         }
230     }
231     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
232     return SOFTBUS_TRANS_NODE_NOT_FOUND;
233 }
234 
TransProxyGetChanByChanId(int32_t chanId,ProxyChannelInfo * chan)235 int32_t TransProxyGetChanByChanId(int32_t chanId, ProxyChannelInfo *chan)
236 {
237     TRANS_CHECK_AND_RETURN_RET_LOGE((g_proxyChannelList != NULL && chan != NULL), SOFTBUS_INVALID_PARAM, TRANS_CTRL,
238         "trans proxy get channel param nullptr!");
239     TRANS_CHECK_AND_RETURN_RET_LOGE(
240         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
241 
242     ProxyChannelInfo *item = NULL;
243     ProxyChannelInfo *nextNode = NULL;
244 
245     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
246         if (item->channelId == chanId) {
247             if (memcpy_s(chan, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
248                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
249                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
250                 return SOFTBUS_MEM_ERR;
251             }
252             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
253             return SOFTBUS_OK;
254         }
255     }
256     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
257     TRANS_LOGE(TRANS_CTRL, "proxy channel not found by chanId. chanId=%{public}d", chanId);
258     return SOFTBUS_TRANS_NODE_NOT_FOUND;
259 }
260 
TransProxyGetChanByReqId(int32_t reqId,ProxyChannelInfo * chan)261 int32_t TransProxyGetChanByReqId(int32_t reqId, ProxyChannelInfo *chan)
262 {
263     ProxyChannelInfo *item = NULL;
264     TRANS_CHECK_AND_RETURN_RET_LOGE(
265         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
266     TRANS_CHECK_AND_RETURN_RET_LOGE(
267         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
268 
269     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
270         if (item->reqId == reqId && item->status == PROXY_CHANNEL_STATUS_PYH_CONNECTING) {
271             *chan = *item;
272             break;
273         }
274     }
275     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
276     return SOFTBUS_OK;
277 }
278 
TransProxyDelChanByReqId(int32_t reqId,int32_t errCode)279 void TransProxyDelChanByReqId(int32_t reqId, int32_t errCode)
280 {
281     ProxyChannelInfo *item = NULL;
282     ProxyChannelInfo *nextNode = NULL;
283 
284     TRANS_CHECK_AND_RETURN_LOGE(
285         g_proxyChannelList != NULL, TRANS_CTRL, "g_proxyChannelList is null");
286     TRANS_CHECK_AND_RETURN_LOGE(
287         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_CTRL, "lock mutex fail!");
288 
289     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
290         if ((item->reqId == reqId) &&
291             (item->status == PROXY_CHANNEL_STATUS_PYH_CONNECTING)) {
292             ReleaseProxyChannelId(item->channelId);
293             ListDelete(&(item->node));
294             g_proxyChannelList->cnt--;
295             TRANS_LOGI(TRANS_CTRL, "del channelId by reqId. channelId=%{public}d", item->channelId);
296             SoftBusFree((void *)item->appInfo.fastTransData);
297             item->appInfo.fastTransData = NULL;
298             TransProxyPostOpenFailMsgToLoop(item, errCode);
299         }
300     }
301     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
302     return;
303 }
304 
TransProxyDelChanByChanId(int32_t chanlId)305 void TransProxyDelChanByChanId(int32_t chanlId)
306 {
307     ProxyChannelInfo *item = NULL;
308     ProxyChannelInfo *nextNode = NULL;
309 
310     TRANS_CHECK_AND_RETURN_LOGE(
311         g_proxyChannelList != NULL, TRANS_CTRL, "g_proxyChannelList is null");
312     TRANS_CHECK_AND_RETURN_LOGE(
313         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_CTRL, "lock mutex fail!");
314 
315     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
316         if (item->channelId == chanlId) {
317             ReleaseProxyChannelId(item->channelId);
318             ListDelete(&(item->node));
319             if (item->appInfo.fastTransData != NULL) {
320                 SoftBusFree((void *)item->appInfo.fastTransData);
321             }
322             (void)memset_s(item->appInfo.sessionKey, sizeof(item->appInfo.sessionKey), 0,
323                 sizeof(item->appInfo.sessionKey));
324             SoftBusFree(item);
325             g_proxyChannelList->cnt--;
326             break;
327         }
328     }
329     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
330     TRANS_LOGE(TRANS_CTRL, "del channelId by chanId! channelId=%{public}d", chanlId);
331     return;
332 }
333 
TransProxyChanProcessByReqId(int32_t reqId,uint32_t connId)334 void TransProxyChanProcessByReqId(int32_t reqId, uint32_t connId)
335 {
336     ProxyChannelInfo *item = NULL;
337     TRANS_CHECK_AND_RETURN_LOGE(
338         g_proxyChannelList != NULL, TRANS_CTRL, "g_proxyChannelList is null");
339     TRANS_CHECK_AND_RETURN_LOGE(
340         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_CTRL, "lock mutex fail!");
341 
342     bool isUsing = false;
343     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
344         if (item->reqId == reqId && item->status == PROXY_CHANNEL_STATUS_PYH_CONNECTING) {
345             item->status = PROXY_CHANNEL_STATUS_HANDSHAKEING;
346             item->connId = connId;
347             isUsing = true;
348             TransAddConnRefByConnId(connId, (bool)item->isServer);
349             TransProxyPostHandshakeMsgToLoop(item->channelId);
350         }
351     }
352 
353     if (!isUsing) {
354         TRANS_LOGW(TRANS_CTRL, "logical channel is already closed, connId=%{public}u", connId);
355         TransProxyCloseConnChannel(connId, false);
356     }
357     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
358 }
359 
TransProxyCloseProxyOtherRes(int32_t channelId,const ProxyChannelInfo * info)360 static void TransProxyCloseProxyOtherRes(int32_t channelId, const ProxyChannelInfo *info)
361 {
362     uint32_t connId = info->connId;
363     bool isServer = (bool)info->isServer;
364     ProxyChannelInfo *disChanInfo = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
365     if (disChanInfo != NULL) {
366         if (memcpy_s(disChanInfo, sizeof(ProxyChannelInfo), info, sizeof(ProxyChannelInfo)) != EOK) {
367             SoftBusFree(disChanInfo);
368             SoftBusFree((void *)info);
369             TRANS_LOGE(TRANS_SVC, "memcpy info to disChanInfo failed");
370             return;
371         }
372     }
373     TransProxyPostResetPeerMsgToLoop(info);
374     TransProxyPostDisConnectMsgToLoop(connId, isServer, disChanInfo);
375 }
376 
TransProxyReleaseChannelList(ListNode * proxyChannelList,int32_t errCode)377 static void TransProxyReleaseChannelList(ListNode *proxyChannelList, int32_t errCode)
378 {
379     TRANS_CHECK_AND_RETURN_LOGE(!IsListEmpty(proxyChannelList), TRANS_CTRL, "proxyChannelList is empty");
380 
381     ProxyChannelInfo *removeNode = NULL;
382     ProxyChannelInfo *nextNode = NULL;
383     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, proxyChannelList, ProxyChannelInfo, node) {
384         ListDelete(&(removeNode->node));
385         if (removeNode->status == PROXY_CHANNEL_STATUS_HANDSHAKEING ||
386             removeNode->status == PROXY_CHANNEL_STATUS_PYH_CONNECTING) {
387             TransProxyOpenProxyChannelFail(removeNode->channelId, &(removeNode->appInfo), errCode);
388         } else {
389             OnProxyChannelClosed(removeNode->channelId, &(removeNode->appInfo));
390         }
391         if (removeNode->appInfo.fastTransData != NULL) {
392             SoftBusFree((void *)removeNode->appInfo.fastTransData);
393         }
394         SoftBusFree(removeNode);
395     }
396 }
397 
TransProxyDelByConnId(uint32_t connId)398 void TransProxyDelByConnId(uint32_t connId)
399 {
400     ProxyChannelInfo *removeNode = NULL;
401     ProxyChannelInfo *nextNode = NULL;
402     ListNode proxyChannelList;
403 
404     TRANS_CHECK_AND_RETURN_LOGE(g_proxyChannelList != NULL, TRANS_CTRL, "g_proxyChannelList is null");
405     TRANS_CHECK_AND_RETURN_LOGE(
406         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_CTRL, "lock mutex fail!");
407 
408     ListInit(&proxyChannelList);
409     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
410         if (removeNode->connId == connId) {
411             ReleaseProxyChannelId(removeNode->channelId);
412             ListDelete(&(removeNode->node));
413             g_proxyChannelList->cnt--;
414             ListAdd(&proxyChannelList, &removeNode->node);
415             TRANS_LOGI(TRANS_CTRL, "trans proxy del channel by connId=%{public}d", connId);
416         }
417     }
418     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
419     TransProxyReleaseChannelList(&proxyChannelList, SOFTBUS_TRANS_PROXY_DISCONNECTED);
420 }
421 
TransProxyDelByChannelId(int32_t channelId,ProxyChannelInfo * channelInfo)422 static int32_t TransProxyDelByChannelId(int32_t channelId, ProxyChannelInfo *channelInfo)
423 {
424     ProxyChannelInfo *removeNode = NULL;
425     ProxyChannelInfo *nextNode = NULL;
426 
427     TRANS_CHECK_AND_RETURN_RET_LOGE(
428         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
429     TRANS_CHECK_AND_RETURN_RET_LOGE(
430         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
431 
432     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
433         if (removeNode->channelId == channelId) {
434             if (channelInfo != NULL) {
435                 (void)memcpy_s(channelInfo, sizeof(ProxyChannelInfo), removeNode, sizeof(ProxyChannelInfo));
436             }
437             ReleaseProxyChannelId(removeNode->channelId);
438             if (removeNode->appInfo.fastTransData != NULL) {
439                 SoftBusFree((void *)removeNode->appInfo.fastTransData);
440             }
441             ListDelete(&(removeNode->node));
442             SoftBusFree(removeNode);
443             g_proxyChannelList->cnt--;
444             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
445             TRANS_LOGI(TRANS_CTRL, "trans proxy del channel by channelId=%{public}d", channelId);
446             return SOFTBUS_OK;
447         }
448     }
449     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
450     return SOFTBUS_TRANS_NODE_NOT_FOUND;
451 }
452 
TransProxyResetChan(ProxyChannelInfo * chanInfo)453 static int32_t TransProxyResetChan(ProxyChannelInfo *chanInfo)
454 {
455     ProxyChannelInfo *removeNode = NULL;
456     ProxyChannelInfo *nextNode = NULL;
457 
458     TRANS_CHECK_AND_RETURN_RET_LOGE(
459         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
460     TRANS_CHECK_AND_RETURN_RET_LOGE(
461         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
462 
463     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
464         if (ResetChanIsEqual(removeNode->status, removeNode, chanInfo)) {
465             if (memcpy_s(chanInfo, sizeof(ProxyChannelInfo), removeNode, sizeof(ProxyChannelInfo)) != EOK) {
466                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
467                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
468                 return SOFTBUS_MEM_ERR;
469             }
470             ReleaseProxyChannelId(removeNode->channelId);
471             if (removeNode->appInfo.fastTransData != NULL) {
472                 SoftBusFree((void *)removeNode->appInfo.fastTransData);
473             }
474             ListDelete(&(removeNode->node));
475             SoftBusFree(removeNode);
476             g_proxyChannelList->cnt--;
477             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
478             TRANS_LOGI(TRANS_CTRL, "trans proxy reset channelId=%{public}d", chanInfo->channelId);
479             return SOFTBUS_OK;
480         }
481     }
482     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
483 
484     return SOFTBUS_TRANS_NODE_NOT_FOUND;
485 }
486 
TransProxyGetRecvMsgChanInfo(int16_t myId,int16_t peerId,ProxyChannelInfo * chanInfo)487 static int32_t TransProxyGetRecvMsgChanInfo(int16_t myId, int16_t peerId, ProxyChannelInfo *chanInfo)
488 {
489     ProxyChannelInfo *item = NULL;
490 
491     TRANS_CHECK_AND_RETURN_RET_LOGE(
492         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
493     TRANS_CHECK_AND_RETURN_RET_LOGE(
494         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
495 
496     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
497         if ((item->myId == myId) && (item->peerId == peerId)) {
498             if (item->status == PROXY_CHANNEL_STATUS_COMPLETED) {
499                 item->timeout = 0;
500             }
501             if (memcpy_s(chanInfo, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
502                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
503                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
504                 return SOFTBUS_MEM_ERR;
505             }
506             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
507             return SOFTBUS_OK;
508         }
509     }
510     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
511     return SOFTBUS_TRANS_NODE_NOT_FOUND;
512 }
513 
TransProxyKeepAliveChan(ProxyChannelInfo * chanInfo)514 static int32_t TransProxyKeepAliveChan(ProxyChannelInfo *chanInfo)
515 {
516     ProxyChannelInfo *item = NULL;
517 
518     TRANS_CHECK_AND_RETURN_RET_LOGE(
519         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
520     TRANS_CHECK_AND_RETURN_RET_LOGE(
521         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
522 
523     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
524         if (ChanIsEqual(item, chanInfo)) {
525             if (item->status == PROXY_CHANNEL_STATUS_KEEPLIVEING || item->status == PROXY_CHANNEL_STATUS_COMPLETED) {
526                 item->timeout = 0;
527                 item->status = PROXY_CHANNEL_STATUS_COMPLETED;
528             }
529             if (memcpy_s(chanInfo, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
530                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
531                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
532                 return SOFTBUS_MEM_ERR;
533             }
534             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
535             return SOFTBUS_OK;
536         }
537     }
538     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
539     return SOFTBUS_TRANS_NODE_NOT_FOUND;
540 }
541 
TransProxyGetSendMsgChanInfo(int32_t channelId,ProxyChannelInfo * chanInfo)542 int32_t TransProxyGetSendMsgChanInfo(int32_t channelId, ProxyChannelInfo *chanInfo)
543 {
544     ProxyChannelInfo *item = NULL;
545 
546     TRANS_CHECK_AND_RETURN_RET_LOGE(
547         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
548     TRANS_CHECK_AND_RETURN_RET_LOGE(
549         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
550 
551     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
552         if (item->channelId == channelId) {
553             if (item->status == PROXY_CHANNEL_STATUS_COMPLETED) {
554                 item->timeout = 0;
555             }
556             if (memcpy_s(chanInfo, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
557                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
558                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
559                 return SOFTBUS_MEM_ERR;
560             }
561             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
562             return SOFTBUS_OK;
563         }
564     }
565     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
566     return SOFTBUS_TRANS_NODE_NOT_FOUND;
567 }
568 
TransProxyGetNewChanSeq(int32_t channelId)569 int32_t TransProxyGetNewChanSeq(int32_t channelId)
570 {
571     ProxyChannelInfo *item = NULL;
572     int32_t seq = 0;
573 
574     TRANS_CHECK_AND_RETURN_RET_LOGE(
575         g_proxyChannelList != NULL, seq, TRANS_CTRL, "g_proxyChannelList is null");
576     TRANS_CHECK_AND_RETURN_RET_LOGE(
577         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, seq, TRANS_CTRL, "lock mutex fail!");
578 
579     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
580         if (item->channelId == channelId) {
581             seq = item->seq;
582             item->seq++;
583             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
584             return seq;
585         }
586     }
587     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
588     return seq;
589 }
590 
TransProxyGetAuthId(int32_t channelId,AuthHandle * authHandle)591 int32_t TransProxyGetAuthId(int32_t channelId, AuthHandle *authHandle)
592 {
593     TRANS_CHECK_AND_RETURN_RET_LOGE(
594         authHandle != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "authHandle is null");
595     ProxyChannelInfo *item = NULL;
596     TRANS_CHECK_AND_RETURN_RET_LOGE(
597         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
598     TRANS_CHECK_AND_RETURN_RET_LOGE(
599         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
600     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
601         if (item->channelId == channelId) {
602             *authHandle = item->authHandle;
603             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
604             return SOFTBUS_OK;
605         }
606     }
607     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
608     return SOFTBUS_TRANS_NODE_NOT_FOUND;
609 }
610 
TransProxyGetSessionKeyByChanId(int32_t channelId,char * sessionKey,uint32_t sessionKeySize)611 int32_t TransProxyGetSessionKeyByChanId(int32_t channelId, char *sessionKey, uint32_t sessionKeySize)
612 {
613     TRANS_CHECK_AND_RETURN_RET_LOGE(
614         sessionKey != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "sessionKey is null");
615     ProxyChannelInfo *item = NULL;
616     TRANS_CHECK_AND_RETURN_RET_LOGE(
617         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
618     TRANS_CHECK_AND_RETURN_RET_LOGE(
619         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
620     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
621         if (item->channelId == channelId) {
622             if (item->status == PROXY_CHANNEL_STATUS_COMPLETED) {
623                 item->timeout = 0;
624             }
625             if (memcpy_s(sessionKey, sessionKeySize, item->appInfo.sessionKey,
626                 sizeof(item->appInfo.sessionKey)) != EOK) {
627                 TRANS_LOGE(TRANS_CTRL, "memcpy_s fail!");
628                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
629                 return SOFTBUS_MEM_ERR;
630             }
631             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
632             return SOFTBUS_OK;
633         }
634     }
635     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
636     TRANS_LOGE(TRANS_CTRL, "not found ChannelInfo by channelId=%{public}d", channelId);
637     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
638 }
639 
TransProxyProcessErrMsg(ProxyChannelInfo * info,int32_t errCode)640 static inline void TransProxyProcessErrMsg(ProxyChannelInfo *info, int32_t errCode)
641 {
642     TRANS_LOGW(TRANS_CTRL, "TransProxyProcessErrMsg errCode=%{public}d", errCode);
643     TRANS_CHECK_AND_RETURN_LOGE(
644         TransProxyGetChanByChanId(info->myId, info) == SOFTBUS_OK, TRANS_CTRL, "TransProxyGetChanByChanId fail");
645     if ((info->appInfo.appType == APP_TYPE_NORMAL) || (info->appInfo.appType == APP_TYPE_AUTH)) {
646         TransProxyDelChanByChanId(info->channelId);
647         (void)TransProxyOpenProxyChannelFail(info->channelId, &(info->appInfo), errCode);
648     }
649 }
650 
TransProxyGetAppInfo(int16_t myId,AppInfo * appInfo)651 static int32_t TransProxyGetAppInfo(int16_t myId, AppInfo *appInfo)
652 {
653     ProxyChannelInfo *item = NULL;
654 
655     TRANS_CHECK_AND_RETURN_RET_LOGE(
656         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
657     TRANS_CHECK_AND_RETURN_RET_LOGE(
658         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
659 
660     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
661         if (item->myId == myId) {
662             if (memcpy_s(appInfo, sizeof(AppInfo), &(item->appInfo), sizeof(item->appInfo)) != EOK) {
663                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
664                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
665                 return SOFTBUS_MEM_ERR;
666             }
667             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
668             return SOFTBUS_OK;
669         }
670     }
671     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
672     return SOFTBUS_TRANS_NODE_NOT_FOUND;
673 }
674 
TransProxyGetReqIdAndStatus(int32_t myId,int32_t * reqId,int8_t * status)675 static int32_t TransProxyGetReqIdAndStatus(int32_t myId, int32_t *reqId, int8_t *status)
676 {
677     TRANS_CHECK_AND_RETURN_RET_LOGE(
678         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "proxy channel list not init");
679 
680     int32_t ret = SoftBusMutexLock(&g_proxyChannelList->lock);
681     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
682     ProxyChannelInfo *item = NULL;
683     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
684         if (item->myId == myId) {
685             *reqId = item->reqId;
686             *status = item->status;
687             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
688             return SOFTBUS_OK;
689         }
690     }
691     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
692     TRANS_LOGE(TRANS_CTRL, "not found proxyChannelInfo by channelId=%{public}d", myId);
693     return SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND;
694 }
695 
696 static const ConfigTypeMap g_configTypeMap[] = {
697     { CHANNEL_TYPE_AUTH,  BUSINESS_TYPE_BYTE,    SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH   },
698     { CHANNEL_TYPE_AUTH,  BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH },
699     { CHANNEL_TYPE_PROXY, BUSINESS_TYPE_BYTE,    SOFTBUS_INT_MAX_BYTES_NEW_LENGTH    },
700     { CHANNEL_TYPE_PROXY, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH  },
701 };
702 
FindConfigType(int32_t channelType,int32_t businessType)703 static int32_t FindConfigType(int32_t channelType, int32_t businessType)
704 {
705     uint32_t size = (uint32_t)sizeof(g_configTypeMap) / sizeof(ConfigTypeMap);
706     for (uint32_t i = 0; i < size; i++) {
707         if ((g_configTypeMap[i].channelType == channelType) && (g_configTypeMap[i].businessType == businessType)) {
708             return g_configTypeMap[i].configType;
709         }
710     }
711     return SOFTBUS_CONFIG_TYPE_MAX;
712 }
713 
TransGetLocalConfig(int32_t channelType,int32_t businessType,uint32_t * len)714 static int32_t TransGetLocalConfig(int32_t channelType, int32_t businessType, uint32_t *len)
715 {
716     ConfigType configType = (ConfigType)FindConfigType(channelType, businessType);
717     if (configType == SOFTBUS_CONFIG_TYPE_MAX) {
718         TRANS_LOGE(TRANS_CTRL, "Invalid channelType=%{public}d, businessType=%{public}d", channelType, businessType);
719         return SOFTBUS_INVALID_PARAM;
720     }
721     uint32_t maxLen;
722     if (SoftbusGetConfig(configType, (unsigned char *)&maxLen, sizeof(maxLen)) != SOFTBUS_OK) {
723         TRANS_LOGE(TRANS_CTRL, "get fail configType=%{public}d", configType);
724         return SOFTBUS_GET_CONFIG_VAL_ERR;
725     }
726     *len = maxLen;
727     TRANS_LOGI(TRANS_CTRL, "get local config len=%{public}u", *len);
728     return SOFTBUS_OK;
729 }
730 
TransProxyProcessDataConfig(AppInfo * appInfo)731 static int32_t TransProxyProcessDataConfig(AppInfo *appInfo)
732 {
733     if (appInfo == NULL) {
734         TRANS_LOGE(TRANS_CTRL, "appInfo is null");
735         return SOFTBUS_INVALID_PARAM;
736     }
737     if (appInfo->businessType != BUSINESS_TYPE_MESSAGE && appInfo->businessType != BUSINESS_TYPE_BYTE) {
738         TRANS_LOGE(TRANS_CTRL, "invalid businessType=%{public}d", appInfo->businessType);
739         return SOFTBUS_OK;
740     }
741     if (appInfo->peerData.dataConfig != 0) {
742         appInfo->myData.dataConfig = MIN(appInfo->myData.dataConfig, appInfo->peerData.dataConfig);
743         TRANS_LOGI(TRANS_CTRL, "process dataConfig succ. dataConfig=%{public}u", appInfo->myData.dataConfig);
744         return SOFTBUS_OK;
745     }
746     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ? SOFTBUS_INT_PROXY_MAX_BYTES_LENGTH :
747                                                                           SOFTBUS_INT_PROXY_MAX_MESSAGE_LENGTH;
748     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
749         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
750         TRANS_LOGE(TRANS_CTRL, "get config failed, configType=%{public}d", configType);
751         return SOFTBUS_GET_CONFIG_VAL_ERR;
752     }
753     TRANS_LOGI(TRANS_CTRL, "process dataConfig=%{public}d", appInfo->myData.dataConfig);
754     return SOFTBUS_OK;
755 }
756 
TransProxyHandshakeUnpackErrMsg(ProxyChannelInfo * info,const ProxyMessage * msg,int32_t * errCode)757 static int32_t TransProxyHandshakeUnpackErrMsg(ProxyChannelInfo *info, const ProxyMessage *msg, int32_t *errCode)
758 {
759     if (errCode == NULL) {
760         TRANS_LOGE(TRANS_CTRL, "errCode is invalid.");
761         return SOFTBUS_INVALID_PARAM;
762     }
763     int32_t ret = TransProxyUnPackHandshakeErrMsg(msg->data, errCode, msg->dateLen);
764     if (ret == SOFTBUS_OK) {
765         TransEventExtra extra = {
766             .socketName = NULL,
767             .peerNetworkId = NULL,
768             .calleePkg = NULL,
769             .callerPkg = NULL,
770             .channelId = info->myId,
771             .peerChannelId = info->peerId,
772             .errcode = *errCode,
773             .result = EVENT_STAGE_RESULT_FAILED
774         };
775         TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_REPLY, extra);
776         TransAuditExtra auditMsgExtra = {
777             .hostPkg = NULL,
778             .localIp = NULL,
779             .localPort = NULL,
780             .localDevId = NULL,
781             .localSessName = NULL,
782             .peerIp = NULL,
783             .peerPort = NULL,
784             .peerDevId = NULL,
785             .peerSessName = NULL,
786             .result = TRANS_AUDIT_DISCONTINUE,
787             .errcode = *errCode,
788             .auditType = AUDIT_EVENT_MSG_ERROR,
789             .localChannelId = info->myId,
790             .peerChannelId = info->peerId,
791         };
792         TRANS_AUDIT(AUDIT_SCENE_OPEN_SESSION, auditMsgExtra);
793         return SOFTBUS_OK;
794     }
795     return ret;
796 }
797 
TransProxyHandshakeUnpackRightMsg(ProxyChannelInfo * info,const ProxyMessage * msg,int32_t errCode,uint16_t * fastDataSize)798 static int32_t TransProxyHandshakeUnpackRightMsg(
799     ProxyChannelInfo *info, const ProxyMessage *msg, int32_t errCode, uint16_t *fastDataSize)
800 {
801     if (fastDataSize == NULL) {
802         TRANS_LOGE(TRANS_CTRL, "fastDataSize is invalid.");
803         return SOFTBUS_INVALID_PARAM;
804     }
805     int32_t ret = TransProxyUnpackHandshakeAckMsg(msg->data, info, msg->dateLen, fastDataSize);
806     if (ret != SOFTBUS_OK) {
807         TransAuditExtra auditPacketExtra = {
808             .hostPkg = NULL,
809             .localIp = NULL,
810             .localPort = NULL,
811             .localDevId = NULL,
812             .localSessName = NULL,
813             .peerIp = NULL,
814             .peerPort = NULL,
815             .peerDevId = NULL,
816             .peerSessName = NULL,
817             .result = TRANS_AUDIT_DISCONTINUE,
818             .errcode = errCode,
819             .auditType = AUDIT_EVENT_PACKETS_ERROR,
820             .localChannelId = info->myId,
821             .peerChannelId = info->peerId,
822         };
823         TRANS_AUDIT(AUDIT_SCENE_OPEN_SESSION, auditPacketExtra);
824         TRANS_LOGE(TRANS_CTRL, "UnpackHandshakeAckMsg failed");
825         return ret;
826     }
827     TRANS_LOGI(TRANS_CTRL,
828         "recv Handshake ack myChannelid=%{public}d, peerChannelId=%{public}d, identity=%{public}s, crc=%{public}d",
829         info->myId, info->peerId, info->identity, info->appInfo.crc);
830     return SOFTBUS_OK;
831 }
832 
TransProxyProcessHandshakeAckMsg(const ProxyMessage * msg)833 void TransProxyProcessHandshakeAckMsg(const ProxyMessage *msg)
834 {
835     uint16_t fastDataSize = 0;
836     ProxyChannelInfo info = {
837         .myId = msg->msgHead.myId,
838         .peerId = msg->msgHead.peerId
839     };
840 
841     if (TransProxyGetAppInfo(info.myId, &(info.appInfo)) != SOFTBUS_OK) {
842         TRANS_LOGE(TRANS_CTRL, "failed to get peer data info");
843         return;
844     }
845     int32_t errCode = SOFTBUS_OK;
846     if (TransProxyHandshakeUnpackErrMsg(&info, msg, &errCode) == SOFTBUS_OK) {
847         TransProxyProcessErrMsg(&info, errCode);
848         goto EXIT;
849     }
850     if (TransProxyHandshakeUnpackRightMsg(&info, msg, errCode, &fastDataSize) != SOFTBUS_OK) {
851         goto EXIT;
852     }
853 
854     if (TransProxyProcessDataConfig(&(info.appInfo)) != SOFTBUS_OK) {
855         TRANS_LOGE(TRANS_CTRL, "ProcessDataConfig failed");
856         goto EXIT;
857     }
858 
859     if (TransProxyUpdateAckInfo(&info) != SOFTBUS_OK) {
860         TRANS_LOGE(TRANS_CTRL, "UpdateAckInfo failed");
861         goto EXIT;
862     }
863 
864     info.appInfo.peerData.channelId = msg->msgHead.peerId;
865     if (info.appInfo.fastTransDataSize <= 0 || (fastDataSize > 0 && fastDataSize == info.appInfo.fastTransDataSize)) {
866         (void)OnProxyChannelOpened(info.channelId, &(info.appInfo), PROXY_CHANNEL_CLIENT);
867     } else {
868         uint32_t outLen;
869         char *buf = TransProxyPackFastData(&(info.appInfo), &outLen);
870         if (buf == NULL) {
871             TRANS_LOGE(TRANS_CTRL, "failed to pack bytes.");
872             goto EXIT;
873         }
874         (void)TransSendMsg(info.channelId, CHANNEL_TYPE_PROXY, buf, outLen, info.appInfo.businessType);
875         (void)OnProxyChannelOpened(info.channelId, &(info.appInfo), PROXY_CHANNEL_CLIENT);
876         SoftBusFree(buf);
877     }
878 EXIT:
879     (void)memset_s(info.appInfo.sessionKey, sizeof(info.appInfo.sessionKey), 0, sizeof(info.appInfo.sessionKey));
880     return;
881 }
882 
TransProxyGetLocalInfo(ProxyChannelInfo * chan)883 static int32_t TransProxyGetLocalInfo(ProxyChannelInfo *chan)
884 {
885     bool noNeedGetPkg = (chan->appInfo.appType == APP_TYPE_INNER) ||
886         ((chan->appInfo.appType == APP_TYPE_AUTH) && (IsNoPkgNameSession(chan->appInfo.myData.sessionName)));
887     if (!noNeedGetPkg) {
888         if (TransProxyGetPkgName(chan->appInfo.myData.sessionName,
889             chan->appInfo.myData.pkgName, sizeof(chan->appInfo.myData.pkgName)) != SOFTBUS_OK) {
890             TRANS_LOGE(TRANS_CTRL, "channelId=%{public}d proc handshake get pkg name fail", chan->channelId);
891             return SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED;
892         }
893 
894         if (TransProxyGetUidAndPidBySessionName(chan->appInfo.myData.sessionName,
895             &chan->appInfo.myData.uid, &chan->appInfo.myData.pid) != SOFTBUS_OK) {
896             TRANS_LOGE(TRANS_CTRL, "channelId=%{public}d proc handshake get uid pid fail", chan->channelId);
897             return SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED;
898         }
899     }
900 
901     InfoKey key = STRING_KEY_UUID;
902     if (chan->appInfo.appType == APP_TYPE_AUTH) {
903         key = STRING_KEY_DEV_UDID;
904     }
905     int32_t ret = LnnGetLocalStrInfo(key, chan->appInfo.myData.deviceId, sizeof(chan->appInfo.myData.deviceId));
906     TRANS_CHECK_AND_RETURN_RET_LOGE(
907         ret == SOFTBUS_OK, ret, TRANS_CTRL, "channelId=%{public}d Handshake get local info fail", chan->channelId);
908     return SOFTBUS_OK;
909 }
910 
CheckAppTypeAndMsgHead(const ProxyMessageHead * msgHead,const AppInfo * appInfo)911 static inline int32_t CheckAppTypeAndMsgHead(const ProxyMessageHead *msgHead, const AppInfo *appInfo)
912 {
913     if (((msgHead->cipher & ENCRYPTED) == 0) && (appInfo->appType != APP_TYPE_AUTH)) {
914         return SOFTBUS_TRANS_PROXY_ERROR_APP_TYPE;
915     }
916     return SOFTBUS_OK;
917 }
918 
SelectRouteType(ConnectType type,RouteType * routeType)919 static void SelectRouteType(ConnectType type, RouteType *routeType)
920 {
921     if (type == CONNECT_TCP) {
922         *routeType = WIFI_STA;
923     } else if (type == CONNECT_BR) {
924         *routeType = BT_BR;
925     } else if (type == CONNECT_BLE) {
926         *routeType = BT_BLE;
927     } else if (type == CONNECT_BLE_DIRECT) {
928         *routeType = BT_BLE;
929     }
930 }
931 
ConstructProxyChannelInfo(ProxyChannelInfo * chan,const ProxyMessage * msg,int16_t newChanId,const ConnectionInfo * info)932 static void ConstructProxyChannelInfo(
933     ProxyChannelInfo *chan, const ProxyMessage *msg, int16_t newChanId, const ConnectionInfo *info)
934 {
935     // always be client when communicating with WinPC
936     chan->isServer = (msg->msgHead.cipher & CS_MODE) == 0 ? 0 : 1;
937     if (chan->isServer == 0) {
938         chan->deviceTypeIsWinpc = true;
939     }
940     chan->status = PROXY_CHANNEL_STATUS_COMPLETED;
941     chan->connId = msg->connId;
942     chan->myId = newChanId;
943     chan->channelId = newChanId;
944     chan->peerId = msg->msgHead.peerId;
945     chan->authHandle = msg->authHandle;
946     chan->type = info->type;
947     if (chan->type == CONNECT_BLE || chan->type == CONNECT_BLE_DIRECT) {
948         chan->bleProtocolType = info->bleInfo.protocol;
949     }
950 
951     SelectRouteType(info->type, &chan->appInfo.routeType);
952 }
953 
TransProxyFillDataConfig(AppInfo * appInfo)954 static int32_t TransProxyFillDataConfig(AppInfo *appInfo)
955 {
956     if (appInfo == NULL) {
957         TRANS_LOGE(TRANS_CTRL, "appInfo is null");
958         return SOFTBUS_INVALID_PARAM;
959     }
960     if (appInfo->appType == APP_TYPE_AUTH) {
961         appInfo->businessType = BUSINESS_TYPE_BYTE;
962     }
963     if (appInfo->businessType != BUSINESS_TYPE_MESSAGE && appInfo->businessType != BUSINESS_TYPE_BYTE) {
964         TRANS_LOGI(TRANS_CTRL, "invalid businessType=%{public}d", appInfo->businessType);
965         return SOFTBUS_OK;
966     }
967     if (appInfo->peerData.dataConfig != 0) {
968         uint32_t localDataConfig = 0;
969         if (TransGetLocalConfig(CHANNEL_TYPE_PROXY, appInfo->businessType, &localDataConfig) != SOFTBUS_OK) {
970             TRANS_LOGE(TRANS_CTRL, "get local config failed, businessType=%{public}d", appInfo->businessType);
971             return SOFTBUS_GET_CONFIG_VAL_ERR;
972         }
973         appInfo->myData.dataConfig = MIN(localDataConfig, appInfo->peerData.dataConfig);
974         TRANS_LOGI(TRANS_CTRL, "fill dataConfig success. dataConfig=%{public}u", appInfo->myData.dataConfig);
975         return SOFTBUS_OK;
976     }
977     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ? SOFTBUS_INT_PROXY_MAX_BYTES_LENGTH :
978                                                                           SOFTBUS_INT_PROXY_MAX_MESSAGE_LENGTH;
979     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
980         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
981         TRANS_LOGE(TRANS_CTRL, "get config failed, configType=%{public}d", configType);
982         return SOFTBUS_GET_CONFIG_VAL_ERR;
983     }
984     TRANS_LOGD(TRANS_CTRL, "fill dataConfig=%{public}d", appInfo->myData.dataConfig);
985     return SOFTBUS_OK;
986 }
987 
TransProxyReportAuditEvent(int32_t ret)988 static void TransProxyReportAuditEvent(int32_t ret)
989 {
990     TransAuditExtra extra = {
991         .hostPkg = NULL,
992         .localIp = NULL,
993         .localPort = NULL,
994         .localDevId = NULL,
995         .localSessName = NULL,
996         .peerIp = NULL,
997         .peerPort = NULL,
998         .peerDevId = NULL,
999         .peerSessName = NULL,
1000         .result = TRANS_AUDIT_DISCONTINUE,
1001         .errcode = ret,
1002         .auditType = AUDIT_EVENT_PACKETS_ERROR,
1003     };
1004     TRANS_AUDIT(AUDIT_SCENE_OPEN_SESSION, extra);
1005 }
1006 
TransProxyFillChannelInfo(const ProxyMessage * msg,ProxyChannelInfo * chan)1007 static int32_t TransProxyFillChannelInfo(const ProxyMessage *msg, ProxyChannelInfo *chan)
1008 {
1009     int32_t ret = TransProxyUnpackHandshakeMsg(msg->data, chan, msg->dateLen);
1010     if (ret != SOFTBUS_OK) {
1011         TransProxyReportAuditEvent(ret);
1012         TRANS_LOGE(TRANS_CTRL, "UnpackHandshakeMsg fail.");
1013         return ret;
1014     }
1015     if ((chan->appInfo.appType == APP_TYPE_AUTH) &&
1016         (!CheckSessionNameValidOnAuthChannel(chan->appInfo.myData.sessionName))) {
1017         TRANS_LOGE(TRANS_CTRL, "proxy auth check sessionname valid.");
1018         return SOFTBUS_TRANS_AUTH_NOTALLOW_OPENED;
1019     }
1020 
1021     if (CheckAppTypeAndMsgHead(&msg->msgHead, &chan->appInfo) != SOFTBUS_OK) {
1022         TRANS_LOGE(TRANS_CTRL, "only auth channel surpport plain text data");
1023         return SOFTBUS_TRANS_PROXY_ERROR_APP_TYPE;
1024     }
1025 
1026     ConnectionInfo info;
1027     (void)memset_s(&info, sizeof(ConnectionInfo), 0, sizeof(ConnectionInfo));
1028     ret = ConnGetConnectionInfo(msg->connId, &info);
1029     if (ret != SOFTBUS_OK) {
1030         TRANS_LOGE(TRANS_CTRL, "GetConnectionInfo fail. connId=%{public}u", msg->connId);
1031         return ret;
1032     }
1033     ConnectType type;
1034     if (ConnGetTypeByConnectionId(msg->connId, &type) != SOFTBUS_OK) {
1035         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
1036     }
1037     SelectRouteType(type, &chan->appInfo.routeType);
1038 
1039     int16_t newChanId = (int16_t)(GenerateChannelId(false));
1040     ConstructProxyChannelInfo(chan, msg, newChanId, &info);
1041 
1042     if (chan->appInfo.appType == APP_TYPE_NORMAL && chan->appInfo.callingTokenId != TOKENID_NOT_SET &&
1043         TransCheckServerAccessControl(chan->appInfo.callingTokenId) != SOFTBUS_OK) {
1044         return SOFTBUS_TRANS_CHECK_ACL_FAILED;
1045     }
1046 
1047     if (CheckSecLevelPublic(chan->appInfo.myData.sessionName, chan->appInfo.peerData.sessionName) != SOFTBUS_OK) {
1048         return SOFTBUS_PERMISSION_SERVER_DENIED;
1049     }
1050     ret = TransProxyGetLocalInfo(chan);
1051     if (ret != SOFTBUS_OK) {
1052         return ret;
1053     }
1054 
1055     ret = TransProxyFillDataConfig(&chan->appInfo);
1056     if (ret != SOFTBUS_OK) {
1057         TRANS_LOGE(TRANS_CTRL, "fill dataConfig fail.");
1058         return ret;
1059     }
1060     return SOFTBUS_OK;
1061 }
1062 
TransProxyProcessHandshakeAuthMsg(const ProxyMessage * msg)1063 void TransProxyProcessHandshakeAuthMsg(const ProxyMessage *msg)
1064 {
1065     AppInfo appInfo;
1066     int32_t ret = TransProxyGetAppInfoByChanId(msg->msgHead.myId, &appInfo);
1067     (void)memset_s(appInfo.sessionKey, sizeof(appInfo.sessionKey), 0, sizeof(appInfo.sessionKey));
1068     if (ret != SOFTBUS_OK) {
1069         return;
1070     }
1071     if (((uint32_t)appInfo.transFlag & TRANS_FLAG_HAS_CHANNEL_AUTH) == 0) {
1072         return;
1073     }
1074     int64_t authSeq = appInfo.authSeq;
1075     AuthSessionProcessAuthData(authSeq, (uint8_t *)msg->data, msg->dateLen);
1076 }
1077 
TransProxyFastDataRecv(ProxyChannelInfo * chan)1078 static void TransProxyFastDataRecv(ProxyChannelInfo *chan)
1079 {
1080     TRANS_LOGD(TRANS_CTRL, "begin, fastTransDataSize=%{public}d", chan->appInfo.fastTransDataSize);
1081     TransReceiveData receiveData;
1082     receiveData.data = (void *)chan->appInfo.fastTransData;
1083     if (chan->appInfo.businessType == BUSINESS_TYPE_MESSAGE && chan->appInfo.routeType == WIFI_STA) {
1084         receiveData.dataLen = chan->appInfo.fastTransDataSize + FAST_EXT_MSG_SIZE;
1085     } else {
1086         receiveData.dataLen = chan->appInfo.fastTransDataSize + FAST_EXT_BYTE_SIZE;
1087     }
1088     if (chan->appInfo.businessType == BUSINESS_TYPE_MESSAGE) {
1089         receiveData.dataType = TRANS_SESSION_MESSAGE;
1090     } else {
1091         receiveData.dataType = TRANS_SESSION_BYTES;
1092     }
1093     if (NotifyClientMsgReceived(chan->appInfo.myData.pkgName, chan->appInfo.myData.pid,
1094         chan->channelId, &receiveData) != SOFTBUS_OK) {
1095         TRANS_LOGE(TRANS_CTRL, "TransProxyFastDataRecv err");
1096         chan->appInfo.fastTransDataSize = 0;
1097     }
1098     TRANS_LOGD(TRANS_CTRL, "ok");
1099     return;
1100 }
1101 
ReleaseChannelInfo(ProxyChannelInfo * chan)1102 static void ReleaseChannelInfo(ProxyChannelInfo *chan)
1103 {
1104     if (chan == NULL) {
1105         return;
1106     }
1107     if (chan->appInfo.fastTransData != NULL) {
1108         SoftBusFree((void*)chan->appInfo.fastTransData);
1109     }
1110     SoftBusFree(chan);
1111 }
1112 
FillProxyHandshakeExtra(TransEventExtra * extra,ProxyChannelInfo * chan,char * socketName,NodeInfo * nodeInfo)1113 static void FillProxyHandshakeExtra(
1114     TransEventExtra *extra, ProxyChannelInfo *chan, char *socketName, NodeInfo *nodeInfo)
1115 {
1116     if (strcpy_s(socketName, SESSION_NAME_SIZE_MAX, chan->appInfo.myData.sessionName) != EOK) {
1117         TRANS_LOGW(TRANS_CTRL, "strcpy_s socketName failed");
1118     }
1119     extra->calleePkg = NULL;
1120     extra->callerPkg = NULL;
1121     extra->channelId = chan->myId;
1122     extra->peerChannelId = chan->peerId;
1123     extra->socketName = socketName;
1124     extra->authId = chan->authHandle.authId;
1125     extra->connectionId = (int32_t)chan->connId;
1126     extra->channelType = chan->appInfo.appType == APP_TYPE_AUTH ? CHANNEL_TYPE_AUTH : CHANNEL_TYPE_PROXY;
1127     extra->linkType = chan->type;
1128 
1129     if (chan->appInfo.appType == APP_TYPE_AUTH &&
1130         strcpy_s(nodeInfo->deviceInfo.deviceUdid, UDID_BUF_LEN, chan->appInfo.peerData.deviceId) != EOK) {
1131         extra->peerUdid = nodeInfo->deviceInfo.deviceUdid;
1132     } else if (chan->appInfo.appType != APP_TYPE_AUTH &&
1133         LnnGetRemoteNodeInfoById(chan->appInfo.peerData.deviceId, CATEGORY_UUID, nodeInfo) == SOFTBUS_OK) {
1134         extra->peerUdid = nodeInfo->deviceInfo.deviceUdid;
1135         extra->peerDevVer = nodeInfo->deviceInfo.deviceVersion;
1136     }
1137     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, nodeInfo->masterUdid, UDID_BUF_LEN) == SOFTBUS_OK) {
1138         extra->localUdid = nodeInfo->masterUdid;
1139     }
1140 }
1141 
TransProxyProcessHandshake(ProxyChannelInfo * chan,const ProxyMessage * msg)1142 static int32_t TransProxyProcessHandshake(ProxyChannelInfo *chan, const ProxyMessage *msg)
1143 {
1144     int32_t ret = OnProxyChannelOpened(chan->channelId, &(chan->appInfo), PROXY_CHANNEL_SERVER);
1145     if (ret != SOFTBUS_OK) {
1146         TRANS_LOGE(TRANS_CTRL, "OnProxyChannelOpened fail channelId=%{public}d", chan->channelId);
1147         (void)TransProxyAckHandshake(msg->connId, chan, ret);
1148         return ret;
1149     }
1150     if (chan->appInfo.fastTransData != NULL && chan->appInfo.fastTransDataSize > 0) {
1151         TransProxyFastDataRecv(chan);
1152     }
1153     chan->appInfo.myHandleId = 0;
1154 
1155     if ((ret = TransProxyAckHandshake(msg->connId, chan, SOFTBUS_OK)) != SOFTBUS_OK) {
1156         TRANS_LOGE(
1157             TRANS_CTRL, "AckHandshake fail channelId=%{public}d, connId=%{public}u", chan->channelId, msg->connId);
1158         OnProxyChannelClosed(chan->channelId, &(chan->appInfo));
1159         return ret;
1160     }
1161     if ((ret = OnProxyChannelBind(chan->channelId, &(chan->appInfo))) != SOFTBUS_OK) {
1162         TRANS_LOGE(TRANS_CTRL, "OnProxyChannelBind fail channelId=%{public}d, connId=%{public}u", chan->channelId,
1163             msg->connId);
1164         return ret;
1165     }
1166 
1167     return SOFTBUS_OK;
1168 }
1169 
TransProxyProcessHandshakeMsg(const ProxyMessage * msg)1170 void TransProxyProcessHandshakeMsg(const ProxyMessage *msg)
1171 {
1172     if (msg == NULL) {
1173         TRANS_LOGE(TRANS_CTRL, "param invalid");
1174         return;
1175     }
1176     TRANS_LOGI(TRANS_CTRL, "recv Handshake myChannelId=%{public}d, peerChannelId=%{public}d", msg->msgHead.myId,
1177         msg->msgHead.peerId);
1178     ProxyChannelInfo *chan = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1179     TRANS_CHECK_AND_RETURN_LOGW(!(chan == NULL), TRANS_CTRL, "proxy handshake calloc failed.");
1180 
1181     int32_t ret = TransProxyFillChannelInfo(msg, chan);
1182     if ((ret == SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED || ret == SOFTBUS_TRANS_CHECK_ACL_FAILED) &&
1183         (TransProxyAckHandshake(msg->connId, chan, ret) != SOFTBUS_OK)) {
1184         TRANS_LOGE(TRANS_CTRL, "ErrHandshake fail, connId=%{public}u.", msg->connId);
1185     }
1186     char tmpSocketName[SESSION_NAME_SIZE_MAX] = { 0 };
1187     NodeInfo nodeInfo;
1188     (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
1189     TransEventExtra extra = { 0 };
1190     FillProxyHandshakeExtra(&extra, chan, tmpSocketName, &nodeInfo);
1191 
1192     if (ret != SOFTBUS_OK) {
1193         ReleaseProxyChannelId(chan->channelId);
1194         ReleaseChannelInfo(chan);
1195         goto EXIT_ERR;
1196     }
1197 
1198     extra.result = EVENT_STAGE_RESULT_OK;
1199     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_START, extra);
1200     ret = TransProxyProcessHandshake(chan, msg);
1201     if (ret != SOFTBUS_OK) {
1202         goto EXIT_ERR;
1203     }
1204     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_REPLY, extra);
1205 
1206     TransCreateConnByConnId(msg->connId, (bool)chan->isServer);
1207     if ((ret = TransProxyAddChanItem(chan)) != SOFTBUS_OK) {
1208         TRANS_LOGE(TRANS_CTRL, "AddChanItem fail");
1209         ReleaseProxyChannelId(chan->channelId);
1210         ReleaseChannelInfo(chan);
1211         goto EXIT_ERR;
1212     }
1213 
1214     return;
1215 EXIT_ERR:
1216     extra.result = EVENT_STAGE_RESULT_FAILED;
1217     extra.errcode = ret;
1218     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_REPLY, extra);
1219 }
1220 
TransGetRemoteDeviceIdByReqId(int32_t requestId,char * peerNetworkId)1221 static int32_t TransGetRemoteDeviceIdByReqId(int32_t requestId, char *peerNetworkId)
1222 {
1223     TRANS_CHECK_AND_RETURN_RET_LOGE(
1224         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "proxy channel list not init");
1225 
1226     int32_t ret = SoftBusMutexLock(&g_proxyChannelList->lock);
1227     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
1228 
1229     ProxyChannelInfo *item = NULL;
1230     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
1231         if (item->reqId == requestId) {
1232             if (memcpy_s(peerNetworkId, DEVICE_ID_SIZE_MAX, item->appInfo.peerNetWorkId, DEVICE_ID_SIZE_MAX) != EOK) {
1233                 TRANS_LOGE(TRANS_CTRL, "memcpy_s peerNetworkId failed");
1234                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1235                 return SOFTBUS_MEM_ERR;
1236             }
1237             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1238             return SOFTBUS_OK;
1239         }
1240     }
1241     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1242     TRANS_LOGE(TRANS_CTRL, "proxy channel not found by requestId=%{public}d", requestId);
1243     return SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND;
1244 }
1245 
TransProxyProcessReNegotiateMsg(const ProxyMessage * msg,const ProxyChannelInfo * info)1246 static int32_t TransProxyProcessReNegotiateMsg(const ProxyMessage *msg, const ProxyChannelInfo *info)
1247 {
1248     TRANS_LOGW(TRANS_CTRL, "receive reNegotiate msg, retry one time");
1249     AuthConnInfo authConnInfo;
1250     (void)memset_s(&authConnInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
1251     int32_t ret = GetAuthConnInfoByConnId(msg->connId, &authConnInfo);
1252     if (ret != SOFTBUS_OK) {
1253         TRANS_LOGE(TRANS_CTRL, "get authConnInfo by connId=%{public}u fail, ret=%{public}d", msg->connId, ret);
1254         return ret;
1255     }
1256 
1257     ret = TransReNegotiateSessionKey(&authConnInfo, info->myId);
1258     if (ret != SOFTBUS_OK) {
1259         TransProxyNegoSessionKeyFail(info->myId, ret);
1260         TRANS_LOGE(TRANS_CTRL, "generate session key failed ret=%{public}d", ret);
1261         return ret;
1262     }
1263     TRANS_LOGI(TRANS_CTRL, "call regenerate sessionKey succ");
1264     return SOFTBUS_OK;
1265 }
1266 
TransProxyProcessResetMsgHelper(const ProxyChannelInfo * info,const ProxyMessage * msg)1267 static void TransProxyProcessResetMsgHelper(const ProxyChannelInfo *info, const ProxyMessage *msg)
1268 {
1269     if (info->status == PROXY_CHANNEL_STATUS_HANDSHAKEING) {
1270         int32_t errCode = ((msg->msgHead.cipher & BAD_CIPHER) == BAD_CIPHER) ?
1271             SOFTBUS_TRANS_BAD_KEY : SOFTBUS_TRANS_HANDSHAKE_ERROR;
1272         TransProxyUnPackRestErrMsg(msg->data, &errCode, msg->dateLen);
1273         TRANS_LOGE(TRANS_CTRL, "TransProxyProcessResetMsg errCode=%{public}d", errCode);
1274         TransProxyOpenProxyChannelFail(info->channelId, &(info->appInfo), errCode);
1275     } else if (info->status == PROXY_CHANNEL_STATUS_COMPLETED) {
1276         TransEventExtra extra = {
1277             .socketName = NULL,
1278             .peerNetworkId = NULL,
1279             .calleePkg = NULL,
1280             .callerPkg = NULL,
1281             .channelId = msg->msgHead.myId,
1282             .peerChannelId = msg->msgHead.peerId,
1283             .result = EVENT_STAGE_RESULT_OK
1284         };
1285         TRANS_EVENT(EVENT_SCENE_CLOSE_CHANNEL_PASSIVE, EVENT_STAGE_CLOSE_CHANNEL, extra);
1286         OnProxyChannelClosed(info->channelId, &(info->appInfo));
1287     }
1288     (void)TransProxyCloseConnChannelReset(msg->connId, (info->isServer == 0), info->isServer, info->deviceTypeIsWinpc);
1289     if ((msg->msgHead.cipher & BAD_CIPHER) == BAD_CIPHER) {
1290         TRANS_LOGE(TRANS_CTRL, "clear bad key cipher=%{public}d, authId=%{public}" PRId64 ", keyIndex=%{public}d",
1291             msg->msgHead.cipher, msg->authHandle.authId, msg->keyIndex);
1292         RemoveAuthSessionKeyByIndex(msg->authHandle.authId, msg->keyIndex, (AuthLinkType)msg->authHandle.type);
1293     }
1294 }
1295 
TransProxyProcessResetMsg(const ProxyMessage * msg)1296 void TransProxyProcessResetMsg(const ProxyMessage *msg)
1297 {
1298     ProxyChannelInfo *info = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1299     if (info == NULL) {
1300         TRANS_LOGE(TRANS_CTRL, "ProxyProcessResetMsg calloc failed.");
1301         return;
1302     }
1303 
1304     TRANS_LOGI(TRANS_CTRL, "recv reset myChannelId=%{public}d, peerChanelId=%{public}d, cipher=%{public}d",
1305         msg->msgHead.myId, msg->msgHead.peerId, msg->msgHead.cipher);
1306     if (TransProxyUnpackIdentity(msg->data, info->identity, sizeof(info->identity), msg->dateLen) != SOFTBUS_OK) {
1307         TRANS_LOGE(TRANS_CTRL, "reset identity fail");
1308         SoftBusFree(info);
1309         return;
1310     }
1311 
1312     info->peerId = msg->msgHead.peerId;
1313     info->myId = msg->msgHead.myId;
1314 
1315     if (TransProxyGetAppInfo(info->myId, &(info->appInfo)) != SOFTBUS_OK) {
1316         TRANS_LOGE(TRANS_CTRL, "fail to get peer data info");
1317         SoftBusFree(info);
1318         return;
1319     }
1320 
1321     if (TransProxyGetReqIdAndStatus(info->myId, &info->reqId, &info->status) != SOFTBUS_OK) {
1322         TRANS_LOGE(TRANS_CTRL, "fail to get conn reqId");
1323         goto EXIT;
1324     }
1325 
1326     if (CheckAppTypeAndMsgHead(&msg->msgHead, &info->appInfo) != SOFTBUS_OK) {
1327         TRANS_LOGE(TRANS_CTRL, "only auth channel surpport plain text data");
1328         goto EXIT;
1329     }
1330 
1331     if (info->status == PROXY_CHANNEL_STATUS_HANDSHAKEING &&
1332         (msg->msgHead.cipher & AUTH_SINGLE_CIPHER) == AUTH_SINGLE_CIPHER &&
1333         TransProxyProcessReNegotiateMsg(msg, info) == SOFTBUS_OK) {
1334         goto EXIT;
1335     }
1336 
1337     if (TransProxyResetChan(info) != SOFTBUS_OK) {
1338         TRANS_LOGE(TRANS_CTRL, "reset chan fail mychannelId=%{public}d, peerChannelId=%{public}d", msg->msgHead.myId,
1339             msg->msgHead.peerId);
1340         goto EXIT;
1341     }
1342 
1343     TransProxyProcessResetMsgHelper(info, msg);
1344 EXIT:
1345     (void)memset_s(info->appInfo.sessionKey, sizeof(info->appInfo.sessionKey), 0, sizeof(info->appInfo.sessionKey));
1346     SoftBusFree(info);
1347     return;
1348 }
1349 
TransProxyProcessKeepAlive(const ProxyMessage * msg)1350 void TransProxyProcessKeepAlive(const ProxyMessage *msg)
1351 {
1352     ProxyChannelInfo *info = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1353     if (info == NULL) {
1354         TRANS_LOGE(TRANS_CTRL, "ProxyProcessKeepAlive calloc failed.");
1355         return;
1356     }
1357 
1358     TRANS_LOGI(TRANS_CTRL, "recv keepalive myChannelId=%{public}d, peerChannelId=%{public}d", msg->msgHead.myId,
1359         msg->msgHead.peerId);
1360     if (TransProxyUnpackIdentity(msg->data, info->identity, sizeof(info->identity), msg->dateLen) != SOFTBUS_OK) {
1361         TRANS_LOGE(TRANS_CTRL, "keep alive unpack identity fail");
1362         SoftBusFree(info);
1363         return;
1364     }
1365     info->peerId = msg->msgHead.peerId;
1366     info->myId = msg->msgHead.myId;
1367 
1368     if (TransProxyKeepAliveChan(info) != SOFTBUS_OK) {
1369         TRANS_LOGE(TRANS_CTRL, "reset keep alive proc fail myChannelId=%{public}d, peerChannelId=%{public}d",
1370             msg->msgHead.myId, msg->msgHead.peerId);
1371         SoftBusFree(info);
1372         return;
1373     }
1374 
1375     TransProxyAckKeepalive(info);
1376     (void)memset_s(info->appInfo.sessionKey, sizeof(info->appInfo.sessionKey), 0, sizeof(info->appInfo.sessionKey));
1377     SoftBusFree(info);
1378 }
1379 
TransProxyProcessKeepAliveAck(const ProxyMessage * msg)1380 void TransProxyProcessKeepAliveAck(const ProxyMessage *msg)
1381 {
1382     ProxyChannelInfo *info = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1383     if (info == NULL) {
1384         TRANS_LOGE(TRANS_CTRL, "ProxyProcessKeepAliveAck calloc failed.");
1385         return;
1386     }
1387 
1388     TRANS_LOGI(TRANS_CTRL, "recv keepalive ack myChannelId=%{public}d, peerChannelId=%{public}d", msg->msgHead.myId,
1389         msg->msgHead.peerId);
1390     if (TransProxyUnpackIdentity(msg->data, info->identity, sizeof(info->identity), msg->dateLen) != SOFTBUS_OK) {
1391         SoftBusFree(info);
1392         return;
1393     }
1394     info->peerId = msg->msgHead.peerId;
1395     info->myId = msg->msgHead.myId;
1396 
1397     if (TransProxyKeepAliveChan(info) != SOFTBUS_OK) {
1398         TRANS_LOGE(TRANS_CTRL, "reset keep alive ack proc fail myChannelId=%{public}d, peerChannelId=%{public}d",
1399             msg->msgHead.myId, msg->msgHead.peerId);
1400         SoftBusFree(info);
1401         return;
1402     }
1403     (void)memset_s(info->appInfo.sessionKey, sizeof(info->appInfo.sessionKey), 0, sizeof(info->appInfo.sessionKey));
1404     SoftBusFree(info);
1405 }
1406 
TransProxyProcessDataRecv(const ProxyMessage * msg)1407 void TransProxyProcessDataRecv(const ProxyMessage *msg)
1408 {
1409     ProxyChannelInfo *info = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1410     if (info == NULL) {
1411         TRANS_LOGE(TRANS_CTRL, "ProxyProcessDataRecv calloc failed.");
1412         return;
1413     }
1414 
1415     if (TransProxyGetRecvMsgChanInfo(msg->msgHead.myId, msg->msgHead.peerId, info) != SOFTBUS_OK) {
1416         TRANS_LOGE(TRANS_CTRL, "data recv get info fail myChannelId=%{public}d, peerChannelId=%{public}d",
1417             msg->msgHead.myId, msg->msgHead.peerId);
1418         SoftBusFree(info);
1419         return;
1420     }
1421 
1422     OnProxyChannelMsgReceived(info->channelId, &(info->appInfo), msg->data, msg->dateLen);
1423     (void)memset_s(info->appInfo.sessionKey, sizeof(info->appInfo.sessionKey), 0, sizeof(info->appInfo.sessionKey));
1424     SoftBusFree(info);
1425 }
1426 
TransProxyOnMessageReceived(const ProxyMessage * msg)1427 void TransProxyOnMessageReceived(const ProxyMessage *msg)
1428 {
1429     if (msg == NULL) {
1430         return;
1431     }
1432     switch (msg->msgHead.type) {
1433         case PROXYCHANNEL_MSG_TYPE_HANDSHAKE: {
1434             TransProxyProcessHandshakeMsg(msg);
1435             break;
1436         }
1437         case PROXYCHANNEL_MSG_TYPE_HANDSHAKE_ACK: {
1438             TransProxyProcessHandshakeAckMsg(msg);
1439             break;
1440         }
1441         case PROXYCHANNEL_MSG_TYPE_RESET: {
1442             TransProxyProcessResetMsg(msg);
1443             break;
1444         }
1445         case PROXYCHANNEL_MSG_TYPE_KEEPALIVE: {
1446             TransProxyProcessKeepAlive(msg);
1447             break;
1448         }
1449         case PROXYCHANNEL_MSG_TYPE_KEEPALIVE_ACK: {
1450             TransProxyProcessKeepAliveAck(msg);
1451             break;
1452         }
1453         case PROXYCHANNEL_MSG_TYPE_NORMAL: {
1454             TransProxyProcessDataRecv(msg);
1455             break;
1456         }
1457         case PROXYCHANNEL_MSG_TYPE_HANDSHAKE_AUTH: {
1458             TransProxyProcessHandshakeAuthMsg(msg);
1459             break;
1460         }
1461         default: {
1462             break;
1463         }
1464     }
1465 }
1466 
CopyAppInfoFastTransData(ProxyChannelInfo * chan,const AppInfo * appInfo)1467 static int32_t CopyAppInfoFastTransData(ProxyChannelInfo *chan, const AppInfo *appInfo)
1468 {
1469     if (appInfo->fastTransData != NULL && appInfo->fastTransDataSize > 0) {
1470         uint8_t *fastTransData = (uint8_t *)SoftBusCalloc(appInfo->fastTransDataSize);
1471         if (fastTransData == NULL) {
1472             return SOFTBUS_MALLOC_ERR;
1473         }
1474         if (memcpy_s((char *)fastTransData, appInfo->fastTransDataSize, (const char *)appInfo->fastTransData,
1475             appInfo->fastTransDataSize) != EOK) {
1476             TRANS_LOGE(TRANS_CTRL, "memcpy fastTransData fail");
1477             SoftBusFree(fastTransData);
1478             return SOFTBUS_MEM_ERR;
1479         }
1480         chan->appInfo.fastTransData = fastTransData;
1481     }
1482     return SOFTBUS_OK;
1483 }
1484 
TransProxyCreateChanInfo(ProxyChannelInfo * chan,int32_t channelId,const AppInfo * appInfo)1485 int32_t TransProxyCreateChanInfo(ProxyChannelInfo *chan, int32_t channelId, const AppInfo *appInfo)
1486 {
1487     chan->myId = (int16_t)channelId;
1488     chan->channelId = channelId;
1489 
1490     int32_t ret = GenerateRandomStr(chan->identity, sizeof(chan->identity));
1491     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "GenerateRandomStr err");
1492 
1493     if (appInfo->appType != APP_TYPE_AUTH) {
1494         ret = SoftBusGenerateRandomArray((unsigned char *)appInfo->sessionKey, sizeof(appInfo->sessionKey));
1495         TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "GenerateRandomArray err");
1496     }
1497 
1498     if (memcpy_s(&(chan->appInfo), sizeof(chan->appInfo), appInfo, sizeof(AppInfo)) != EOK) {
1499         TRANS_LOGE(TRANS_CTRL, "appInfo memcpy failed.");
1500         return SOFTBUS_MEM_ERR;
1501     }
1502 
1503     ret = CopyAppInfoFastTransData(chan, appInfo);
1504     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "copy appinfo fast trans data fail");
1505 
1506     ret = TransProxyAddChanItem(chan);
1507     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
1508         TRANS_CTRL, "trans proxy add channelId fail. channelId=%{public}d", channelId);
1509     return SOFTBUS_OK;
1510 }
1511 
TransProxyNegoSessionKeySucc(int32_t channelId)1512 void TransProxyNegoSessionKeySucc(int32_t channelId)
1513 {
1514     ProxyChannelInfo *channelInfo = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1515     TRANS_CHECK_AND_RETURN_LOGE(channelInfo != NULL, TRANS_CTRL, "malloc proxyChannelInfo failed");
1516 
1517     if (TransProxyGetChanByChanId(channelId, channelInfo) != SOFTBUS_OK) {
1518         SoftBusFree(channelInfo);
1519         TRANS_LOGE(TRANS_CTRL, "disconnect device channelId=%{public}d", channelId);
1520         return;
1521     }
1522 
1523     channelInfo->appInfo.connectedStart = GetSoftbusRecordTimeMillis();
1524     int32_t ret = TransProxyHandshake(channelInfo);
1525     if (ret != SOFTBUS_OK) {
1526         TransEventExtra extra = {
1527             .socketName = NULL,
1528             .peerNetworkId = NULL,
1529             .calleePkg = NULL,
1530             .callerPkg = NULL,
1531             .channelId = channelId,
1532             .connectionId = channelInfo->connId,
1533             .errcode = ret,
1534             .result = EVENT_STAGE_RESULT_FAILED
1535         };
1536         TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_START, extra);
1537         (void)TransProxyCloseConnChannel(channelInfo->connId, channelInfo->isServer);
1538         TRANS_LOGE(TRANS_CTRL, "channelId=%{public}d handshake err, ret=%{public}d", channelId, ret);
1539         TransProxyOpenProxyChannelFail(channelInfo->channelId, &(channelInfo->appInfo), ret);
1540         TransProxyDelChanByChanId(channelId);
1541     }
1542     (void)memset_s(channelInfo->appInfo.sessionKey, sizeof(channelInfo->appInfo.sessionKey), 0,
1543         sizeof(channelInfo->appInfo.sessionKey));
1544     SoftBusFree(channelInfo);
1545 }
1546 
TransProxyNegoSessionKeyFail(int32_t channelId,int32_t errCode)1547 void TransProxyNegoSessionKeyFail(int32_t channelId, int32_t errCode)
1548 {
1549     ProxyChannelInfo *channelInfo = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1550     TRANS_CHECK_AND_RETURN_LOGE(channelInfo != NULL, TRANS_CTRL, "malloc proxyChannelInfo failed");
1551 
1552     if (TransProxyGetChanByChanId(channelId, channelInfo) != SOFTBUS_OK) {
1553         SoftBusFree(channelInfo);
1554         TRANS_LOGE(TRANS_CTRL, "disconnect device channelId=%{public}d", channelId);
1555         return;
1556     }
1557 
1558     (void)TransProxyCloseConnChannel(channelInfo->connId, channelInfo->isServer);
1559     (void)OnProxyChannelOpenFailed(channelId, &(channelInfo->appInfo), errCode);
1560     (void)memset_s(channelInfo->appInfo.sessionKey, sizeof(channelInfo->appInfo.sessionKey), 0,
1561         sizeof(channelInfo->appInfo.sessionKey));
1562     SoftBusFree(channelInfo);
1563     TransProxyDelChanByChanId(channelId);
1564 }
1565 
TransProxyOpenProxyChannelSuccess(int32_t channelId)1566 void TransProxyOpenProxyChannelSuccess(int32_t channelId)
1567 {
1568     TRANS_LOGI(TRANS_CTRL, "send handshake msg. channelId=%{public}d", channelId);
1569     ProxyChannelInfo *channelInfo = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1570     TRANS_CHECK_AND_RETURN_LOGE(channelInfo != NULL, TRANS_CTRL, "malloc proxyChannelInfo failed");
1571 
1572     if (TransProxyGetChanByChanId(channelId, channelInfo) != SOFTBUS_OK) {
1573         SoftBusFree(channelInfo);
1574         TRANS_LOGE(TRANS_CTRL, "disconnect device channelId=%{public}d", channelId);
1575         return;
1576     }
1577     (void)memset_s(channelInfo->appInfo.sessionKey, sizeof(channelInfo->appInfo.sessionKey), 0,
1578         sizeof(channelInfo->appInfo.sessionKey));
1579     AuthConnInfo authConnInfo;
1580     (void)memset_s(&authConnInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
1581     int32_t ret = GetAuthConnInfoByConnId(channelInfo->connId, &authConnInfo);
1582     if (ret != SOFTBUS_OK) {
1583         TRANS_LOGE(TRANS_CTRL, "get authConnInfo by connId=%{public}u fail, ret=%{public}d", channelInfo->connId, ret);
1584         SoftBusFree(channelInfo);
1585         return;
1586     }
1587 
1588     char peerNetworkId[DEVICE_ID_SIZE_MAX] = { 0 };
1589     ret = TransGetRemoteDeviceIdByReqId(channelInfo->reqId, peerNetworkId);
1590     SoftBusFree(channelInfo);
1591     if (ret != SOFTBUS_OK) {
1592         TRANS_LOGE(TRANS_CTRL, "get networkId failed, ret=%{public}d", ret);
1593         return;
1594     }
1595 
1596     ret = TransNegotiateSessionKey(&authConnInfo, channelId, peerNetworkId);
1597     if (ret != SOFTBUS_OK) {
1598         TransProxyNegoSessionKeyFail(channelId, ret);
1599         TRANS_LOGE(TRANS_CTRL, "generate session key failed ret=%{public}d", ret);
1600         return;
1601     }
1602 }
1603 
TransProxyOpenProxyChannelFail(int32_t channelId,const AppInfo * appInfo,int32_t errCode)1604 void TransProxyOpenProxyChannelFail(int32_t channelId, const AppInfo *appInfo, int32_t errCode)
1605 {
1606     (void)OnProxyChannelOpenFailed(channelId, appInfo, errCode);
1607 }
1608 
TransProxyOpenProxyChannel(AppInfo * appInfo,const ConnectOption * connInfo,int32_t * channelId)1609 int32_t TransProxyOpenProxyChannel(AppInfo *appInfo, const ConnectOption *connInfo,
1610     int32_t *channelId)
1611 {
1612     if (appInfo == NULL || connInfo == NULL || channelId == NULL) {
1613         TRANS_LOGE(TRANS_CTRL, "open normal channel: invalid para");
1614         return SOFTBUS_INVALID_PARAM;
1615     }
1616 
1617     SelectRouteType(connInfo->type, &appInfo->routeType);
1618     return TransProxyOpenConnChannel(appInfo, connInfo, channelId);
1619 }
1620 
TransProxyCloseProxyChannel(int32_t channelId)1621 int32_t TransProxyCloseProxyChannel(int32_t channelId)
1622 {
1623     ProxyChannelInfo *info = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1624     if (info == NULL) {
1625         return SOFTBUS_MALLOC_ERR;
1626     }
1627 
1628     if (TransProxyDelByChannelId(channelId, info) != SOFTBUS_OK) {
1629         TRANS_LOGE(TRANS_CTRL, "proxy del failed. channelId=%{public}d", channelId);
1630         SoftBusFree(info);
1631         return SOFTBUS_TRANS_PROXY_INVALID_CHANNEL_ID;
1632     }
1633 
1634     (void)memset_s(info->appInfo.sessionKey, sizeof(info->appInfo.sessionKey), 0, sizeof(info->appInfo.sessionKey));
1635     TransProxyCloseProxyOtherRes(channelId, info);
1636     return SOFTBUS_OK;
1637 }
1638 
TransProxyTimerItemProc(const ListNode * proxyProcList)1639 static void TransProxyTimerItemProc(const ListNode *proxyProcList)
1640 {
1641     if (IsListEmpty(proxyProcList)) {
1642         return;
1643     }
1644     TRANS_LOGI(TRANS_CTRL, "enter.");
1645     ProxyChannelInfo *removeNode = NULL;
1646     ProxyChannelInfo *nextNode = NULL;
1647     ProxyChannelInfo *disChanInfo = NULL;
1648     uint32_t connId;
1649     int8_t status;
1650     bool isServer;
1651 
1652     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, proxyProcList, ProxyChannelInfo, node) {
1653         ListDelete(&(removeNode->node));
1654         status = removeNode->status;
1655         SoftBusFree((void *)removeNode->appInfo.fastTransData);
1656         removeNode->appInfo.fastTransData = NULL;
1657         (void)memset_s(removeNode->appInfo.sessionKey, sizeof(removeNode->appInfo.sessionKey), 0,
1658             sizeof(removeNode->appInfo.sessionKey));
1659         if (status == PROXY_CHANNEL_STATUS_HANDSHAKE_TIMEOUT) {
1660             connId = removeNode->connId;
1661             isServer = removeNode->isServer;
1662             disChanInfo = (ProxyChannelInfo *)SoftBusMalloc(sizeof(ProxyChannelInfo));
1663             if (disChanInfo == NULL) {
1664                 SoftBusFree(removeNode);
1665                 TRANS_LOGE(TRANS_SVC, "SoftBusMalloc failed");
1666                 return;
1667             }
1668             if (memcpy_s(disChanInfo, sizeof(ProxyChannelInfo), removeNode, sizeof(ProxyChannelInfo)) != EOK) {
1669                 SoftBusFree(removeNode);
1670                 SoftBusFree(disChanInfo);
1671                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
1672                 return;
1673             }
1674             TransProxyPostOpenFailMsgToLoop(removeNode, SOFTBUS_TRANS_HANDSHAKE_TIMEOUT);
1675             TransProxyPostDisConnectMsgToLoop(connId, isServer, disChanInfo);
1676         } else if (status == PROXY_CHANNEL_STATUS_CONNECTING_TIMEOUT) {
1677             (void)TransDelConnByReqId(removeNode->reqId);
1678             TransProxyPostOpenFailMsgToLoop(removeNode, SOFTBUS_TRANS_HANDSHAKE_TIMEOUT);
1679         } else if (status == PROXY_CHANNEL_STATUS_TIMEOUT) {
1680             TRANS_LOGI(TRANS_CTRL, "send keepalive channelId=%{public}d", removeNode->myId);
1681             TransProxyPostKeepAliveMsgToLoop(removeNode);
1682         } else {
1683             SoftBusFree(removeNode);
1684         }
1685     }
1686 }
1687 
TransProxyTimerProc(void)1688 void TransProxyTimerProc(void)
1689 {
1690     ProxyChannelInfo *removeNode = NULL;
1691     ProxyChannelInfo *nextNode = NULL;
1692     ListNode proxyProcList;
1693 
1694     TRANS_CHECK_AND_RETURN_LOGE(
1695         g_proxyChannelList != NULL, TRANS_CTRL, "g_proxyChannelList is null");
1696     TRANS_CHECK_AND_RETURN_LOGE(
1697         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_CTRL, "lock mutex fail!");
1698     if (g_proxyChannelList->cnt <= 0) {
1699         (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1700         return;
1701     }
1702 
1703     ListInit(&proxyProcList);
1704     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
1705         removeNode->timeout++;
1706         if (removeNode->status == PROXY_CHANNEL_STATUS_HANDSHAKEING ||
1707             removeNode->status == PROXY_CHANNEL_STATUS_PYH_CONNECTING) {
1708             if (removeNode->timeout >= PROXY_CHANNEL_CONTROL_TIMEOUT) {
1709                 removeNode->status = (removeNode->status == PROXY_CHANNEL_STATUS_HANDSHAKEING) ?
1710                     PROXY_CHANNEL_STATUS_HANDSHAKE_TIMEOUT : PROXY_CHANNEL_STATUS_CONNECTING_TIMEOUT;
1711                 TRANS_LOGE(TRANS_CTRL, "handshake is timeout. channelId=%{public}d", removeNode->myId);
1712                 ReleaseProxyChannelId(removeNode->channelId);
1713                 ListDelete(&(removeNode->node));
1714                 ListAdd(&proxyProcList, &(removeNode->node));
1715                 g_proxyChannelList->cnt--;
1716             }
1717         }
1718         if (removeNode->status == PROXY_CHANNEL_STATUS_KEEPLIVEING) {
1719             if (removeNode->timeout >= PROXY_CHANNEL_CONTROL_TIMEOUT) {
1720                 removeNode->status = PROXY_CHANNEL_STATUS_TIMEOUT;
1721                 TRANS_LOGE(TRANS_CTRL, "keepalvie is timeout. channelId=%{public}d", removeNode->myId);
1722                 ReleaseProxyChannelId(removeNode->channelId);
1723                 ListDelete(&(removeNode->node));
1724                 ListAdd(&proxyProcList, &(removeNode->node));
1725                 g_proxyChannelList->cnt--;
1726             }
1727         }
1728     }
1729     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1730     TransProxyTimerItemProc(&proxyProcList);
1731 }
1732 
TransWifiOnLineProc(const char * peerNetworkId)1733 static void TransWifiOnLineProc(const char *peerNetworkId)
1734 {
1735     TRANS_LOGI(TRANS_CTRL, "wifi is online");
1736     if (peerNetworkId == NULL) {
1737         TRANS_LOGE(TRANS_CTRL, "invalid networkId");
1738         return;
1739     }
1740     int ret = NotifyNearByOnMigrateEvents(peerNetworkId, WIFI_STA, true);
1741     if (ret == SOFTBUS_OK) {
1742         TRANS_LOGI(TRANS_CTRL, "notify upgrade migrate success");
1743         return;
1744     }
1745     TRANS_LOGE(TRANS_CTRL, "notify upgrade migrate fail");
1746 }
1747 
TransWifiOffLineProc(const char * peerNetworkId)1748 static void TransWifiOffLineProc(const char *peerNetworkId)
1749 {
1750     TRANS_LOGI(TRANS_CTRL, "wifi is offline");
1751     if (peerNetworkId == NULL) {
1752         TRANS_LOGE(TRANS_CTRL, "invalid networkId");
1753         return;
1754     }
1755     int ret = NotifyNearByOnMigrateEvents(peerNetworkId, WIFI_STA, false);
1756     if (ret == SOFTBUS_OK) {
1757         TRANS_LOGI(TRANS_CTRL, "notify degrade migrate success");
1758         return;
1759     }
1760     TRANS_LOGE(TRANS_CTRL, "notify degrade migrate fail");
1761 }
1762 
TransWifiStateChange(const LnnEventBasicInfo * info)1763 void TransWifiStateChange(const LnnEventBasicInfo *info)
1764 {
1765     TRANS_LOGI(TRANS_CTRL, "Start");
1766     if ((info == NULL) || (info->event != LNN_EVENT_NODE_MIGRATE)) {
1767         return;
1768     }
1769 
1770     LnnOnlineStateEventInfo *onlineStateInfo = (LnnOnlineStateEventInfo *)info;
1771     if (onlineStateInfo->isOnline == true) {
1772         TransWifiOnLineProc(onlineStateInfo->networkId);
1773     } else {
1774         TransWifiOffLineProc(onlineStateInfo->networkId);
1775     }
1776 }
1777 
TransNotifySingleNetworkOffLine(const LnnEventBasicInfo * info)1778 static void TransNotifySingleNetworkOffLine(const LnnEventBasicInfo *info)
1779 {
1780     if ((info == NULL) || (info->event != LNN_EVENT_SINGLE_NETWORK_OFFLINE)) {
1781         return;
1782     }
1783     LnnSingleNetworkOffLineEvent *offlineInfo = (LnnSingleNetworkOffLineEvent *)info;
1784     ConnectionAddrType type = offlineInfo->type;
1785     if (type == CONNECTION_ADDR_WLAN) {
1786         TransOnLinkDown(offlineInfo->networkId, offlineInfo->uuid, offlineInfo->udid, "", WIFI_STA);
1787     } else if (type == CONNECTION_ADDR_BLE) {
1788         TransOnLinkDown(offlineInfo->networkId, offlineInfo->uuid, offlineInfo->udid, "", BT_BLE);
1789     } else if (type == CONNECTION_ADDR_BR) {
1790         TransOnLinkDown(offlineInfo->networkId, offlineInfo->uuid, offlineInfo->udid, "", BT_BR);
1791     }
1792 }
1793 
TransNotifyOffLine(const LnnEventBasicInfo * info)1794 static void TransNotifyOffLine(const LnnEventBasicInfo *info)
1795 {
1796     TRANS_LOGI(TRANS_CTRL, "Trans Notify OffLine Start");
1797     if ((info == NULL) || (info->event != LNN_EVENT_NODE_ONLINE_STATE_CHANGED)) {
1798         return;
1799     }
1800     LnnOnlineStateEventInfo *onlineStateInfo = (LnnOnlineStateEventInfo *)info;
1801     if (onlineStateInfo->isOnline) {
1802         return;
1803     }
1804 
1805     TransOnLinkDown(onlineStateInfo->networkId, onlineStateInfo->uuid, onlineStateInfo->udid, "", WIFI_P2P);
1806     TransOnLinkDown(onlineStateInfo->networkId, onlineStateInfo->uuid, onlineStateInfo->udid, "", WIFI_STA);
1807     TransOnLinkDown(onlineStateInfo->networkId, onlineStateInfo->uuid, onlineStateInfo->udid, "", BT_BR);
1808     TransOnLinkDown(onlineStateInfo->networkId, onlineStateInfo->uuid, onlineStateInfo->udid, "", BT_BLE);
1809 }
1810 
TransProxyManagerInitInner(const IServerChannelCallBack * cb)1811 static int32_t TransProxyManagerInitInner(const IServerChannelCallBack *cb)
1812 {
1813     int32_t ret = TransProxySetCallBack(cb);
1814     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_INIT, "TransProxySetCallBack fail");
1815 
1816     g_proxyChannelList = CreateSoftBusList();
1817     if (g_proxyChannelList == NULL) {
1818         TRANS_LOGE(TRANS_INIT, "proxy manager init inner failed");
1819         return SOFTBUS_MALLOC_ERR;
1820     }
1821     return SOFTBUS_OK;
1822 }
1823 
TransProxyManagerInit(const IServerChannelCallBack * cb)1824 int32_t TransProxyManagerInit(const IServerChannelCallBack *cb)
1825 {
1826     int32_t ret = TransProxyManagerInitInner(cb);
1827     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_INIT, "init proxy manager failed");
1828 
1829     ret = TransProxyTransInit();
1830     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_INIT, "TransProxyTransInit fail");
1831 
1832     ret = RegisterTimeoutCallback(SOFTBUS_PROXYCHANNEL_TIMER_FUN, TransProxyTimerProc);
1833     if (ret != SOFTBUS_OK) {
1834         DestroySoftBusList(g_proxyChannelList);
1835         TRANS_LOGE(TRANS_INIT, "trans proxy register timeout callback failed.");
1836         return ret;
1837     }
1838 
1839     ret = LnnRegisterEventHandler(LNN_EVENT_SINGLE_NETWORK_OFFLINE, TransNotifySingleNetworkOffLine);
1840     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
1841         TRANS_INIT, "register TransNotifySingleNetworkOffLine failed.");
1842 
1843     ret = LnnRegisterEventHandler(LNN_EVENT_NODE_ONLINE_STATE_CHANGED, TransNotifyOffLine);
1844     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_INIT, "register TransNotifyOffLine failed.");
1845 
1846     ret = LnnRegisterEventHandler(LNN_EVENT_NODE_MIGRATE, TransWifiStateChange);
1847     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_INIT, "TransWifiStateChange register fail");
1848 
1849     TRANS_LOGI(TRANS_INIT, "proxy channel init ok");
1850     return SOFTBUS_OK;
1851 }
1852 
TransProxyGetNameByChanId(int32_t chanId,char * pkgName,char * sessionName,uint16_t pkgLen,uint16_t sessionLen)1853 int32_t TransProxyGetNameByChanId(int32_t chanId, char *pkgName, char *sessionName,
1854     uint16_t pkgLen, uint16_t sessionLen)
1855 {
1856     TRANS_CHECK_AND_RETURN_RET_LOGE((pkgName != NULL && sessionName != NULL), SOFTBUS_INVALID_PARAM, TRANS_CTRL,
1857         "invalid param");
1858     ProxyChannelInfo *chan = (ProxyChannelInfo *)SoftBusCalloc(sizeof(ProxyChannelInfo));
1859     TRANS_CHECK_AND_RETURN_RET_LOGE(chan != NULL, SOFTBUS_MALLOC_ERR, TRANS_CTRL, "malloc err");
1860     int32_t ret = TransProxyGetChanByChanId(chanId, chan);
1861     (void)memset_s(chan->appInfo.sessionKey, sizeof(chan->appInfo.sessionKey), 0, sizeof(chan->appInfo.sessionKey));
1862     if (ret != SOFTBUS_OK) {
1863         TRANS_LOGE(TRANS_CTRL, "get channel info by chanId failed. chanId=%{public}d", chanId);
1864         SoftBusFree(chan);
1865         return ret;
1866     }
1867     ret = TransProxyGetPkgName(chan->appInfo.myData.sessionName, pkgName, pkgLen);
1868     if (ret != SOFTBUS_OK) {
1869         TRANS_LOGE(TRANS_CTRL, "get pkgName failed");
1870         SoftBusFree(chan);
1871         return ret;
1872     }
1873     if (strcpy_s(sessionName, sessionLen, chan->appInfo.myData.sessionName) != EOK) {
1874         TRANS_LOGE(TRANS_CTRL, "strcpy_s failed");
1875         SoftBusFree(chan);
1876         return SOFTBUS_STRCPY_ERR;
1877     }
1878     SoftBusFree(chan);
1879     return SOFTBUS_OK;
1880 }
1881 
TransProxyManagerDeinitInner(void)1882 static void TransProxyManagerDeinitInner(void)
1883 {
1884     TRANS_CHECK_AND_RETURN_LOGE(
1885         g_proxyChannelList != NULL, TRANS_INIT, "g_proxyChannelList is null");
1886     TRANS_CHECK_AND_RETURN_LOGE(
1887         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, TRANS_INIT, "lock mutex fail!");
1888     ProxyChannelInfo *item = NULL;
1889     ProxyChannelInfo *nextNode = NULL;
1890     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
1891         ReleaseProxyChannelId(item->channelId);
1892         ListDelete(&(item->node));
1893         if (item->appInfo.fastTransData != NULL) {
1894             SoftBusFree((void *)item->appInfo.fastTransData);
1895         }
1896         SoftBusFree(item);
1897     }
1898     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1899 
1900     DestroySoftBusList(g_proxyChannelList);
1901 }
1902 
TransProxyManagerDeinit(void)1903 void TransProxyManagerDeinit(void)
1904 {
1905     TransProxyManagerDeinitInner();
1906 
1907     (void)RegisterTimeoutCallback(SOFTBUS_PROXYCHANNEL_TIMER_FUN, NULL);
1908 }
1909 
TransProxyDestroyChannelList(const ListNode * destroyList)1910 static void TransProxyDestroyChannelList(const ListNode *destroyList)
1911 {
1912     TRANS_LOGD(TRANS_CTRL, "enter.");
1913     TRANS_CHECK_AND_RETURN_LOGE(
1914         (destroyList != NULL && !IsListEmpty(destroyList)), TRANS_INIT, "destroyList is null");
1915     ProxyChannelInfo *destroyNode = NULL;
1916     ProxyChannelInfo *nextDestroyNode = NULL;
1917     LIST_FOR_EACH_ENTRY_SAFE(destroyNode, nextDestroyNode, destroyList, ProxyChannelInfo, node) {
1918         ListDelete(&(destroyNode->node));
1919         TransProxyResetPeer(destroyNode);
1920         TransProxyCloseConnChannel(destroyNode->connId, destroyNode->isServer);
1921         if (destroyNode->appInfo.fastTransData != NULL) {
1922             SoftBusFree((void *)destroyNode->appInfo.fastTransData);
1923         }
1924         (void)memset_s(destroyNode->appInfo.sessionKey, sizeof(destroyNode->appInfo.sessionKey), 0,
1925             sizeof(destroyNode->appInfo.sessionKey));
1926         SoftBusFree(destroyNode);
1927     }
1928     return;
1929 }
1930 
TransProxyDeathCallback(const char * pkgName,int32_t pid)1931 void TransProxyDeathCallback(const char *pkgName, int32_t pid)
1932 {
1933     TRANS_CHECK_AND_RETURN_LOGE(
1934         (pkgName != NULL && g_proxyChannelList != NULL), TRANS_CTRL, "pkgName or proxy channel list is null.");
1935     char *anonymizePkgName = NULL;
1936     Anonymize(pkgName, &anonymizePkgName);
1937     TRANS_LOGW(TRANS_CTRL, "pkgName=%{public}s, pid=%{public}d", anonymizePkgName, pid);
1938     AnonymizeFree(anonymizePkgName);
1939     ListNode destroyList;
1940     ListInit(&destroyList);
1941     ProxyChannelInfo *item = NULL;
1942     ProxyChannelInfo *nextNode = NULL;
1943     if (SoftBusMutexLock(&g_proxyChannelList->lock) != SOFTBUS_OK) {
1944         TRANS_LOGE(TRANS_CTRL, "lock mutex fail!");
1945         return;
1946     }
1947     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
1948         if ((strcmp(item->appInfo.myData.pkgName, pkgName) == 0) && (item->appInfo.myData.pid == pid)) {
1949             ReleaseProxyChannelId(item->channelId);
1950             ListDelete(&(item->node));
1951             g_proxyChannelList->cnt--;
1952             ListAdd(&destroyList, &(item->node));
1953             TRANS_LOGI(TRANS_CTRL, "add channelId=%{public}d", item->channelId);
1954         }
1955     }
1956     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1957     TransProxyDestroyChannelList(&destroyList);
1958     TRANS_LOGD(TRANS_CTRL, "ok");
1959 }
1960 
TransProxyGetAppInfoByChanId(int32_t chanId,AppInfo * appInfo)1961 int32_t TransProxyGetAppInfoByChanId(int32_t chanId, AppInfo *appInfo)
1962 {
1963     TRANS_CHECK_AND_RETURN_RET_LOGE(appInfo != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL,
1964         "invalid param");
1965 
1966     ProxyChannelInfo *item = NULL;
1967     ProxyChannelInfo *nextNode = NULL;
1968 
1969     TRANS_CHECK_AND_RETURN_RET_LOGE(
1970         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
1971     TRANS_CHECK_AND_RETURN_RET_LOGE(
1972         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
1973 
1974     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
1975         if (item->channelId == chanId) {
1976             if (memcpy_s(appInfo, sizeof(AppInfo), &item->appInfo, sizeof(AppInfo)) != EOK) {
1977                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1978                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
1979                 return SOFTBUS_MEM_ERR;
1980             }
1981             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1982             return SOFTBUS_OK;
1983         }
1984     }
1985     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
1986     TRANS_LOGE(TRANS_CTRL, "Proxy channel not find: channelId=%{public}d", chanId);
1987     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1988 }
1989 
TransProxyGetConnIdByChanId(int32_t channelId,int32_t * connId)1990 int32_t TransProxyGetConnIdByChanId(int32_t channelId, int32_t *connId)
1991 {
1992     TRANS_CHECK_AND_RETURN_RET_LOGE(connId != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL,
1993         "invalid param");
1994 
1995     ProxyChannelInfo *item = NULL;
1996 
1997     TRANS_CHECK_AND_RETURN_RET_LOGE(
1998         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
1999     TRANS_CHECK_AND_RETURN_RET_LOGE(
2000         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
2001 
2002     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
2003         if (item->channelId == channelId) {
2004             if (item->status == PROXY_CHANNEL_STATUS_COMPLETED ||
2005                 item->status == PROXY_CHANNEL_STATUS_KEEPLIVEING) {
2006                 *connId = (int32_t)item->connId;
2007                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2008                 return SOFTBUS_OK;
2009             } else {
2010                 TRANS_LOGE(TRANS_CTRL, "g_proxyChannel status error");
2011                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2012                 return SOFTBUS_TRANS_PROXY_CHANNLE_STATUS_INVALID;
2013             }
2014         }
2015     }
2016     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2017     return SOFTBUS_TRANS_NODE_NOT_FOUND;
2018 }
2019 
TransProxyGetProxyChannelInfoByChannelId(int32_t channelId,ProxyChannelInfo * chan)2020 static int32_t TransProxyGetProxyChannelInfoByChannelId(int32_t channelId, ProxyChannelInfo *chan)
2021 {
2022     if (g_proxyChannelList == NULL) {
2023         TRANS_LOGE(TRANS_CTRL, "g_proxyChannelList is null");
2024         return SOFTBUS_INVALID_PARAM;
2025     }
2026     if (SoftBusMutexLock(&g_proxyChannelList->lock) != SOFTBUS_OK) {
2027         TRANS_LOGE(TRANS_CTRL, "lock mutex fail!");
2028         return SOFTBUS_LOCK_ERR;
2029     }
2030     ProxyChannelInfo *item = NULL;
2031     LIST_FOR_EACH_ENTRY(item, &g_proxyChannelList->list, ProxyChannelInfo, node) {
2032         if (item->channelId == channelId) {
2033             if (item->status != PROXY_CHANNEL_STATUS_COMPLETED && item->status != PROXY_CHANNEL_STATUS_KEEPLIVEING) {
2034                 TRANS_LOGE(TRANS_CTRL, "invalid status=%{public}d, channelId=%{public}d", item->status, channelId);
2035                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2036                 return SOFTBUS_TRANS_PROXY_CHANNLE_STATUS_INVALID;
2037             }
2038             if (memcpy_s(chan, sizeof(ProxyChannelInfo), item, sizeof(ProxyChannelInfo)) != EOK) {
2039                 (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2040                 TRANS_LOGE(TRANS_CTRL, "memcpy_s failed");
2041                 return SOFTBUS_MEM_ERR;
2042             }
2043             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2044             return SOFTBUS_OK;
2045         }
2046     }
2047     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2048     TRANS_LOGE(TRANS_CTRL, "not found proxy channel info by channelId=%{public}d", channelId);
2049     return SOFTBUS_TRANS_NODE_NOT_FOUND;
2050 }
2051 
TransProxyUdpateNewPeerUdidHash(const char * deviceId,ConnectOption * connOpt)2052 static int32_t TransProxyUdpateNewPeerUdidHash(const char *deviceId, ConnectOption *connOpt)
2053 {
2054     uint8_t udidHash[UDID_HASH_LEN] = { 0 };
2055     int32_t ret = SoftBusGenerateStrHash((const unsigned char *)deviceId, strlen(deviceId), udidHash);
2056     if (ret != SOFTBUS_OK) {
2057         TRANS_LOGE(TRANS_CTRL, "Generate UDID HexStringHash fail, ret=%{public}d", ret);
2058         return ret;
2059     }
2060     if (memcpy_s(connOpt->bleOption.deviceIdHash, UDID_HASH_LEN, udidHash, UDID_HASH_LEN) != EOK) {
2061         TRANS_LOGE(TRANS_CTRL, "memcpy_s udid hash err");
2062         return SOFTBUS_MEM_ERR;
2063     }
2064     return SOFTBUS_OK;
2065 }
2066 
TransProxyGetConnOptionByChanId(int32_t channelId,ConnectOption * connOpt)2067 int32_t TransProxyGetConnOptionByChanId(int32_t channelId, ConnectOption *connOpt)
2068 {
2069     TRANS_CHECK_AND_RETURN_RET_LOGE(connOpt != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "invalid param");
2070     ProxyChannelInfo chan;
2071     (void)memset_s(&chan, sizeof(ProxyChannelInfo), 0, sizeof(ProxyChannelInfo));
2072     int32_t ret = TransProxyGetProxyChannelInfoByChannelId(channelId, &chan);
2073     if (ret != SOFTBUS_OK) {
2074         TRANS_LOGE(TRANS_CTRL, "get proxy channel info fail, channelId=%{public}d, ret=%{public}d", channelId, ret);
2075         return ret;
2076     }
2077 
2078     ret = TransProxyGetConnInfoByConnId(chan.connId, connOpt);
2079     if (ret != SOFTBUS_OK) {
2080         TRANS_LOGE(TRANS_CTRL, "get conn optinfo fail, channelId=%{public}d, connId=%{public}d, ret=%{public}d",
2081             chan.channelId, chan.connId, ret);
2082         return ret;
2083     }
2084 
2085     ret = TransProxyUdpateNewPeerUdidHash(chan.appInfo.peerData.deviceId, connOpt);
2086     if (ret != SOFTBUS_OK) {
2087         TRANS_LOGE(TRANS_CTRL, "get new peer udid hash fail, channelId=%{public}d, connId=%{public}d, ret=%{public}d",
2088             chan.channelId, chan.connId, ret);
2089         return ret;
2090     }
2091 
2092     char udidHashStr[HEXIFY_LEN(SHORT_UDID_HASH_LEN)] = { 0 };
2093     ret = ConvertBytesToHexString(udidHashStr, HEXIFY_LEN(SHORT_UDID_HASH_LEN),
2094         (unsigned char *)connOpt->bleOption.deviceIdHash, SHORT_UDID_HASH_LEN);
2095     if (ret != SOFTBUS_OK) {
2096         TRANS_LOGE(
2097             TRANS_CTRL, "convert udid hash to string fail, channelId=%{public}d, connId=%{public}d, ret=%{public}d",
2098             chan.channelId, chan.connId, ret);
2099         return ret;
2100     }
2101 
2102     char *udidHash = NULL;
2103     Anonymize(udidHashStr, &udidHash);
2104     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, connId=%{public}d, udidHash=%{public}s",
2105         chan.channelId, chan.connId, AnonymizeWrapper(udidHash));
2106     AnonymizeFree(udidHash);
2107     return SOFTBUS_OK;
2108 }
2109 
TransProxySetAuthHandleByChanId(int32_t channelId,AuthHandle authHandle)2110 int32_t TransProxySetAuthHandleByChanId(int32_t channelId, AuthHandle authHandle)
2111 {
2112     ProxyChannelInfo *item = NULL;
2113     ProxyChannelInfo *nextNode = NULL;
2114 
2115     TRANS_CHECK_AND_RETURN_RET_LOGE(
2116         g_proxyChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_proxyChannelList is null");
2117     TRANS_CHECK_AND_RETURN_RET_LOGE(
2118         SoftBusMutexLock(&g_proxyChannelList->lock) == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
2119 
2120     LIST_FOR_EACH_ENTRY_SAFE(item, nextNode, &g_proxyChannelList->list, ProxyChannelInfo, node) {
2121         if (item->channelId == channelId) {
2122             item->authHandle.authId = authHandle.authId;
2123             item->authHandle.type = authHandle.type;
2124             (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2125             return SOFTBUS_OK;
2126         }
2127     }
2128     (void)SoftBusMutexUnlock(&g_proxyChannelList->lock);
2129     TRANS_LOGE(TRANS_CTRL, "proxy channel not found by chanId, chanId=%{public}d", channelId);
2130     return SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND;
2131 }
2132