• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "lnn_connection_addr_utils.h"
17 
18 #include <securec.h>
19 #include <string.h>
20 
21 #include "softbus_def.h"
22 #include "softbus_log.h"
23 
24 #define LNN_MAX_PRINT_ADDR_LEN 100
25 
LnnIsSameConnectionAddr(const ConnectionAddr * addr1,const ConnectionAddr * addr2)26 NO_SANITIZE("cfi") bool LnnIsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)
27 {
28     if (addr1 == NULL || addr2 == NULL) {
29         return false;
30     }
31     if (addr1->type != addr2->type) {
32         return false;
33     }
34     if (addr1->type == CONNECTION_ADDR_BR) {
35         return strncmp(addr1->info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0;
36     }
37     if (addr1->type == CONNECTION_ADDR_BLE) {
38         return memcmp(addr1->info.ble.udidHash, addr2->info.ble.udidHash, UDID_HASH_LEN) == 0 &&
39         strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
40     }
41     if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
42         return (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, IP_STR_MAX_LEN) == 0) &&
43         (addr1->info.ip.port == addr2->info.ip.port);
44     }
45     if (addr1->type == CONNECTION_ADDR_SESSION) {
46         return ((addr1->info.session.sessionId == addr2->info.session.sessionId) &&
47             (addr1->info.session.channelId == addr2->info.session.channelId) &&
48             (addr1->info.session.type == addr2->info.session.type));
49     }
50     return false;
51 }
52 
LnnConvertAddrToOption(const ConnectionAddr * addr,ConnectOption * option)53 NO_SANITIZE("cfi") bool LnnConvertAddrToOption(const ConnectionAddr *addr, ConnectOption *option)
54 {
55     if (addr == NULL || option == NULL) {
56         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr or option is null");
57         return false;
58     }
59     if (addr->type == CONNECTION_ADDR_BR) {
60         option->type = CONNECT_BR;
61         if (strncpy_s(option->brOption.brMac, BT_MAC_LEN, addr->info.br.brMac,
62             strlen(addr->info.br.brMac)) != EOK) {
63             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy br mac to addr fail");
64             return false;
65         }
66         return true;
67     }
68     if (addr->type == CONNECTION_ADDR_BLE) {
69         option->type = CONNECT_BLE;
70         if (strncpy_s(option->bleOption.bleMac, BT_MAC_LEN, addr->info.ble.bleMac,
71             strlen(addr->info.ble.bleMac)) != EOK) {
72             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ble mac to addr fail");
73             return false;
74         }
75         return true;
76     }
77     if (addr->type == CONNECTION_ADDR_ETH || addr->type == CONNECTION_ADDR_WLAN) {
78         option->type = CONNECT_TCP;
79         if (strncpy_s(option->socketOption.addr, sizeof(option->socketOption.addr), addr->info.ip.ip,
80             strlen(addr->info.ip.ip)) != EOK) {
81             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ip  to addr fail");
82             return false;
83         }
84         option->socketOption.port = addr->info.ip.port;
85         option->socketOption.protocol = LNN_PROTOCOL_IP;
86         return true;
87     }
88     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "not supported type: %d", addr->type);
89     return false;
90 }
91 
LnnConvertOptionToAddr(ConnectionAddr * addr,const ConnectOption * option,ConnectionAddrType hintType)92 NO_SANITIZE("cfi") bool LnnConvertOptionToAddr(ConnectionAddr *addr, const ConnectOption *option,
93     ConnectionAddrType hintType)
94 {
95     if (addr == NULL || option == NULL) {
96         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr or option is null");
97         return false;
98     }
99     if (option->type == CONNECT_BR) {
100         addr->type = CONNECTION_ADDR_BR;
101         if (strncpy_s(addr->info.br.brMac, BT_MAC_LEN, option->brOption.brMac,
102             strlen(option->brOption.brMac)) != EOK) {
103             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy br mac to addr fail");
104             return false;
105         }
106         return true;
107     }
108     if (option->type == CONNECT_BLE) {
109         addr->type = CONNECTION_ADDR_BLE;
110         if (strncpy_s(addr->info.ble.bleMac, BT_MAC_LEN, option->bleOption.bleMac,
111             strlen(option->bleOption.bleMac)) != EOK) {
112             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ble mac to addr fail");
113             return false;
114         }
115         return true;
116     }
117     if (option->type == CONNECT_TCP) {
118         if (option->socketOption.protocol != LNN_PROTOCOL_IP) {
119             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "only ip is supportted");
120             return false;
121         }
122         addr->type = hintType;
123         if (strncpy_s(addr->info.ip.ip, IP_LEN, option->socketOption.addr,
124             strlen(option->socketOption.addr)) != EOK) {
125             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ip to addr fail");
126             return false;
127         }
128         addr->info.ip.port = (uint16_t)option->socketOption.port;
129         return true;
130     }
131     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "not supported type: %d", option->type);
132     return false;
133 }
134 
LnnConvAddrTypeToDiscType(ConnectionAddrType type)135 NO_SANITIZE("cfi") DiscoveryType LnnConvAddrTypeToDiscType(ConnectionAddrType type)
136 {
137     if (type == CONNECTION_ADDR_WLAN || type == CONNECTION_ADDR_ETH) {
138         return DISCOVERY_TYPE_WIFI;
139     } else if (type == CONNECTION_ADDR_BR) {
140         return DISCOVERY_TYPE_BR;
141     } else if (type == CONNECTION_ADDR_BLE) {
142         return DISCOVERY_TYPE_BLE;
143     } else if (type == CONNECTION_ADDR_SESSION) {
144         return DISCOVERY_TYPE_BLE;
145     } else {
146         return DISCOVERY_TYPE_COUNT;
147     }
148 }
149 
LnnDiscTypeToConnAddrType(DiscoveryType type)150 NO_SANITIZE("cfi") ConnectionAddrType LnnDiscTypeToConnAddrType(DiscoveryType type)
151 {
152     switch (type) {
153         case DISCOVERY_TYPE_WIFI:
154             return CONNECTION_ADDR_WLAN;
155         case DISCOVERY_TYPE_BLE:
156             return CONNECTION_ADDR_BLE;
157         case DISCOVERY_TYPE_BR:
158             return CONNECTION_ADDR_BR;
159         default:
160             break;
161     }
162     return CONNECTION_ADDR_MAX;
163 }
164 
LnnConvertAddrToAuthConnInfo(const ConnectionAddr * addr,AuthConnInfo * connInfo)165 NO_SANITIZE("cfi") bool LnnConvertAddrToAuthConnInfo(const ConnectionAddr *addr, AuthConnInfo *connInfo)
166 {
167     if (addr == NULL || connInfo == NULL) {
168         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr or connInfo is null");
169         return false;
170     }
171     if (addr->type == CONNECTION_ADDR_BR) {
172         connInfo->type = AUTH_LINK_TYPE_BR;
173         if (strcpy_s(connInfo->info.brInfo.brMac, BT_MAC_LEN, addr->info.br.brMac) != EOK) {
174             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy br mac to connInfo fail");
175             return false;
176         }
177         return true;
178     }
179     if (addr->type == CONNECTION_ADDR_BLE) {
180         connInfo->type = AUTH_LINK_TYPE_BLE;
181         if (strcpy_s(connInfo->info.bleInfo.bleMac, BT_MAC_LEN, addr->info.ble.bleMac) != EOK ||
182             memcpy_s(connInfo->info.bleInfo.deviceIdHash, UDID_HASH_LEN, addr->info.ble.udidHash, UDID_HASH_LEN)) {
183             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ble mac to connInfo fail");
184             return false;
185         }
186         connInfo->info.bleInfo.protocol = addr->info.ble.protocol;
187         connInfo->info.bleInfo.psm = addr->info.ble.psm;
188         return true;
189     }
190     if (addr->type == CONNECTION_ADDR_ETH || addr->type == CONNECTION_ADDR_WLAN) {
191         connInfo->type = AUTH_LINK_TYPE_WIFI;
192         if (strcpy_s(connInfo->info.ipInfo.ip, IP_LEN, addr->info.ip.ip) != EOK) {
193             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ip to connInfo fail");
194             return false;
195         }
196         connInfo->info.ipInfo.port = addr->info.ip.port;
197         return true;
198     }
199     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "not supported type: %d", addr->type);
200     return false;
201 }
202 
LnnConvertAuthConnInfoToAddr(ConnectionAddr * addr,const AuthConnInfo * connInfo,ConnectionAddrType hintType)203 NO_SANITIZE("cfi") bool LnnConvertAuthConnInfoToAddr(ConnectionAddr *addr, const AuthConnInfo *connInfo,
204     ConnectionAddrType hintType)
205 {
206     if (addr == NULL || connInfo == NULL) {
207         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr or connInfo is null");
208         return false;
209     }
210     if (connInfo->type == AUTH_LINK_TYPE_BR) {
211         addr->type = CONNECTION_ADDR_BR;
212         if (strcpy_s(addr->info.br.brMac, BT_MAC_LEN, connInfo->info.brInfo.brMac) != EOK) {
213             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy br mac to addr fail");
214             return false;
215         }
216         return true;
217     }
218     if (connInfo->type == AUTH_LINK_TYPE_BLE) {
219         addr->type = CONNECTION_ADDR_BLE;
220         if (strcpy_s(addr->info.ble.bleMac, BT_MAC_LEN, connInfo->info.bleInfo.bleMac) != EOK) {
221             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ble mac to addr fail");
222             return false;
223         }
224         addr->info.ble.protocol = connInfo->info.bleInfo.protocol;
225         addr->info.ble.psm = connInfo->info.bleInfo.psm;
226         return true;
227     }
228     if (connInfo->type == AUTH_LINK_TYPE_WIFI) {
229         addr->type = hintType;
230         if (strcpy_s(addr->info.ip.ip, IP_LEN, connInfo->info.ipInfo.ip) != EOK) {
231             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ip to addr fail");
232             return false;
233         }
234         addr->info.ip.port = (uint16_t)connInfo->info.ipInfo.port;
235         return true;
236     }
237     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "not supported type: %d", connInfo->type);
238     return false;
239 }
240 
LnnPrintConnectionAddr(const ConnectionAddr * addr)241 const char *LnnPrintConnectionAddr(const ConnectionAddr *addr)
242 {
243     int32_t ret = 0;
244     static char printAddr[LNN_MAX_PRINT_ADDR_LEN] = {0};
245 
246     if (addr == NULL) {
247         LLOGE("print connection addr get invalid param");
248         return "Addr=";
249     }
250     switch (addr->type) {
251         case CONNECTION_ADDR_WLAN:
252         case CONNECTION_ADDR_ETH:
253             ret = sprintf_s(printAddr, sizeof(printAddr),
254                 "Ip=*.*.*%s", AnonymizesIp(addr->info.ip.ip));
255             break;
256         case CONNECTION_ADDR_BR:
257             ret = sprintf_s(printAddr, sizeof(printAddr),
258                 "BrMac=**:**:**:**:%s", AnonymizesMac(addr->info.br.brMac));
259             break;
260         case CONNECTION_ADDR_BLE:
261             ret = sprintf_s(printAddr, sizeof(printAddr),
262                 "BleMac=**:**:**:**:%s", AnonymizesMac(addr->info.ble.bleMac));
263             break;
264         default:
265             LLOGW("print invalid connection addr type");
266             return "Addr=";
267     }
268     if (ret < 0) {
269         LLOGE("sprintf_s connection addr failed");
270         return "Addr=";
271     }
272     return printAddr;
273 }