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