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 <securec.h>
17 #include <stdbool.h>
18 
19 #include "comm_log.h"
20 #include "softbus_common.h"
21 #include "softbus_errcode.h"
22 #include "softbus_config_adapter.h"
23 #include "softbus_feature_config.h"
24 
25 #define MAX_STORAGE_PATH_LEN 256
26 #define MAX_NET_IF_NAME_LEN 256
27 
28 #define MAX_BYTES_LENGTH 4194304
29 #define MAX_MESSAGE_LENGTH 4096
30 
31 #ifdef SOFTBUS_LINUX
32 #define CONN_BR_MAX_DATA_LENGTH (40 * 1000)
33 #define CONN_COC_MAX_DATA_LENGTH (40 * 1000)
34 #define CONN_BLE_CLOSE_DELAY (10 * 1000)
35 #else
36 #define CONN_BR_MAX_DATA_LENGTH 4096
37 #define CONN_COC_MAX_DATA_LENGTH 4096
38 #define CONN_BLE_CLOSE_DELAY (30 * 1000)
39 #endif
40 
41 #define CONN_RFCOM_SEND_MAX_LEN 990
42 #define CONN_COC_SEND_MTU_LEN 990
43 /* 4KB + INDEX + IV_HEAD + PACKET_HEAD + SLICE_HEAD + CHANNEL_HEAD */
44 #define CONN_TCP_MAX_LENGTH (4096 + 12 + 28 + 16 + 16)
45 #define CONN_BR_RECEIVE_MAX_LEN 500
46 #define CONN_TCP_MAX_CONN_NUM 30
47 #define CONN_TCP_TIME_OUT 100
48 #define MAX_NODE_STATE_CB_CNT 10
49 #define MAX_LNN_CONNECTION_CNT 30
50 #define LNN_SUPPORT_CAPBILITY 62
51 #define LNN_SUPPORT_FEATURE     0x177C2
52 #define AUTH_ABILITY_COLLECTION 0
53 #define ADAPTER_LOG_LEVEL 0
54 #ifndef DEFAULT_STORAGE_PATH
55 #define DEFAULT_STORAGE_PATH "/data/service/el1/public"
56 #endif
57 #define LNN_UDID_INIT_DELAY_LEN 1500
58 #define LNN_NET_IF_NAME "0:eth0,1:wlan0,2:br0,3:ble0"
59 #define LNN_MAX_CONCURENT_NUM 2
60 #define DEFAULT_DISC_FREQ_LOW ((5 << 16) | 12)
61 #define DEFAULT_DISC_FREQ_MID ((5 << 16) | 24)
62 #define DEFAULT_DISC_FREQ_HIGH ((5 << 16) | 36)
63 #define DEFAULT_DISC_FREQ_SUPER_HIGH ((10 << 16) | 48)
64 #define DEFAULT_DISC_FREQ_EXTREME_HIGH ((10 << 16) | 48)
65 #define DEFAULT_DISC_COAP_MAX_DEVICE_NUM 20
66 
67 #ifdef SOFTBUS_LINUX
68 #define DEFAULT_NEW_BYTES_LEN (4 * 1024 * 1024)
69 #define DEFAULT_NEW_MESSAGE_LEN (4 * 1024)
70 #define DEFAULT_MAX_BYTES_LEN (4 * 1024 * 1024)
71 #define DEFAULT_MAX_MESSAGE_LEN (4 * 1024)
72 #define DEFAULT_AUTH_MAX_BYTES_LEN (40000 - 32)
73 #define DEFAULT_AUTH_MAX_MESSAGE_LEN (4 * 1024)
74 #define DEFAULT_PROXY_MAX_BYTES_LEN (4 * 1024 * 1024)
75 #define DEFAULT_PROXY_MAX_MESSAGE_LEN (1 * 1024)
76 #define DEFAULT_IS_SUPPORT_TCP_PROXY 1
77 #define DEFAULT_BLE_MAC_AUTO_REFRESH 1
78 #elif defined SOFTBUS_LITEOS_A
79 #define DEFAULT_NEW_BYTES_LEN (1 * 1024 * 1024)
80 #define DEFAULT_NEW_MESSAGE_LEN (4 * 1024)
81 #define DEFAULT_MAX_BYTES_LEN (1 * 1024 * 1024)
82 #define DEFAULT_MAX_MESSAGE_LEN (4 * 1024)
83 #define DEFAULT_AUTH_MAX_BYTES_LEN (4 * 1024)
84 #define DEFAULT_AUTH_MAX_MESSAGE_LEN (1 * 1024)
85 #define DEFAULT_PROXY_MAX_BYTES_LEN (4 * 1024)
86 #define DEFAULT_PROXY_MAX_MESSAGE_LEN (1 * 1024)
87 #define DEFAULT_IS_SUPPORT_TCP_PROXY 1
88 #define DEFAULT_BLE_MAC_AUTO_REFRESH 1
89 #else
90 #define DEFAULT_NEW_BYTES_LEN (4 * 1024)
91 #define DEFAULT_NEW_MESSAGE_LEN (4 * 1024)
92 #define DEFAULT_MAX_BYTES_LEN (2 * 1024)
93 #define DEFAULT_MAX_MESSAGE_LEN (1 * 1024)
94 #define DEFAULT_AUTH_MAX_BYTES_LEN (2 * 1024)
95 #define DEFAULT_AUTH_MAX_MESSAGE_LEN (1 * 1024)
96 #define DEFAULT_PROXY_MAX_BYTES_LEN (2 * 1024)
97 #define DEFAULT_PROXY_MAX_MESSAGE_LEN (1 * 1024)
98 #define DEFAULT_IS_SUPPORT_TCP_PROXY 1
99 #define DEFAULT_BLE_MAC_AUTO_REFRESH 0
100 #endif
101 
102 typedef struct {
103     int32_t authAbilityConn;
104     int32_t connBrMaxDataLen;
105     int32_t connRfcomSendMaxLen;
106     int32_t connBrRecvMaxLen;
107     int32_t connTcpMaxLen;
108     int32_t connTcpMaxConnNum;
109     int32_t connTcpTimeOut;
110     int32_t maxNodeStateCbCnt;
111     int32_t maxLnnConnCnt;
112     int32_t maxLnnSupportCap;
113     int32_t adapterLogLevel;
114     char storageDir[MAX_STORAGE_PATH_LEN];
115     int32_t lnnUdidInitDelayLen;
116     char lnnNetIfName[MAX_NET_IF_NAME_LEN];
117     int32_t lnnMaxConcurentNum;
118     bool lnnAutoNetworkingSwitch;
119     bool isSupportTopo;
120     uint64_t supportFeature;
121     int32_t connCocMaxDataLen;
122     int32_t connCocSendMtu;
123     int32_t connBleCloseDelayTime;
124     int32_t bleMacAutoRefreshSwitch;
125 } ConfigItem;
126 
127 typedef struct {
128     ConfigType type;
129     unsigned char *val;
130     uint32_t len;
131 } ConfigVal;
132 
133 ConfigItem g_config = {
134     AUTH_ABILITY_COLLECTION,
135     CONN_BR_MAX_DATA_LENGTH,
136     CONN_RFCOM_SEND_MAX_LEN,
137     CONN_BR_RECEIVE_MAX_LEN,
138     CONN_TCP_MAX_LENGTH,
139     CONN_TCP_MAX_CONN_NUM,
140     CONN_TCP_TIME_OUT,
141     MAX_NODE_STATE_CB_CNT,
142     MAX_LNN_CONNECTION_CNT,
143     LNN_SUPPORT_CAPBILITY,
144     ADAPTER_LOG_LEVEL,
145     DEFAULT_STORAGE_PATH,
146     LNN_UDID_INIT_DELAY_LEN,
147     LNN_NET_IF_NAME,
148     LNN_MAX_CONCURENT_NUM,
149     true,
150     true,
151     LNN_SUPPORT_FEATURE,
152     CONN_COC_MAX_DATA_LENGTH,
153     CONN_COC_SEND_MTU_LEN,
154     CONN_BLE_CLOSE_DELAY,
155     DEFAULT_BLE_MAC_AUTO_REFRESH,
156 };
157 
158 typedef struct {
159     int32_t isSupportTcpProxy;
160     int32_t maxBytesNewLen;
161     int32_t maxMessageNewLen;
162     int32_t maxBytesLen;
163     int32_t maxMessageLen;
164     int32_t maxAuthBytesLen;
165     int32_t maxAuthMessageLen;
166     uint32_t maxProxyBytesLen;
167     uint32_t maxProxyMessageLen;
168 } TransConfigItem;
169 
170 static TransConfigItem g_tranConfig = {0};
171 
172 typedef struct {
173     uint32_t discFreq[FREQ_BUTT];
174     uint32_t discCoapMaxDeviceNum;
175 } DiscConfigItem;
176 
177 static DiscConfigItem g_discConfig = {
178     .discFreq = {
179         DEFAULT_DISC_FREQ_LOW,
180         DEFAULT_DISC_FREQ_MID,
181         DEFAULT_DISC_FREQ_HIGH,
182         DEFAULT_DISC_FREQ_SUPER_HIGH,
183         DEFAULT_DISC_FREQ_EXTREME_HIGH,
184     },
185     .discCoapMaxDeviceNum = DEFAULT_DISC_COAP_MAX_DEVICE_NUM
186 };
187 
188 ConfigVal g_configItems[SOFTBUS_CONFIG_TYPE_MAX] = {
189     {
190         SOFTBUS_INT_MAX_BYTES_NEW_LENGTH,
191         (unsigned char *)&(g_tranConfig.maxBytesNewLen),
192         sizeof(g_tranConfig.maxBytesNewLen)
193     },
194     {
195         SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH,
196         (unsigned char *)&(g_tranConfig.maxMessageNewLen),
197         sizeof(g_tranConfig.maxMessageNewLen)
198     },
199     {
200         SOFTBUS_INT_MAX_BYTES_LENGTH,
201         (unsigned char *)&(g_tranConfig.maxBytesLen),
202         sizeof(g_tranConfig.maxBytesLen)
203     },
204     {
205         SOFTBUS_INT_MAX_MESSAGE_LENGTH,
206         (unsigned char *)&(g_tranConfig.maxMessageLen),
207         sizeof(g_tranConfig.maxMessageLen)
208     },
209     {
210         SOFTBUS_INT_CONN_BR_MAX_DATA_LENGTH,
211         (unsigned char *)&(g_config.connBrMaxDataLen),
212         sizeof(g_config.connBrMaxDataLen)
213     },
214     {
215         SOFTBUS_INT_CONN_RFCOM_SEND_MAX_LEN,
216         (unsigned char *)&(g_config.connRfcomSendMaxLen),
217         sizeof(g_config.connRfcomSendMaxLen)
218     },
219     {
220         SOFTBUS_INT_CONN_BR_RECEIVE_MAX_LEN,
221         (unsigned char *)&(g_config.connBrRecvMaxLen),
222         sizeof(g_config.connBrRecvMaxLen)
223     },
224     {
225         SOFTBUS_INT_CONN_TCP_MAX_LENGTH,
226         (unsigned char *)&(g_config.connTcpMaxLen),
227         sizeof(g_config.connTcpMaxLen)
228     },
229     {
230         SOFTBUS_INT_CONN_TCP_MAX_CONN_NUM,
231         (unsigned char *)&(g_config.connTcpMaxConnNum),
232         sizeof(g_config.connTcpMaxConnNum)
233     },
234     {
235         SOFTBUS_INT_CONN_TCP_TIME_OUT,
236         (unsigned char *)&(g_config.connTcpTimeOut),
237         sizeof(g_config.connTcpTimeOut)
238     },
239     {
240         SOFTBUS_INT_MAX_NODE_STATE_CB_CNT,
241         (unsigned char *)&(g_config.maxNodeStateCbCnt),
242         sizeof(g_config.maxNodeStateCbCnt)
243     },
244     {
245         SOFTBUS_INT_MAX_LNN_CONNECTION_CNT,
246         (unsigned char *)&(g_config.maxLnnConnCnt),
247         sizeof(g_config.maxLnnConnCnt)
248     },
249     {
250         SOFTBUS_INT_LNN_SUPPORT_CAPABILITY,
251         (unsigned char *)&(g_config.maxLnnSupportCap),
252         sizeof(g_config.maxLnnSupportCap)
253     },
254     {
255         SOFTBUS_INT_AUTH_ABILITY_COLLECTION,
256         (unsigned char *)&(g_config.authAbilityConn),
257         sizeof(g_config.authAbilityConn)
258     },
259     {
260         SOFTBUS_INT_ADAPTER_LOG_LEVEL,
261         (unsigned char *)&(g_config.adapterLogLevel),
262         sizeof(g_config.adapterLogLevel)
263     },
264     {
265         SOFTBUS_STR_STORAGE_DIRECTORY,
266         (unsigned char *)(g_config.storageDir),
267         sizeof(g_config.storageDir)
268     },
269     {
270         SOFTBUS_INT_SUPPORT_TCP_PROXY,
271         (unsigned char *)&(g_tranConfig.isSupportTcpProxy),
272         sizeof(g_tranConfig.isSupportTcpProxy)
273     },
274     {
275         SOFTBUS_INT_LNN_UDID_INIT_DELAY_LEN,
276         (unsigned char *)&(g_config.lnnUdidInitDelayLen),
277         sizeof(g_config.lnnUdidInitDelayLen)
278     },
279     {
280         SOFTBUS_STR_LNN_NET_IF_NAME,
281         (unsigned char *)&(g_config.lnnNetIfName),
282         sizeof(g_config.lnnNetIfName)
283     },
284     {
285         SOFTBUS_INT_LNN_MAX_CONCURRENT_NUM,
286         (unsigned char *)&(g_config.lnnMaxConcurentNum),
287         sizeof(g_config.lnnMaxConcurentNum)
288     },
289     {
290         SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH,
291         (unsigned char *)&(g_tranConfig.maxAuthBytesLen),
292         sizeof(g_tranConfig.maxAuthBytesLen)
293     },
294     {
295         SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH,
296         (unsigned char *)&(g_tranConfig.maxAuthMessageLen),
297         sizeof(g_tranConfig.maxAuthMessageLen)
298     },
299     {
300         SOFTBUS_INT_AUTO_NETWORKING_SWITCH,
301         (unsigned char *)&(g_config.lnnAutoNetworkingSwitch),
302         sizeof(g_config.lnnAutoNetworkingSwitch)
303     },
304     {
305         SOFTBUS_BOOL_SUPPORT_TOPO,
306         (unsigned char *)&(g_config.isSupportTopo),
307         sizeof(g_config.isSupportTopo)
308     },
309     {
310         SOFTBUS_INT_DISC_FREQ,
311         (unsigned char *)(g_discConfig.discFreq),
312         sizeof(g_discConfig.discFreq)
313     },
314     {
315         SOFTBUS_INT_PROXY_MAX_BYTES_LENGTH,
316         (unsigned char *)&(g_tranConfig.maxProxyBytesLen),
317         sizeof(g_tranConfig.maxProxyBytesLen)
318     },
319     {
320         SOFTBUS_INT_PROXY_MAX_MESSAGE_LENGTH,
321         (unsigned char *)&(g_tranConfig.maxProxyMessageLen),
322         sizeof(g_tranConfig.maxProxyMessageLen)
323     },
324     {
325         SOFTBUS_INT_LNN_SUPPORT_FEATURE,
326         (unsigned char *)&(g_config.supportFeature),
327         sizeof(g_config.supportFeature)
328     },
329     {
330         SOFTBUS_INT_CONN_COC_MAX_DATA_LENGTH,
331         (unsigned char *)&(g_config.connCocMaxDataLen),
332         sizeof(g_config.connCocMaxDataLen)
333     },
334     {
335         SOFTBUS_INT_CONN_COC_SEND_MTU,
336         (unsigned char *)&(g_config.connCocSendMtu),
337         sizeof(g_config.connCocSendMtu)
338     },
339     {
340         SOFTBUS_INT_CONN_BLE_CLOSE_DELAY_TIME,
341         (unsigned char *)&(g_config.connBleCloseDelayTime),
342         sizeof(g_config.connBleCloseDelayTime)
343     },
344     {
345         SOFTBUS_INT_BLE_MAC_AUTO_REFRESH_SWITCH,
346         (unsigned char *)&(g_config.bleMacAutoRefreshSwitch),
347         sizeof(g_config.bleMacAutoRefreshSwitch)
348     },
349     {
350         SOFTBUS_INT_DISC_COAP_MAX_DEVICE_NUM,
351         (unsigned char *)&(g_discConfig.discCoapMaxDeviceNum),
352         sizeof(g_discConfig.discCoapMaxDeviceNum)
353     },
354 };
355 
SoftbusSetConfig(ConfigType type,const unsigned char * val,uint32_t len)356 int SoftbusSetConfig(ConfigType type, const unsigned char *val, uint32_t len)
357 {
358     if ((type >= SOFTBUS_CONFIG_TYPE_MAX) || (val == NULL) ||
359         (len > g_configItems[type].len) || (type != g_configItems[type].type)) {
360         COMM_LOGW(COMM_DFX, "invalid param");
361         return SOFTBUS_INVALID_PARAM;
362     }
363     if (memcpy_s(g_configItems[type].val, g_configItems[type].len, val, len) != EOK) {
364         COMM_LOGW(COMM_DFX, "memcpy_s fail");
365         return SOFTBUS_MEM_ERR;
366     }
367     return SOFTBUS_OK;
368 }
369 
SoftbusGetConfig(ConfigType type,unsigned char * val,uint32_t len)370 int SoftbusGetConfig(ConfigType type, unsigned char *val, uint32_t len)
371 {
372     if ((type >= SOFTBUS_CONFIG_TYPE_MAX) || (val == NULL) ||
373         (len != g_configItems[type].len) || (type != g_configItems[type].type)) {
374         COMM_LOGW(COMM_DFX, "invalid param");
375         return SOFTBUS_INVALID_PARAM;
376     }
377     if (memcpy_s((void*)val, len, g_configItems[type].val, g_configItems[type].len) != EOK) {
378         COMM_LOGW(COMM_DFX, "memcpy_s fail");
379         return SOFTBUS_MEM_ERR;
380     }
381     return SOFTBUS_OK;
382 }
383 
SoftbusConfigSetTransDefaultVal(void)384 static void SoftbusConfigSetTransDefaultVal(void)
385 {
386     g_tranConfig.isSupportTcpProxy = DEFAULT_IS_SUPPORT_TCP_PROXY;
387     g_tranConfig.maxBytesNewLen = DEFAULT_NEW_BYTES_LEN;
388     g_tranConfig.maxMessageNewLen = DEFAULT_NEW_MESSAGE_LEN;
389     g_tranConfig.maxBytesLen = DEFAULT_MAX_BYTES_LEN;
390     g_tranConfig.maxMessageLen = DEFAULT_MAX_MESSAGE_LEN;
391     g_tranConfig.maxAuthBytesLen = DEFAULT_AUTH_MAX_BYTES_LEN;
392     g_tranConfig.maxAuthMessageLen = DEFAULT_AUTH_MAX_MESSAGE_LEN;
393     g_tranConfig.maxProxyBytesLen = DEFAULT_PROXY_MAX_BYTES_LEN;
394     g_tranConfig.maxProxyMessageLen = DEFAULT_PROXY_MAX_MESSAGE_LEN;
395 }
396 
SoftbusConfigSetDefaultVal(void)397 static void SoftbusConfigSetDefaultVal(void)
398 {
399     SoftbusConfigSetTransDefaultVal();
400 }
401 
SoftbusConfigInit(void)402 void SoftbusConfigInit(void)
403 {
404     ConfigSetProc sets;
405     SoftbusConfigSetDefaultVal();
406     sets.SetConfig = &SoftbusSetConfig;
407     SoftbusConfigAdapterInit(&sets);
408 }