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 "auth_connection.h"
17
18 #include <securec.h>
19
20 #include "auth_common.h"
21 #include "auth_log.h"
22 #include "auth_manager.h"
23 #include "auth_request.h"
24 #include "auth_pre_link.h"
25 #include "auth_tcp_connection.h"
26 #include "lnn_async_callback_utils.h"
27 #include "softbus_adapter_bt_common.h"
28 #include "softbus_adapter_errcode.h"
29 #include "softbus_adapter_mem.h"
30 #include "softbus_adapter_socket.h"
31 #include "softbus_conn_interface.h"
32 #include "softbus_def.h"
33 #include "wifi_direct_manager.h"
34
35 #define AUTH_CONN_DATA_HEAD_SIZE 24
36 #define AUTH_ENHANCE_P2P_CONNECT_TIMEOUT_MS 4500
37 #define AUTH_CONN_CONNECT_TIMEOUT_MS 11000
38 #define AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY 1000
39 #define AUTH_CONN_MAX_RETRY_TIMES 1
40 #define AUTH_CONN_RETRY_DELAY_MILLIS 3000
41
42 typedef struct {
43 uint32_t requestId;
44 AuthConnInfo connInfo;
45 uint32_t retryTimes;
46 } ConnCmdInfo;
47
48 typedef struct {
49 uint32_t requestId;
50 int32_t fd;
51 AuthConnInfo connInfo;
52 uint32_t retryTimes;
53 ListNode node;
54 } ConnRequest;
55
56 static ListNode g_connRequestList = { &g_connRequestList, &g_connRequestList };
57 static AuthConnListener g_listener = { 0 };
58
59 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient);
60 static void OnTcpSessionConnected(ListenerModule module, int32_t fd, bool isClient);
61
RouteBuildClientAuthManager(int32_t cfd)62 void __attribute__((weak)) RouteBuildClientAuthManager(int32_t cfd)
63 {
64 (void)cfd;
65 }
RouteClearAuthChannelId(int32_t cfd)66 void __attribute__((weak)) RouteClearAuthChannelId(int32_t cfd)
67 {
68 (void)cfd;
69 }
70
IsEnhanceP2pModuleId(ListenerModule moduleId)71 static bool IsEnhanceP2pModuleId(ListenerModule moduleId)
72 {
73 if (moduleId >= AUTH_ENHANCED_P2P_START && moduleId <= AUTH_ENHANCED_P2P_END) {
74 return true;
75 }
76 return false;
77 }
78
GenConnId(int32_t connType,int32_t id)79 uint64_t GenConnId(int32_t connType, int32_t id)
80 {
81 uint64_t connId = (uint64_t)connType;
82 connId = (connId << INT32_BIT_NUM) & MASK_UINT64_H32;
83 connId |= (((uint64_t)id) & MASK_UINT64_L32);
84 return connId;
85 }
86
GetConnType(uint64_t connId)87 int32_t GetConnType(uint64_t connId)
88 {
89 return (int32_t)((connId >> INT32_BIT_NUM) & MASK_UINT64_L32);
90 }
91
GetConnTypeStr(uint64_t connId)92 const char *GetConnTypeStr(uint64_t connId)
93 {
94 int32_t type = GetConnType(connId);
95 switch (type) {
96 case AUTH_LINK_TYPE_WIFI:
97 return "wifi/eth";
98 case AUTH_LINK_TYPE_BR:
99 return "br";
100 case AUTH_LINK_TYPE_BLE:
101 return "ble";
102 case AUTH_LINK_TYPE_P2P:
103 return "p2p";
104 case AUTH_LINK_TYPE_ENHANCED_P2P:
105 return "enhanced_p2p";
106 case AUTH_LINK_TYPE_SESSION:
107 case AUTH_LINK_TYPE_SESSION_KEY:
108 return "session";
109 default:
110 break;
111 }
112 return "unknown";
113 }
114
GetConnId(uint64_t connId)115 uint32_t GetConnId(uint64_t connId)
116 {
117 return (uint32_t)(connId & MASK_UINT64_L32);
118 }
119
GetFd(uint64_t connId)120 int32_t GetFd(uint64_t connId)
121 {
122 return (int32_t)(connId & MASK_UINT64_L32);
123 }
124
UpdateFd(uint64_t * connId,int32_t id)125 void UpdateFd(uint64_t *connId, int32_t id)
126 {
127 CHECK_NULL_PTR_RETURN_VOID(connId);
128 *connId &= MASK_UINT64_H32;
129 *connId |= (((uint64_t)id) & MASK_UINT64_L32);
130 }
131
132 /* Conn Request */
AddConnRequest(const AuthConnInfo * connInfo,uint32_t requestId,int32_t fd)133 static int32_t AddConnRequest(const AuthConnInfo *connInfo, uint32_t requestId, int32_t fd)
134 {
135 ConnRequest *item = (ConnRequest *)SoftBusMalloc(sizeof(ConnRequest));
136 if (item == NULL) {
137 AUTH_LOGE(AUTH_CONN, "malloc ConnRequest fail");
138 return SOFTBUS_MALLOC_ERR;
139 }
140 item->fd = fd;
141 item->requestId = requestId;
142 if (memcpy_s(&item->connInfo, sizeof(item->connInfo), connInfo, sizeof(AuthConnInfo)) != EOK) {
143 AUTH_LOGE(AUTH_CONN, "set AuthConnInfo fail");
144 SoftBusFree(item);
145 return SOFTBUS_MEM_ERR;
146 }
147 ListTailInsert(&g_connRequestList, &item->node);
148 return SOFTBUS_OK;
149 }
150
FindConnRequestByFd(int32_t fd)151 static ConnRequest *FindConnRequestByFd(int32_t fd)
152 {
153 ConnRequest *item = NULL;
154 LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
155 if (item->fd == fd) {
156 return item;
157 }
158 }
159 return NULL;
160 }
161
FindConnRequestByRequestId(uint32_t requestId)162 static ConnRequest *FindConnRequestByRequestId(uint32_t requestId)
163 {
164 ConnRequest *item = NULL;
165 LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
166 if (item->requestId == requestId) {
167 return item;
168 }
169 }
170 return NULL;
171 }
172
DelConnRequest(ConnRequest * item)173 static void DelConnRequest(ConnRequest *item)
174 {
175 CHECK_NULL_PTR_RETURN_VOID(item);
176 ListDelete(&item->node);
177 SoftBusFree(item);
178 }
179
ClearConnRequest(void)180 static void ClearConnRequest(void)
181 {
182 ConnRequest *item = NULL;
183 ConnRequest *next = NULL;
184 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_connRequestList, ConnRequest, node) {
185 DelConnRequest(item);
186 }
187 }
188
189 /* Notify Conn Listener */
190
NotifyClientConnected(uint32_t requestId,uint64_t connId,int32_t result,const AuthConnInfo * connInfo)191 static void NotifyClientConnected(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo)
192 {
193 if (g_listener.onConnectResult != NULL) {
194 g_listener.onConnectResult(requestId, connId, result, connInfo);
195 }
196 }
197
NotifyDisconnected(uint64_t connId,const AuthConnInfo * connInfo)198 static void NotifyDisconnected(uint64_t connId, const AuthConnInfo *connInfo)
199 {
200 if (g_listener.onDisconnected != NULL) {
201 g_listener.onDisconnected(connId, connInfo);
202 }
203 }
204
NotifyDataReceived(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)205 static void NotifyDataReceived(
206 uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
207 {
208 if (g_listener.onDataReceived != NULL) {
209 g_listener.onDataReceived(connId, connInfo, fromServer, head, data);
210 }
211 }
212
213 /* AuthData */
GetAuthDataSize(uint32_t len)214 uint32_t GetAuthDataSize(uint32_t len)
215 {
216 return AUTH_CONN_DATA_HEAD_SIZE + len;
217 }
218
PackAuthData(const AuthDataHead * head,const uint8_t * data,uint8_t * buf,uint32_t size)219 int32_t PackAuthData(const AuthDataHead *head, const uint8_t *data,
220 uint8_t *buf, uint32_t size)
221 {
222 if (head == NULL || data == NULL || buf == NULL) {
223 AUTH_LOGE(AUTH_CONN, "param error");
224 return SOFTBUS_INVALID_PARAM;
225 }
226 if (size < GetAuthDataSize(head->len)) {
227 return SOFTBUS_NO_ENOUGH_DATA;
228 }
229 uint32_t offset = 0;
230 *(uint32_t *)buf = SoftBusHtoLl(head->dataType);
231 offset += sizeof(uint32_t);
232 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->module);
233 offset += sizeof(uint32_t);
234 *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)head->seq);
235 offset += sizeof(uint64_t);
236 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->flag);
237 offset += sizeof(uint32_t);
238 *(uint32_t *)(buf + offset) = SoftBusHtoLl(head->len);
239 offset += sizeof(uint32_t);
240
241 if (memcpy_s(buf + offset, size - offset, data, head->len) != EOK) {
242 AUTH_LOGE(AUTH_CONN, "pack AuthData fail");
243 return SOFTBUS_MEM_ERR;
244 }
245 return SOFTBUS_OK;
246 }
247
UnpackAuthData(const uint8_t * data,uint32_t len,AuthDataHead * head)248 const uint8_t *UnpackAuthData(const uint8_t *data, uint32_t len, AuthDataHead *head)
249 {
250 if (len < GetAuthDataSize(0)) {
251 AUTH_LOGE(AUTH_CONN, "head not enough");
252 return NULL;
253 }
254 uint32_t offset = 0;
255 head->dataType = SoftBusLtoHl(*(uint32_t *)data);
256 offset += sizeof(uint32_t);
257 head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
258 offset += sizeof(uint32_t);
259 head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
260 offset += sizeof(uint64_t);
261 head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
262 offset += sizeof(uint32_t);
263 head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
264 offset += sizeof(uint32_t);
265 uint32_t dataLen = GetAuthDataSize(head->len);
266 if (len < dataLen || dataLen < GetAuthDataSize(0)) {
267 AUTH_LOGE(AUTH_CONN, "data not enough");
268 return NULL;
269 }
270 return (data + offset);
271 }
272
GetAuthTimeoutErrCode(AuthLinkType type)273 static int32_t GetAuthTimeoutErrCode(AuthLinkType type)
274 {
275 switch (type) {
276 case AUTH_LINK_TYPE_WIFI:
277 return SOFTBUS_AUTH_WIFI_CONN_TIMEOUT;
278 case AUTH_LINK_TYPE_BR:
279 return SOFTBUS_AUTH_BR_CONN_TIMEOUT;
280 case AUTH_LINK_TYPE_BLE:
281 return SOFTBUS_AUTH_BLE_CONN_TIMEOUT;
282 case AUTH_LINK_TYPE_P2P:
283 return SOFTBUS_AUTH_P2P_CONN_TIMEOUT;
284 case AUTH_LINK_TYPE_ENHANCED_P2P:
285 return SOFTBUS_AUTH_ENHANCEP2P_CONN_TIMEOUT;
286 case AUTH_LINK_TYPE_SESSION_KEY:
287 return SOFTBUS_AUTH_SESSION_KEY_CONN_TIMEOUT;
288 default:
289 AUTH_LOGE(AUTH_CONN, "auth conn timeout type=%{public}d", type);
290 }
291 return SOFTBUS_AUTH_CONN_TIMEOUT;
292 }
293
294 /* EVENT_CONNECT_TIMEOUT */
HandleConnConnectTimeout(const void * para)295 static void HandleConnConnectTimeout(const void *para)
296 {
297 CHECK_NULL_PTR_RETURN_VOID(para);
298 uint32_t requestId = *(uint32_t *)(para);
299 AUTH_LOGE(AUTH_CONN, "connect timeout, requestId=%{public}u", requestId);
300 ConnRequest *item = FindConnRequestByRequestId(requestId);
301 if (item != NULL) {
302 ListenerModule module = item->connInfo.type == AUTH_LINK_TYPE_RAW_ENHANCED_P2P ? AUTH_RAW_P2P_SERVER : AUTH;
303 SocketDisconnectDevice(module, item->fd);
304 DelConnRequest(item);
305 }
306 int32_t errCode = SOFTBUS_AUTH_CONN_TIMEOUT;
307 AuthRequest request = { 0 };
308 if (GetAuthRequest(requestId, &request) == SOFTBUS_OK) {
309 errCode = GetAuthTimeoutErrCode(request.connInfo.type);
310 AUTH_LOGE(AUTH_CONN, "errCode=%{public}d", errCode);
311 }
312 NotifyClientConnected(requestId, 0, errCode, NULL);
313 }
314
PostConnConnectTimeout(uint32_t requestId,AuthLinkType type)315 static void PostConnConnectTimeout(uint32_t requestId, AuthLinkType type)
316 {
317 if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
318 PostAuthEvent(EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId),
319 AUTH_ENHANCE_P2P_CONNECT_TIMEOUT_MS);
320 } else {
321 PostAuthEvent(EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId),
322 AUTH_CONN_CONNECT_TIMEOUT_MS);
323 }
324 }
325
RemoveFunc(const void * obj,void * param)326 static int32_t RemoveFunc(const void *obj, void *param)
327 {
328 CHECK_NULL_PTR_RETURN_VALUE(obj, SOFTBUS_INVALID_PARAM);
329 CHECK_NULL_PTR_RETURN_VALUE(param, SOFTBUS_INVALID_PARAM);
330 return ((*(uint32_t *)(obj) == *(uint32_t *)(param)) ? SOFTBUS_OK : SOFTBUS_INVALID_PARAM);
331 }
332
RemoveConnConnectTimeout(uint32_t requestId)333 static void RemoveConnConnectTimeout(uint32_t requestId)
334 {
335 RemoveAuthEvent(EVENT_CONNECT_TIMEOUT, RemoveFunc, (void *)(&requestId));
336 }
337
338 /* EVENT_CONNECT_CMD */
HandleConnConnectCmd(const void * para)339 static void HandleConnConnectCmd(const void *para)
340 {
341 int32_t fd = AUTH_INVALID_FD;
342 CHECK_NULL_PTR_RETURN_VOID(para);
343 ConnCmdInfo *info = (ConnCmdInfo *)para;
344 bool isFindAuthPreLinkNode = false;
345 if (info->connInfo.type != AUTH_LINK_TYPE_WIFI) {
346 AUTH_LOGE(AUTH_CONN, "invalid connType=%{public}d", info->connInfo.type);
347 return;
348 }
349 AuthPreLinkNode reuseKeyNode;
350 (void)memset_s(&reuseKeyNode, sizeof(AuthPreLinkNode), 0, sizeof(AuthPreLinkNode));
351 if (FindAuthPreLinkNodeById(info->requestId, &reuseKeyNode) == SOFTBUS_OK) {
352 AUTH_LOGI(AUTH_CONN, "find reuse devicekey id");
353 fd = reuseKeyNode.fd;
354 isFindAuthPreLinkNode = true;
355 SocketSetDevice(fd, true);
356 } else {
357 fd = SocketConnectDevice(info->connInfo.info.ipInfo.ip, info->connInfo.info.ipInfo.port, false);
358 }
359 if (fd < 0) {
360 AUTH_LOGE(AUTH_CONN, "SocketConnectDevice fail");
361 RemoveConnConnectTimeout(info->requestId);
362 NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
363 DelAuthPreLinkById(info->requestId);
364 return;
365 }
366 (void)AddConnRequest(&info->connInfo, info->requestId, fd);
367 if (isFindAuthPreLinkNode) {
368 AUTH_LOGI(AUTH_CONN, "reuse socket directly");
369 OnWiFiConnected(AUTH, fd, true);
370 }
371 }
372
HandleTcpSessionConnConnectCmd(const void * para)373 static void HandleTcpSessionConnConnectCmd(const void *para)
374 {
375 int32_t fd = AUTH_INVALID_FD;
376 CHECK_NULL_PTR_RETURN_VOID(para);
377 ConnCmdInfo *info = (ConnCmdInfo *)para;
378 if (info->connInfo.type != AUTH_LINK_TYPE_SESSION_KEY) {
379 AUTH_LOGE(AUTH_CONN, "invalid connType=%{public}d", info->connInfo.type);
380 return;
381 }
382 AuthPreLinkNode reuseKeyNode;
383 (void)memset_s(&reuseKeyNode, sizeof(AuthPreLinkNode), 0, sizeof(AuthPreLinkNode));
384 if (FindAuthPreLinkNodeById(info->requestId, &reuseKeyNode) != SOFTBUS_OK) {
385 AUTH_LOGE(AUTH_CONN, "not find reuse devicekey id");
386 return;
387 }
388 AUTH_LOGI(AUTH_CONN, "find reuse devicekey id");
389 fd = reuseKeyNode.fd;
390 if (fd < 0) {
391 AUTH_LOGE(AUTH_CONN, "SocketConnectDevice fail");
392 RemoveConnConnectTimeout(info->requestId);
393 NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
394 DelAuthPreLinkById(info->requestId);
395 return;
396 }
397 SocketSetDevice(fd, true);
398 (void)AddConnRequest(&info->connInfo, info->requestId, fd);
399 AUTH_LOGI(AUTH_CONN, "reuse socket directly");
400 OnTcpSessionConnected(AUTH, fd, true);
401 }
402
403 /* EVENT_CONNECT_RESULT */
HandleConnConnectResult(const void * para)404 static void HandleConnConnectResult(const void *para)
405 {
406 CHECK_NULL_PTR_RETURN_VOID(para);
407 AuthConnectResult *connResult = (AuthConnectResult *)(para);
408 RouteBuildClientAuthManager(connResult->fd);
409 ConnRequest *item = FindConnRequestByFd(connResult->fd);
410 if (item == NULL) {
411 AUTH_LOGE(AUTH_CONN, "ConnRequest not found, fd=%{public}d", connResult->fd);
412 return;
413 }
414 RemoveConnConnectTimeout(item->requestId);
415 if (connResult->ret == SOFTBUS_OK) {
416 NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_WIFI, connResult->fd),
417 SOFTBUS_OK, &item->connInfo);
418 } else {
419 NotifyClientConnected(item->requestId, 0, connResult->ret, NULL);
420 }
421 DelConnRequest(item);
422 }
423
HandleTcpSessionConnConnectResult(const void * para)424 static void HandleTcpSessionConnConnectResult(const void *para)
425 {
426 CHECK_NULL_PTR_RETURN_VOID(para);
427 AuthConnectResult *connResult = (AuthConnectResult *)(para);
428 RouteBuildClientAuthManager(connResult->fd);
429 ConnRequest *item = FindConnRequestByFd(connResult->fd);
430 if (item == NULL) {
431 AUTH_LOGE(AUTH_CONN, "ConnRequest not found, fd=%{public}d", connResult->fd);
432 return;
433 }
434 RemoveConnConnectTimeout(item->requestId);
435 if (connResult->ret == SOFTBUS_OK) {
436 NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_SESSION_KEY, connResult->fd),
437 SOFTBUS_OK, &item->connInfo);
438 } else {
439 NotifyClientConnected(item->requestId, 0, connResult->ret, NULL);
440 }
441 DelConnRequest(item);
442 }
443
AsyncCallDeviceIdReceived(void * para)444 static void AsyncCallDeviceIdReceived(void *para)
445 {
446 RepeatDeviceIdData *recvData = (RepeatDeviceIdData *)para;
447 if (recvData == NULL) {
448 return;
449 }
450 NotifyDataReceived(recvData->connId, &recvData->connInfo, recvData->fromServer, &recvData->head, recvData->data);
451 SoftBusFree(para);
452 }
453
HandleDataReceivedProcess(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)454 static void HandleDataReceivedProcess(
455 uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
456 {
457 RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
458 if (request == NULL) {
459 AUTH_LOGE(AUTH_CONN, "malloc RepeatDeviceIdData fail");
460 return;
461 }
462 request->len = head->len;
463 if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
464 AUTH_LOGE(AUTH_CONN, "copy data fail");
465 SoftBusFree(request);
466 return;
467 }
468 request->connId = connId;
469 request->connInfo = *connInfo;
470 request->fromServer = fromServer;
471 request->head = *head;
472 if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request, 0) !=
473 SOFTBUS_OK) {
474 SoftBusFree(request);
475 }
476 }
477
478 /* WiFi Connection */
OnWiFiConnected(ListenerModule module,int32_t fd,bool isClient)479 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient)
480 {
481 AUTH_LOGI(AUTH_CONN, "OnWiFiConnected: fd=%{public}d, side=%{public}s", fd,
482 isClient ? "client" : "server(ignored)");
483 if (!isClient) {
484 /* do nothing, wait auth message. */
485 return;
486 }
487 AuthConnectResult info = {
488 .fd = fd,
489 .ret = SOFTBUS_OK,
490 };
491 (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &info, sizeof(AuthConnectResult), 0);
492 }
493
OnTcpSessionConnected(ListenerModule module,int32_t fd,bool isClient)494 static void OnTcpSessionConnected(ListenerModule module, int32_t fd, bool isClient)
495 {
496 AUTH_LOGI(AUTH_CONN, "OnTcpSessionConnected: fd=%{public}d, side=%{public}s", fd,
497 isClient ? "client" : "server(ignored)");
498 if (!isClient) {
499 /* do nothing, wait auth message. */
500 return;
501 }
502 AuthConnectResult info = {
503 .fd = fd,
504 .ret = SOFTBUS_OK,
505 };
506 (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleTcpSessionConnConnectResult, &info, sizeof(AuthConnectResult), 0);
507 }
508
OnWiFiDisconnected(int32_t fd)509 static void OnWiFiDisconnected(int32_t fd)
510 {
511 AUTH_LOGI(AUTH_CONN, "OnWiFiDisconnected: fd=%{public}d", fd);
512 AuthConnInfo connInfo;
513 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
514 connInfo.type = AUTH_LINK_TYPE_WIFI;
515 bool isWifiType = IsHaveAuthIdByConnId(GenConnId(connInfo.type, fd));
516 if (!isWifiType) {
517 AUTH_LOGI(AUTH_CONN, "select session key auth link type");
518 connInfo.type = AUTH_LINK_TYPE_SESSION_KEY;
519 NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
520 AuthConnectResult info = {
521 .fd = fd,
522 .ret = SOFTBUS_AUTH_CONN_FAIL,
523 };
524 (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleTcpSessionConnConnectResult, &info,
525 sizeof(AuthConnectResult), 0);
526 RouteClearAuthChannelId(fd);
527 return;
528 }
529 NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
530 AuthConnectResult info = {
531 .fd = fd,
532 .ret = SOFTBUS_AUTH_CONN_FAIL,
533 };
534 (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &info, sizeof(AuthConnectResult), 0);
535 RouteClearAuthChannelId(fd);
536 }
537
IsSessionAuth(int32_t module)538 static bool IsSessionAuth(int32_t module)
539 {
540 return (module == MODULE_SESSION_AUTH);
541 }
542
OnWiFiDataReceived(ListenerModule module,int32_t fd,const AuthDataHead * head,const uint8_t * data)543 static void OnWiFiDataReceived(ListenerModule module, int32_t fd, const AuthDataHead *head, const uint8_t *data)
544 {
545 CHECK_NULL_PTR_RETURN_VOID(head);
546 CHECK_NULL_PTR_RETURN_VOID(data);
547
548 if (module != AUTH && module != AUTH_P2P && module != AUTH_RAW_P2P_SERVER && !IsEnhanceP2pModuleId(module) &&
549 !IsSessionAuth(head->module)) {
550 return;
551 }
552 bool fromServer = false;
553 AuthConnInfo connInfo;
554 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
555 if (IsSessionAuth(head->module)) {
556 connInfo.type = AUTH_LINK_TYPE_SESSION;
557 connInfo.info.sessionInfo.connId = (uint32_t)fd;
558 AUTH_LOGI(AUTH_CONN, "set connInfo for AUTH_LINK_TYPE_SESSION, fd=%{public}d", fd);
559 } else {
560 if (SocketGetConnInfo(fd, &connInfo, &fromServer) != SOFTBUS_OK) {
561 AUTH_LOGE(AUTH_CONN, "get connInfo fail, fd=%{public}d", fd);
562 return;
563 }
564 }
565 HandleDataReceivedProcess(GenConnId(connInfo.type, fd), &connInfo, fromServer, head, data);
566 }
567
InitWiFiConn(void)568 static int32_t InitWiFiConn(void)
569 {
570 SocketCallback socketCb = {
571 .onConnected = OnWiFiConnected,
572 .onDisconnected = OnWiFiDisconnected,
573 .onDataReceived = OnWiFiDataReceived,
574 };
575 return SetSocketCallback(&socketCb);
576 }
577
578 /* BR/BLE/P2P Connection */
OnCommConnected(uint32_t connectionId,const ConnectionInfo * info)579 static void OnCommConnected(uint32_t connectionId, const ConnectionInfo *info)
580 {
581 AUTH_LOGI(AUTH_CONN, "(ignored)OnCommConnected: connectionId=%{public}u", connectionId);
582 }
583
OnCommDisconnected(uint32_t connectionId,const ConnectionInfo * info)584 static void OnCommDisconnected(uint32_t connectionId, const ConnectionInfo *info)
585 {
586 AUTH_LOGI(AUTH_CONN, "connectionId=%{public}u", connectionId);
587 CHECK_NULL_PTR_RETURN_VOID(info);
588 AuthConnInfo connInfo;
589 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
590 (void)ConvertToAuthConnInfo(info, &connInfo);
591 NotifyDisconnected(GenConnId(connInfo.type, connectionId), &connInfo);
592 }
593
GetConnInfoByConnectionId(uint32_t connectionId,AuthConnInfo * connInfo)594 int32_t GetConnInfoByConnectionId(uint32_t connectionId, AuthConnInfo *connInfo)
595 {
596 ConnectionInfo info = { 0 };
597 int32_t ret = ConnGetConnectionInfo(connectionId, &info);
598 if (ret != SOFTBUS_OK) {
599 AUTH_LOGE(AUTH_CONN, "GetConnectionInfo err=%{public}d, connectionId=%{public}u", ret, connectionId);
600 return ret;
601 }
602 return ConvertToAuthConnInfo(&info, connInfo);
603 }
604
OnCommDataReceived(uint32_t connectionId,ConnModule moduleId,int64_t seq,char * data,int32_t len)605 static void OnCommDataReceived(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
606 {
607 if (data == NULL || moduleId != MODULE_DEVICE_AUTH || len <= 0) {
608 AUTH_LOGE(AUTH_CONN, "invalid param");
609 return;
610 }
611 bool fromServer = ((seq % SEQ_INTERVAL) != 0);
612 AUTH_LOGI(AUTH_CONN,
613 "connectionId=%{public}u, module=%{public}d, seq=%{public}" PRId64 ", len=%{public}d, from=%{public}s",
614 connectionId, moduleId, seq, len, GetAuthSideStr(fromServer));
615 AuthConnInfo connInfo;
616 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
617 if (GetConnInfoByConnectionId(connectionId, &connInfo) != SOFTBUS_OK) {
618 return;
619 }
620 AuthDataHead head = { 0 };
621 const uint8_t *body = UnpackAuthData((const uint8_t *)data, (uint32_t)len, &head);
622 if (body == NULL) {
623 AUTH_LOGE(AUTH_CONN, "empty body");
624 return;
625 }
626 HandleDataReceivedProcess(GenConnId(connInfo.type, connectionId), &connInfo, fromServer, &head, body);
627 }
628
HandleRepeatDeviceIdDataDelay(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)629 void HandleRepeatDeviceIdDataDelay(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
630 const AuthDataHead *head, const uint8_t *data)
631 {
632 if (connInfo == NULL || head == NULL || data == NULL) {
633 AUTH_LOGE(AUTH_CONN, "param error");
634 return;
635 }
636 RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
637 if (request == NULL) {
638 AUTH_LOGE(AUTH_CONN, "malloc RepeatDeviceIdData fail");
639 return;
640 }
641 request->len = head->len;
642 if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
643 AUTH_LOGE(AUTH_CONN, "copy data fail");
644 SoftBusFree(request);
645 return;
646 }
647 request->connId = connId;
648 request->connInfo = *connInfo;
649 request->fromServer = fromServer;
650 request->head = *head;
651 if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request,
652 AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY) != SOFTBUS_OK) {
653 SoftBusFree(request);
654 }
655 }
656
InitCommConn(void)657 static int32_t InitCommConn(void)
658 {
659 ConnectCallback connCb = {
660 .OnConnected = OnCommConnected,
661 .OnDisconnected = OnCommDisconnected,
662 .OnDataReceived = OnCommDataReceived,
663 };
664 return ConnSetConnectCallback(MODULE_DEVICE_AUTH, &connCb);
665 }
666
OnCommConnectSucc(uint32_t requestId,uint32_t connectionId,const ConnectionInfo * info)667 static void OnCommConnectSucc(uint32_t requestId, uint32_t connectionId, const ConnectionInfo *info)
668 {
669 AuthConnInfo connInfo;
670 AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, connectionId=%{public}u", requestId, connectionId);
671 CHECK_NULL_PTR_RETURN_VOID(info);
672 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
673 (void)ConvertToAuthConnInfo(info, &connInfo);
674 RemoveConnConnectTimeout(requestId);
675 uint64_t connId = GenConnId(connInfo.type, connectionId);
676 NotifyClientConnected(requestId, connId, SOFTBUS_OK, &connInfo);
677 }
678
OnCommConnectFail(uint32_t requestId,int32_t reason)679 static void OnCommConnectFail(uint32_t requestId, int32_t reason)
680 {
681 AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, reason=%{public}d", requestId, reason);
682 RemoveConnConnectTimeout(requestId);
683 NotifyClientConnected(requestId, 0, reason, NULL);
684 }
685
ConnectCommDevice(const AuthConnInfo * info,uint32_t requestId,ConnSideType sideType)686 static int32_t ConnectCommDevice(const AuthConnInfo *info, uint32_t requestId, ConnSideType sideType)
687 {
688 ConnectOption option;
689 (void)memset_s(&option, sizeof(ConnectOption), 0, sizeof(ConnectOption));
690 int32_t ret = ConvertToConnectOption(info, &option);
691 if (ret != SOFTBUS_OK) {
692 AUTH_LOGE(AUTH_CONN, "ConvertToConnectOption fail=%{public}d", ret);
693 return ret;
694 }
695 if (option.type == CONNECT_BR) {
696 option.brOption.sideType = sideType;
697 }
698 ConnectResult result = {
699 .OnConnectSuccessed = OnCommConnectSucc,
700 .OnConnectFailed = OnCommConnectFail,
701 };
702 ret = ConnConnectDevice(&option, requestId, &result);
703 if (ret != SOFTBUS_OK) {
704 AUTH_LOGE(AUTH_CONN, "ConnConnectDevice fail. ret=%{public}d", ret);
705 return ret;
706 }
707 return SOFTBUS_OK;
708 }
709
PostCommData(uint32_t connectionId,bool toServer,const AuthDataHead * head,const uint8_t * data)710 static int32_t PostCommData(uint32_t connectionId, bool toServer, const AuthDataHead *head, const uint8_t *data)
711 {
712 uint32_t size = ConnGetHeadSize() + GetAuthDataSize(head->len);
713 uint8_t *buf = (uint8_t *)SoftBusMalloc(size);
714 if (buf == NULL) {
715 AUTH_LOGE(AUTH_CONN, "malloc fail");
716 return SOFTBUS_MALLOC_ERR;
717 }
718 int32_t ret = PackAuthData(head, data, buf + ConnGetHeadSize(), size - ConnGetHeadSize());
719 if (ret != SOFTBUS_OK) {
720 AUTH_LOGE(AUTH_CONN, "pack data fail=%{public}d", ret);
721 SoftBusFree(buf);
722 return ret;
723 }
724 ConnPostData connData = {
725 .module = MODULE_DEVICE_AUTH,
726 .seq = GenSeq(!toServer),
727 .flag = CONN_HIGH,
728 .pid = 0,
729 .len = size,
730 .buf = (char *)buf,
731 };
732 AUTH_LOGI(AUTH_CONN,
733 "dataSeq=%{public}" PRId64 ", dataLen=%{public}u, "
734 "connId=%{public}u, connSeq=%{public}" PRId64 ", connLen=%{public}u}",
735 head->seq, head->len, connectionId, connData.seq, connData.len);
736 return ConnPostBytes(connectionId, &connData);
737 }
738
AuthConnInit(const AuthConnListener * listener)739 int32_t AuthConnInit(const AuthConnListener *listener)
740 {
741 CHECK_NULL_PTR_RETURN_VALUE(listener, SOFTBUS_INVALID_PARAM);
742 g_listener = *listener;
743 ListInit(&g_connRequestList);
744 if (InitCommConn() != SOFTBUS_OK) {
745 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
746 AUTH_LOGE(AUTH_CONN, "init br/ble/p2p conn fail");
747 return SOFTBUS_AUTH_CONN_INIT_FAIL;
748 }
749 if (WifiConnListLockInit() != SOFTBUS_OK) {
750 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
751 AUTH_LOGE(AUTH_CONN, "init WifiConnListLock fail");
752 return SOFTBUS_LOCK_ERR;
753 }
754 if (InitWiFiConn() != SOFTBUS_OK) {
755 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
756 AUTH_LOGE(AUTH_CONN, "init wifi conn fail");
757 return SOFTBUS_AUTH_CONN_INIT_FAIL;
758 }
759 return SOFTBUS_OK;
760 }
761
AuthConnDeinit(void)762 void AuthConnDeinit(void)
763 {
764 UnsetSocketCallback();
765 ConnUnSetConnectCallback(MODULE_DEVICE_AUTH);
766 ClearConnRequest();
767 WifiConnListLockDeinit();
768 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
769 }
770
SessionConnectSucc(uint32_t requestId,const AuthConnInfo * connInfo)771 static void SessionConnectSucc(uint32_t requestId, const AuthConnInfo *connInfo)
772 {
773 AUTH_LOGI(AUTH_CONN, "no need connect.");
774 uint64_t connId = GenConnId(connInfo->type, (int32_t)connInfo->info.sessionInfo.connId);
775 NotifyClientConnected(requestId, connId, SOFTBUS_OK, connInfo);
776 }
777
ConnectAuthDevice(uint32_t requestId,const AuthConnInfo * connInfo,ConnSideType sideType)778 int32_t ConnectAuthDevice(uint32_t requestId, const AuthConnInfo *connInfo, ConnSideType sideType)
779 {
780 CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
781 AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, connType=%{public}d, sideType=%{public}d", requestId,
782 connInfo->type, sideType);
783 PostConnConnectTimeout(requestId, connInfo->type);
784 int32_t ret = 0;
785 switch (connInfo->type) {
786 case AUTH_LINK_TYPE_WIFI: {
787 ConnCmdInfo info = {
788 .requestId = requestId,
789 .connInfo = *connInfo,
790 .retryTimes = 0,
791 };
792 ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
793 break;
794 }
795 case AUTH_LINK_TYPE_BLE:
796 __attribute__((fallthrough));
797 case AUTH_LINK_TYPE_BR:
798 if (SoftBusGetBtState() != BLE_ENABLE) {
799 ret = SOFTBUS_AUTH_CONN_FAIL;
800 break;
801 }
802 __attribute__((fallthrough));
803 case AUTH_LINK_TYPE_P2P:
804 case AUTH_LINK_TYPE_ENHANCED_P2P:
805 ret = ConnectCommDevice(connInfo, requestId, sideType);
806 break;
807 case AUTH_LINK_TYPE_SESSION:
808 SessionConnectSucc(requestId, connInfo);
809 break;
810 case AUTH_LINK_TYPE_SESSION_KEY: {
811 ConnCmdInfo info = {
812 .requestId = requestId,
813 .connInfo = *connInfo,
814 .retryTimes = 0,
815 };
816 ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleTcpSessionConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
817 break;
818 }
819 default:
820 ret = SOFTBUS_OK;
821 break;
822 }
823 if (ret != SOFTBUS_OK) {
824 RemoveConnConnectTimeout(requestId);
825 AUTH_LOGE(AUTH_CONN, "ConnectDevice fail, requestId=%{public}u", requestId);
826 }
827 return ret;
828 }
829
UpdateAuthDevicePriority(uint64_t connId)830 void UpdateAuthDevicePriority(uint64_t connId)
831 {
832 if (GetConnType(connId) != AUTH_LINK_TYPE_BLE) {
833 return;
834 }
835 UpdateOption option = {
836 .type = CONNECT_BLE,
837 .bleOption = {
838 .priority = CONN_BLE_PRIORITY_BALANCED,
839 }
840 };
841 int32_t ret = ConnUpdateConnection(GetConnId(connId), &option);
842 AUTH_LOGI(AUTH_CONN, "update connecton priority to balanced, connType=%{public}d, id=%{public}u, ret=%{public}d",
843 GetConnType(connId), GetConnId(connId), ret);
844 }
845
DisconnectAuthDevice(uint64_t * connId)846 void DisconnectAuthDevice(uint64_t *connId)
847 {
848 if (connId == NULL) {
849 AUTH_LOGW(AUTH_CONN, "connId nulptr");
850 return;
851 }
852 AUTH_LOGI(AUTH_CONN, "connType=%{public}d, connectionId=%{public}u", GetConnType(*connId), GetConnId(*connId));
853 switch (GetConnType(*connId)) {
854 case AUTH_LINK_TYPE_RAW_ENHANCED_P2P:
855 SocketDisconnectDevice(AUTH_RAW_P2P_SERVER, GetFd(*connId));
856 UpdateFd(connId, AUTH_INVALID_FD);
857 break;
858 case AUTH_LINK_TYPE_WIFI:
859 SocketDisconnectDevice(AUTH, GetFd(*connId));
860 UpdateFd(connId, AUTH_INVALID_FD);
861 break;
862 case AUTH_LINK_TYPE_BLE:
863 __attribute__((fallthrough));
864 case AUTH_LINK_TYPE_BR:
865 ConnDisconnectDevice(GetConnId(*connId));
866 __attribute__((fallthrough));
867 case AUTH_LINK_TYPE_P2P:
868 case AUTH_LINK_TYPE_ENHANCED_P2P:
869 case AUTH_LINK_TYPE_SESSION_KEY:
870 break;
871 default:
872 AUTH_LOGI(AUTH_CONN, "unknown connType");
873 break;
874 }
875 }
876
PostBytesForSession(int32_t fd,const AuthDataHead * head,const uint8_t * data)877 static int32_t PostBytesForSession(int32_t fd, const AuthDataHead *head, const uint8_t *data)
878 {
879 uint32_t size = GetAuthDataSize(head->len);
880 uint8_t *buf = (uint8_t *)SoftBusCalloc(size);
881 if (buf == NULL) {
882 AUTH_LOGE(AUTH_CONN, "calloc fail");
883 return SOFTBUS_MALLOC_ERR;
884 }
885 AuthDataHead tmpHead = *head;
886 tmpHead.module = MODULE_SESSION_AUTH;
887 int32_t ret = PackAuthData(&tmpHead, data, buf, size);
888 if (ret != SOFTBUS_OK) {
889 AUTH_LOGE(AUTH_CONN, "PackAuthData fail");
890 SoftBusFree(buf);
891 return ret;
892 }
893 tmpHead.len = size;
894 ret = SocketPostBytes(fd, &tmpHead, buf);
895 if (ret != SOFTBUS_OK) {
896 AUTH_LOGE(AUTH_CONN, "SocketPostBytes fail");
897 }
898 SoftBusFree(buf);
899 return ret;
900 }
901
PostAuthData(uint64_t connId,bool toServer,const AuthDataHead * head,const uint8_t * data)902 int32_t PostAuthData(uint64_t connId, bool toServer, const AuthDataHead *head, const uint8_t *data)
903 {
904 CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
905 CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
906 AUTH_LOGI(AUTH_CONN,
907 "auth post dataType=0x%{public}x, dataModule=%{public}d, dataSeq=%{public}" PRId64 ", "
908 "dataFlag=%{public}d, dataLen=%{public}u, " CONN_INFO ", toServer=%{public}s",
909 head->dataType, head->module, head->seq, head->flag, head->len, CONN_DATA(connId),
910 GetAuthSideStr(toServer));
911 switch (GetConnType(connId)) {
912 case AUTH_LINK_TYPE_WIFI:
913 case AUTH_LINK_TYPE_SESSION_KEY:
914 return SocketPostBytes(GetFd(connId), head, data);
915 case AUTH_LINK_TYPE_BLE:
916 case AUTH_LINK_TYPE_BR:
917 case AUTH_LINK_TYPE_P2P:
918 case AUTH_LINK_TYPE_ENHANCED_P2P:
919 return PostCommData(GetConnId(connId), toServer, head, data);
920 case AUTH_LINK_TYPE_SESSION:
921 return PostBytesForSession(GetFd(connId), head, data);
922 default:
923 AUTH_LOGI(AUTH_CONN, "unknown connType");
924 break;
925 }
926 return SOFTBUS_AUTH_SEND_FAIL;
927 }
928
GetConnSideType(uint64_t connId)929 ConnSideType GetConnSideType(uint64_t connId)
930 {
931 if (GetConnType(connId) == AUTH_LINK_TYPE_WIFI) {
932 AUTH_LOGE(AUTH_CONN, "WiFi not supported, " CONN_INFO, CONN_DATA(connId));
933 return CONN_SIDE_ANY;
934 }
935 ConnectionInfo info;
936 (void)memset_s(&info, sizeof(ConnectionInfo), 0, sizeof(ConnectionInfo));
937 if (ConnGetConnectionInfo(GetConnId(connId), &info)) {
938 AUTH_LOGE(AUTH_CONN, "ConnGetConnectionInfo fail, " CONN_INFO, CONN_DATA(connId));
939 return CONN_SIDE_ANY;
940 }
941 if (!info.isAvailable) {
942 AUTH_LOGE(AUTH_CONN, "connection not available, " CONN_INFO, CONN_DATA(connId));
943 }
944 return info.isServer ? CONN_SIDE_SERVER : CONN_SIDE_CLIENT;
945 }
946
CheckActiveAuthConnection(const AuthConnInfo * connInfo)947 bool CheckActiveAuthConnection(const AuthConnInfo *connInfo)
948 {
949 ConnectOption connOpt;
950 CHECK_NULL_PTR_RETURN_VALUE(connInfo, false);
951 (void)memset_s(&connOpt, sizeof(ConnectOption), 0, sizeof(ConnectOption));
952 if (ConvertToConnectOption(connInfo, &connOpt) != SOFTBUS_OK) {
953 AUTH_LOGE(AUTH_CONN, "convert to connect option fail, connType=%{public}d.", connInfo->type);
954 return false;
955 }
956 if (connInfo->type == AUTH_LINK_TYPE_BLE) {
957 connOpt.bleOption.protocol = BLE_PROTOCOL_ANY;
958 }
959 return CheckActiveConnection(&connOpt, true);
960 }
961
AuthStartListening(AuthLinkType type,const char * ip,int32_t port)962 int32_t AuthStartListening(AuthLinkType type, const char *ip, int32_t port)
963 {
964 if (ip == NULL) {
965 AUTH_LOGW(AUTH_CONN, "invalid param");
966 return SOFTBUS_INVALID_PARAM;
967 }
968 AUTH_LOGI(AUTH_CONN, "start auth listening, linkType=%{public}d, port=%{public}d", type, port);
969 LocalListenerInfo info = {
970 .type = CONNECT_TCP,
971 .socketOption = {
972 .addr = "",
973 .port = port,
974 .moduleId = AUTH,
975 .protocol = LNN_PROTOCOL_IP,
976 },
977 };
978
979 if (strcpy_s(info.socketOption.addr, sizeof(info.socketOption.addr), ip) != EOK) {
980 AUTH_LOGE(AUTH_CONN, "strcpy_s ip fail");
981 return SOFTBUS_STRCPY_ERR;
982 }
983 switch (type) {
984 case AUTH_LINK_TYPE_WIFI: {
985 info.socketOption.moduleId = AUTH;
986 return StartSocketListening(AUTH, &info);
987 }
988 case AUTH_LINK_TYPE_RAW_ENHANCED_P2P: {
989 info.socketOption.moduleId = AUTH_RAW_P2P_SERVER;
990 info.socketOption.port = 0;
991 return StartSocketListening(AUTH_RAW_P2P_SERVER, &info);
992 }
993 default:
994 AUTH_LOGE(AUTH_CONN, "unsupport linkType=%{public}d", type);
995 break;
996 }
997 return SOFTBUS_INVALID_PARAM;
998 }
999
AuthStopListening(AuthLinkType type)1000 void AuthStopListening(AuthLinkType type)
1001 {
1002 AUTH_LOGI(AUTH_CONN, "stop auth listening, linkType=%{public}d", type);
1003 switch (type) {
1004 case AUTH_LINK_TYPE_WIFI:
1005 StopSocketListening(AUTH);
1006 break;
1007 case AUTH_LINK_TYPE_RAW_ENHANCED_P2P:
1008 StopSocketListening(AUTH_RAW_P2P_SERVER);
1009 break;
1010 default:
1011 AUTH_LOGE(AUTH_CONN, "unsupport linkType=%{public}d", type);
1012 break;
1013 }
1014 }
1015
AuthStartListeningForWifiDirect(AuthLinkType type,const char * ip,int32_t port,ListenerModule * moduleId)1016 int32_t AuthStartListeningForWifiDirect(AuthLinkType type, const char *ip, int32_t port, ListenerModule *moduleId)
1017 {
1018 AUTH_CHECK_AND_RETURN_RET_LOGE(ip != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "ip is null");
1019 AUTH_CHECK_AND_RETURN_RET_LOGE(moduleId != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "moduleId is null");
1020
1021 LocalListenerInfo local;
1022 local.type = CONNECT_TCP;
1023 local.socketOption.port = port;
1024 local.socketOption.protocol = LNN_PROTOCOL_IP;
1025 int32_t ret = strcpy_s(local.socketOption.addr, sizeof(local.socketOption.addr), ip);
1026 AUTH_CHECK_AND_RETURN_RET_LOGE(ret == EOK, SOFTBUS_STRCPY_ERR, AUTH_CONN, "copy ip failed");
1027
1028 if (type == AUTH_LINK_TYPE_P2P) {
1029 local.socketOption.moduleId = AUTH_P2P;
1030 } else if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
1031 local.socketOption.moduleId = (ListenerModule)(GetWifiDirectManager()->allocateListenerModuleId());
1032 AUTH_CHECK_AND_RETURN_RET_LOGE(local.socketOption.moduleId < UNUSE_BUTT,
1033 SOFTBUS_AUTH_LISTENER_MODULE_INVALID, AUTH_CONN, "alloc listener module id failed");
1034 } else {
1035 AUTH_LOGE(AUTH_CONN, "invalid type=%{public}d", type);
1036 return SOFTBUS_INVALID_PARAM;
1037 }
1038
1039 int32_t realPort = ConnStartLocalListening(&local);
1040 if (realPort <= 0) {
1041 if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
1042 GetWifiDirectManager()->freeListenerModuleId(local.socketOption.moduleId);
1043 }
1044 AUTH_LOGE(AUTH_CONN, "start local listening failed");
1045 return realPort;
1046 }
1047 AUTH_LOGI(AUTH_CONN, "moduleId=%{public}u, port=%{public}d", local.socketOption.moduleId, realPort);
1048 *moduleId = local.socketOption.moduleId;
1049 return realPort;
1050 }
1051
AuthStopListeningForWifiDirect(AuthLinkType type,ListenerModule moduleId)1052 void AuthStopListeningForWifiDirect(AuthLinkType type, ListenerModule moduleId)
1053 {
1054 AUTH_CHECK_AND_RETURN_LOGE(type == AUTH_LINK_TYPE_P2P || type == AUTH_LINK_TYPE_ENHANCED_P2P, AUTH_CONN,
1055 "invalid type=%{public}d", type);
1056 LocalListenerInfo local = {
1057 .type = CONNECT_TCP,
1058 .socketOption = {
1059 .moduleId = moduleId,
1060 .protocol = LNN_PROTOCOL_IP,
1061 },
1062 };
1063
1064 if (ConnStopLocalListening(&local) != SOFTBUS_OK) {
1065 AUTH_LOGE(AUTH_CONN, "ConnStopLocalListening fail");
1066 }
1067 GetWifiDirectManager()->freeListenerModuleId(moduleId);
1068 }