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 }