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