• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_tcp_connection.h"
17 
18 #include <securec.h>
19 
20 #include "auth_channel.h"
21 #include "auth_common.h"
22 #include "auth_log.h"
23 #include "auth_meta_manager.h"
24 #include "bus_center_manager.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_adapter_socket.h"
27 #include "softbus_base_listener.h"
28 #include "softbus_def.h"
29 #include "softbus_socket.h"
30 #include "softbus_tcp_socket.h"
31 #include "trans_lane_manager.h"
32 
33 #define MAGIC_NUMBER             0xBABEFACE
34 #define AUTH_PKT_HEAD_LEN        24
35 #define AUTH_SOCKET_MAX_DATA_LEN (64 * 1024)
36 #define TCP_KEEPALIVE_TOS_VAL    180
37 #define RECV_DATA_TIMEOUT        (2 * 1000 * 1000)
38 
39 typedef struct {
40     int32_t keepaliveIdle;
41     int32_t keepaliveIntvl;
42     int32_t keepaliveCount;
43     uint32_t userTimeout;
44 } TcpKeepaliveOption;
45 
46 typedef struct {
47     int32_t module;
48     AuthChannelListener listener;
49 } InnerChannelListener;
50 
51 static InnerChannelListener g_listener[] = {
52     {
53         .module = MODULE_AUTH_CHANNEL,
54         .listener = { NULL, NULL },
55     },
56     {
57         .module = MODULE_AUTH_MSG,
58         .listener = { NULL, NULL },
59     },
60 };
61 
62 static SocketCallback g_callback = { NULL, NULL, NULL };
63 static ListNode g_wifiConnList = { &g_wifiConnList, &g_wifiConnList };
64 static SoftBusMutex g_wifiConnListLock;
65 
66 static void NotifyChannelDisconnected(int32_t channelId);
67 static void NotifyChannelDataReceived(int32_t channelId, const SocketPktHead *head, const uint8_t *data);
RouteBuildServerAuthManager(int32_t cfd,const ConnectOption * clientAddr)68 int32_t __attribute__((weak)) RouteBuildServerAuthManager(int32_t cfd, const ConnectOption *clientAddr)
69 {
70     (void)cfd;
71     (void)clientAddr;
72     return SOFTBUS_OK;
73 }
74 
GetSocketPktSize(uint32_t len)75 static uint32_t GetSocketPktSize(uint32_t len)
76 {
77     return AUTH_PKT_HEAD_LEN + len;
78 }
79 
PackSocketPkt(const SocketPktHead * pktHead,const uint8_t * data,uint8_t * buf,uint32_t size)80 static int32_t PackSocketPkt(const SocketPktHead *pktHead, const uint8_t *data, uint8_t *buf, uint32_t size)
81 {
82     if (size < GetSocketPktSize(pktHead->len)) {
83         AUTH_LOGE(AUTH_CONN, "buffer not enough.");
84         return SOFTBUS_NO_ENOUGH_DATA;
85     }
86     uint32_t offset = 0;
87     *(uint32_t *)buf = SoftBusHtoLl((uint32_t)pktHead->magic);
88     offset += sizeof(uint32_t);
89     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)pktHead->module);
90     offset += sizeof(uint32_t);
91     *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)pktHead->seq);
92     offset += sizeof(uint64_t);
93     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)pktHead->flag);
94     offset += sizeof(uint32_t);
95     *(uint32_t *)(buf + offset) = SoftBusHtoLl(pktHead->len);
96     offset += sizeof(uint32_t);
97     if (memcpy_s(buf + offset, size - offset, data, pktHead->len) != EOK) {
98         AUTH_LOGE(AUTH_CONN, "pack fail.");
99         return SOFTBUS_MEM_ERR;
100     }
101     return SOFTBUS_OK;
102 }
103 
UnpackSocketPkt(const uint8_t * data,uint32_t len,SocketPktHead * head)104 static int32_t UnpackSocketPkt(const uint8_t *data, uint32_t len, SocketPktHead *head)
105 {
106     if (len < GetSocketPktSize(0)) {
107         AUTH_LOGE(AUTH_CONN, "head not enough.");
108         return SOFTBUS_NO_ENOUGH_DATA;
109     }
110     uint32_t offset = 0;
111     head->magic = (int32_t)SoftBusLtoHl(*(uint32_t *)data);
112     offset += sizeof(uint32_t);
113     head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
114     offset += sizeof(uint32_t);
115     head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
116     offset += sizeof(uint64_t);
117     head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
118     offset += sizeof(uint32_t);
119     head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
120     return SOFTBUS_OK;
121 }
122 
NotifyConnected(ListenerModule module,int32_t fd,bool isClient)123 static void NotifyConnected(ListenerModule module, int32_t fd, bool isClient)
124 {
125     if (g_callback.onConnected != NULL) {
126         g_callback.onConnected(module, fd, isClient);
127     }
128 }
129 
NotifyDisconnected(int32_t fd)130 static void NotifyDisconnected(int32_t fd)
131 {
132     if (g_callback.onDisconnected != NULL) {
133         g_callback.onDisconnected(fd);
134     }
135     NotifyChannelDisconnected(fd);
136 }
137 
ModuleToDataType(int32_t module)138 static uint32_t ModuleToDataType(int32_t module)
139 {
140     switch (module) {
141         case MODULE_TRUST_ENGINE:
142             return DATA_TYPE_DEVICE_ID;
143         case MODULE_AUTH_SDK:
144             return DATA_TYPE_AUTH;
145         case MODULE_AUTH_CONNECTION:
146             return DATA_TYPE_DEVICE_INFO;
147         case MODULE_AUTH_CANCEL:
148             return DATA_TYPE_CANCEL_AUTH;
149         case MODULE_AUTH_TEST:
150             return DATA_TYPE_TEST_AUTH;
151         default:
152             break;
153     }
154     return DATA_TYPE_CONNECTION;
155 }
156 
SessionNotifyDataReceived(ListenerModule module,int32_t fd,uint32_t len,const uint8_t * data)157 static void SessionNotifyDataReceived(ListenerModule module, int32_t fd,
158     uint32_t len, const uint8_t *data)
159 {
160     AuthDataHead head = {0};
161     const uint8_t *body = UnpackAuthData(data, len, &head);
162     if (body == NULL) {
163         AUTH_LOGE(AUTH_CONN, "unpack auth data fail.");
164         return;
165     }
166     if (g_callback.onDataReceived != NULL) {
167         g_callback.onDataReceived(module, fd, &head, body);
168     }
169 }
170 
NotifyDataReceived(ListenerModule module,int32_t fd,const SocketPktHead * pktHead,const uint8_t * data)171 static void NotifyDataReceived(ListenerModule module, int32_t fd,
172     const SocketPktHead *pktHead, const uint8_t *data)
173 {
174     if (pktHead->module == MODULE_AUTH_CHANNEL || pktHead->module == MODULE_AUTH_MSG) {
175         NotifyChannelDataReceived(fd, pktHead, data);
176         return;
177     }
178     if (pktHead->module == MODULE_META_AUTH) {
179         AuthMetaNotifyDataReceived(fd, pktHead, data);
180         return;
181     }
182     if (pktHead->module == MODULE_SESSION_AUTH) {
183         SessionNotifyDataReceived(module, fd, pktHead->len, data);
184         return;
185     }
186     AuthDataHead head = {
187         .dataType = ModuleToDataType(pktHead->module),
188         .module = pktHead->module,
189         .seq = pktHead->seq,
190         .flag = pktHead->flag,
191         .len = pktHead->len,
192     };
193     if (g_callback.onDataReceived != NULL) {
194         g_callback.onDataReceived(module, fd, &head, data);
195     }
196 }
197 
RecvPacketHead(ListenerModule module,int32_t fd,SocketPktHead * head)198 static int32_t RecvPacketHead(ListenerModule module, int32_t fd, SocketPktHead *head)
199 {
200     uint8_t buf[AUTH_PKT_HEAD_LEN] = { 0 };
201     uint32_t offset = 0;
202     while (offset < AUTH_PKT_HEAD_LEN) {
203         ssize_t recvLen =
204             ConnRecvSocketData(fd, (char *)&buf[offset], (size_t)(sizeof(buf) - offset), RECV_DATA_TIMEOUT);
205         if (recvLen < 0) {
206             AUTH_LOGE(AUTH_CONN, "recv head fail.");
207             (void)DelTrigger(module, fd, READ_TRIGGER);
208             NotifyDisconnected(fd);
209             return SOFTBUS_INVALID_DATA_HEAD;
210         }
211         offset += (uint32_t)recvLen;
212     }
213     return UnpackSocketPkt(buf, offset, head);
214 }
215 
RecvPacketData(int32_t fd,uint32_t len)216 static uint8_t *RecvPacketData(int32_t fd, uint32_t len)
217 {
218     uint8_t *data = (uint8_t *)SoftBusCalloc(len);
219     if (data == NULL) {
220         AUTH_LOGE(AUTH_CONN, "malloc data buf fail.");
221         return NULL;
222     }
223     uint32_t offset = 0;
224     while (offset < len) {
225         ssize_t recvLen = ConnRecvSocketData(fd, (char *)(data + offset), (size_t)(len - offset), 0);
226         if (recvLen < 0) {
227             AUTH_LOGE(AUTH_CONN, "recv data fail.");
228             SoftBusFree(data);
229             return NULL;
230         }
231         offset += (uint32_t)recvLen;
232     }
233     return data;
234 }
235 
236 typedef struct {
237     ListNode node;
238     int32_t fd;
239 } WifiConnInstance;
240 
RequireWifiConnListLock(void)241 static bool RequireWifiConnListLock(void)
242 {
243     if (SoftBusMutexLock(&g_wifiConnListLock) != SOFTBUS_OK) {
244         AUTH_LOGE(AUTH_CONN, "wifiConnList lock fail");
245         return false;
246     }
247     return true;
248 }
249 
ReleaseWifiConnListLock(void)250 static void ReleaseWifiConnListLock(void)
251 {
252     if (SoftBusMutexUnlock(&g_wifiConnListLock) != SOFTBUS_OK) {
253         AUTH_LOGE(AUTH_CONN, "wifiConnList unlock fail");
254     }
255 }
256 
AddWifiConnItem(int32_t fd)257 static int32_t AddWifiConnItem(int32_t fd)
258 {
259     if (!RequireWifiConnListLock()) {
260         AUTH_LOGE(AUTH_CONN, "RequireWifiConnListLock fail");
261         return SOFTBUS_LOCK_ERR;
262     }
263     WifiConnInstance *connItem = (WifiConnInstance *)SoftBusCalloc(sizeof(WifiConnInstance));
264     if (connItem == NULL) {
265         AUTH_LOGE(AUTH_CONN, "malloc connItem fail");
266         ReleaseWifiConnListLock();
267         return SOFTBUS_MEM_ERR;
268     }
269     connItem->fd = fd;
270     ListNodeInsert(&g_wifiConnList, &connItem->node);
271     AUTH_LOGI(AUTH_CONN, "add wifi conn item. fd=%{public}d", fd);
272     ReleaseWifiConnListLock();
273     return SOFTBUS_OK;
274 }
275 
IsExistWifiConnItemByConnId(int32_t fd)276 bool IsExistWifiConnItemByConnId(int32_t fd)
277 {
278     if (!RequireWifiConnListLock()) {
279         AUTH_LOGE(AUTH_CONN, "RequireWifiConnListLock fail");
280         return false;
281     }
282     WifiConnInstance *item = NULL;
283     LIST_FOR_EACH_ENTRY(item, &g_wifiConnList, WifiConnInstance, node) {
284         if (item->fd != fd) {
285             continue;
286         }
287         ReleaseWifiConnListLock();
288         return true;
289     }
290     AUTH_LOGE(AUTH_CONN, "wifi conn item is not found. fd=%{public}d", fd);
291     ReleaseWifiConnListLock();
292     return false;
293 }
294 
DeleteWifiConnItemByConnId(int32_t fd)295 void DeleteWifiConnItemByConnId(int32_t fd)
296 {
297     if (!RequireWifiConnListLock()) {
298         AUTH_LOGE(AUTH_CONN, "RequireWifiConnListLock fail");
299         return;
300     }
301     WifiConnInstance *item = NULL;
302     LIST_FOR_EACH_ENTRY(item, &g_wifiConnList, WifiConnInstance, node) {
303         if (item->fd != fd) {
304             continue;
305         }
306         AUTH_LOGI(AUTH_CONN, "delete wifi conn item. fd=%{public}d", fd);
307         ListDelete(&item->node);
308         SoftBusFree(item);
309         break;
310     }
311     ReleaseWifiConnListLock();
312 }
313 
ProcessSocketOutEvent(ListenerModule module,int32_t fd)314 static int32_t ProcessSocketOutEvent(ListenerModule module, int32_t fd)
315 {
316     AUTH_LOGI(AUTH_CONN, "socket client connect succ: fd=%{public}d.", fd);
317     (void)DelTrigger(module, fd, WRITE_TRIGGER);
318     if (AddTrigger(module, fd, READ_TRIGGER) != SOFTBUS_OK) {
319         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
320         goto FAIL;
321     }
322     if (ConnToggleNonBlockMode(fd, true) != SOFTBUS_OK) {
323         AUTH_LOGE(AUTH_CONN, "set none block mode fail.");
324         goto FAIL;
325     }
326     if (AddWifiConnItem(fd) != SOFTBUS_OK) {
327         AUTH_LOGE(AUTH_CONN, "insert wifi conn item fail.");
328         goto FAIL;
329     }
330     NotifyConnected(module, fd, true);
331     return SOFTBUS_OK;
332 
333 FAIL:
334     (void)DelTrigger(module, fd, READ_TRIGGER);
335     ConnShutdownSocket(fd);
336     NotifyDisconnected(fd);
337     return SOFTBUS_AUTH_SOCKET_EVENT_INVALID;
338 }
339 
ProcessSocketInEvent(ListenerModule module,int32_t fd)340 static int32_t ProcessSocketInEvent(ListenerModule module, int32_t fd)
341 {
342     SocketPktHead head = { 0 };
343     int32_t ret = RecvPacketHead(module, fd, &head);
344     if (ret != SOFTBUS_OK) {
345         return ret;
346     }
347     AUTH_LOGI(AUTH_CONN,
348         "RecvSocketData: fd=%{public}d, module=%{public}d, seq=%{public}" PRId64 ", flag=%{public}d, len=%{public}u.",
349         fd, head.module, head.seq, head.flag, head.len);
350     if (head.len == 0 || head.len > AUTH_SOCKET_MAX_DATA_LEN) {
351         AUTH_LOGW(AUTH_CONN, "data is out of size, abandon it.");
352         return SOFTBUS_INVALID_DATA_HEAD;
353     }
354     if (head.magic != (int32_t)MAGIC_NUMBER) {
355         AUTH_LOGE(AUTH_CONN, "magic number not match.");
356         return SOFTBUS_INVALID_DATA_HEAD;
357     }
358     uint8_t *data = RecvPacketData(fd, head.len);
359     if (data == NULL) {
360         return SOFTBUS_DATA_NOT_ENOUGH;
361     }
362     NotifyDataReceived(module, fd, &head, data);
363     SoftBusFree(data);
364     return SOFTBUS_OK;
365 }
366 
IsEnhanceP2pModuleId(ListenerModule moduleId)367 static bool IsEnhanceP2pModuleId(ListenerModule moduleId)
368 {
369     if (moduleId >= AUTH_ENHANCED_P2P_START && moduleId <= AUTH_ENHANCED_P2P_END) {
370         return true;
371     }
372     return false;
373 }
374 
OnConnectEvent(ListenerModule module,int32_t cfd,const ConnectOption * clientAddr)375 static int32_t OnConnectEvent(ListenerModule module, int32_t cfd, const ConnectOption *clientAddr)
376 {
377     if (cfd < 0) {
378         AUTH_LOGE(AUTH_CONN, "invalid param.");
379         return SOFTBUS_INVALID_PARAM;
380     }
381     if (ConnSetTcpKeepalive(cfd, (int32_t)DEFAULT_FREQ_CYCLE, TCP_KEEPALIVE_INTERVAL, TCP_KEEPALIVE_DEFAULT_COUNT) !=
382         SOFTBUS_OK) {
383         AUTH_LOGE(AUTH_CONN, "set keepalive fail!");
384         ConnShutdownSocket(cfd);
385         return SOFTBUS_NETWORK_SET_KEEPALIVE_OPTION_FAIL;
386     }
387     int32_t ipTos = TCP_KEEPALIVE_TOS_VAL;
388     if (module == AUTH) {
389         if (SoftBusSocketSetOpt(cfd, SOFTBUS_IPPROTO_IP_, SOFTBUS_IP_TOS_, &ipTos, sizeof(ipTos)) !=
390             SOFTBUS_ADAPTER_OK) {
391             AUTH_LOGE(AUTH_CONN, "set option fail!");
392             ConnShutdownSocket(cfd);
393             return SOFTBUS_NETWORK_SET_KEEPALIVE_OPTION_FAIL;
394         }
395     }
396     if (AddTrigger(module, cfd, READ_TRIGGER) != SOFTBUS_OK) {
397         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
398         ConnShutdownSocket(cfd);
399         return SOFTBUS_AUTH_ADD_TRIGGER_FAIL;
400     }
401     if (module != AUTH && module != AUTH_P2P && module != AUTH_RAW_P2P_CLIENT && !IsEnhanceP2pModuleId(module)) {
402         AUTH_LOGI(AUTH_CONN, "newip auth process");
403         if (RouteBuildServerAuthManager(cfd, clientAddr) != SOFTBUS_OK) {
404             AUTH_LOGE(AUTH_CONN, "build auth manager fail.");
405             (void)DelTrigger(module, cfd, READ_TRIGGER);
406             ConnShutdownSocket(cfd);
407             return SOFTBUS_AUTH_MANAGER_BUILD_FAIL;
408         }
409         return SOFTBUS_OK;
410     }
411     if (module == AUTH && AddWifiConnItem(cfd) != SOFTBUS_OK) {
412         AUTH_LOGE(AUTH_CONN, "insert wifi conn item fail.");
413         return SOFTBUS_MEM_ERR;
414     }
415     NotifyConnected(module, cfd, false);
416     return SOFTBUS_OK;
417 }
418 
OnDataEvent(ListenerModule module,int32_t events,int32_t fd)419 static int32_t OnDataEvent(ListenerModule module, int32_t events, int32_t fd)
420 {
421     if (events == SOFTBUS_SOCKET_OUT) {
422         return ProcessSocketOutEvent(module, fd);
423     } else if (events == SOFTBUS_SOCKET_IN) {
424         return ProcessSocketInEvent(module, fd);
425     }
426     return SOFTBUS_AUTH_SOCKET_EVENT_INVALID;
427 }
428 
SetSocketCallback(const SocketCallback * cb)429 int32_t SetSocketCallback(const SocketCallback *cb)
430 {
431     CHECK_NULL_PTR_RETURN_VALUE(cb, SOFTBUS_INVALID_PARAM);
432     if (memcpy_s(&g_callback, sizeof(SocketCallback), cb, sizeof(SocketCallback)) != EOK) {
433         AUTH_LOGE(AUTH_CONN, "set SocketCallback fail.");
434         return SOFTBUS_MEM_ERR;
435     }
436     return SOFTBUS_OK;
437 }
438 
UnsetSocketCallback(void)439 void UnsetSocketCallback(void)
440 {
441     (void)memset_s(&g_callback, sizeof(SocketCallback), 0, sizeof(SocketCallback));
442 }
443 
StartSocketListening(ListenerModule module,const LocalListenerInfo * info)444 int32_t StartSocketListening(ListenerModule module, const LocalListenerInfo *info)
445 {
446     SoftbusBaseListener listener = {
447         .onConnectEvent = OnConnectEvent,
448         .onDataEvent = OnDataEvent,
449     };
450     int32_t port = StartBaseListener(info, &listener);
451     if (port <= 0) {
452         AUTH_LOGE(AUTH_CONN, "StartBaseListener fail. port=%{public}d", port);
453         return SOFTBUS_INVALID_PORT;
454     }
455     return port;
456 }
457 
StopSocketListening(ListenerModule moduleId)458 void StopSocketListening(ListenerModule moduleId)
459 {
460     AUTH_LOGI(AUTH_CONN, "stop socket listening. moduleId=%{public}d", moduleId);
461     if (StopBaseListener(moduleId) != SOFTBUS_OK) {
462         AUTH_LOGE(AUTH_CONN, "StopBaseListener fail.");
463     }
464 }
465 
AuthTcpCreateListener(ListenerModule module,int32_t fd,TriggerType trigger)466 static int32_t AuthTcpCreateListener(ListenerModule module, int32_t fd, TriggerType trigger)
467 {
468     if (!IsListenerNodeExist(module)) {
469         SoftbusBaseListener listener = {
470             .onConnectEvent = OnConnectEvent,
471             .onDataEvent = OnDataEvent,
472         };
473         if (StartBaseClient(module, &listener) != SOFTBUS_OK) {
474             AUTH_LOGE(AUTH_CONN, "StartBaseClient fail.");
475         }
476     }
477     return AddTrigger(module, fd, trigger);
478 }
479 
SocketConnectInner(const char * localIp,const char * peerIp,int32_t port,ListenerModule module,bool isBlockMode)480 static int32_t SocketConnectInner(
481     const char *localIp, const char *peerIp, int32_t port, ListenerModule module, bool isBlockMode)
482 {
483     if (localIp == NULL || peerIp == NULL) {
484         AUTH_LOGE(AUTH_CONN, "ip is invalid param.");
485         return AUTH_INVALID_FD;
486     }
487     ConnectOption option = {
488         .type = CONNECT_TCP,
489         .socketOption = { .addr = "", .port = port, .moduleId = module, .protocol = LNN_PROTOCOL_IP }
490     };
491     if (strcpy_s(option.socketOption.addr, sizeof(option.socketOption.addr), peerIp) != EOK) {
492         AUTH_LOGE(AUTH_CONN, "copy remote ip fail.");
493         return AUTH_INVALID_FD;
494     }
495     int32_t ret = ConnOpenClientSocket(&option, localIp, !isBlockMode);
496     if (ret < 0) {
497         AUTH_LOGE(AUTH_CONN, "ConnOpenClientSocket fail, error=%{public}d", ret);
498         return ret;
499     }
500     int32_t fd = ret;
501     TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
502     if (AuthTcpCreateListener(module, fd, triggerMode) != SOFTBUS_OK) {
503         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
504         ConnShutdownSocket(fd);
505         return AUTH_INVALID_FD;
506     }
507     if (ConnSetTcpKeepalive(fd, (int32_t)DEFAULT_FREQ_CYCLE, TCP_KEEPALIVE_INTERVAL, TCP_KEEPALIVE_DEFAULT_COUNT) !=
508         SOFTBUS_OK) {
509         AUTH_LOGE(AUTH_CONN, "set tcp keep alive fail.");
510         (void)DelTrigger(module, fd, triggerMode);
511         ConnShutdownSocket(fd);
512         return AUTH_INVALID_FD;
513     }
514     return fd;
515 }
516 
SocketConnectDeviceWithAllIp(const char * localIp,const char * peerIp,int32_t port,bool isBlockMode)517 int32_t SocketConnectDeviceWithAllIp(const char *localIp, const char *peerIp, int32_t port, bool isBlockMode)
518 {
519     return SocketConnectInner(localIp, peerIp, port, AUTH_RAW_P2P_CLIENT, isBlockMode);
520 }
521 
SocketSetDevice(int32_t fd,bool isBlockMode)522 int32_t SocketSetDevice(int32_t fd, bool isBlockMode)
523 {
524     if (fd < 0) {
525         AUTH_LOGE(AUTH_CONN, "ConnOpenClientSocket fail, fd=%{public}d", fd);
526         return SOFTBUS_INVALID_FD;
527     }
528     TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
529     SoftbusBaseListener listener = {
530         .onConnectEvent = OnConnectEvent,
531         .onDataEvent = OnDataEvent,
532     };
533     if (StartBaseClient(AUTH, &listener) != SOFTBUS_OK) {
534         AUTH_LOGE(AUTH_CONN, "StartBaseClient fail.");
535     }
536     if (DelTrigger(AUTH_RAW_P2P_CLIENT, fd, RW_TRIGGER) != SOFTBUS_OK) {
537         AUTH_LOGE(AUTH_CONN, "DelTrigger fail.");
538         ConnShutdownSocket(fd);
539         return SOFTBUS_INVALID_FD;
540     }
541     if (AddTrigger(AUTH, fd, triggerMode) != SOFTBUS_OK) {
542         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
543         ConnShutdownSocket(fd);
544         return SOFTBUS_INVALID_FD;
545     }
546     if (ConnSetTcpKeepalive(fd, (int32_t)DEFAULT_FREQ_CYCLE, TCP_KEEPALIVE_INTERVAL, TCP_KEEPALIVE_DEFAULT_COUNT) !=
547         SOFTBUS_OK) {
548         AUTH_LOGE(AUTH_CONN, "set tcp keep alive fail.");
549         (void)DelTrigger(AUTH, fd, triggerMode);
550         ConnShutdownSocket(fd);
551         return SOFTBUS_INVALID_FD;
552     }
553     int32_t ipTos = TCP_KEEPALIVE_TOS_VAL;
554     if (SoftBusSocketSetOpt(fd, SOFTBUS_IPPROTO_IP_, SOFTBUS_IP_TOS_, &ipTos, sizeof(ipTos)) != SOFTBUS_ADAPTER_OK) {
555         AUTH_LOGE(AUTH_CONN, "set option fail.");
556         (void)DelTrigger(AUTH, fd, triggerMode);
557         ConnShutdownSocket(fd);
558         return SOFTBUS_INVALID_FD;
559     }
560     return SOFTBUS_OK;
561 }
562 
SocketConnectDevice(const char * ip,int32_t port,bool isBlockMode)563 int32_t SocketConnectDevice(const char *ip, int32_t port, bool isBlockMode)
564 {
565     CHECK_NULL_PTR_RETURN_VALUE(ip, AUTH_INVALID_FD);
566     char localIp[MAX_ADDR_LEN] = { 0 };
567     if (LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, localIp, MAX_ADDR_LEN) != SOFTBUS_OK) {
568         AUTH_LOGE(AUTH_CONN, "get local ip fail.");
569         return AUTH_INVALID_FD;
570     }
571     ConnectOption option = {
572         .type = CONNECT_TCP, .socketOption = { .addr = "", .port = port, .moduleId = AUTH, .protocol = LNN_PROTOCOL_IP }
573     };
574     if (strcpy_s(option.socketOption.addr, sizeof(option.socketOption.addr), ip) != EOK) {
575         AUTH_LOGE(AUTH_CONN, "copy remote ip fail.");
576         return AUTH_INVALID_FD;
577     }
578     int32_t ret = ConnOpenClientSocket(&option, localIp, !isBlockMode);
579     if (ret < 0) {
580         AUTH_LOGE(AUTH_CONN, "ConnOpenClientSocket fail, error=%{public}d", ret);
581         return ret;
582     }
583     int32_t fd = ret;
584     TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
585     if (AddTrigger(AUTH, fd, triggerMode) != SOFTBUS_OK) {
586         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
587         ConnShutdownSocket(fd);
588         return AUTH_INVALID_FD;
589     }
590     if (ConnSetTcpKeepalive(fd, (int32_t)DEFAULT_FREQ_CYCLE, TCP_KEEPALIVE_INTERVAL, TCP_KEEPALIVE_DEFAULT_COUNT) !=
591         SOFTBUS_OK) {
592         AUTH_LOGE(AUTH_CONN, "set tcp keep alive fail.");
593         (void)DelTrigger(AUTH, fd, triggerMode);
594         ConnShutdownSocket(fd);
595         return AUTH_INVALID_FD;
596     }
597     int32_t ipTos = TCP_KEEPALIVE_TOS_VAL;
598     if (SoftBusSocketSetOpt(fd, SOFTBUS_IPPROTO_IP_, SOFTBUS_IP_TOS_, &ipTos, sizeof(ipTos)) != SOFTBUS_ADAPTER_OK) {
599         AUTH_LOGE(AUTH_CONN, "set option fail.");
600         (void)DelTrigger(AUTH, fd, triggerMode);
601         ConnShutdownSocket(fd);
602         return AUTH_INVALID_FD;
603     }
604     return fd;
605 }
606 
NipSocketConnectDevice(ListenerModule module,const char * addr,int32_t port,bool isBlockMode)607 int32_t NipSocketConnectDevice(ListenerModule module, const char *addr, int32_t port, bool isBlockMode)
608 {
609     if (addr == NULL) {
610         AUTH_LOGE(AUTH_CONN, "addr is invalid param.");
611         return AUTH_INVALID_FD;
612     }
613     ConnectOption option = {
614         .type = CONNECT_TCP,
615         .socketOption = { .addr = "", .port = port, .moduleId = module, .protocol = LNN_PROTOCOL_NIP }
616     };
617     if (strcpy_s(option.socketOption.addr, sizeof(option.socketOption.addr), addr) != EOK) {
618         AUTH_LOGE(AUTH_CONN, "copy remote ip fail.");
619         return AUTH_INVALID_FD;
620     }
621     int32_t fd = ConnOpenClientSocket(&option, BIND_ADDR_ALL, !isBlockMode);
622     if (fd < 0) {
623         AUTH_LOGE(AUTH_CONN, "ConnOpenClientSocket fail.");
624         return AUTH_INVALID_FD;
625     }
626     TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
627     if (AddTrigger(module, fd, triggerMode) != SOFTBUS_OK) {
628         AUTH_LOGE(AUTH_CONN, "AddTrigger fail.");
629         ConnShutdownSocket(fd);
630         return AUTH_INVALID_FD;
631     }
632     if (ConnSetTcpKeepalive(fd, (int32_t)DEFAULT_FREQ_CYCLE, TCP_KEEPALIVE_INTERVAL, TCP_KEEPALIVE_DEFAULT_COUNT) !=
633         SOFTBUS_OK) {
634         AUTH_LOGE(AUTH_CONN, "set tcp keep alive fail.");
635         (void)DelTrigger(module, fd, triggerMode);
636         ConnShutdownSocket(fd);
637         return AUTH_INVALID_FD;
638     }
639     return fd;
640 }
641 
SocketDisconnectDevice(ListenerModule module,int32_t fd)642 void SocketDisconnectDevice(ListenerModule module, int32_t fd)
643 {
644     if (fd < 0) {
645         AUTH_LOGD(AUTH_CONN, "invalid fd, maybe has shutdown. fd=%{public}d", fd);
646         return;
647     }
648     (void)DelTrigger(module, fd, RW_TRIGGER);
649     ConnShutdownSocket(fd);
650 }
651 
SocketPostBytes(int32_t fd,const AuthDataHead * head,const uint8_t * data)652 int32_t SocketPostBytes(int32_t fd, const AuthDataHead *head, const uint8_t *data)
653 {
654     CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
655     CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
656     uint32_t size = GetSocketPktSize(head->len);
657     uint8_t *buf = (uint8_t *)SoftBusCalloc(size);
658     if (buf == NULL) {
659         AUTH_LOGE(AUTH_CONN, "malloc pkt err.");
660         return SOFTBUS_MALLOC_ERR;
661     }
662     SocketPktHead pktHead = {
663         .magic = MAGIC_NUMBER,
664         .module = head->module,
665         .seq = head->seq,
666         .flag = head->flag,
667         .len = head->len,
668     };
669     if (PackSocketPkt(&pktHead, data, buf, size) != SOFTBUS_OK) {
670         AUTH_LOGE(AUTH_CONN, "pack socket pkt fail.");
671         SoftBusFree(buf);
672         return SOFTBUS_AUTH_PACK_SOCKET_PKT_FAIL;
673     }
674 
675     AUTH_LOGI(AUTH_CONN, "fd=%{public}d, module=%{public}d, seq=%{public}" PRId64 ", flag=%{public}d, len=%{public}u.",
676         fd, pktHead.module, pktHead.seq, pktHead.flag, pktHead.len);
677     ssize_t ret = ConnSendSocketData(fd, (const char *)buf, (size_t)size, 0);
678     SoftBusFree(buf);
679     if (ret != (ssize_t)size) {
680         AUTH_LOGE(AUTH_CONN, "fail. ret=%{public}zd", ret);
681         return SOFTBUS_TCP_SOCKET_ERR;
682     }
683     return SOFTBUS_OK;
684 }
685 
SocketGetConnInfo(int32_t fd,AuthConnInfo * connInfo,bool * isServer)686 int32_t SocketGetConnInfo(int32_t fd, AuthConnInfo *connInfo, bool *isServer)
687 {
688     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
689     CHECK_NULL_PTR_RETURN_VALUE(isServer, SOFTBUS_INVALID_PARAM);
690     SocketAddr socket;
691     if (ConnGetPeerSocketAddr(fd, &socket) != SOFTBUS_OK) {
692         AUTH_LOGE(AUTH_CONN, "fail, fd=%{public}d.", fd);
693         return SOFTBUS_AUTH_GET_PEER_SOCKET_ADDR_FAIL;
694     }
695     int32_t localPort = ConnGetLocalSocketPort(fd);
696     if (localPort <= 0) {
697         AUTH_LOGE(AUTH_CONN, "fail, fd=%{public}d.", fd);
698         return SOFTBUS_INVALID_PORT;
699     }
700     connInfo->type = AUTH_LINK_TYPE_WIFI;
701     if (strcpy_s(connInfo->info.ipInfo.ip, sizeof(connInfo->info.ipInfo.ip), socket.addr) != EOK) {
702         AUTH_LOGE(AUTH_CONN, "copy ip fail, fd=%{public}d.", fd);
703         return SOFTBUS_MEM_ERR;
704     }
705     connInfo->info.ipInfo.port = socket.port;
706     int32_t serverPort = 0;
707     if (LnnGetLocalNumInfo(NUM_KEY_AUTH_PORT, &serverPort) != SOFTBUS_OK) {
708         AUTH_LOGE(AUTH_CONN, "get local auth port fail.");
709     }
710     *isServer = (serverPort != localPort);
711     return SOFTBUS_OK;
712 }
713 
714 /* Auth Channel */
NotifyChannelDataReceived(int32_t channelId,const SocketPktHead * head,const uint8_t * data)715 static void NotifyChannelDataReceived(int32_t channelId, const SocketPktHead *head, const uint8_t *data)
716 {
717     uint32_t i;
718     AuthChannelListener *listener = NULL;
719     for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
720         if (g_listener[i].module == head->module) {
721             listener = &g_listener[i].listener;
722             break;
723         }
724     }
725     if (listener == NULL || listener->onDataReceived == NULL) {
726         AUTH_LOGE(AUTH_CONN, "AuthChannelListener not set.");
727         return;
728     }
729 
730     AuthChannelData channelData = { 0 };
731     channelData.module = head->module;
732     channelData.seq = head->seq;
733     channelData.flag = head->flag;
734     channelData.len = head->len;
735     channelData.data = data;
736     listener->onDataReceived(channelId, &channelData);
737 }
738 
NotifyChannelDisconnected(int32_t channelId)739 static void NotifyChannelDisconnected(int32_t channelId)
740 {
741     uint32_t i;
742     for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
743         if (g_listener[i].listener.onDisconnected != NULL) {
744             g_listener[i].listener.onDisconnected(channelId);
745         }
746     }
747 }
748 
RegAuthChannelListener(int32_t module,const AuthChannelListener * listener)749 int32_t RegAuthChannelListener(int32_t module, const AuthChannelListener *listener)
750 {
751     if (listener == NULL || listener->onDataReceived == NULL) {
752         AUTH_LOGE(AUTH_CONN, "invalid listener.");
753         return SOFTBUS_INVALID_PARAM;
754     }
755     uint32_t i;
756     for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
757         if (g_listener[i].module == module) {
758             g_listener[i].listener.onDataReceived = listener->onDataReceived;
759             g_listener[i].listener.onDisconnected = listener->onDisconnected;
760             return SOFTBUS_OK;
761         }
762     }
763     AUTH_LOGE(AUTH_CONN, "unknown module. module=%{public}d", module);
764     return SOFTBUS_INVALID_PARAM;
765 }
766 
UnregAuthChannelListener(int32_t module)767 void UnregAuthChannelListener(int32_t module)
768 {
769     uint32_t i;
770     for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
771         if (g_listener[i].module == module) {
772             g_listener[i].listener.onDataReceived = NULL;
773             g_listener[i].listener.onDisconnected = NULL;
774             return;
775         }
776     }
777 }
778 
AuthOpenChannelWithAllIp(const char * localIp,const char * remoteIp,int32_t port)779 int32_t AuthOpenChannelWithAllIp(const char *localIp, const char *remoteIp, int32_t port)
780 {
781     if (localIp == NULL || remoteIp == NULL || port <= 0) {
782         AUTH_LOGE(AUTH_CONN, "invalid param.");
783         return SOFTBUS_INVALID_PARAM;
784     }
785     int32_t fd = SocketConnectDeviceWithAllIp(localIp, remoteIp, port, true);
786     if (fd < 0) {
787         AUTH_LOGE(AUTH_CONN, "connect fail.");
788         return INVALID_CHANNEL_ID;
789     }
790     AUTH_LOGI(AUTH_CONN, "open auth channel succ, channelId=%{public}d.", fd);
791     return fd;
792 }
793 
AuthOpenChannel(const char * ip,int32_t port)794 int32_t AuthOpenChannel(const char *ip, int32_t port)
795 {
796     if (ip == NULL || port <= 0) {
797         AUTH_LOGE(AUTH_CONN, "invalid param.");
798         return INVALID_CHANNEL_ID;
799     }
800     int32_t fd = SocketConnectDevice(ip, port, true);
801     if (fd < 0) {
802         AUTH_LOGE(AUTH_CONN, "connect fail.");
803         return INVALID_CHANNEL_ID;
804     }
805     AUTH_LOGI(AUTH_CONN, "open auth channel succ, channelId=%{public}d.", fd);
806     return fd;
807 }
808 
AuthCloseChannel(int32_t channelId,int32_t moduleId)809 void AuthCloseChannel(int32_t channelId, int32_t moduleId)
810 {
811     AUTH_LOGI(AUTH_CONN, "close auth channel, moduleId=%{public}d, id=%{public}d.", moduleId, channelId);
812     SocketDisconnectDevice((ListenerModule)moduleId, channelId);
813 }
814 
AuthPostChannelData(int32_t channelId,const AuthChannelData * data)815 int32_t AuthPostChannelData(int32_t channelId, const AuthChannelData *data)
816 {
817     if (channelId < 0 || data == NULL || data->data == NULL || data->len == 0) {
818         AUTH_LOGE(AUTH_CONN, "invalid param, channelId=%{public}d.", channelId);
819         return SOFTBUS_INVALID_PARAM;
820     }
821     AuthDataHead head = {
822         .dataType = DATA_TYPE_CONNECTION,
823         .module = data->module,
824         .seq = data->seq,
825         .flag = data->flag,
826         .len = data->len,
827     };
828     return SocketPostBytes(channelId, &head, data->data);
829 }
830 
GetTcpKeepaliveOptionByCycle(ModeCycle cycle,TcpKeepaliveOption * tcpKeepaliveOption)831 static int32_t GetTcpKeepaliveOptionByCycle(ModeCycle cycle, TcpKeepaliveOption *tcpKeepaliveOption)
832 {
833     if (tcpKeepaliveOption == NULL) {
834         AUTH_LOGE(AUTH_CONN, "invalid param");
835         return SOFTBUS_INVALID_PARAM;
836     }
837     switch (cycle) {
838         case HIGH_FREQ_CYCLE:
839             tcpKeepaliveOption->keepaliveCount = TCP_KEEPALIVE_HIGH_COUNT;
840             tcpKeepaliveOption->userTimeout = TCP_KEEPALIVE_HIGH_USER_TIMEOUT;
841             break;
842         case MID_FREQ_CYCLE:
843             tcpKeepaliveOption->keepaliveCount = TCP_KEEPALIVE_MID_COUNT;
844             tcpKeepaliveOption->userTimeout = TCP_KEEPALIVE_MID_USER_TIMEOUT;
845             break;
846         case LOW_FREQ_CYCLE:
847             tcpKeepaliveOption->keepaliveCount = TCP_KEEPALIVE_LOW_COUNT;
848             tcpKeepaliveOption->userTimeout = TCP_KEEPALIVE_LOW_USER_TIMEOUT;
849             break;
850         case DEFAULT_FREQ_CYCLE:
851             tcpKeepaliveOption->keepaliveCount = TCP_KEEPALIVE_DEFAULT_COUNT;
852             tcpKeepaliveOption->userTimeout = TCP_KEEPALIVE_DEFAULT_USER_TIMEOUT;
853             break;
854         default:
855             AUTH_LOGE(AUTH_CONN, "no match cycle, cycle=%{public}d", cycle);
856             return SOFTBUS_INVALID_PARAM;
857     }
858     tcpKeepaliveOption->keepaliveIdle = (int32_t)cycle;
859     tcpKeepaliveOption->keepaliveIntvl = TCP_KEEPALIVE_INTERVAL;
860     return SOFTBUS_OK;
861 }
862 
AuthSetTcpKeepaliveOption(int32_t fd,ModeCycle cycle)863 int32_t AuthSetTcpKeepaliveOption(int32_t fd, ModeCycle cycle)
864 {
865     if (fd <= 0 || cycle < HIGH_FREQ_CYCLE || cycle > DEFAULT_FREQ_CYCLE) {
866         AUTH_LOGE(AUTH_CONN, "invalid param");
867         return SOFTBUS_INVALID_PARAM;
868     }
869     TcpKeepaliveOption tcpKeepaliveOption = { 0 };
870     int32_t ret = GetTcpKeepaliveOptionByCycle(cycle, &tcpKeepaliveOption);
871     if (ret != SOFTBUS_OK) {
872         AUTH_LOGE(AUTH_CONN, "get tcp keepalive option by cycle fail");
873         return ret;
874     }
875     if (ConnSetTcpUserTimeOut(fd, tcpKeepaliveOption.userTimeout) != SOFTBUS_OK) {
876         AUTH_LOGE(AUTH_CONN, "set TCP_USER_TIMEOUT fail, fd=%{public}d", fd);
877         return SOFTBUS_ADAPTER_ERR;
878     }
879     if (ConnSetTcpKeepalive(fd, tcpKeepaliveOption.keepaliveIdle, tcpKeepaliveOption.keepaliveIntvl,
880         tcpKeepaliveOption.keepaliveCount) != SOFTBUS_OK) {
881         AUTH_LOGE(AUTH_CONN, "set tcp keepalive fail, fd=%{public}d", fd);
882         return SOFTBUS_ADAPTER_ERR;
883     }
884 
885     AUTH_LOGI(AUTH_CONN,
886         "set tcp keepalive successful, fd=%{public}d, keepaliveIdle=%{public}d, keepaliveIntvl=%{public}d, "
887         "keepaliveCount=%{public}d, userTimeout=%{public}u",
888         fd, tcpKeepaliveOption.keepaliveIdle, tcpKeepaliveOption.keepaliveIntvl, tcpKeepaliveOption.keepaliveCount,
889         tcpKeepaliveOption.userTimeout);
890     return SOFTBUS_OK;
891 }
892 
WifiConnListLockInit(void)893 int32_t WifiConnListLockInit(void)
894 {
895     if (SoftBusMutexInit(&g_wifiConnListLock, NULL) != SOFTBUS_OK) {
896         AUTH_LOGE(AUTH_CONN, "wifiConnList mutex init fail");
897         return SOFTBUS_LOCK_ERR;
898     }
899     return SOFTBUS_OK;
900 }
901 
WifiConnListLockDeinit(void)902 void WifiConnListLockDeinit(void)
903 {
904     if (SoftBusMutexDestroy(&g_wifiConnListLock) != SOFTBUS_OK) {
905         AUTH_LOGE(AUTH_CONN, "wifiConnList mutex destroy fail");
906     }
907 }