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_tcp_connection.h"
22 #include "lnn_async_callback_utils.h"
23 #include "softbus_adapter_bt_common.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_adapter_socket.h"
26 #include "softbus_base_listener.h"
27 #include "softbus_conn_interface.h"
28 #include "softbus_def.h"
29
30 #define AUTH_CONN_DATA_HEAD_SIZE 24
31 #define AUTH_CONN_CONNECT_TIMEOUT_MS 10000
32 #define AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY 1000
33
34 typedef struct {
35 uint32_t requestId;
36 AuthConnInfo connInfo;
37 } ConnCmdInfo;
38
39 typedef struct {
40 uint32_t requestId;
41 int32_t fd;
42 AuthConnInfo connInfo;
43 ListNode node;
44 } ConnRequest;
45
46 static ListNode g_connRequestList = { &g_connRequestList, &g_connRequestList };
47 static AuthConnListener g_listener = { 0 };
RouteBuildClientAuthManager(int32_t cfd)48 void __attribute__((weak)) RouteBuildClientAuthManager(int32_t cfd)
49 {
50 (void)cfd;
51 }
RouteClearAuthChannelId(int32_t cfd)52 void __attribute__((weak)) RouteClearAuthChannelId(int32_t cfd)
53 {
54 (void)cfd;
55 }
56
GenConnId(int32_t connType,int32_t id)57 uint64_t GenConnId(int32_t connType, int32_t id)
58 {
59 uint64_t connId = (uint64_t)connType;
60 connId = (connId << INT32_BIT_NUM) & MASK_UINT64_H32;
61 connId |= (((uint64_t)id) & MASK_UINT64_L32);
62 return connId;
63 }
64
GetConnType(uint64_t connId)65 int32_t GetConnType(uint64_t connId)
66 {
67 return (int32_t)((connId >> INT32_BIT_NUM) & MASK_UINT64_L32);
68 }
69
GetConnTypeStr(uint64_t connId)70 NO_SANITIZE("cfi") const char *GetConnTypeStr(uint64_t connId)
71 {
72 int32_t type = GetConnType(connId);
73 switch (type) {
74 case AUTH_LINK_TYPE_WIFI:
75 return "wifi/eth";
76 case AUTH_LINK_TYPE_BR:
77 return "br";
78 case AUTH_LINK_TYPE_BLE:
79 return "ble";
80 case AUTH_LINK_TYPE_P2P:
81 return "p2p";
82 default:
83 break;
84 }
85 return "unknown";
86 }
87
GetConnId(uint64_t connId)88 uint32_t GetConnId(uint64_t connId)
89 {
90 return (uint32_t)(connId & MASK_UINT64_L32);
91 }
92
GetFd(uint64_t connId)93 static int32_t GetFd(uint64_t connId)
94 {
95 return (int32_t)(connId & MASK_UINT64_L32);
96 }
97
98 /* Conn Request */
AddConnRequest(const AuthConnInfo * connInfo,uint32_t requestId,int32_t fd)99 static int32_t AddConnRequest(const AuthConnInfo *connInfo, uint32_t requestId, int32_t fd)
100 {
101 ConnRequest *item = (ConnRequest *)SoftBusMalloc(sizeof(ConnRequest));
102 if (item == NULL) {
103 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: malloc ConnRequest fail.");
104 return SOFTBUS_MALLOC_ERR;
105 }
106 item->fd = fd;
107 item->requestId = requestId;
108 if (memcpy_s(&item->connInfo, sizeof(item->connInfo), connInfo, sizeof(AuthConnInfo)) != EOK) {
109 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: set AuthConnInfo fail.");
110 SoftBusFree(item);
111 return SOFTBUS_MEM_ERR;
112 }
113 ListTailInsert(&g_connRequestList, &item->node);
114 return SOFTBUS_OK;
115 }
116
FindConnRequestByFd(int32_t fd)117 static ConnRequest *FindConnRequestByFd(int32_t fd)
118 {
119 ConnRequest *item = NULL;
120 LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
121 if (item->fd == fd) {
122 return item;
123 }
124 }
125 return NULL;
126 }
127
FindConnRequestByRequestId(uint32_t requestId)128 static ConnRequest *FindConnRequestByRequestId(uint32_t requestId)
129 {
130 ConnRequest *item = NULL;
131 LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
132 if (item->requestId == requestId) {
133 return item;
134 }
135 }
136 return NULL;
137 }
138
DelConnRequest(ConnRequest * item)139 static void DelConnRequest(ConnRequest *item)
140 {
141 CHECK_NULL_PTR_RETURN_VOID(item);
142 ListDelete(&item->node);
143 SoftBusFree(item);
144 }
145
ClearConnRequest(void)146 static void ClearConnRequest(void)
147 {
148 ConnRequest *item = NULL;
149 ConnRequest *next = NULL;
150 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_connRequestList, ConnRequest, node) {
151 DelConnRequest(item);
152 }
153 }
154
155 /* Notify Conn Listener */
156 NO_SANITIZE("cfi")
NotifyClientConnected(uint32_t requestId,uint64_t connId,int32_t result,const AuthConnInfo * connInfo)157 static void NotifyClientConnected(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo)
158 {
159 if (g_listener.onConnectResult != NULL) {
160 g_listener.onConnectResult(requestId, connId, result, connInfo);
161 }
162 }
163
NotifyDisconnected(uint64_t connId,const AuthConnInfo * connInfo)164 NO_SANITIZE("cfi") static void NotifyDisconnected(uint64_t connId, const AuthConnInfo *connInfo)
165 {
166 if (g_listener.onDisconnected != NULL) {
167 g_listener.onDisconnected(connId, connInfo);
168 }
169 }
170
171 NO_SANITIZE("cfi")
NotifyDataReceived(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)172 static void NotifyDataReceived(
173 uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
174 {
175 if (g_listener.onDataReceived != NULL) {
176 g_listener.onDataReceived(connId, connInfo, fromServer, head, data);
177 }
178 }
179
180 /* AuthData */
GetAuthDataSize(uint32_t len)181 NO_SANITIZE("cfi") uint32_t GetAuthDataSize(uint32_t len)
182 {
183 return AUTH_CONN_DATA_HEAD_SIZE + len;
184 }
185
PackAuthData(const AuthDataHead * head,const uint8_t * data,uint8_t * buf,uint32_t size)186 NO_SANITIZE("cfi") int32_t PackAuthData(const AuthDataHead *head, const uint8_t *data,
187 uint8_t *buf, uint32_t size)
188 {
189 if (size < GetAuthDataSize(head->len)) {
190 return SOFTBUS_NO_ENOUGH_DATA;
191 }
192 uint32_t offset = 0;
193 *(uint32_t *)buf = SoftBusHtoLl(head->dataType);
194 offset += sizeof(uint32_t);
195 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->module);
196 offset += sizeof(uint32_t);
197 *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)head->seq);
198 offset += sizeof(uint64_t);
199 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->flag);
200 offset += sizeof(uint32_t);
201 *(uint32_t *)(buf + offset) = SoftBusHtoLl(head->len);
202 offset += sizeof(uint32_t);
203
204 if (memcpy_s(buf + offset, size - offset, data, head->len) != EOK) {
205 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "pack AuthData fail.");
206 return SOFTBUS_MEM_ERR;
207 }
208 return SOFTBUS_OK;
209 }
210
UnpackAuthData(const uint8_t * data,uint32_t len,AuthDataHead * head)211 NO_SANITIZE("cfi") const uint8_t *UnpackAuthData(const uint8_t *data, uint32_t len, AuthDataHead *head)
212 {
213 if (len < GetAuthDataSize(0)) {
214 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthData: head not enough.");
215 return NULL;
216 }
217 uint32_t offset = 0;
218 head->dataType = SoftBusLtoHl(*(uint32_t *)data);
219 offset += sizeof(uint32_t);
220 head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
221 offset += sizeof(uint32_t);
222 head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
223 offset += sizeof(uint64_t);
224 head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
225 offset += sizeof(uint32_t);
226 head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
227 offset += sizeof(uint32_t);
228 uint32_t dataLen = GetAuthDataSize(head->len);
229 if (len < dataLen || dataLen < GetAuthDataSize(0)) {
230 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthData: data not enough.");
231 return NULL;
232 }
233 return (data + offset);
234 }
235
236 /* EVENT_CONNECT_TIMEOUT */
HandleConnConnectTimeout(const void * para)237 static void HandleConnConnectTimeout(const void *para)
238 {
239 CHECK_NULL_PTR_RETURN_VOID(para);
240 uint32_t requestId = *(uint32_t *)(para);
241 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: connect timeout, requestId=%u.", requestId);
242 ConnRequest *item = FindConnRequestByRequestId(requestId);
243 if (item != NULL) {
244 SocketDisconnectDevice(AUTH, item->fd);
245 DelConnRequest(item);
246 }
247 NotifyClientConnected(requestId, 0, SOFTBUS_AUTH_CONN_TIMEOUT, NULL);
248 }
249
PostConnConnectTimeout(uint32_t requestId)250 static void PostConnConnectTimeout(uint32_t requestId)
251 {
252 PostAuthEvent(
253 EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId), AUTH_CONN_CONNECT_TIMEOUT_MS);
254 }
255
RemoveFunc(const void * obj,void * param)256 static int32_t RemoveFunc(const void *obj, void *param)
257 {
258 CHECK_NULL_PTR_RETURN_VALUE(obj, SOFTBUS_ERR);
259 CHECK_NULL_PTR_RETURN_VALUE(param, SOFTBUS_ERR);
260 return ((*(uint32_t *)(obj) == *(uint32_t *)(param)) ? SOFTBUS_OK : SOFTBUS_ERR);
261 }
262
RemoveConnConnectTimeout(uint32_t requestId)263 static void RemoveConnConnectTimeout(uint32_t requestId)
264 {
265 RemoveAuthEvent(EVENT_CONNECT_TIMEOUT, RemoveFunc, (void *)(&requestId));
266 }
267
268 /* EVENT_CONNECT_CMD */
HandleConnConnectCmd(const void * para)269 static void HandleConnConnectCmd(const void *para)
270 {
271 CHECK_NULL_PTR_RETURN_VOID(para);
272 ConnCmdInfo *info = (ConnCmdInfo *)para;
273 if (info->connInfo.type != AUTH_LINK_TYPE_WIFI) {
274 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: invalid connType(=%d).", info->connInfo.type);
275 return;
276 }
277 int32_t fd = SocketConnectDevice(info->connInfo.info.ipInfo.ip, info->connInfo.info.ipInfo.port, false);
278 if (fd < 0) {
279 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: SocketConnectDevice fail.");
280 RemoveConnConnectTimeout(info->requestId);
281 NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
282 return;
283 }
284 (void)AddConnRequest(&info->connInfo, info->requestId, fd);
285 }
286
287 /* EVENT_CONNECT_RESULT */
HandleConnConnectResult(const void * para)288 static void HandleConnConnectResult(const void *para)
289 {
290 CHECK_NULL_PTR_RETURN_VOID(para);
291 int32_t fd = *(int32_t *)(para);
292 RouteBuildClientAuthManager(fd);
293 ConnRequest *item = FindConnRequestByFd(fd);
294 if (item == NULL) {
295 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnRequest not found, fd=%d.", fd);
296 return;
297 }
298 RemoveConnConnectTimeout(item->requestId);
299 NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_WIFI, fd), SOFTBUS_OK, &item->connInfo);
300 DelConnRequest(item);
301 }
302
303 /* WiFi Connection */
OnWiFiConnected(ListenerModule module,int32_t fd,bool isClient)304 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient)
305 {
306 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnWiFiConnected: fd=%d, side=%s.", fd,
307 isClient ? "client" : "server(ignored)");
308 if (!isClient) {
309 /* do nothing, wait auth message. */
310 return;
311 }
312 (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &fd, sizeof(fd), 0);
313 }
314
OnWiFiDisconnected(int32_t fd)315 static void OnWiFiDisconnected(int32_t fd)
316 {
317 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnWiFiDisconnected: fd=%d.", fd);
318 AuthConnInfo connInfo;
319 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
320 connInfo.type = AUTH_LINK_TYPE_WIFI;
321 NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
322 RouteClearAuthChannelId(fd);
323 }
324
OnWiFiDataReceived(ListenerModule module,int32_t fd,const AuthDataHead * head,const uint8_t * data)325 static void OnWiFiDataReceived(ListenerModule module, int32_t fd, const AuthDataHead *head, const uint8_t *data)
326 {
327 CHECK_NULL_PTR_RETURN_VOID(head);
328 CHECK_NULL_PTR_RETURN_VOID(data);
329
330 if (module != AUTH && module != AUTH_P2P) {
331 return;
332 }
333 bool fromServer = false;
334 AuthConnInfo connInfo;
335 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
336 if (SocketGetConnInfo(fd, &connInfo, &fromServer) != SOFTBUS_OK) {
337 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get connInfo fail, fd=%d.", fd);
338 return;
339 }
340 NotifyDataReceived(GenConnId(connInfo.type, fd), &connInfo, fromServer, head, data);
341 }
342
InitWiFiConn(void)343 static int32_t InitWiFiConn(void)
344 {
345 SocketCallback socketCb = {
346 .onConnected = OnWiFiConnected,
347 .onDisconnected = OnWiFiDisconnected,
348 .onDataReceived = OnWiFiDataReceived,
349 };
350 return SetSocketCallback(&socketCb);
351 }
352
353 /* BR/BLE/P2P Connection */
OnCommConnected(uint32_t connectionId,const ConnectionInfo * info)354 static void OnCommConnected(uint32_t connectionId, const ConnectionInfo *info)
355 {
356 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "(ignored)OnCommConnected: connectionId=%u.", connectionId);
357 }
358
OnCommDisconnected(uint32_t connectionId,const ConnectionInfo * info)359 static void OnCommDisconnected(uint32_t connectionId, const ConnectionInfo *info)
360 {
361 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommDisconnected: connectionId=%u.", connectionId);
362 CHECK_NULL_PTR_RETURN_VOID(info);
363 AuthConnInfo connInfo;
364 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
365 (void)ConvertToAuthConnInfo(info, &connInfo);
366 NotifyDisconnected(GenConnId(connInfo.type, connectionId), &connInfo);
367 }
368
GetConnInfoByConnectionId(uint32_t connectionId,AuthConnInfo * connInfo)369 NO_SANITIZE("cfi") int32_t GetConnInfoByConnectionId(uint32_t connectionId, AuthConnInfo *connInfo)
370 {
371 ConnectionInfo info = { 0 };
372 int32_t ret = ConnGetConnectionInfo(connectionId, &info);
373 if (ret != SOFTBUS_OK) {
374 SoftBusLog(
375 SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "GetConnectionInfo fail(=%d), connectionId=%u.", ret, connectionId);
376 return SOFTBUS_ERR;
377 }
378 return ConvertToAuthConnInfo(&info, connInfo);
379 }
380
OnCommDataReceived(uint32_t connectionId,ConnModule moduleId,int64_t seq,char * data,int32_t len)381 static void OnCommDataReceived(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
382 {
383 if (data == NULL || moduleId != MODULE_DEVICE_AUTH || len <= 0) {
384 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "RecvCommData: invalid param.");
385 return;
386 }
387 bool fromServer = ((seq % SEQ_INTERVAL) != 0);
388 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
389 "RecvCommData: connectionId=%u, module=%d, seq=%" PRId64 ", len=%d, from=%s.", connectionId, moduleId, seq, len,
390 GetAuthSideStr(fromServer));
391 AuthConnInfo connInfo;
392 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
393 if (GetConnInfoByConnectionId(connectionId, &connInfo) != SOFTBUS_OK) {
394 return;
395 }
396 AuthDataHead head = { 0 };
397 const uint8_t *body = UnpackAuthData((const uint8_t *)data, (uint32_t)len, &head);
398 if (body == NULL) {
399 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "RecvCommData: empty body.");
400 return;
401 }
402 NotifyDataReceived(GenConnId(connInfo.type, connectionId), &connInfo, fromServer, &head, body);
403 }
404
AsyncCallDeviceIdReceived(void * para)405 static void AsyncCallDeviceIdReceived(void *para)
406 {
407 RepeatDeviceIdData *recvData = (RepeatDeviceIdData *)para;
408 if (recvData == NULL) {
409 return;
410 }
411 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
412 "Delay handle RecvCommData: connectionId=%u, len=%d, from=%s.", recvData->connId, recvData->len,
413 GetAuthSideStr(recvData->fromServer));
414 NotifyDataReceived(recvData->connId, &recvData->connInfo, recvData->fromServer, &recvData->head, recvData->data);
415 SoftBusFree(para);
416 }
417
HandleRepeatDeviceIdDataDelay(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)418 void HandleRepeatDeviceIdDataDelay(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
419 const AuthDataHead *head, const uint8_t *data)
420 {
421 RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
422 if (request == NULL) {
423 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc RepeatDeviceIdData fail");
424 return;
425 }
426 request->len = head->len;
427 if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
428 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy data fail");
429 SoftBusFree(request);
430 return;
431 }
432 request->connId = connId;
433 request->connInfo = *connInfo;
434 request->fromServer = fromServer;
435 request->head = *head;
436 if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request,
437 AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY) != SOFTBUS_OK) {
438 SoftBusFree(request);
439 }
440 }
441
InitCommConn(void)442 static int32_t InitCommConn(void)
443 {
444 ConnectCallback connCb = {
445 .OnConnected = OnCommConnected,
446 .OnDisconnected = OnCommDisconnected,
447 .OnDataReceived = OnCommDataReceived,
448 };
449 return ConnSetConnectCallback(MODULE_DEVICE_AUTH, &connCb);
450 }
451
OnCommConnectSucc(uint32_t requestId,uint32_t connectionId,const ConnectionInfo * info)452 static void OnCommConnectSucc(uint32_t requestId, uint32_t connectionId, const ConnectionInfo *info)
453 {
454 AuthConnInfo connInfo;
455 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommConnectSucc: requestId=%u, connectionId=%u.", requestId,
456 connectionId);
457 CHECK_NULL_PTR_RETURN_VOID(info);
458 (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
459 (void)ConvertToAuthConnInfo(info, &connInfo);
460 RemoveConnConnectTimeout(requestId);
461 NotifyClientConnected(requestId, GenConnId(connInfo.type, connectionId), SOFTBUS_OK, &connInfo);
462 }
463
OnCommConnectFail(uint32_t requestId,int32_t reason)464 static void OnCommConnectFail(uint32_t requestId, int32_t reason)
465 {
466 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommConnectFail: requestId=%u, reason=%d.", requestId, reason);
467 RemoveConnConnectTimeout(requestId);
468 NotifyClientConnected(requestId, 0, SOFTBUS_CONN_FAIL, NULL);
469 }
470
ConnectCommDevice(const AuthConnInfo * info,uint32_t requestId,ConnSideType sideType)471 static int32_t ConnectCommDevice(const AuthConnInfo *info, uint32_t requestId, ConnSideType sideType)
472 {
473 ConnectOption option;
474 (void)memset_s(&option, sizeof(ConnectOption), 0, sizeof(ConnectOption));
475 int32_t ret = ConvertToConnectOption(info, &option);
476 if (ret != SOFTBUS_OK) {
477 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConvertToConnectOption fail(=%d).", ret);
478 return SOFTBUS_ERR;
479 }
480 if (option.type == CONNECT_BR) {
481 option.brOption.sideType = sideType;
482 }
483 ConnectResult result = {
484 .OnConnectSuccessed = OnCommConnectSucc,
485 .OnConnectFailed = OnCommConnectFail,
486 };
487 ret = ConnConnectDevice(&option, requestId, &result);
488 if (ret != SOFTBUS_OK) {
489 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnConnectDevice fail(=%d).", ret);
490 return SOFTBUS_CONN_FAIL;
491 }
492 return SOFTBUS_OK;
493 }
494
PostCommData(uint32_t connectionId,bool toServer,const AuthDataHead * head,const uint8_t * data)495 static int32_t PostCommData(uint32_t connectionId, bool toServer, const AuthDataHead *head, const uint8_t *data)
496 {
497 uint32_t size = ConnGetHeadSize() + GetAuthDataSize(head->len);
498 uint8_t *buf = (uint8_t *)SoftBusMalloc(size);
499 if (buf == NULL) {
500 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "PostCommData: malloc fail.");
501 return SOFTBUS_ERR;
502 }
503 int32_t ret = PackAuthData(head, data, buf + ConnGetHeadSize(), size - ConnGetHeadSize());
504 if (ret != SOFTBUS_OK) {
505 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "PostCommData: pack data fail(=%d).", ret);
506 SoftBusFree(buf);
507 return ret;
508 }
509 ConnPostData connData = {
510 .module = MODULE_DEVICE_AUTH,
511 .seq = GenSeq(!toServer),
512 .flag = CONN_HIGH,
513 .pid = 0,
514 .len = size,
515 .buf = (char *)buf,
516 };
517 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
518 "PostCommData: data{seq=%" PRId64 ", len=%u} conn{id=%u, seq=%" PRId64 ", len=%u}",
519 head->seq, head->len, connectionId, connData.seq, connData.len);
520 return ConnPostBytes(connectionId, &connData);
521 }
522
AuthConnInit(const AuthConnListener * listener)523 NO_SANITIZE("cfi") int32_t AuthConnInit(const AuthConnListener *listener)
524 {
525 CHECK_NULL_PTR_RETURN_VALUE(listener, SOFTBUS_INVALID_PARAM);
526 g_listener = *listener;
527 ListInit(&g_connRequestList);
528 if (InitCommConn() != SOFTBUS_OK) {
529 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
530 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init br/ble/p2p conn fail.");
531 return SOFTBUS_ERR;
532 }
533 if (InitWiFiConn() != SOFTBUS_OK) {
534 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
535 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init wifi conn fail.");
536 return SOFTBUS_ERR;
537 }
538 return SOFTBUS_OK;
539 }
540
AuthConnDeinit(void)541 NO_SANITIZE("cfi") void AuthConnDeinit(void)
542 {
543 UnsetSocketCallback();
544 ConnUnSetConnectCallback(MODULE_DEVICE_AUTH);
545 ClearConnRequest();
546 (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
547 }
548
ConnectAuthDevice(uint32_t requestId,const AuthConnInfo * connInfo,ConnSideType sideType)549 NO_SANITIZE("cfi") int32_t ConnectAuthDevice(uint32_t requestId, const AuthConnInfo *connInfo, ConnSideType sideType)
550 {
551 CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
552 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "ConnectDevice: requestId=%u, connType=%d, sideType=%d.", requestId,
553 connInfo->type, sideType);
554 PostConnConnectTimeout(requestId);
555 int32_t ret = 0;
556 switch (connInfo->type) {
557 case AUTH_LINK_TYPE_WIFI: {
558 ConnCmdInfo info = {
559 .requestId = requestId,
560 .connInfo = *connInfo,
561 };
562 ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
563 break;
564 }
565 case AUTH_LINK_TYPE_BLE:
566 /* fall-through */
567 case AUTH_LINK_TYPE_BR:
568 if (SoftBusGetBtState() != BLE_ENABLE) {
569 ret = SOFTBUS_AUTH_CONN_FAIL;
570 break;
571 }
572 /* fall-through */
573 case AUTH_LINK_TYPE_P2P:
574 ret = ConnectCommDevice(connInfo, requestId, sideType);
575 break;
576 default:
577 ret = SOFTBUS_OK;
578 break;
579 }
580 if (ret != SOFTBUS_OK) {
581 RemoveConnConnectTimeout(requestId);
582 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnectDevice fail, requestId=%u.", requestId);
583 }
584 return ret;
585 }
586
UpdateAuthDevicePriority(uint64_t connId)587 void UpdateAuthDevicePriority(uint64_t connId)
588 {
589 if (GetConnType(connId) != AUTH_LINK_TYPE_BLE) {
590 return;
591 }
592 UpdateOption option = {
593 .type = CONNECT_BLE,
594 .bleOption = {
595 .priority = CONN_BLE_PRIORITY_BALANCED,
596 }
597 };
598 int32_t ret = ConnUpdateConnection(GetConnId(connId), &option);
599 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "update connecton priority to balanced, connType=%d, id=%u, ret: %d",
600 GetConnType(connId), GetConnId(connId), ret);
601 }
602
DisconnectAuthDevice(uint64_t connId)603 NO_SANITIZE("cfi") void DisconnectAuthDevice(uint64_t connId)
604 {
605 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "DisconnectDevice: connType=%d, id=%u.", GetConnType(connId),
606 GetConnId(connId));
607 switch (GetConnType(connId)) {
608 case AUTH_LINK_TYPE_WIFI:
609 SocketDisconnectDevice(AUTH, GetFd(connId));
610 break;
611 case AUTH_LINK_TYPE_BLE:
612 /* fall-through */
613 case AUTH_LINK_TYPE_BR:
614 ConnDisconnectDevice(GetConnId(connId));
615 /* fall-through */
616 case AUTH_LINK_TYPE_P2P:
617 break;
618 default:
619 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "unknown connType.");
620 break;
621 }
622 }
623
PostAuthData(uint64_t connId,bool toServer,const AuthDataHead * head,const uint8_t * data)624 NO_SANITIZE("cfi") int32_t PostAuthData(uint64_t connId, bool toServer, const AuthDataHead *head, const uint8_t *data)
625 {
626 CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
627 CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
628 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
629 "auth post data{type=0x%x, module=%d, seq=%" PRId64 ", flag=%d, len=%u} " CONN_INFO " to[%s]", head->dataType,
630 head->module, head->seq, head->flag, head->len, CONN_DATA(connId), GetAuthSideStr(toServer));
631 switch (GetConnType(connId)) {
632 case AUTH_LINK_TYPE_WIFI:
633 return SocketPostBytes(GetFd(connId), head, data);
634 case AUTH_LINK_TYPE_BLE:
635 case AUTH_LINK_TYPE_BR:
636 case AUTH_LINK_TYPE_P2P:
637 return PostCommData(GetConnId(connId), toServer, head, data);
638 default:
639 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "unknown connType.");
640 break;
641 }
642 return SOFTBUS_ERR;
643 }
644
GetConnSideType(uint64_t connId)645 NO_SANITIZE("cfi") ConnSideType GetConnSideType(uint64_t connId)
646 {
647 if (GetConnType(connId) == AUTH_LINK_TYPE_WIFI) {
648 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "WiFi not supported, " CONN_INFO, CONN_DATA(connId));
649 return CONN_SIDE_ANY;
650 }
651 ConnectionInfo info;
652 (void)memset_s(&info, sizeof(ConnectionInfo), 0, sizeof(ConnectionInfo));
653 if (ConnGetConnectionInfo(GetConnId(connId), &info)) {
654 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnGetConnectionInfo fail, " CONN_INFO, CONN_DATA(connId));
655 return CONN_SIDE_ANY;
656 }
657 if (!info.isAvailable) {
658 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "connection not available, " CONN_INFO, CONN_DATA(connId));
659 }
660 return info.isServer ? CONN_SIDE_SERVER : CONN_SIDE_CLIENT;
661 }
662
CheckActiveAuthConnection(const AuthConnInfo * connInfo)663 NO_SANITIZE("cfi") bool CheckActiveAuthConnection(const AuthConnInfo *connInfo)
664 {
665 ConnectOption connOpt;
666 CHECK_NULL_PTR_RETURN_VALUE(connInfo, false);
667 (void)memset_s(&connOpt, sizeof(ConnectOption), 0, sizeof(ConnectOption));
668 if (ConvertToConnectOption(connInfo, &connOpt) != SOFTBUS_OK) {
669 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "convert to connect option fail, connType=%d.", connInfo->type);
670 return false;
671 }
672 return CheckActiveConnection(&connOpt);
673 }
674
AuthStartListening(AuthLinkType type,const char * ip,int32_t port)675 NO_SANITIZE("cfi") int32_t AuthStartListening(AuthLinkType type, const char *ip, int32_t port)
676 {
677 if (ip == NULL) {
678 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid param.");
679 return SOFTBUS_INVALID_PARAM;
680 }
681 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "start auth listening, type=%d, port=%d.", type, port);
682 switch (type) {
683 case AUTH_LINK_TYPE_WIFI: {
684 LocalListenerInfo info = {
685 .type = CONNECT_TCP,
686 .socketOption = {
687 .addr = "",
688 .port = port,
689 .moduleId = AUTH,
690 .protocol = LNN_PROTOCOL_IP,
691 },
692 };
693
694 if (strcpy_s(info.socketOption.addr, sizeof(info.socketOption.addr), ip) != EOK) {
695 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "strcpy_s ip fail.");
696 return SOFTBUS_MEM_ERR;
697 }
698 return StartSocketListening(AUTH, &info);
699 }
700 case AUTH_LINK_TYPE_P2P: {
701 LocalListenerInfo local = {
702 .type = CONNECT_TCP,
703 .socketOption = {
704 .addr = "",
705 .port = port,
706 .moduleId = AUTH_P2P,
707 .protocol = LNN_PROTOCOL_IP,
708 },
709 };
710 if (strcpy_s(local.socketOption.addr, sizeof(local.socketOption.addr), ip) != EOK) {
711 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "strcpy_s ip fail.");
712 return SOFTBUS_MEM_ERR;
713 }
714 return ConnStartLocalListening(&local);
715 }
716 default:
717 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "unsupport link type:%d.", type);
718 break;
719 }
720 return SOFTBUS_INVALID_PARAM;
721 }
722
AuthStopListening(AuthLinkType type)723 NO_SANITIZE("cfi") void AuthStopListening(AuthLinkType type)
724 {
725 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "stop auth listening, type=%d.", type);
726 switch (type) {
727 case AUTH_LINK_TYPE_WIFI:
728 StopSocketListening();
729 break;
730 case AUTH_LINK_TYPE_P2P: {
731 LocalListenerInfo local = {
732 .type = CONNECT_TCP,
733 .socketOption = {
734 .moduleId = AUTH_P2P,
735 .protocol = LNN_PROTOCOL_IP,
736 },
737 };
738 if (ConnStopLocalListening(&local) != SOFTBUS_OK) {
739 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnStopLocalListening fail.");
740 }
741 break;
742 }
743 default:
744 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "unsupport link type:%d.", type);
745 break;
746 }
747 }
748