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 }