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