1 /*
2 * Copyright (c) 2022 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
16 #include "lnn_sync_info_manager.h"
17
18 #include <securec.h>
19 #include <string.h>
20
21 #include "anonymizer.h"
22 #include "auth_manager.h"
23 #include "bus_center_event.h"
24 #include "bus_center_manager.h"
25 #include "common_list.h"
26 #include "lnn_async_callback_utils.h"
27 #include "lnn_distributed_net_ledger.h"
28 #include "lnn_feature_capability.h"
29 #include "lnn_net_builder.h"
30 #include "lnn_log.h"
31 #include "message_handler.h"
32 #include "softbus_adapter_json.h"
33 #include "softbus_adapter_mem.h"
34 #include "softbus_adapter_thread.h"
35 #include "softbus_adapter_timer.h"
36 #include "softbus_bus_center.h"
37 #include "softbus_conn_interface.h"
38 #include "softbus_def.h"
39 #include "softbus_error_code.h"
40 #include "softbus_transmission_interface.h"
41
42 #define MSG_HEAD_LEN 4
43 #define MAX_SYNC_INFO_MSG_LEN 4096
44 #define UNUSED_CHANNEL_CLOSED_DELAY (60 * 1000)
45 #define TIME_CONVERSION_UNIT 1000
46 #define CHANNEL_NAME "com.huawei.hwddmp.service.DeviceInfoSynchronize"
47 #define WIFI_OFFLINE_CODE_LEN 4
48 #define NETWORK_SYNC_CONN_CAP "conn_cap_long"
49 #define NETWORK_SYNC_TYPE "networking_type"
50 #define NETWORK_SYNC_SEQ "auth_seq"
51 #define NETWORK_OFFLINE_PORT "offline_port"
52 #define NETWORK_OFFLINE_CODE "offline_code"
53
54 typedef struct {
55 uint32_t dataLen;
56 LnnSyncInfoMsgComplete complete;
57 ListNode node;
58 uint8_t data[0];
59 } SyncInfoMsg;
60
61 typedef struct {
62 char networkId[NETWORK_ID_BUF_LEN];
63 bool isClientOpened;
64 int32_t clientChannelId;
65 int32_t serverChannelId;
66 ListNode node;
67 ListNode syncMsgList;
68 SoftBusSysTime accessTime;
69 } SyncChannelInfo;
70
71 typedef struct {
72 ListNode channelInfoList;
73 LnnSyncInfoMsgHandler handlers[LNN_INFO_TYPE_COUNT];
74 SoftBusMutex lock;
75 } SyncInfoManager;
76
77 static SyncInfoManager g_syncInfoManager;
78
ClearSyncInfoMsg(SyncChannelInfo * info,ListNode * list)79 static void ClearSyncInfoMsg(SyncChannelInfo *info, ListNode *list)
80 {
81 SyncInfoMsg *item = NULL;
82 SyncInfoMsg *next = NULL;
83
84 LIST_FOR_EACH_ENTRY_SAFE(item, next, list, SyncInfoMsg, node) {
85 ListDelete(&item->node);
86 if (item->complete != NULL) {
87 item->complete((LnnSyncInfoType)(*(uint32_t *)item->data), info->networkId,
88 &item->data[MSG_HEAD_LEN], item->dataLen - MSG_HEAD_LEN);
89 }
90 SoftBusFree(item);
91 }
92 }
93
ClearSyncChannelInfo(void)94 static void ClearSyncChannelInfo(void)
95 {
96 SyncChannelInfo *item = NULL;
97 SyncChannelInfo *next = NULL;
98
99 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_syncInfoManager.channelInfoList, SyncChannelInfo, node) {
100 ListDelete(&item->node);
101 ClearSyncInfoMsg(item, &item->syncMsgList);
102 SoftBusFree(item);
103 }
104 }
105
FindSyncChannelInfoByNetworkId(const char * networkId)106 static SyncChannelInfo *FindSyncChannelInfoByNetworkId(const char *networkId)
107 {
108 SyncChannelInfo *item = NULL;
109 SyncChannelInfo *next = NULL;
110
111 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_syncInfoManager.channelInfoList, SyncChannelInfo, node) {
112 if (strcmp(item->networkId, networkId) == 0) {
113 return item;
114 }
115 }
116 return NULL;
117 }
118
FindSyncChannelInfoByChannelId(int32_t channelId)119 static SyncChannelInfo *FindSyncChannelInfoByChannelId(int32_t channelId)
120 {
121 SyncChannelInfo *item = NULL;
122 SyncChannelInfo *next = NULL;
123
124 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_syncInfoManager.channelInfoList, SyncChannelInfo, node) {
125 if (item->clientChannelId == channelId || item->serverChannelId == channelId) {
126 return item;
127 }
128 }
129 return NULL;
130 }
131
CreateSyncChannelInfo(const char * networkId)132 static SyncChannelInfo *CreateSyncChannelInfo(const char *networkId)
133 {
134 SyncChannelInfo *item = (SyncChannelInfo *)SoftBusMalloc(sizeof(SyncChannelInfo));
135 if (item == NULL) {
136 LNN_LOGE(LNN_BUILDER, "malloc sync channel info fail");
137 return NULL;
138 }
139 ListInit(&item->node);
140 ListInit(&item->syncMsgList);
141 if (strcpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId) != EOK) {
142 LNN_LOGE(LNN_BUILDER, "copy network id to sync channel info fail");
143 SoftBusFree(item);
144 return NULL;
145 }
146 item->clientChannelId = INVALID_CHANNEL_ID;
147 item->serverChannelId = INVALID_CHANNEL_ID;
148 SoftBusGetTime(&item->accessTime);
149 item->isClientOpened = false;
150 return item;
151 }
152
CreateSyncInfoMsg(LnnSyncInfoType type,const uint8_t * msg,uint32_t len,LnnSyncInfoMsgComplete complete)153 static SyncInfoMsg *CreateSyncInfoMsg(LnnSyncInfoType type, const uint8_t *msg,
154 uint32_t len, LnnSyncInfoMsgComplete complete)
155 {
156 uint32_t dataLen = len + MSG_HEAD_LEN;
157 SyncInfoMsg *syncMsg = NULL;
158
159 if (dataLen > MAX_SYNC_INFO_MSG_LEN) {
160 LNN_LOGE(LNN_BUILDER, "sync info msg length too large. type=%{public}d, len=%{public}u",
161 type, dataLen);
162 return NULL;
163 }
164 syncMsg = (SyncInfoMsg *)SoftBusMalloc(sizeof(SyncInfoMsg) + dataLen);
165 if (syncMsg == NULL) {
166 LNN_LOGE(LNN_BUILDER, "malloc sync info msg fail. type=%{public}d, len=%{public}u",
167 type, dataLen);
168 return NULL;
169 }
170 *(int32_t *)syncMsg->data = type;
171 if (memcpy_s(syncMsg->data + MSG_HEAD_LEN, dataLen - MSG_HEAD_LEN, msg, len) != EOK) {
172 LNN_LOGE(LNN_BUILDER, "copy sync info msg fail. type=%{public}d, len=%{public}u",
173 type, dataLen);
174 SoftBusFree(syncMsg);
175 return NULL;
176 }
177 ListInit(&syncMsg->node);
178 syncMsg->complete = complete;
179 syncMsg->dataLen = dataLen;
180 return syncMsg;
181 }
182
SendSyncInfoMsgOnly(const char * networkId,int32_t clientChannelId,SyncInfoMsg * msg)183 static void SendSyncInfoMsgOnly(const char *networkId, int32_t clientChannelId, SyncInfoMsg *msg)
184 {
185 LNN_LOGI(LNN_BUILDER, "only send sync info");
186 if (TransSendNetworkingMessage(clientChannelId, (char *)msg->data, msg->dataLen, CONN_HIGH) != SOFTBUS_OK) {
187 LNN_LOGE(LNN_BUILDER, "trans send data fail");
188 }
189 if (msg->complete != NULL) {
190 msg->complete((LnnSyncInfoType)(*(uint32_t *)msg->data), networkId,
191 &msg->data[MSG_HEAD_LEN], msg->dataLen - MSG_HEAD_LEN);
192 }
193 SoftBusFree(msg);
194 }
195
SendSyncInfoMsg(SyncChannelInfo * info,SyncInfoMsg * msg)196 static void SendSyncInfoMsg(SyncChannelInfo *info, SyncInfoMsg *msg)
197 {
198 if (TransSendNetworkingMessage(info->clientChannelId, (char *)msg->data, msg->dataLen, CONN_HIGH) != SOFTBUS_OK) {
199 LNN_LOGE(LNN_BUILDER, "trans send data fail");
200 }
201 SoftBusGetTime(&info->accessTime);
202 ListDelete(&msg->node);
203 if (msg->complete != NULL) {
204 msg->complete((LnnSyncInfoType)(*(uint32_t *)msg->data), info->networkId,
205 &msg->data[MSG_HEAD_LEN], msg->dataLen - MSG_HEAD_LEN);
206 }
207 SoftBusFree(msg);
208 }
209
CloseUnusedChannel(void * para)210 static void CloseUnusedChannel(void *para)
211 {
212 SyncChannelInfo *item = NULL;
213 SyncChannelInfo *itemNext = NULL;
214 SoftBusSysTime now;
215 int64_t diff;
216
217 (void)para;
218 LNN_LOGD(LNN_BUILDER, "try close unused channel");
219 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
220 LNN_LOGE(LNN_BUILDER, "close unused channel lock fail");
221 return;
222 }
223 SoftBusGetTime(&now);
224 LIST_FOR_EACH_ENTRY_SAFE(item, itemNext, &g_syncInfoManager.channelInfoList, SyncChannelInfo, node) {
225 if (!IsListEmpty(&item->syncMsgList)) {
226 continue;
227 }
228 if (item->clientChannelId == INVALID_CHANNEL_ID) {
229 continue;
230 }
231 diff = (now.sec - item->accessTime.sec) * TIME_CONVERSION_UNIT +
232 (now.usec - item->accessTime.usec) / TIME_CONVERSION_UNIT;
233 if (diff <= UNUSED_CHANNEL_CLOSED_DELAY) {
234 continue;
235 }
236 (void)TransCloseNetWorkingChannel(item->clientChannelId);
237 item->clientChannelId = INVALID_CHANNEL_ID;
238 item->isClientOpened = false;
239 if (item->serverChannelId == INVALID_CHANNEL_ID) {
240 ListDelete(&item->node);
241 SoftBusFree(item);
242 }
243 }
244 if (!IsListEmpty(&g_syncInfoManager.channelInfoList)) {
245 (void)LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT),
246 CloseUnusedChannel, NULL, UNUSED_CHANNEL_CLOSED_DELAY);
247 }
248 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
249 }
250
DestroySyncInfoMsgList(ListNode * list)251 static void DestroySyncInfoMsgList(ListNode *list)
252 {
253 SyncInfoMsg *item = NULL;
254 SyncInfoMsg *next = NULL;
255 LIST_FOR_EACH_ENTRY_SAFE(item, next, list, SyncInfoMsg, node) {
256 ListDelete(&item->node);
257 SoftBusFree(item);
258 }
259 }
260
DumpMsgExcludeListNode(const SyncInfoMsg * msg)261 static SyncInfoMsg *DumpMsgExcludeListNode(const SyncInfoMsg *msg)
262 {
263 if (msg == NULL) {
264 LNN_LOGE(LNN_BUILDER, "invalid param");
265 return NULL;
266 }
267 SyncInfoMsg *newMsg = (SyncInfoMsg *)SoftBusCalloc(sizeof(SyncInfoMsg) + msg->dataLen);
268 if (newMsg == NULL) {
269 LNN_LOGE(LNN_BUILDER, "malloc err");
270 return NULL;
271 }
272 newMsg->complete = msg->complete;
273 newMsg->dataLen = msg->dataLen;
274 if (memcpy_s(newMsg->data, newMsg->dataLen, msg->data, msg->dataLen) != EOK) {
275 LNN_LOGE(LNN_BUILDER, "memcpy err");
276 SoftBusFree(newMsg);
277 return NULL;
278 }
279 return newMsg;
280 }
281
DumpSyncInfoMsgList(const ListNode * srcList,ListNode * dstList)282 static int32_t DumpSyncInfoMsgList(const ListNode *srcList, ListNode *dstList)
283 {
284 if (srcList == NULL || dstList == NULL) {
285 LNN_LOGE(LNN_BUILDER, "invalid param");
286 return SOFTBUS_INVALID_PARAM;
287 }
288 SyncInfoMsg *item = NULL;
289 SyncInfoMsg *newItem = NULL;
290 LIST_FOR_EACH_ENTRY(item, srcList, SyncInfoMsg, node) {
291 newItem = DumpMsgExcludeListNode(item);
292 if (newItem == NULL) {
293 LNN_LOGE(LNN_BUILDER, "dump msg node fail");
294 return SOFTBUS_MALLOC_ERR;
295 }
296 LNN_LOGD(LNN_BUILDER, "add node");
297 ListInit(&newItem->node);
298 ListNodeInsert(dstList, &newItem->node);
299 }
300 return SOFTBUS_OK;
301 }
302
DumpSyncChannelInfo(const SyncChannelInfo * info)303 static SyncChannelInfo *DumpSyncChannelInfo(const SyncChannelInfo *info)
304 {
305 SyncChannelInfo *newInfo = (SyncChannelInfo *)SoftBusCalloc(sizeof(SyncChannelInfo));
306 if (newInfo == NULL) {
307 LNN_LOGE(LNN_BUILDER, "malloc err");
308 return NULL;
309 }
310 ListInit(&newInfo->node);
311 ListInit(&newInfo->syncMsgList);
312 if (strcpy_s(newInfo->networkId, NETWORK_ID_BUF_LEN, info->networkId) != EOK) {
313 LNN_LOGE(LNN_BUILDER, "copy network id fail");
314 SoftBusFree(newInfo);
315 return NULL;
316 }
317 newInfo->clientChannelId = info->clientChannelId;
318 newInfo->serverChannelId = info->serverChannelId;
319 newInfo->accessTime = info->accessTime;
320 newInfo->isClientOpened = info->isClientOpened;
321
322 if (DumpSyncInfoMsgList(&info->syncMsgList, &newInfo->syncMsgList) != SOFTBUS_OK) {
323 LNN_LOGE(LNN_BUILDER, "dump sync info msg list fail");
324 DestroySyncInfoMsgList(&newInfo->syncMsgList);
325 SoftBusFree(newInfo);
326 return NULL;
327 }
328 return newInfo;
329 }
330
SendSyncInfoMsgFromList(SyncChannelInfo * info)331 static void SendSyncInfoMsgFromList(SyncChannelInfo *info)
332 {
333 SyncInfoMsg *msg = NULL;
334 SyncInfoMsg *msgNext = NULL;
335
336 LIST_FOR_EACH_ENTRY_SAFE(msg, msgNext, &info->syncMsgList, SyncInfoMsg, node) {
337 SendSyncInfoMsg(info, msg);
338 }
339 }
340
ResetOpenChannelInfo(int32_t channelId,unsigned char isServer,SyncChannelInfo * info,int32_t * oldChannelId)341 static void ResetOpenChannelInfo(int32_t channelId, unsigned char isServer,
342 SyncChannelInfo *info, int32_t *oldChannelId)
343 {
344 SoftBusGetTime(&info->accessTime);
345 if (isServer) {
346 if (info->serverChannelId != channelId && info->serverChannelId != INVALID_CHANNEL_ID) {
347 LNN_LOGD(LNN_BUILDER, "reset sync info server channel. serverChannelId=%{public}d, channelId=%{public}d",
348 info->serverChannelId, channelId);
349 *oldChannelId = info->serverChannelId;
350 }
351 info->serverChannelId = channelId;
352 } else {
353 info->isClientOpened = true;
354 if (info->clientChannelId != channelId && info->clientChannelId != INVALID_CHANNEL_ID) {
355 LNN_LOGD(LNN_BUILDER, "reset sync info client channel. clientChannelId=%{public}d, channelId=%{public}d",
356 info->clientChannelId, channelId);
357 *oldChannelId = info->clientChannelId;
358 }
359 info->clientChannelId = channelId;
360 }
361 }
362
AddChannelInfoNode(const char * networkId,int32_t channelId,unsigned char isServer)363 static int32_t AddChannelInfoNode(const char *networkId, int32_t channelId, unsigned char isServer)
364 {
365 if (!isServer) {
366 LNN_LOGI(LNN_BUILDER, "unexpected client channel opened");
367 return SOFTBUS_INVALID_PARAM;
368 }
369 SyncChannelInfo *info = CreateSyncChannelInfo(networkId);
370 if (info == NULL) {
371 LNN_LOGE(LNN_BUILDER, "creat sync channel info fail");
372 return SOFTBUS_MALLOC_ERR;
373 }
374 if (IsListEmpty(&g_syncInfoManager.channelInfoList)) {
375 (void)LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT),
376 CloseUnusedChannel, NULL, UNUSED_CHANNEL_CLOSED_DELAY);
377 }
378 info->serverChannelId = channelId;
379 ListNodeInsert(&g_syncInfoManager.channelInfoList, &info->node);
380 return SOFTBUS_OK;
381 }
382
OnChannelOpened(int32_t channelId,const char * peerUuid,unsigned char isServer)383 static int32_t OnChannelOpened(int32_t channelId, const char *peerUuid, unsigned char isServer)
384 {
385 char networkId[NETWORK_ID_BUF_LEN] = {0};
386 SyncChannelInfo *info = NULL;
387
388 int32_t ret = LnnConvertDlId(peerUuid, CATEGORY_UUID, CATEGORY_NETWORK_ID, networkId, NETWORK_ID_BUF_LEN);
389 if (ret != SOFTBUS_OK) {
390 LNN_LOGI(LNN_BUILDER, "peer device not online");
391 return ret;
392 }
393 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
394 LNN_LOGE(LNN_BUILDER, "sync channel opened lock fail");
395 return SOFTBUS_LOCK_ERR;
396 }
397 char *anonyNetworkId = NULL;
398 Anonymize(networkId, &anonyNetworkId);
399 LNN_LOGI(LNN_BUILDER,
400 "channelId=%{public}d, networkId=%{public}s, server=%{public}u",
401 channelId, AnonymizeWrapper(anonyNetworkId), isServer);
402 AnonymizeFree(anonyNetworkId);
403 info = FindSyncChannelInfoByNetworkId(networkId);
404 if (info == NULL) {
405 ret = AddChannelInfoNode((char *)networkId, channelId, isServer);
406 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
407 return ret;
408 }
409 int32_t oldChannelId = INVALID_CHANNEL_ID;
410 ResetOpenChannelInfo(channelId, isServer, info, &oldChannelId);
411 SyncChannelInfo *newInfo = NULL;
412 if (!isServer) {
413 newInfo = DumpSyncChannelInfo(info);
414 if (newInfo == NULL) {
415 LNN_LOGE(LNN_BUILDER, "client dump sync channel info fail");
416 }
417 DestroySyncInfoMsgList(&info->syncMsgList);
418 }
419 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
420 if (oldChannelId != INVALID_CHANNEL_ID) {
421 (void)TransCloseNetWorkingChannel(oldChannelId);
422 }
423 if (newInfo != NULL) {
424 if (!IsListEmpty(&newInfo->syncMsgList)) {
425 SendSyncInfoMsgFromList(newInfo);
426 }
427 SoftBusFree(newInfo);
428 }
429 return SOFTBUS_OK;
430 }
431
OnChannelCloseCommon(SyncChannelInfo * info,int32_t channelId)432 static void OnChannelCloseCommon(SyncChannelInfo *info, int32_t channelId)
433 {
434 if (info->serverChannelId == channelId) {
435 info->serverChannelId = INVALID_CHANNEL_ID;
436 } else {
437 ClearSyncInfoMsg(info, &info->syncMsgList);
438 info->clientChannelId = INVALID_CHANNEL_ID;
439 info->isClientOpened = false;
440 if (info->serverChannelId == INVALID_CHANNEL_ID) {
441 LNN_LOGI(LNN_BUILDER, "free empty sync channel info");
442 ListDelete(&info->node);
443 SoftBusFree(info);
444 }
445 }
446 }
447
OnChannelOpenFailed(int32_t channelId,const char * peerUuid)448 static void OnChannelOpenFailed(int32_t channelId, const char *peerUuid)
449 {
450 char networkId[NETWORK_ID_BUF_LEN] = {0};
451 SyncChannelInfo *info = NULL;
452
453 if (LnnConvertDlId(peerUuid, CATEGORY_UUID, CATEGORY_NETWORK_ID, networkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
454 LNN_LOGI(LNN_BUILDER, "peer device not online");
455 return;
456 }
457 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
458 LNN_LOGE(LNN_BUILDER, "sync channel opened failed lock fail");
459 return;
460 }
461 char *anonyNetworkId = NULL;
462 Anonymize(networkId, &anonyNetworkId);
463 LNN_LOGI(LNN_BUILDER,
464 "open channel fail. channelId=%{public}d, networkId=%{public}s",
465 channelId, AnonymizeWrapper(anonyNetworkId));
466 AnonymizeFree(anonyNetworkId);
467 info = FindSyncChannelInfoByNetworkId(networkId);
468 if (info == NULL || (info->clientChannelId != channelId && info->serverChannelId != channelId)) {
469 LNN_LOGE(LNN_BUILDER, "unexpected channel open fail event");
470 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
471 return;
472 }
473 OnChannelCloseCommon(info, channelId);
474 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
475 }
476
OnChannelClosed(int32_t channelId)477 static void OnChannelClosed(int32_t channelId)
478 {
479 SyncChannelInfo *info = NULL;
480
481 LNN_LOGI(LNN_BUILDER, "channel closed, channelId=%{public}d", channelId);
482 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
483 LNN_LOGE(LNN_BUILDER, "sync channel opened failed lock fail");
484 return;
485 }
486 info = FindSyncChannelInfoByChannelId(channelId);
487 if (info == NULL) {
488 LNN_LOGE(LNN_BUILDER, "unexpected channel closed event");
489 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
490 return;
491 }
492 OnChannelCloseCommon(info, channelId);
493 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
494 }
495
OnMessageReceived(int32_t channelId,const char * data,uint32_t len)496 static void OnMessageReceived(int32_t channelId, const char *data, uint32_t len)
497 {
498 SyncChannelInfo *info = NULL;
499 LnnSyncInfoType type;
500 LnnSyncInfoMsgHandler handler;
501 char networkId[NETWORK_ID_BUF_LEN] = {0};
502
503 if (data == NULL) {
504 LNN_LOGE(LNN_BUILDER, "recv NULL data, channelId=%{public}d", channelId);
505 return;
506 }
507 if (len <= MSG_HEAD_LEN || len > MAX_SYNC_INFO_MSG_LEN) {
508 LNN_LOGE(LNN_BUILDER, "invalid msg. len=%{public}d", len);
509 return;
510 }
511 LNN_LOGI(LNN_BUILDER, "recv sync info msg. type=%{public}d, channelId=%{public}d, len=%{public}d",
512 (LnnSyncInfoType)(*(int32_t *)data), channelId, len);
513 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
514 LNN_LOGE(LNN_BUILDER, "sync channel opened failed lock fail");
515 return;
516 }
517 info = FindSyncChannelInfoByChannelId(channelId);
518 if (info == NULL) {
519 LNN_LOGE(LNN_BUILDER, "unexpected channel data received event");
520 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
521 return;
522 }
523 type = (LnnSyncInfoType)(*(int32_t *)data);
524 if (type < 0 || type >= LNN_INFO_TYPE_COUNT) {
525 LNN_LOGE(LNN_BUILDER, "received data is exception");
526 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
527 return;
528 }
529 handler = g_syncInfoManager.handlers[type];
530 if (handler == NULL) {
531 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
532 return;
533 }
534 if (strcpy_s(networkId, NETWORK_ID_BUF_LEN, info->networkId) != EOK) {
535 LNN_LOGE(LNN_BUILDER, "copy networkId fail");
536 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
537 return;
538 }
539 SoftBusGetTime(&info->accessTime);
540 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
541 handler(type, networkId, (const uint8_t *)&data[MSG_HEAD_LEN], len - MSG_HEAD_LEN);
542 }
543
544 static INetworkingListener g_networkListener = {
545 OnChannelOpened,
546 OnChannelOpenFailed,
547 OnChannelClosed,
548 OnMessageReceived,
549 };
550
PackBleOfflineMsg(int64_t connCap,int32_t networkType,int64_t authSeq)551 static char *PackBleOfflineMsg(int64_t connCap, int32_t networkType, int64_t authSeq)
552 {
553 JsonObj *json = JSON_CreateObject();
554 if (json == NULL) {
555 LNN_LOGE(LNN_BUILDER, "create json object fail");
556 return NULL;
557 }
558 if (!JSON_AddInt64ToObject(json, NETWORK_SYNC_CONN_CAP, connCap) ||
559 !JSON_AddInt32ToObject(json, NETWORK_SYNC_TYPE, networkType) ||
560 !JSON_AddInt64ToObject(json, NETWORK_SYNC_SEQ, authSeq)) {
561 LNN_LOGE(LNN_BUILDER, "add p2p networking msg to json fail");
562 JSON_Delete(json);
563 return NULL;
564 }
565 char *msg = JSON_PrintUnformatted(json);
566 JSON_Delete(json);
567 return msg;
568 }
569
PackWifiOfflineMsg(int32_t authPort,char * offlineCode)570 static char *PackWifiOfflineMsg(int32_t authPort, char *offlineCode)
571 {
572 JsonObj *json = JSON_CreateObject();
573 if (json == NULL) {
574 LNN_LOGE(LNN_BUILDER, "create json object fail");
575 return NULL;
576 }
577 if (!JSON_AddInt32ToObject(json, NETWORK_OFFLINE_PORT, authPort) ||
578 !JSON_AddInt32ToObject(json, NETWORK_SYNC_TYPE, DISCOVERY_TYPE_WIFI) ||
579 !JSON_AddStringToObject(json, NETWORK_OFFLINE_CODE, offlineCode)) {
580 LNN_LOGE(LNN_BUILDER, "add wifi offline msg to json fail");
581 JSON_Delete(json);
582 return NULL;
583 }
584 char *msg = JSON_PrintUnformatted(json);
585 JSON_Delete(json);
586 return msg;
587 }
588
CheckPeerAuthSeq(const char * uuid,int64_t peerAuthSeq)589 static int32_t CheckPeerAuthSeq(const char *uuid, int64_t peerAuthSeq)
590 {
591 int64_t localAuthSeq[2] = {0};
592 uint64_t authVerifyTime[2] = {0};
593 char udid[UDID_BUF_LEN] = {0};
594
595 int32_t ret = LnnConvertDlId(uuid, CATEGORY_UUID, CATEGORY_UDID, udid, UDID_BUF_LEN);
596 if (ret != SOFTBUS_OK) {
597 LNN_LOGE(LNN_BUILDER, "convert uuid fail");
598 return ret;
599 }
600 ret = AuthGetLatestAuthSeqListByType(udid, localAuthSeq, authVerifyTime, DISCOVERY_TYPE_BLE);
601 if (ret != SOFTBUS_OK) {
602 LNN_LOGE(LNN_BUILDER, "get authseq fail");
603 return ret;
604 }
605 char *anonyUdid = NULL;
606 Anonymize(udid, &anonyUdid);
607 if (peerAuthSeq == 0 || (peerAuthSeq != localAuthSeq[0] && peerAuthSeq != localAuthSeq[1])) {
608 LNN_LOGE(LNN_BUILDER, "authSeq is invalid, udid:%{public}s, local:%{public}" PRId64 ", %{public}"
609 PRId64 "peer:%{public}" PRId64 "", AnonymizeWrapper(anonyUdid),
610 localAuthSeq[0], localAuthSeq[1], peerAuthSeq);
611 AnonymizeFree(anonyUdid);
612 return SOFTBUS_INVALID_PARAM;
613 }
614 AnonymizeFree(anonyUdid);
615 return SOFTBUS_OK;
616 }
617
BleOffLineProcess(const AuthTransData * data,AuthHandle authHandle)618 static void BleOffLineProcess(const AuthTransData *data, AuthHandle authHandle)
619 {
620 int64_t peerConnCap = 0;
621 int64_t peerAuthSeq = 0;
622 JsonObj *json = JSON_Parse((const char *)data->data, data->len);
623 if (json == NULL) {
624 LNN_LOGE(LNN_BUILDER, "json parse fail");
625 return;
626 }
627 if (!JSON_GetInt64FromOject(json, NETWORK_SYNC_CONN_CAP, &peerConnCap) ||
628 !JSON_GetInt64FromOject(json, NETWORK_SYNC_SEQ, &peerAuthSeq)) {
629 LNN_LOGE(LNN_BUILDER, "ble json parse object fail");
630 JSON_Delete(json);
631 return;
632 }
633 JSON_Delete(json);
634 if (LnnHasCapability((uint32_t)peerConnCap, BIT_BLE)) {
635 LNN_LOGE(LNN_BUILDER, "no need to offline, peerConnCap:%{public}u", (uint32_t)peerConnCap);
636 return;
637 }
638 char uuid[UUID_BUF_LEN] = {0};
639 char networkId[NETWORK_ID_BUF_LEN] = {0};
640 if (AuthGetDeviceUuid(authHandle.authId, uuid, UUID_BUF_LEN) != SOFTBUS_OK ||
641 CheckPeerAuthSeq(uuid, peerAuthSeq) != SOFTBUS_OK) {
642 char *anonyUuid = NULL;
643 Anonymize(uuid, &anonyUuid);
644 LNN_LOGW(LNN_BUILDER, "device has offline or get authId/authSeq fail, uuid:%{public}s",
645 AnonymizeWrapper(anonyUuid));
646 AnonymizeFree(anonyUuid);
647 return;
648 }
649 char *anonyNetworkId = NULL;
650 Anonymize(networkId, &anonyNetworkId);
651 (void)LnnConvertDlId(uuid, CATEGORY_UUID, CATEGORY_NETWORK_ID, networkId, NETWORK_ID_BUF_LEN);
652 if (LnnRequestLeaveSpecific(networkId, CONNECTION_ADDR_BLE) != SOFTBUS_OK) {
653 LNN_LOGE(LNN_BUILDER, "request leave specific fail, networkId:%{public}s",
654 AnonymizeWrapper(anonyNetworkId));
655 } else {
656 LNN_LOGD(LNN_BUILDER, "offline ble by p2p succ, networkId:%{public}s",
657 AnonymizeWrapper(anonyNetworkId));
658 }
659 AnonymizeFree(anonyNetworkId);
660 }
661
CheckWifiOfflineMsgResult(const char * networkId,int32_t authPort,const char * offlineCode)662 static bool CheckWifiOfflineMsgResult(const char *networkId, int32_t authPort, const char *offlineCode)
663 {
664 int32_t port = 0;
665 uint8_t remoteOfflineCode[WIFI_OFFLINE_CODE_LEN] = {0};
666 char convertOfflineCode[WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1] = {0};
667 char *anonyNetworkId = NULL;
668 Anonymize(networkId, &anonyNetworkId);
669
670 if (LnnGetRemoteNumInfoByIfnameIdx(networkId, NUM_KEY_AUTH_PORT, &port, WLAN_IF) != 0) {
671 LNN_LOGE(LNN_BUILDER, "get remote port fail, neteorkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
672 AnonymizeFree(anonyNetworkId);
673 return false;
674 }
675 if (LnnGetNodeKeyInfo(networkId, NODE_KEY_BLE_OFFLINE_CODE, remoteOfflineCode, WIFI_OFFLINE_CODE_LEN) != 0) {
676 LNN_LOGE(LNN_BUILDER, "get remote offlinecode fail, neteorkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
677 AnonymizeFree(anonyNetworkId);
678 return false;
679 }
680 if (ConvertBytesToHexString(convertOfflineCode, WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1,
681 (unsigned char *)remoteOfflineCode, WIFI_OFFLINE_CODE_LEN) != SOFTBUS_OK) {
682 LNN_LOGE(LNN_BUILDER, "coonvert offlinecode fail, neteorkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
683 AnonymizeFree(anonyNetworkId);
684 return false;
685 }
686 if (strcmp(convertOfflineCode, offlineCode) != 0 || port != authPort) {
687 LNN_LOGE(LNN_BUILDER, "check offline msg info fail, neteorkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
688 AnonymizeFree(anonyNetworkId);
689 return false;
690 }
691 AnonymizeFree(anonyNetworkId);
692 return true;
693 }
694
WlanOffLineProcess(const AuthTransData * data,AuthHandle authHandle)695 static void WlanOffLineProcess(const AuthTransData *data, AuthHandle authHandle)
696 {
697 char uuid[UUID_BUF_LEN] = {0};
698 char networkId[NETWORK_ID_BUF_LEN] = {0};
699 char *anonyNetworkId = NULL;
700 int32_t authPort = 0;
701 char convertOfflineCode[WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1] = {0};
702 JsonObj *json = JSON_Parse((const char *)data->data, data->len);
703 if (json == NULL) {
704 LNN_LOGE(LNN_BUILDER, "json parse fail");
705 return;
706 }
707 if (!JSON_GetInt32FromOject(json, NETWORK_OFFLINE_PORT, &authPort) ||
708 !JSON_GetStringFromObject(json, NETWORK_OFFLINE_CODE, convertOfflineCode,
709 WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1)) {
710 LNN_LOGE(LNN_BUILDER, "wifi json parse object fail");
711 JSON_Delete(json);
712 return;
713 }
714 JSON_Delete(json);
715 if (AuthGetDeviceUuid(authHandle.authId, uuid, UUID_BUF_LEN) != SOFTBUS_OK) {
716 char *anonyUuid = NULL;
717 Anonymize(uuid, &anonyUuid);
718 LNN_LOGW(LNN_BUILDER, "device has offline or get authId/authSeq fail, uuid:%{public}s",
719 AnonymizeWrapper(anonyUuid));
720 AnonymizeFree(anonyUuid);
721 return;
722 }
723 if (LnnConvertDlId(uuid, CATEGORY_UUID, CATEGORY_NETWORK_ID, networkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
724 LNN_LOGE(LNN_BUILDER, "convert networkid fail");
725 return;
726 }
727 if (CheckWifiOfflineMsgResult(networkId, authPort, convertOfflineCode)) {
728 Anonymize(networkId, &anonyNetworkId);
729 if (LnnRequestLeaveSpecific(networkId, CONNECTION_ADDR_WLAN) != SOFTBUS_OK) {
730 LNN_LOGE(LNN_BUILDER, "wifi fast offline failed, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
731 } else {
732 LNN_LOGI(LNN_BUILDER, "wifi fast offline success networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
733 }
734 AnonymizeFree(anonyNetworkId);
735 }
736 }
737
OnP2pNetworkingDataRecv(AuthHandle authHandle,const AuthTransData * data)738 static void OnP2pNetworkingDataRecv(AuthHandle authHandle, const AuthTransData *data)
739 {
740 if (data == NULL || data->data == NULL || data->len ==0) {
741 LNN_LOGE(LNN_BUILDER, "invalid param");
742 return;
743 }
744 LNN_LOGI(LNN_BUILDER, "authId=%{public}" PRId64 ", module=%{public}d, seq=%{public}" PRId64 ", len=%{public}u.",
745 authHandle.authId, data->module, data->seq, data->len);
746 if (data->module != MODULE_P2P_NETWORKING_SYNC) {
747 LNN_LOGE(LNN_BUILDER, "data->module is not MODULE_P2P_NETWORKING_SYNC");
748 return;
749 }
750 JsonObj *json = JSON_Parse((const char *)data->data, data->len);
751 if (json == NULL) {
752 LNN_LOGE(LNN_BUILDER, "json parse fail");
753 return;
754 }
755 int32_t peerNetworkType = DISCOVERY_TYPE_UNKNOWN;
756 if (!JSON_GetInt32FromOject(json, NETWORK_SYNC_TYPE, &peerNetworkType)) {
757 LNN_LOGE(LNN_BUILDER, "json parse object fail");
758 JSON_Delete(json);
759 return;
760 }
761 JSON_Delete(json);
762 if (peerNetworkType == DISCOVERY_TYPE_BLE) {
763 BleOffLineProcess(data, authHandle);
764 } else if (peerNetworkType == DISCOVERY_TYPE_WIFI) {
765 WlanOffLineProcess(data, authHandle);
766 }
767 }
768
LnnSyncManagerHandleOffline(const char * networkId)769 static void LnnSyncManagerHandleOffline(const char *networkId)
770 {
771 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
772 LNN_LOGE(LNN_BUILDER, "Lock fail");
773 return;
774 }
775 SyncChannelInfo *item = FindSyncChannelInfoByNetworkId(networkId);
776 if (item == NULL) {
777 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
778 return;
779 }
780 ListDelete(&item->node);
781 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
782 LNN_LOGI(LNN_BUILDER, "close sync channel. client=%{public}d, server=%{public}d", item->clientChannelId,
783 item->serverChannelId);
784 if (item->clientChannelId != INVALID_CHANNEL_ID) {
785 (void)TransCloseNetWorkingChannel(item->clientChannelId);
786 }
787 if (item->serverChannelId != INVALID_CHANNEL_ID) {
788 (void)TransCloseNetWorkingChannel(item->serverChannelId);
789 }
790 ClearSyncInfoMsg(item, &item->syncMsgList);
791 SoftBusFree(item);
792 }
793
OnLnnOnlineStateChange(const LnnEventBasicInfo * info)794 static void OnLnnOnlineStateChange(const LnnEventBasicInfo *info)
795 {
796 if ((info == NULL) || (info->event != LNN_EVENT_NODE_ONLINE_STATE_CHANGED)) {
797 return;
798 }
799 LnnOnlineStateEventInfo *onlineStateInfo = (LnnOnlineStateEventInfo*)info;
800 if (!onlineStateInfo->isOnline) {
801 LnnSyncManagerHandleOffline(onlineStateInfo->networkId);
802 }
803 }
804
OnWifiDirectSyncMsgRecv(AuthHandle authHandle,const AuthTransData * data)805 static void OnWifiDirectSyncMsgRecv(AuthHandle authHandle, const AuthTransData *data)
806 {
807 LnnSyncInfoType type;
808 LnnSyncInfoMsgHandler handler;
809 char networkId[NETWORK_ID_BUF_LEN] = {0};
810
811 if (data == NULL) {
812 LNN_LOGE(LNN_BUILDER, "recv null data, authId=%{public}" PRId64, authHandle.authId);
813 return;
814 }
815 LNN_LOGI(LNN_BUILDER, "recv sync info msg. type=%{public}d, authId=%{public}" PRId64 ", len=%{public}u",
816 (LnnSyncInfoType)(*(int32_t *)data->data), authHandle.authId, data->len);
817 if (data->len <= MSG_HEAD_LEN || data->len > MAX_SYNC_INFO_MSG_LEN) {
818 LNN_LOGE(LNN_BUILDER, "invalid msg. len=%{public}u", data->len);
819 return;
820 }
821 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
822 if (auth == NULL) {
823 return;
824 }
825 char *anonyUdid = NULL;
826 Anonymize(auth->udid, &anonyUdid);
827 LNN_LOGI(LNN_BUILDER, "udid=%{public}s", AnonymizeWrapper(anonyUdid));
828 AnonymizeFree(anonyUdid);
829 if (LnnGetNetworkIdByUdid(auth->udid, networkId, sizeof(networkId)) != SOFTBUS_OK) {
830 LNN_LOGE(LNN_BUILDER, "LnnGetNetworkIdByUdid fail");
831 DelDupAuthManager(auth);
832 return;
833 }
834 DelDupAuthManager(auth);
835 type = (LnnSyncInfoType)(*(int32_t *)data->data);
836 if (type < 0 || type >= LNN_INFO_TYPE_COUNT) {
837 LNN_LOGE(LNN_BUILDER, "received data is exception, type=%{public}d", type);
838 return;
839 }
840 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
841 LNN_LOGE(LNN_BUILDER, "sync info lock fail");
842 return;
843 }
844 handler = g_syncInfoManager.handlers[type];
845 if (handler == NULL) {
846 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
847 return;
848 }
849 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
850 handler(type, networkId, &data->data[MSG_HEAD_LEN], data->len - MSG_HEAD_LEN);
851 }
852
OnWifiDirectSyncAuthClose(AuthHandle authHandle)853 static void OnWifiDirectSyncAuthClose(AuthHandle authHandle)
854 {
855 LNN_LOGW(LNN_BUILDER, "authId=%{public}" PRId64, authHandle.authId);
856 }
857
LnnInitSyncInfoManager(void)858 int32_t LnnInitSyncInfoManager(void)
859 {
860 int32_t i;
861
862 ListInit(&g_syncInfoManager.channelInfoList);
863 for (i = 0; i < LNN_INFO_TYPE_COUNT; ++i) {
864 g_syncInfoManager.handlers[i] = NULL;
865 }
866
867 AuthTransListener wifiDirectSyncCb = {
868 .onDataReceived = OnWifiDirectSyncMsgRecv,
869 .onDisconnected = OnWifiDirectSyncAuthClose,
870 .onException = NULL,
871 };
872 int32_t ret = RegAuthTransListener(MODULE_AUTH_SYNC_INFO, &wifiDirectSyncCb);
873 if (ret != SOFTBUS_OK) {
874 LNN_LOGE(LNN_INIT, "reg auth lister fail");
875 return ret;
876 }
877 if (LnnRegisterEventHandler(LNN_EVENT_NODE_ONLINE_STATE_CHANGED, OnLnnOnlineStateChange) != SOFTBUS_OK) {
878 LNN_LOGE(LNN_INIT, "reg online lister fail");
879 return SOFTBUS_NETWORK_REG_EVENT_HANDLER_ERR;
880 }
881 if (TransRegisterNetworkingChannelListener(CHANNEL_NAME, &g_networkListener) != SOFTBUS_OK) {
882 LNN_LOGE(LNN_INIT, "reg proxy channel lister fail");
883 return SOFTBUS_TRANS_REGISTER_LISTENER_FAILED;
884 }
885 if (SoftBusMutexInit(&g_syncInfoManager.lock, NULL) != SOFTBUS_OK) {
886 LNN_LOGE(LNN_INIT, "sync info manager mutex init fail");
887 return SOFTBUS_LOCK_ERR;
888 }
889 AuthTransListener p2pNetworkingCb = {
890 .onDataReceived = OnP2pNetworkingDataRecv,
891 .onDisconnected = NULL,
892 .onException = NULL,
893 };
894 ret = RegAuthTransListener(MODULE_P2P_NETWORKING_SYNC, &p2pNetworkingCb);
895 if (ret != SOFTBUS_OK) {
896 LNN_LOGE(LNN_INIT, "p2p networking sync set cb fail");
897 return ret;
898 }
899 return SOFTBUS_OK;
900 }
901
LnnDeinitSyncInfoManager(void)902 void LnnDeinitSyncInfoManager(void)
903 {
904 int32_t i;
905 for (i = 0; i < LNN_INFO_TYPE_COUNT; ++i) {
906 g_syncInfoManager.handlers[i] = NULL;
907 }
908 UnregAuthTransListener(MODULE_P2P_NETWORKING_SYNC);
909 LnnUnregisterEventHandler(LNN_EVENT_NODE_ONLINE_STATE_CHANGED, OnLnnOnlineStateChange);
910 UnregAuthTransListener(MODULE_AUTH_SYNC_INFO);
911 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
912 LNN_LOGE(LNN_BUILDER, "clear reg sync info lock fail");
913 return;
914 }
915 ClearSyncChannelInfo();
916 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
917 SoftBusMutexDestroy(&g_syncInfoManager.lock);
918 }
919
LnnRegSyncInfoHandler(LnnSyncInfoType type,LnnSyncInfoMsgHandler handler)920 int32_t LnnRegSyncInfoHandler(LnnSyncInfoType type, LnnSyncInfoMsgHandler handler)
921 {
922 if (type >= LNN_INFO_TYPE_COUNT || handler == NULL) {
923 LNN_LOGE(LNN_BUILDER, "invalid sync info hander reg param. type=%{public}d", type);
924 return SOFTBUS_INVALID_PARAM;
925 }
926 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
927 LNN_LOGE(LNN_BUILDER, "reg sync info handler lock fail");
928 return SOFTBUS_LOCK_ERR;
929 }
930 if (g_syncInfoManager.handlers[type] != NULL) {
931 LNN_LOGE(LNN_BUILDER, "sync info already have handler. type=%{public}d", type);
932 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
933 return SOFTBUS_INVALID_PARAM;
934 }
935 g_syncInfoManager.handlers[type] = handler;
936 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
937 return SOFTBUS_OK;
938 }
939
LnnUnregSyncInfoHandler(LnnSyncInfoType type,LnnSyncInfoMsgHandler handler)940 int32_t LnnUnregSyncInfoHandler(LnnSyncInfoType type, LnnSyncInfoMsgHandler handler)
941 {
942 if (type >= LNN_INFO_TYPE_COUNT || handler == NULL) {
943 LNN_LOGE(LNN_BUILDER, "invalid sync info hander unreg param. type=%{public}d", type);
944 return SOFTBUS_INVALID_PARAM;
945 }
946 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
947 LNN_LOGE(LNN_BUILDER, "unreg sync info handler lock fail");
948 return SOFTBUS_LOCK_ERR;
949 }
950 if (g_syncInfoManager.handlers[type] != handler) {
951 LNN_LOGE(LNN_BUILDER, "sync info handler not valid. type=%{public}d", type);
952 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
953 return SOFTBUS_INVALID_PARAM;
954 }
955 g_syncInfoManager.handlers[type] = NULL;
956 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
957 return SOFTBUS_OK;
958 }
959
ResetSendSyncInfo(SyncChannelInfo * oldInfo,const SyncChannelInfo * newInfo,SyncInfoMsg * msg)960 static void ResetSendSyncInfo(SyncChannelInfo *oldInfo, const SyncChannelInfo *newInfo, SyncInfoMsg *msg)
961 {
962 if (oldInfo->clientChannelId == INVALID_CHANNEL_ID) {
963 oldInfo->clientChannelId = newInfo->clientChannelId;
964 oldInfo->accessTime = newInfo->accessTime;
965 } else {
966 if (oldInfo->clientChannelId != newInfo->clientChannelId && oldInfo->clientChannelId != INVALID_CHANNEL_ID) {
967 LNN_LOGD(LNN_BUILDER, "reset sync info send channel. clientChannelId:%{public}d->%{public}d",
968 oldInfo->clientChannelId, newInfo->clientChannelId);
969 (void)TransCloseNetWorkingChannel(oldInfo->clientChannelId);
970 oldInfo->isClientOpened = false;
971 oldInfo->clientChannelId = newInfo->clientChannelId;
972 }
973 if (oldInfo->isClientOpened) {
974 SendSyncInfoMsg(oldInfo, msg);
975 } else {
976 LNN_LOGW(LNN_BUILDER, "send sync info client is not opened, channelId=%{public}d",
977 oldInfo->clientChannelId);
978 }
979 }
980 }
981
SendSyncInfoByNewChannel(const char * networkId,SyncInfoMsg * msg)982 static int32_t SendSyncInfoByNewChannel(const char *networkId, SyncInfoMsg *msg)
983 {
984 SyncChannelInfo *info = CreateSyncChannelInfo(networkId);
985 if (info == NULL) {
986 return SOFTBUS_MALLOC_ERR;
987 }
988 info->clientChannelId = TransOpenNetWorkingChannel(CHANNEL_NAME, networkId, NULL);
989 if (info->clientChannelId == INVALID_CHANNEL_ID) {
990 LNN_LOGE(LNN_BUILDER, "open sync info channel fail");
991 SoftBusFree(info);
992 return SOFTBUS_INVALID_PARAM;
993 }
994 char *anonyNetworkId = NULL;
995 Anonymize(networkId, &anonyNetworkId);
996 LNN_LOGI(LNN_BUILDER,
997 "open sync info. channelId=%{public}d, networkId=%{public}s",
998 info->clientChannelId, AnonymizeWrapper(anonyNetworkId));
999 AnonymizeFree(anonyNetworkId);
1000 SoftBusGetTime(&info->accessTime);
1001 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
1002 LNN_LOGE(LNN_BUILDER, "send sync info lock fail");
1003 SoftBusFree(info);
1004 return SOFTBUS_LOCK_ERR;
1005 }
1006 SyncChannelInfo *item = FindSyncChannelInfoByNetworkId(networkId);
1007 if (item == NULL) {
1008 ListTailInsert(&info->syncMsgList, &msg->node);
1009 if (IsListEmpty(&g_syncInfoManager.channelInfoList)) {
1010 (void)LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT),
1011 CloseUnusedChannel, NULL, UNUSED_CHANNEL_CLOSED_DELAY);
1012 }
1013 ListNodeInsert(&g_syncInfoManager.channelInfoList, &info->node);
1014 } else {
1015 ListTailInsert(&item->syncMsgList, &msg->node);
1016 ResetSendSyncInfo(item, info, msg);
1017 SoftBusFree(info);
1018 }
1019 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
1020 return SOFTBUS_OK;
1021 }
1022
TrySendSyncInfoMsg(const char * networkId,SyncInfoMsg * msg)1023 static int32_t TrySendSyncInfoMsg(const char *networkId, SyncInfoMsg *msg)
1024 {
1025 LNN_LOGI(LNN_BUILDER, "begin send sync info");
1026 SyncChannelInfo *info = NULL;
1027 if (SoftBusMutexLock(&g_syncInfoManager.lock) != 0) {
1028 LNN_LOGE(LNN_BUILDER, "send sync info lock fail");
1029 return SOFTBUS_LOCK_ERR;
1030 }
1031 info = FindSyncChannelInfoByNetworkId(networkId);
1032 if (info == NULL) {
1033 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
1034 return SendSyncInfoByNewChannel(networkId, msg);
1035 }
1036 if (info->clientChannelId == INVALID_CHANNEL_ID) {
1037 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
1038 return SendSyncInfoByNewChannel(networkId, msg);
1039 }
1040 char *anonyNetworkId = NULL;
1041 Anonymize(networkId, &anonyNetworkId);
1042 LNN_LOGI(LNN_BUILDER,
1043 "send sync info by alread exists channel. channelId=%{public}d, networkId=%{public}s",
1044 info->clientChannelId, AnonymizeWrapper(anonyNetworkId));
1045 AnonymizeFree(anonyNetworkId);
1046 ListTailInsert(&info->syncMsgList, &msg->node);
1047 if (info->isClientOpened) {
1048 SoftBusGetTime(&info->accessTime);
1049 ListDelete(&msg->node);
1050 int32_t id = info->clientChannelId;
1051 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
1052 SendSyncInfoMsgOnly(networkId, id, msg);
1053 return SOFTBUS_OK;
1054 }
1055 (void)SoftBusMutexUnlock(&g_syncInfoManager.lock);
1056 return SOFTBUS_OK;
1057 }
1058
GetWifiDirectAuthByNetworkId(const char * networkId,AuthHandle * authHandle)1059 static int32_t GetWifiDirectAuthByNetworkId(const char *networkId, AuthHandle *authHandle)
1060 {
1061 char uuid[UUID_BUF_LEN] = {0};
1062 char *anonyNetworkId = NULL;
1063 Anonymize(networkId, &anonyNetworkId);
1064 (void)LnnConvertDlId(networkId, CATEGORY_NETWORK_ID, CATEGORY_UUID, uuid, UUID_BUF_LEN);
1065 AuthDeviceGetLatestIdByUuid(uuid, AUTH_LINK_TYPE_ENHANCED_P2P, authHandle);
1066 if (authHandle->authId != AUTH_INVALID_ID) {
1067 LNN_LOGI(LNN_BUILDER, "find wifidirect authHandle, networkId=%{public}s",
1068 AnonymizeWrapper(anonyNetworkId));
1069 AnonymizeFree(anonyNetworkId);
1070 return SOFTBUS_OK;
1071 }
1072 AnonymizeFree(anonyNetworkId);
1073 return SOFTBUS_INVALID_PARAM;
1074 }
1075
TrySendSyncInfoMsgByAuth(const char * networkId,SyncInfoMsg * msg)1076 static int32_t TrySendSyncInfoMsgByAuth(const char *networkId, SyncInfoMsg *msg)
1077 {
1078 char *anonyNetworkId = NULL;
1079 Anonymize(networkId, &anonyNetworkId);
1080 AuthHandle authHandle = {
1081 .authId = AUTH_INVALID_ID
1082 };
1083 if (GetWifiDirectAuthByNetworkId(networkId, &authHandle) != SOFTBUS_OK) {
1084 LNN_LOGE(LNN_BUILDER, "get authHandle fail, networkId=%{public}s", AnonymizeWrapper(anonyNetworkId));
1085 AnonymizeFree(anonyNetworkId);
1086 return SOFTBUS_INVALID_PARAM;
1087 }
1088 AnonymizeFree(anonyNetworkId);
1089 LNN_LOGI(LNN_BUILDER, "send sync info, authId=%{public}" PRId64 ", datalen=%{public}u",
1090 authHandle.authId, msg->dataLen);
1091 AuthTransData dataInfo = {
1092 .module = MODULE_AUTH_SYNC_INFO,
1093 .flag = 0,
1094 .seq = 0,
1095 .len = msg->dataLen,
1096 .data = msg->data,
1097 };
1098 int32_t ret = AuthPostTransData(authHandle, &dataInfo);
1099 if (ret != SOFTBUS_OK) {
1100 LNN_LOGE(LNN_BUILDER, "auth post data fail");
1101 return ret;
1102 }
1103 if (msg->complete != NULL) {
1104 msg->complete((LnnSyncInfoType)(*(uint32_t *)msg->data), networkId, &msg->data[MSG_HEAD_LEN],
1105 msg->dataLen - MSG_HEAD_LEN);
1106 }
1107 return SOFTBUS_OK;
1108 }
1109
GetFeatureCap(const char * networkId,uint64_t * local,uint64_t * remote)1110 static int32_t GetFeatureCap(const char *networkId, uint64_t *local, uint64_t *remote)
1111 {
1112 int32_t ret = LnnGetLocalNumU64Info(NUM_KEY_FEATURE_CAPA, local);
1113 if (ret != SOFTBUS_OK || *local == 0) {
1114 LNN_LOGE(LNN_BUILDER, "get local cap fail, ret=%{public}d, local=%{public}" PRIu64, ret, *local);
1115 return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
1116 }
1117 ret = LnnGetRemoteNumU64Info(networkId, NUM_KEY_FEATURE_CAPA, remote);
1118 if (ret != SOFTBUS_OK || *remote == 0) {
1119 LNN_LOGE(LNN_BUILDER, "get remote cap fail, ret=%{public}d, remote=%{public}" PRIu64, ret, *remote);
1120 return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
1121 }
1122 return SOFTBUS_OK;
1123 }
1124
IsNeedSyncByAuth(const char * networkId)1125 static bool IsNeedSyncByAuth(const char *networkId)
1126 {
1127 uint32_t localCap;
1128 uint32_t remoteCap;
1129 if (LnnGetLocalNumU32Info(NUM_KEY_NET_CAP, &localCap) != SOFTBUS_OK ||
1130 LnnGetRemoteNumU32Info(networkId, NUM_KEY_NET_CAP, &remoteCap) != SOFTBUS_OK) {
1131 LNN_LOGE(LNN_BUILDER, "get cap fail");
1132 return false;
1133 }
1134 if (((localCap & (1 << BIT_WIFI_P2P)) == 0) || ((remoteCap & (1 << BIT_WIFI_P2P)) == 0)) {
1135 LNN_LOGI(LNN_BUILDER, "not support p2p");
1136 return false;
1137 }
1138 uint64_t local = 0;
1139 uint64_t remote = 0;
1140 if (GetFeatureCap(networkId, &local, &remote) != SOFTBUS_OK) {
1141 LNN_LOGE(LNN_BUILDER, "get feature fail");
1142 return false;
1143 }
1144 if ((local & (1 << BIT_WIFI_DIRECT_ENHANCE_CAPABILITY)) == 0 ||
1145 (remote & (1 << BIT_WIFI_DIRECT_ENHANCE_CAPABILITY)) == 0) {
1146 LNN_LOGI(LNN_BUILDER, "not support wifi direct");
1147 return false;
1148 }
1149 NodeInfo node;
1150 (void)memset_s(&node, sizeof(NodeInfo), 0, sizeof(NodeInfo));
1151 if (LnnGetRemoteNodeInfoById(networkId, CATEGORY_NETWORK_ID, &node) != SOFTBUS_OK) {
1152 LNN_LOGE(LNN_BUILDER, "get remote node info fail");
1153 return false;
1154 }
1155 if (LnnHasDiscoveryType(&node, DISCOVERY_TYPE_WIFI) || LnnHasDiscoveryType(&node, DISCOVERY_TYPE_LSA)) {
1156 LNN_LOGI(LNN_BUILDER, "peer node is wifi online");
1157 return false;
1158 }
1159 if ((localCap & (1 << BIT_BR)) && (remoteCap & (1 << BIT_BR))) {
1160 LNN_LOGI(LNN_BUILDER, "both support br");
1161 return false;
1162 }
1163 LNN_LOGI(LNN_BUILDER, "need sync info by auth");
1164 return true;
1165 }
1166
LnnSendSyncInfoMsg(LnnSyncInfoType type,const char * networkId,const uint8_t * msg,uint32_t len,LnnSyncInfoMsgComplete complete)1167 int32_t LnnSendSyncInfoMsg(LnnSyncInfoType type, const char *networkId,
1168 const uint8_t *msg, uint32_t len, LnnSyncInfoMsgComplete complete)
1169 {
1170 SyncInfoMsg *syncMsg = NULL;
1171 int32_t rc;
1172
1173 LNN_LOGI(LNN_BUILDER, "send sync info msg for type=%{public}d, len=%{public}d", type, len);
1174 if (type >= LNN_INFO_TYPE_COUNT || networkId == NULL || msg == NULL) {
1175 LNN_LOGE(LNN_BUILDER, "invalid sync info msg param");
1176 return SOFTBUS_INVALID_PARAM;
1177 }
1178 syncMsg = CreateSyncInfoMsg(type, msg, len, complete);
1179 if (syncMsg == NULL) {
1180 return SOFTBUS_MEM_ERR;
1181 }
1182 if (IsNeedSyncByAuth(networkId)) {
1183 rc = TrySendSyncInfoMsgByAuth(networkId, syncMsg);
1184 if (rc == SOFTBUS_OK) {
1185 SoftBusFree(syncMsg);
1186 return rc;
1187 }
1188 }
1189 rc = TrySendSyncInfoMsg(networkId, syncMsg);
1190 if (rc != SOFTBUS_OK) {
1191 SoftBusFree(syncMsg);
1192 }
1193 return rc;
1194 }
1195
FillAuthdataInfo(AuthTransData * dataInfo,char * msg)1196 static void FillAuthdataInfo(AuthTransData *dataInfo, char *msg)
1197 {
1198 dataInfo->module = MODULE_P2P_NETWORKING_SYNC;
1199 dataInfo->flag = 0;
1200 dataInfo->seq = 0;
1201 dataInfo->len = strlen(msg) + 1;
1202 dataInfo->data = (const uint8_t *)msg;
1203 }
1204
GetAuthHandleByNetworkId(const char * networkId,AuthHandle * authHandle)1205 static int32_t GetAuthHandleByNetworkId(const char *networkId, AuthHandle *authHandle)
1206 {
1207 char uuid[UUID_BUF_LEN] = {0};
1208 char *anonyNetworkId = NULL;
1209 Anonymize(networkId, &anonyNetworkId);
1210 (void)LnnConvertDlId(networkId, CATEGORY_NETWORK_ID, CATEGORY_UUID, uuid, UUID_BUF_LEN);
1211 AuthDeviceGetLatestIdByUuid(uuid, AUTH_LINK_TYPE_P2P, authHandle);
1212 if (authHandle->authId != AUTH_INVALID_ID) {
1213 LNN_LOGI(LNN_BUILDER, "find p2p authHandle, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
1214 AnonymizeFree(anonyNetworkId);
1215 return SOFTBUS_OK;
1216 }
1217 AuthDeviceGetLatestIdByUuid(uuid, AUTH_LINK_TYPE_ENHANCED_P2P, authHandle);
1218 if (authHandle->authId != AUTH_INVALID_ID) {
1219 LNN_LOGI(LNN_BUILDER, "find hml authHandle, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
1220 AnonymizeFree(anonyNetworkId);
1221 return SOFTBUS_OK;
1222 }
1223 AnonymizeFree(anonyNetworkId);
1224 return SOFTBUS_NOT_FIND;
1225 }
1226
LnnSendP2pSyncInfoMsg(const char * networkId,uint32_t netCapability)1227 int32_t LnnSendP2pSyncInfoMsg(const char *networkId, uint32_t netCapability)
1228 {
1229 char *anonyNetworkId = NULL;
1230 if (networkId == NULL) {
1231 LNN_LOGE(LNN_BUILDER, "invalid param");
1232 return SOFTBUS_INVALID_PARAM;
1233 }
1234 Anonymize(networkId, &anonyNetworkId);
1235 AuthHandle authHandle = { .authId = AUTH_INVALID_ID };
1236 if (GetAuthHandleByNetworkId(networkId, &authHandle) != SOFTBUS_OK) {
1237 LNN_LOGE(LNN_BUILDER, "get authHandle fail, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
1238 AnonymizeFree(anonyNetworkId);
1239 return SOFTBUS_AUTH_NOT_FOUND;
1240 }
1241 int64_t authSeq[2] = {0};
1242 uint64_t authVerifyTime[2] = {0};
1243 char udid[UDID_BUF_LEN] = {0};
1244 (void)LnnConvertDlId(networkId, CATEGORY_NETWORK_ID, CATEGORY_UDID, udid, UDID_BUF_LEN);
1245 if (AuthGetLatestAuthSeqListByType(udid, authSeq, authVerifyTime, DISCOVERY_TYPE_BLE) != SOFTBUS_OK ||
1246 (authSeq[0] == 0 && authSeq[1] == 0)) {
1247 LNN_LOGE(LNN_BUILDER, "seqErr, ble authSeq:%{public}" PRId64 ", %{public}" PRId64 "", authSeq[0], authSeq[1]);
1248 AnonymizeFree(anonyNetworkId);
1249 return SOFTBUS_AUTH_NOT_FOUND;
1250 }
1251 char *msg = PackBleOfflineMsg((int64_t)netCapability, DISCOVERY_TYPE_BLE,
1252 authVerifyTime[0] > authVerifyTime[1] ? authSeq[0] : authSeq[1]);
1253 if (msg == NULL) {
1254 LNN_LOGE(LNN_BUILDER, "pack p2p networking msg fail, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
1255 AnonymizeFree(anonyNetworkId);
1256 return SOFTBUS_NETWORK_PACK_DATA_FAILED;
1257 }
1258 AuthTransData dataInfo = {0};
1259 FillAuthdataInfo(&dataInfo, msg);
1260 if (SoftBusGenerateRandomArray((uint8_t *)&dataInfo.seq, sizeof(int64_t)) != SOFTBUS_OK) {
1261 LNN_LOGE(LNN_BUILDER, "generate seq fail");
1262 AnonymizeFree(anonyNetworkId);
1263 cJSON_free(msg);
1264 return SOFTBUS_GENERATE_RANDOM_ARRAY_FAIL;
1265 }
1266 if (AuthPostTransData(authHandle, &dataInfo) == SOFTBUS_OK) {
1267 LNN_LOGI(LNN_BUILDER, "send p2p sync info msg to networkId:%{public}s, netCap:%{public}u, seq:%{public}"
1268 PRId64 ", [%{public}" PRId64 "/%{public}" PRId64 ", %{public}" PRIu64 "/%{public}" PRId64 "]",
1269 AnonymizeWrapper(anonyNetworkId), netCapability, dataInfo.seq,
1270 authVerifyTime[0], authSeq[0], authVerifyTime[1], authSeq[1]);
1271 } else {
1272 LNN_LOGE(LNN_BUILDER, "post trans data fail, networkId:%{public}s", AnonymizeWrapper(anonyNetworkId));
1273 }
1274 AnonymizeFree(anonyNetworkId);
1275 cJSON_free(msg);
1276 return SOFTBUS_OK;
1277 }
1278
LnnSendWifiOfflineInfoMsg(void)1279 int32_t LnnSendWifiOfflineInfoMsg(void)
1280 {
1281 int32_t authPort = 0;
1282 char localOfflineCode[WIFI_OFFLINE_CODE_LEN] = {0};
1283 if (LnnGetLocalNumInfoByIfnameIdx(NUM_KEY_AUTH_PORT, &authPort, WLAN_IF) != SOFTBUS_OK) {
1284 LNN_LOGE(LNN_BUILDER, "get local authPort fail");
1285 return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
1286 }
1287 if (LnnGetLocalStrInfo(STRING_KEY_OFFLINE_CODE, localOfflineCode, WIFI_OFFLINE_CODE_LEN) != SOFTBUS_OK) {
1288 LNN_LOGE(LNN_BUILDER, "get local offlinecode fail");
1289 return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
1290 }
1291 char convertOfflineCode[WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1] = {0};
1292 if (ConvertBytesToHexString(convertOfflineCode, WIFI_OFFLINE_CODE_LEN * HEXIFY_UNIT_LEN + 1,
1293 (unsigned char *)localOfflineCode, WIFI_OFFLINE_CODE_LEN) != SOFTBUS_OK) {
1294 LNN_LOGE(LNN_BUILDER, "convert offlinecode fail");
1295 return SOFTBUS_BYTE_CONVERT_FAIL;
1296 }
1297 char *msg = PackWifiOfflineMsg(authPort, convertOfflineCode);
1298 if (msg == NULL) {
1299 LNN_LOGE(LNN_BUILDER, "pack p2p networking msg fail");
1300 return SOFTBUS_NETWORK_PACK_DATA_FAILED;
1301 }
1302 AuthTransData dataInfo = {0};
1303 FillAuthdataInfo(&dataInfo, msg);
1304 AuthHandle *authHandle = NULL;
1305 int32_t num = 0;
1306 if (GetHmlOrP2pAuthHandle(&authHandle, &num) != SOFTBUS_OK) {
1307 LNN_LOGE(LNN_BUILDER, "get authHandle fail");
1308 cJSON_free(msg);
1309 return SOFTBUS_AUTH_NOT_FOUND;
1310 }
1311 char *anonyOfflineCode = NULL;
1312 Anonymize(convertOfflineCode, &anonyOfflineCode);
1313 for (int32_t i = 0; i < num; i++) {
1314 if (AuthPostTransData(authHandle[i], &dataInfo) == SOFTBUS_OK) {
1315 LNN_LOGI(LNN_BUILDER, "send wifi offline msg sucess, authPort:%{public}d, offlineCode:%{public}s,"
1316 "authId:%{public}" PRId64, authPort, AnonymizeWrapper(anonyOfflineCode), authHandle->authId);
1317 } else {
1318 LNN_LOGE(LNN_BUILDER, "post trans data fail, authId:%{public}" PRId64, authHandle->authId);
1319 }
1320 }
1321 cJSON_free(msg);
1322 SoftBusFree(authHandle);
1323 AnonymizeFree(anonyOfflineCode);
1324 return SOFTBUS_OK;
1325 }
1326
LnnSendAsyncInfoMsg(void * param)1327 void LnnSendAsyncInfoMsg(void *param)
1328 {
1329 SendSyncInfoParam *data = (SendSyncInfoParam *)param;
1330 if (data == NULL) {
1331 LNN_LOGE(LNN_BUILDER, "invalid para");
1332 return;
1333 }
1334 if (data->msg == NULL) {
1335 LNN_LOGE(LNN_BUILDER, "invalid para");
1336 SoftBusFree(data);
1337 return;
1338 }
1339 int32_t ret =
1340 LnnSendSyncInfoMsg(data->type, data->networkId, data->msg, data->len, data->complete);
1341 if (ret != SOFTBUS_OK) {
1342 LNN_LOGE(LNN_BUILDER, "send info msg type=%{public}d fail, ret:%{public}d", data->type, ret);
1343 }
1344 SoftBusFree(data->msg);
1345 SoftBusFree(data);
1346 }
1347
CreateSyncInfoParam(LnnSyncInfoType type,const char * networkId,const uint8_t * msg,uint32_t len,LnnSyncInfoMsgComplete complete)1348 SendSyncInfoParam *CreateSyncInfoParam(
1349 LnnSyncInfoType type, const char *networkId, const uint8_t *msg, uint32_t len, LnnSyncInfoMsgComplete complete)
1350 {
1351 SendSyncInfoParam *data = (SendSyncInfoParam *)SoftBusCalloc(sizeof(SendSyncInfoParam));
1352 if (data == NULL) {
1353 LNN_LOGE(LNN_BUILDER, "malloc SendSyncInfoParam fail");
1354 return NULL;
1355 }
1356
1357 data->msg = (uint8_t *)SoftBusCalloc(len);
1358 if (data->msg == NULL) {
1359 SoftBusFree(data);
1360 LNN_LOGE(LNN_BUILDER, "malloc SendSyncInfoParam fail");
1361 return NULL;
1362 }
1363
1364 if (strcpy_s(data->networkId, strlen(networkId) + 1, networkId) != SOFTBUS_OK ||
1365 memcpy_s(data->msg, len, (uint8_t *)msg, len) != SOFTBUS_OK) {
1366 SoftBusFree(data->msg);
1367 SoftBusFree(data);
1368 return NULL;
1369 }
1370 data->type = type;
1371 data->len = len;
1372 data->complete = complete;
1373 return data;
1374 }
1375