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 "client_bus_center.h"
17
18 #include <securec.h>
19 #include <string.h>
20
21 #include "client_trans_session_manager.h"
22 #include "softbus_adapter_mem.h"
23 #include "softbus_client_frame_manager.h"
24 #include "softbus_def.h"
25 #include "softbus_errcode.h"
26 #include "softbus_log.h"
27 #include "softbus_type_def.h"
28 #include "softbus_utils.h"
29
CommonInit(const char * pkgName)30 static int32_t CommonInit(const char *pkgName)
31 {
32 if (InitSoftBus(pkgName) != SOFTBUS_OK) {
33 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init softbus failed");
34 return SOFTBUS_NETWORK_NOT_INIT;
35 }
36 if (CheckPackageName(pkgName) != SOFTBUS_OK) {
37 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "check packageName failed");
38 return SOFTBUS_INVALID_PARAM;
39 }
40 return SOFTBUS_OK;
41 }
42
IsValidNodeStateCb(INodeStateCb * callback)43 static bool IsValidNodeStateCb(INodeStateCb *callback)
44 {
45 if (callback == NULL) {
46 return false;
47 }
48 if (callback->events == 0) {
49 return false;
50 }
51 if ((callback->events & EVENT_NODE_STATE_ONLINE) != 0 &&
52 callback->onNodeOnline == NULL) {
53 return false;
54 }
55 if ((callback->events & EVENT_NODE_STATE_OFFLINE) != 0 &&
56 callback->onNodeOffline == NULL) {
57 return false;
58 }
59 if ((callback->events & EVENT_NODE_STATE_INFO_CHANGED) != 0 &&
60 callback->onNodeBasicInfoChanged == NULL) {
61 return false;
62 }
63 if ((callback->events & EVENT_NODE_STATUS_CHANGED) != 0 &&
64 callback->onNodeStatusChanged == NULL) {
65 return false;
66 }
67 return true;
68 }
69
PublishInfoCheck(const PublishInfo * info)70 static int32_t PublishInfoCheck(const PublishInfo *info)
71 {
72 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
73 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "mode is invalid");
74 return SOFTBUS_INVALID_PARAM;
75 }
76 if ((info->medium < AUTO) || (info->medium > COAP)) {
77 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "medium is invalid");
78 return SOFTBUS_INVALID_PARAM;
79 }
80 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
81 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "freq is invalid");
82 return SOFTBUS_INVALID_PARAM;
83 }
84 if (info->capability == NULL) {
85 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "capability is invalid");
86 return SOFTBUS_INVALID_PARAM;
87 }
88 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
89 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "data is invalid");
90 return SOFTBUS_INVALID_PARAM;
91 }
92 if (info->dataLen == 0) {
93 return SOFTBUS_OK;
94 }
95 if ((info->capabilityData != NULL) &&
96 ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
97 (strnlen((char *)(info->capabilityData), MAX_CAPABILITYDATA_LEN) == MAX_CAPABILITYDATA_LEN))) {
98 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data exceeds the maximum length");
99 return SOFTBUS_INVALID_PARAM;
100 }
101 return SOFTBUS_OK;
102 }
103
SubscribeInfoCheck(const SubscribeInfo * info)104 static int32_t SubscribeInfoCheck(const SubscribeInfo *info)
105 {
106 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
107 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "mode is invalid");
108 return SOFTBUS_INVALID_PARAM;
109 }
110 if ((info->medium < AUTO) || (info->medium > COAP)) {
111 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "medium is invalid");
112 return SOFTBUS_INVALID_PARAM;
113 }
114 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
115 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "freq is invalid");
116 return SOFTBUS_INVALID_PARAM;
117 }
118 if (info->capability == NULL) {
119 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "capability is invalid");
120 return SOFTBUS_INVALID_PARAM;
121 }
122 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
123 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data is invalid");
124 return SOFTBUS_INVALID_PARAM;
125 }
126 if (info->dataLen == 0) {
127 return SOFTBUS_OK;
128 }
129 if ((info->capabilityData != NULL) &&
130 ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
131 (strnlen((char *)(info->capabilityData), MAX_CAPABILITYDATA_LEN) == MAX_CAPABILITYDATA_LEN))) {
132 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data exceeds the maximum length");
133 return SOFTBUS_INVALID_PARAM;
134 }
135 return SOFTBUS_OK;
136 }
137
GetAllNodeDeviceInfo(const char * pkgName,NodeBasicInfo ** info,int32_t * infoNum)138 int32_t GetAllNodeDeviceInfo(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
139 {
140 if (pkgName == NULL || info == NULL || infoNum == NULL) {
141 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: params are null");
142 return SOFTBUS_INVALID_PARAM;
143 }
144 int32_t ret = CommonInit(pkgName);
145 if (ret != SOFTBUS_OK) {
146 return ret;
147 }
148 return GetAllNodeDeviceInfoInner(pkgName, info, infoNum);
149 }
150
FreeNodeInfo(NodeBasicInfo * info)151 void FreeNodeInfo(NodeBasicInfo *info)
152 {
153 if (info == NULL) {
154 return;
155 }
156 SoftBusFree(info);
157 }
158
GetLocalNodeDeviceInfo(const char * pkgName,NodeBasicInfo * info)159 int32_t GetLocalNodeDeviceInfo(const char *pkgName, NodeBasicInfo *info)
160 {
161 if (pkgName == NULL || info == NULL) {
162 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: params are null");
163 return SOFTBUS_INVALID_PARAM;
164 }
165 int32_t ret = CommonInit(pkgName);
166 if (ret != SOFTBUS_OK) {
167 return ret;
168 }
169 return GetLocalNodeDeviceInfoInner(pkgName, info);
170 }
171
GetNodeKeyInfo(const char * pkgName,const char * networkId,NodeDeviceInfoKey key,uint8_t * info,int32_t infoLen)172 int32_t GetNodeKeyInfo(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
173 uint8_t *info, int32_t infoLen)
174 {
175 if (pkgName == NULL) {
176 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: pkgName is null");
177 return SOFTBUS_INVALID_PARAM;
178 }
179 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || info == NULL) {
180 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid params");
181 return SOFTBUS_INVALID_PARAM;
182 }
183 int32_t ret = CommonInit(pkgName);
184 if (ret != SOFTBUS_OK) {
185 return ret;
186 }
187 (void)memset_s(info, infoLen, 0, infoLen);
188 return GetNodeKeyInfoInner(pkgName, networkId, key, info, infoLen);
189 }
190
SetNodeDataChangeFlag(const char * pkgName,const char * networkId,uint16_t dataChangeFlag)191 int32_t SetNodeDataChangeFlag(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
192 {
193 if (pkgName == NULL) {
194 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: pkgName is null");
195 return SOFTBUS_INVALID_PARAM;
196 }
197 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN)) {
198 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid params");
199 return SOFTBUS_INVALID_PARAM;
200 }
201 int32_t ret = CommonInit(pkgName);
202 if (ret != SOFTBUS_OK) {
203 return ret;
204 }
205 return SetNodeDataChangeFlagInner(pkgName, networkId, dataChangeFlag);
206 }
207
JoinLNN(const char * pkgName,ConnectionAddr * target,OnJoinLNNResult cb)208 int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
209 {
210 if (pkgName == NULL || target == NULL || cb == NULL) {
211 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : params are NULL!");
212 return SOFTBUS_INVALID_PARAM;
213 }
214 int32_t ret = CommonInit(pkgName);
215 if (ret != SOFTBUS_OK) {
216 return ret;
217 }
218 return JoinLNNInner(pkgName, target, cb);
219 }
220
JoinMetaNode(const char * pkgName,ConnectionAddr * target,CustomData * customData,OnJoinMetaNodeResult cb)221 int32_t JoinMetaNode(const char *pkgName, ConnectionAddr *target, CustomData *customData, OnJoinMetaNodeResult cb)
222 {
223 if (pkgName == NULL || target == NULL || customData == NULL || cb == NULL) {
224 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : params are NULL!");
225 return SOFTBUS_INVALID_PARAM;
226 }
227 int32_t ret = CommonInit(pkgName);
228 if (ret != SOFTBUS_OK) {
229 return ret;
230 }
231 if (target->type == CONNECTION_ADDR_SESSION) {
232 ret = ClientGetChannelBySessionId(target->info.session.sessionId, &target->info.session.channelId,
233 &target->info.session.type, NULL);
234 if (ret != SOFTBUS_OK) {
235 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : get channel error!");
236 return ret;
237 }
238 }
239 return JoinMetaNodeInner(pkgName, target, customData, cb);
240 }
241
LeaveLNN(const char * pkgName,const char * networkId,OnLeaveLNNResult cb)242 int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
243 {
244 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || cb == NULL || !IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
245 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : networkId or cb is NULL!");
246 return SOFTBUS_INVALID_PARAM;
247 }
248 return LeaveLNNInner(pkgName, networkId, cb);
249 }
250
LeaveMetaNode(const char * pkgName,const char * networkId,OnLeaveMetaNodeResult cb)251 int32_t LeaveMetaNode(const char *pkgName, const char *networkId, OnLeaveMetaNodeResult cb)
252 {
253 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || cb == NULL || !IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
254 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : networkId or cb is NULL!");
255 return SOFTBUS_INVALID_PARAM;
256 }
257 return LeaveMetaNodeInner(pkgName, networkId, cb);
258 }
259
RegNodeDeviceStateCb(const char * pkgName,INodeStateCb * callback)260 int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback)
261 {
262 if (pkgName == NULL || IsValidNodeStateCb(callback) == false) {
263 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
264 return SOFTBUS_INVALID_PARAM;
265 }
266 int32_t ret = CommonInit(pkgName);
267 if (ret != SOFTBUS_OK) {
268 return ret;
269 }
270 return RegNodeDeviceStateCbInner(pkgName, callback);
271 }
272
UnregNodeDeviceStateCb(INodeStateCb * callback)273 int32_t UnregNodeDeviceStateCb(INodeStateCb *callback)
274 {
275 if (callback == NULL) {
276 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para callback = null!");
277 return SOFTBUS_INVALID_PARAM;
278 }
279 return UnregNodeDeviceStateCbInner(callback);
280 }
281
StartTimeSync(const char * pkgName,const char * targetNetworkId,TimeSyncAccuracy accuracy,TimeSyncPeriod period,ITimeSyncCb * cb)282 int32_t StartTimeSync(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
283 TimeSyncPeriod period, ITimeSyncCb *cb)
284 {
285 if (pkgName == NULL || !IsValidString(targetNetworkId, NETWORK_ID_BUF_LEN) ||
286 cb == NULL || cb->onTimeSyncResult == NULL) {
287 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
288 return SOFTBUS_INVALID_PARAM;
289 }
290 int32_t ret = CommonInit(pkgName);
291 if (ret != SOFTBUS_OK) {
292 return ret;
293 }
294 return StartTimeSyncInner(pkgName, targetNetworkId, accuracy, period, cb);
295 }
296
StopTimeSync(const char * pkgName,const char * targetNetworkId)297 int32_t StopTimeSync(const char *pkgName, const char *targetNetworkId)
298 {
299 if (pkgName == NULL || !IsValidString(targetNetworkId, NETWORK_ID_BUF_LEN)) {
300 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
301 return SOFTBUS_INVALID_PARAM;
302 }
303 int32_t ret = CommonInit(pkgName);
304 if (ret != SOFTBUS_OK) {
305 return ret;
306 }
307 return StopTimeSyncInner(pkgName, targetNetworkId);
308 }
309
PublishLNN(const char * pkgName,const PublishInfo * info,const IPublishCb * cb)310 int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
311 {
312 if (pkgName == NULL || info == NULL || cb == NULL) {
313 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
314 return SOFTBUS_INVALID_PARAM;
315 }
316 int32_t ret = CommonInit(pkgName);
317 if (ret != SOFTBUS_OK) {
318 return ret;
319 }
320 if (PublishInfoCheck(info) != SOFTBUS_OK) {
321 return SOFTBUS_INVALID_PARAM;
322 }
323 return PublishLNNInner(pkgName, info, cb);
324 }
325
StopPublishLNN(const char * pkgName,int32_t publishId)326 int32_t StopPublishLNN(const char *pkgName, int32_t publishId)
327 {
328 if (pkgName == NULL) {
329 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
330 return SOFTBUS_INVALID_PARAM;
331 }
332 int32_t ret = CommonInit(pkgName);
333 if (ret != SOFTBUS_OK) {
334 return ret;
335 }
336 return StopPublishLNNInner(pkgName, publishId);
337 }
338
RefreshLNN(const char * pkgName,const SubscribeInfo * info,const IRefreshCallback * cb)339 int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
340 {
341 if (pkgName == NULL || info == NULL || cb == NULL) {
342 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
343 return SOFTBUS_INVALID_PARAM;
344 }
345 int32_t ret = CommonInit(pkgName);
346 if (ret != SOFTBUS_OK) {
347 return ret;
348 }
349 if (SubscribeInfoCheck(info) != SOFTBUS_OK) {
350 return SOFTBUS_INVALID_PARAM;
351 }
352 return RefreshLNNInner(pkgName, info, cb);
353 }
354
StopRefreshLNN(const char * pkgName,int32_t refreshId)355 int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId)
356 {
357 if (pkgName == NULL) {
358 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
359 return SOFTBUS_INVALID_PARAM;
360 }
361 int32_t ret = CommonInit(pkgName);
362 if (ret != SOFTBUS_OK) {
363 return ret;
364 }
365 return StopRefreshLNNInner(pkgName, refreshId);
366 }
367
ActiveMetaNode(const char * pkgName,const MetaNodeConfigInfo * info,char * metaNodeId)368 int32_t ActiveMetaNode(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
369 {
370 if (pkgName == NULL || info == NULL || metaNodeId == NULL) {
371 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid active meta node para");
372 return SOFTBUS_INVALID_PARAM;
373 }
374 int32_t ret = CommonInit(pkgName);
375 if (ret != SOFTBUS_OK) {
376 return ret;
377 }
378 return ActiveMetaNodeInner(pkgName, info, metaNodeId);
379 }
380
DeactiveMetaNode(const char * pkgName,const char * metaNodeId)381 int32_t DeactiveMetaNode(const char *pkgName, const char *metaNodeId)
382 {
383 if (pkgName == NULL || metaNodeId == NULL) {
384 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid deactive meta node para");
385 return SOFTBUS_INVALID_PARAM;
386 }
387 int32_t ret = CommonInit(pkgName);
388 if (ret != SOFTBUS_OK) {
389 return ret;
390 }
391 return DeactiveMetaNodeInner(pkgName, metaNodeId);
392 }
393
GetAllMetaNodeInfo(const char * pkgName,MetaNodeInfo * infos,int32_t * infoNum)394 int32_t GetAllMetaNodeInfo(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
395 {
396 if (pkgName == NULL || infos == NULL || infoNum == NULL || *infoNum > MAX_META_NODE_NUM) {
397 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid query meta node info para");
398 return SOFTBUS_INVALID_PARAM;
399 }
400 int32_t ret = CommonInit(pkgName);
401 if (ret != SOFTBUS_OK) {
402 return ret;
403 }
404 return GetAllMetaNodeInfoInner(pkgName, infos, infoNum);
405 }
406
ShiftLNNGear(const char * pkgName,const char * callerId,const char * targetNetworkId,const GearMode * mode)407 int32_t ShiftLNNGear(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
408 {
409 if (pkgName == NULL || callerId == NULL || mode == NULL) {
410 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid shift lnn gear para");
411 return SOFTBUS_INVALID_PARAM;
412 }
413 int32_t ret = CommonInit(pkgName);
414 if (ret != SOFTBUS_OK) {
415 return ret;
416 }
417 size_t len = strnlen(callerId, CALLER_ID_MAX_LEN);
418 if (len == 0 || len >= CALLER_ID_MAX_LEN) {
419 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid shift lnn gear callerId len:%d", len);
420 return SOFTBUS_INVALID_PARAM;
421 }
422 if (targetNetworkId != NULL &&
423 strnlen(targetNetworkId, NETWORK_ID_BUF_LEN) != NETWORK_ID_BUF_LEN - 1) {
424 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid shift lnn gear targetNetworkId");
425 return SOFTBUS_INVALID_PARAM;
426 }
427 return ShiftLNNGearInner(pkgName, callerId, targetNetworkId, mode);
428 }
429