1 /*
2 * Copyright (c) 2021-2024 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 "bus_center_server_stub.h"
17
18 #include <stdint.h>
19
20 #include "ipc_skeleton.h"
21 #include "lnn_bus_center_ipc.h"
22 #include "lnn_log.h"
23 #include "securec.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_bus_center.h"
26 #include "softbus_def.h"
27 #include "softbus_errcode.h"
28 #include "softbus_permission.h"
29
CheckPermission(const char * pkgName,int32_t uid)30 static int32_t CheckPermission(const char *pkgName, int32_t uid)
31 {
32 if (pkgName == NULL) {
33 LNN_LOGE(LNN_STATE, "pkgName is null");
34 return SOFTBUS_ERR;
35 }
36 if (!CheckBusCenterPermission(uid, pkgName)) {
37 LNN_LOGE(LNN_STATE, "no permission");
38 return SOFTBUS_PERMISSION_DENIED;
39 }
40 return SOFTBUS_OK;
41 }
42
ServerJoinLNN(IpcIo * req,IpcIo * reply)43 int32_t ServerJoinLNN(IpcIo *req, IpcIo *reply)
44 {
45 LNN_LOGD(LNN_STATE, "ipc server pop");
46 if (req == NULL || reply == NULL) {
47 LNN_LOGE(LNN_STATE, "invalid param");
48 return SOFTBUS_INVALID_PARAM;
49 }
50 size_t len;
51 const char *pkgName = (const char *)ReadString(req, &len);
52 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
53 LNN_LOGE(LNN_STATE, "read pkgName failed");
54 return SOFTBUS_INVALID_PARAM;
55 }
56 uint32_t addrTypeLen;
57 ReadUint32(req, &addrTypeLen);
58 if (addrTypeLen != sizeof(ConnectionAddr)) {
59 LNN_LOGE(LNN_STATE, "read addrTypeLen=%{public}d failed", addrTypeLen);
60 return SOFTBUS_ERR;
61 }
62 void *addr = (void *)ReadBuffer(req, addrTypeLen);
63 if (addr == NULL) {
64 LNN_LOGE(LNN_STATE, "read addr is null");
65 return SOFTBUS_IPC_ERR;
66 }
67 int32_t callingUid = GetCallingUid();
68 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
69 LNN_LOGE(LNN_STATE, "no permission");
70 return SOFTBUS_PERMISSION_DENIED;
71 }
72 int32_t ret = LnnIpcServerJoin(pkgName, 0, addr, addrTypeLen);
73 if (ret != SOFTBUS_OK) {
74 LNN_LOGE(LNN_STATE, "LnnIpcServerJoin failed");
75 return SOFTBUS_ERR;
76 }
77 return SOFTBUS_OK;
78 }
79
ServerJoinMetaNode(IpcIo * req,IpcIo * reply)80 int32_t ServerJoinMetaNode(IpcIo *req, IpcIo *reply)
81 {
82 (void)req;
83 (void)reply;
84 return SOFTBUS_OK;
85 }
86
ServerLeaveLNN(IpcIo * req,IpcIo * reply)87 int32_t ServerLeaveLNN(IpcIo *req, IpcIo *reply)
88 {
89 LNN_LOGI(LNN_STATE, "ipc server pop");
90 size_t len;
91 const char *pkgName = (const char *)ReadString(req, &len);
92 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
93 LNN_LOGE(LNN_STATE, "read pkgName failed");
94 return SOFTBUS_INVALID_PARAM;
95 }
96 const char *networkId = (const char *)ReadString(req, &len);
97 if (networkId == NULL || len >= NETWORK_ID_BUF_LEN) {
98 LNN_LOGE(LNN_STATE, "read networkId failed");
99 return SOFTBUS_ERR;
100 }
101 int32_t callingUid = GetCallingUid();
102 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
103 LNN_LOGE(LNN_STATE, "no permission");
104 return SOFTBUS_PERMISSION_DENIED;
105 }
106 int32_t ret = LnnIpcServerLeave(pkgName, 0, networkId);
107 if (ret != SOFTBUS_OK) {
108 LNN_LOGE(LNN_STATE, "LnnIpcServerLeave failed");
109 return SOFTBUS_ERR;
110 }
111 return SOFTBUS_OK;
112 }
113
ServerLeaveMetaNode(IpcIo * req,IpcIo * reply)114 int32_t ServerLeaveMetaNode(IpcIo *req, IpcIo *reply)
115 {
116 (void)req;
117 (void)reply;
118 return SOFTBUS_OK;
119 }
120
ServerGetAllOnlineNodeInfo(IpcIo * req,IpcIo * reply)121 int32_t ServerGetAllOnlineNodeInfo(IpcIo *req, IpcIo *reply)
122 {
123 LNN_LOGI(LNN_STATE, "ipc server pop");
124 void *nodeInfo = NULL;
125 int32_t infoNum = 0;
126 size_t len;
127 const char *pkgName = (const char *)ReadString(req, &len);
128 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
129 LNN_LOGE(LNN_STATE, "read pkgName failed");
130 return SOFTBUS_INVALID_PARAM;
131 }
132 uint32_t infoTypeLen;
133 ReadUint32(req, &infoTypeLen);
134 int32_t callingUid = GetCallingUid();
135 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
136 LNN_LOGE(LNN_STATE, "no permission");
137 WriteInt32(reply, SOFTBUS_PERMISSION_DENIED);
138 return SOFTBUS_PERMISSION_DENIED;
139 }
140 int32_t ret = LnnIpcGetAllOnlineNodeInfo(pkgName, &nodeInfo, infoTypeLen, &infoNum);
141 if (ret != SOFTBUS_OK) {
142 LNN_LOGE(LNN_STATE, "get info failed");
143 WriteInt32(reply, SOFTBUS_ERR);
144 return SOFTBUS_ERR;
145 }
146 if (infoNum < 0 || (infoNum > 0 && nodeInfo == NULL)) {
147 LNN_LOGE(LNN_STATE, "node info is invalid");
148 if (!(WriteInt32(reply, SOFTBUS_ERR))) {
149 LNN_LOGE(LNN_STATE, "write reply failed!");
150 SoftBusFree(nodeInfo);
151 return SOFTBUS_ERR;
152 }
153 }
154 if (!(WriteInt32(reply, infoNum))) {
155 LNN_LOGE(LNN_STATE, "write infoNum failed!");
156 SoftBusFree(nodeInfo);
157 return SOFTBUS_ERR;
158 }
159 if (infoNum > 0) {
160 WriteUint32(reply, infoTypeLen * infoNum);
161 WriteBuffer(reply, nodeInfo, infoTypeLen * infoNum);
162 SoftBusFree(nodeInfo);
163 }
164 return SOFTBUS_OK;
165 }
166
ServerGetLocalDeviceInfo(IpcIo * req,IpcIo * reply)167 int32_t ServerGetLocalDeviceInfo(IpcIo *req, IpcIo *reply)
168 {
169 LNN_LOGD(LNN_STATE, "ipc server pop");
170 void *nodeInfo = NULL;
171 size_t len;
172 const char *pkgName = (const char *)ReadString(req, &len);
173 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
174 LNN_LOGE(LNN_STATE, "read pkgName failed");
175 return SOFTBUS_INVALID_PARAM;
176 }
177 int32_t callingUid = GetCallingUid();
178 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
179 LNN_LOGE(LNN_STATE, "no permission");
180 return SOFTBUS_PERMISSION_DENIED;
181 }
182 uint32_t infoTypeLen;
183 ReadUint32(req, &infoTypeLen);
184 if (infoTypeLen != sizeof(NodeBasicInfo)) {
185 LNN_LOGE(LNN_STATE, "read infoTypeLen failed, infoTypeLen=%{public}u", infoTypeLen);
186 return SOFTBUS_INVALID_PARAM;
187 }
188 nodeInfo = SoftBusCalloc(infoTypeLen);
189 if (nodeInfo == NULL) {
190 LNN_LOGE(LNN_STATE, "malloc info type length failed");
191 return SOFTBUS_MEM_ERR;
192 }
193 int32_t ret = LnnIpcGetLocalDeviceInfo(pkgName, nodeInfo, infoTypeLen);
194 if (ret != SOFTBUS_OK) {
195 LNN_LOGE(LNN_STATE, "get local info failed");
196 SoftBusFree(nodeInfo);
197 return SOFTBUS_ERR;
198 }
199 if (!(WriteUint32(reply, infoTypeLen))) {
200 LNN_LOGE(LNN_STATE, "write reply failed!");
201 SoftBusFree(nodeInfo);
202 return SOFTBUS_ERR;
203 }
204 WriteBuffer(reply, nodeInfo, infoTypeLen);
205 SoftBusFree(nodeInfo);
206 return SOFTBUS_OK;
207 }
208
ServerRecoverGetNodeKeyInfo(void * buf,IpcIo * reply,int32_t infoLen)209 static int32_t ServerRecoverGetNodeKeyInfo(void *buf, IpcIo *reply, int32_t infoLen)
210 {
211 if (!(WriteInt32(reply, infoLen))) {
212 LNN_LOGE(LNN_STATE, "write reply failed!");
213 return SOFTBUS_ERR;
214 }
215 WriteBuffer(reply, buf, infoLen);
216 return SOFTBUS_OK;
217 }
218
ServerGetNodeKeyInfo(IpcIo * req,IpcIo * reply)219 int32_t ServerGetNodeKeyInfo(IpcIo *req, IpcIo *reply)
220 {
221 LNN_LOGD(LNN_STATE, "ipc server pop");
222 size_t length;
223 const char *pkgName = (const char *)ReadString(req, &length);
224 if (pkgName == NULL || length >= PKG_NAME_SIZE_MAX) {
225 LNN_LOGE(LNN_STATE, "read pkgName failed");
226 return SOFTBUS_INVALID_PARAM;
227 }
228 int32_t callingUid = GetCallingUid();
229 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
230 LNN_LOGE(LNN_STATE, "no permission");
231 return SOFTBUS_PERMISSION_DENIED;
232 }
233 const char *networkId = (const char *)ReadString(req, &length);
234 if (networkId == NULL || length >= NETWORK_ID_BUF_LEN) {
235 LNN_LOGE(LNN_STATE, "read networkId failed");
236 return SOFTBUS_ERR;
237 }
238 int32_t key;
239 ReadInt32(req, &key);
240 int32_t infoLen = LnnIpcGetNodeKeyInfoLen(key);
241 if (infoLen == SOFTBUS_ERR) {
242 LNN_LOGE(LNN_STATE, "get infoLen failed");
243 return SOFTBUS_ERR;
244 }
245 uint32_t len;
246 ReadUint32(req, &len);
247 if (len < (uint32_t)infoLen) {
248 LNN_LOGE(LNN_STATE, "read len is invalid param, len=%{public}u, infoLen=%{public}d", len,
249 infoLen);
250 return SOFTBUS_ERR;
251 }
252 void *buf = SoftBusCalloc(infoLen);
253 if (buf == NULL) {
254 LNN_LOGE(LNN_STATE, "malloc buffer failed");
255 return SOFTBUS_MEM_ERR;
256 }
257 int32_t ret = LnnIpcGetNodeKeyInfo(pkgName, networkId, key, (unsigned char *)buf, infoLen);
258 if (ret != SOFTBUS_OK) {
259 LNN_LOGE(LNN_STATE, "get local info failed");
260 SoftBusFree(buf);
261 return SOFTBUS_ERR;
262 }
263 ret = ServerRecoverGetNodeKeyInfo(buf, reply, infoLen);
264 SoftBusFree(buf);
265 return ret;
266 }
267
ServerSetNodeDataChangeFlag(IpcIo * req,IpcIo * reply)268 int32_t ServerSetNodeDataChangeFlag(IpcIo *req, IpcIo *reply)
269 {
270 LNN_LOGD(LNN_STATE, "ipc server pop");
271 size_t length;
272 const char *pkgName = (const char *)ReadString(req, &length);
273 if (pkgName == NULL || length >= PKG_NAME_SIZE_MAX) {
274 LNN_LOGE(LNN_STATE, "read pkgName failed");
275 return SOFTBUS_INVALID_PARAM;
276 }
277 const char *networkId = (const char *)ReadString(req, &length);
278 if (networkId == NULL || length >= NETWORK_ID_BUF_LEN) {
279 LNN_LOGE(LNN_STATE, "read networkId failed");
280 return SOFTBUS_ERR;
281 }
282 int16_t dataChangeFlag;
283 ReadInt16(req, &dataChangeFlag);
284 int32_t callingUid = GetCallingUid();
285 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
286 LNN_LOGE(LNN_STATE, "no permission");
287 return SOFTBUS_PERMISSION_DENIED;
288 }
289 int32_t ret = LnnIpcSetNodeDataChangeFlag(pkgName, networkId, dataChangeFlag);
290 if (ret != SOFTBUS_OK) {
291 LNN_LOGE(LNN_STATE, "get local info failed");
292 return SOFTBUS_ERR;
293 }
294 return SOFTBUS_OK;
295 }
296
ServerRegDataLevelChangeCb(IpcIo * req,IpcIo * reply)297 int32_t ServerRegDataLevelChangeCb(IpcIo *req, IpcIo *reply)
298 {
299 (void)req;
300 (void)reply;
301 return SOFTBUS_FUNC_NOT_SUPPORT;
302 }
303
ServerUnregDataLevelChangeCb(IpcIo * req,IpcIo * reply)304 int32_t ServerUnregDataLevelChangeCb(IpcIo *req, IpcIo *reply)
305 {
306 (void)req;
307 (void)reply;
308 return SOFTBUS_FUNC_NOT_SUPPORT;
309 }
310
ServerSetDataLevel(IpcIo * req,IpcIo * reply)311 int32_t ServerSetDataLevel(IpcIo *req, IpcIo *reply)
312 {
313 (void)req;
314 (void)reply;
315 return SOFTBUS_FUNC_NOT_SUPPORT;
316 }
317
ServerStartTimeSync(IpcIo * req,IpcIo * reply)318 int32_t ServerStartTimeSync(IpcIo *req, IpcIo *reply)
319 {
320 LNN_LOGD(LNN_STATE, "ipc server pop");
321 size_t length;
322 const char *pkgName = (const char *)ReadString(req, &length);
323 if (pkgName == NULL || length >= PKG_NAME_SIZE_MAX) {
324 LNN_LOGE(LNN_STATE, "read pkgName failed");
325 return SOFTBUS_INVALID_PARAM;
326 }
327 const char *targetNetworkId = (const char *)ReadString(req, &length);
328 if (targetNetworkId == NULL || length >= NETWORK_ID_BUF_LEN) {
329 LNN_LOGE(LNN_STATE, "read targetNetworkId failed");
330 return SOFTBUS_ERR;
331 }
332 int32_t accuracy;
333 int32_t period;
334 ReadInt32(req, &accuracy);
335 ReadInt32(req, &period);
336 int32_t callingUid = GetCallingUid();
337 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
338 LNN_LOGE(LNN_STATE, "no permission");
339 return SOFTBUS_PERMISSION_DENIED;
340 }
341 int32_t ret = LnnIpcStartTimeSync(pkgName, 0, targetNetworkId, accuracy, period);
342 if (ret != SOFTBUS_OK) {
343 LNN_LOGE(LNN_STATE, "start time sync failed");
344 return SOFTBUS_ERR;
345 }
346 return SOFTBUS_OK;
347 }
348
ServerStopTimeSync(IpcIo * req,IpcIo * reply)349 int32_t ServerStopTimeSync(IpcIo *req, IpcIo *reply)
350 {
351 LNN_LOGI(LNN_STATE, "ipc server pop");
352 size_t length;
353 const char *pkgName = (const char *)ReadString(req, &length);
354 if (pkgName == NULL || length >= PKG_NAME_SIZE_MAX) {
355 LNN_LOGE(LNN_STATE, "read pkgName failed");
356 return SOFTBUS_INVALID_PARAM;
357 }
358 const char *targetNetworkId = (const char *)ReadString(req, &length);
359 if (targetNetworkId == NULL || length >= NETWORK_ID_BUF_LEN) {
360 LNN_LOGE(LNN_STATE, "read targetNetworkId failed");
361 return SOFTBUS_ERR;
362 }
363 int32_t callingUid = GetCallingUid();
364 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
365 LNN_LOGE(LNN_STATE, "no permission");
366 return SOFTBUS_PERMISSION_DENIED;
367 }
368 int32_t ret = LnnIpcStopTimeSync(pkgName, targetNetworkId, 0);
369 if (ret != SOFTBUS_OK) {
370 LNN_LOGE(LNN_STATE, "start time sync failed");
371 return SOFTBUS_ERR;
372 }
373 return SOFTBUS_OK;
374 }
375
ServerRecoverPublishLNN(const char * pkgName,PublishInfo * info,IpcIo * reply)376 static int32_t ServerRecoverPublishLNN(const char *pkgName, PublishInfo* info, IpcIo *reply)
377 {
378 int32_t ret = LnnIpcPublishLNN(pkgName, info);
379 WriteInt32(reply, ret);
380 if (ret != SOFTBUS_OK) {
381 LNN_LOGE(LNN_STATE, "LnnIpcPublishLNN failed");
382 return SOFTBUS_ERR;
383 }
384 return SOFTBUS_OK;
385 }
386
ServerPublishLNN(IpcIo * req,IpcIo * reply)387 int32_t ServerPublishLNN(IpcIo *req, IpcIo *reply)
388 {
389 LNN_LOGD(LNN_STATE, "ipc server pop");
390 if (req == NULL || reply == NULL) {
391 LNN_LOGE(LNN_STATE, "invalid param.");
392 return SOFTBUS_INVALID_PARAM;
393 }
394 size_t len;
395 const char *pkgName = (const char *)ReadString(req, &len);
396 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
397 LNN_LOGE(LNN_STATE, "read pkgName failed");
398 return SOFTBUS_INVALID_PARAM;
399 }
400 int32_t callingUid = GetCallingUid();
401 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
402 LNN_LOGE(LNN_STATE, "no permission");
403 return SOFTBUS_PERMISSION_DENIED;
404 }
405 PublishInfo info;
406 (void)memset_s(&info, sizeof(PublishInfo), 0, sizeof(PublishInfo));
407 ReadInt32(req, &info.publishId);
408 int32_t mode, medium, freq;
409 ReadInt32(req, &mode);
410 ReadInt32(req, &medium);
411 ReadInt32(req, &freq);
412 info.mode = (DiscoverMode)mode;
413 info.medium = (ExchangeMedium)medium;
414 info.freq = (ExchangeFreq)freq;
415 info.capability = (const char *)ReadString(req, &len);
416 if (info.capability == NULL) {
417 LNN_LOGE(LNN_STATE, "read capability is null");
418 return SOFTBUS_IPC_ERR;
419 }
420 ReadUint32(req, &info.dataLen);
421 if (info.dataLen > 0 && info.dataLen < MAX_CAPABILITYDATA_LEN) {
422 info.capabilityData = (unsigned char *)ReadString(req, &len);
423 if (info.capabilityData == NULL) {
424 LNN_LOGE(LNN_STATE, "read capabilityData is null");
425 return SOFTBUS_IPC_ERR;
426 }
427 } else {
428 info.capabilityData = NULL;
429 info.dataLen = 0;
430 }
431 ReadBool(req, &info.ranging);
432 return ServerRecoverPublishLNN(pkgName, &info, reply);
433 }
434
ServerStopPublishLNN(IpcIo * req,IpcIo * reply)435 int32_t ServerStopPublishLNN(IpcIo *req, IpcIo *reply)
436 {
437 LNN_LOGD(LNN_STATE, "ipc server pop");
438 if (req == NULL || reply == NULL) {
439 LNN_LOGE(LNN_STATE, "invalid param.");
440 return SOFTBUS_INVALID_PARAM;
441 }
442 size_t len;
443 const char *pkgName = (const char *)ReadString(req, &len);
444 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
445 LNN_LOGE(LNN_STATE, "read pkgName failed");
446 return SOFTBUS_INVALID_PARAM;
447 }
448 int32_t publishId;
449 ReadInt32(req, &publishId);
450 int32_t callingUid = GetCallingUid();
451 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
452 LNN_LOGE(LNN_STATE, "no permission");
453 return SOFTBUS_PERMISSION_DENIED;
454 }
455 int32_t ret = LnnIpcStopPublishLNN(pkgName, publishId);
456 if (ret != SOFTBUS_OK) {
457 LNN_LOGE(LNN_STATE, "LnnIpcStopPublishLNN failed");
458 return SOFTBUS_ERR;
459 }
460 return SOFTBUS_OK;
461 }
462
ServerRefreshLNN(IpcIo * req,IpcIo * reply)463 int32_t ServerRefreshLNN(IpcIo *req, IpcIo *reply)
464 {
465 LNN_LOGD(LNN_STATE, "ipc server pop");
466 LNN_CHECK_AND_RETURN_RET_LOGE((req != NULL && reply != NULL), SOFTBUS_INVALID_PARAM, LNN_STATE, "invalid param");
467
468 size_t len;
469 const char *pkgName = (const char *)ReadString(req, &len);
470 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
471 LNN_LOGE(LNN_STATE, "read pkgName failed");
472 return SOFTBUS_INVALID_PARAM;
473 }
474 int32_t callingUid = GetCallingUid();
475 LNN_CHECK_AND_RETURN_RET_LOGE((
476 CheckPermission(pkgName, callingUid) == SOFTBUS_OK), SOFTBUS_PERMISSION_DENIED, LNN_STATE, "no permission");
477
478 SubscribeInfo info;
479 int32_t mode;
480 int32_t medium;
481 int32_t freq;
482 (void)memset_s(&info, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
483 LNN_CHECK_AND_RETURN_RET_LOGE(
484 ReadInt32(req, &info.subscribeId), SOFTBUS_IPC_ERR, LNN_STATE, "read subscribeId failed");
485 LNN_CHECK_AND_RETURN_RET_LOGE(ReadInt32(req, &mode), SOFTBUS_IPC_ERR, LNN_STATE, "read mode failed");
486 LNN_CHECK_AND_RETURN_RET_LOGE(ReadInt32(req, &medium), SOFTBUS_IPC_ERR, LNN_STATE, "read medium failed");
487 LNN_CHECK_AND_RETURN_RET_LOGE(ReadInt32(req, &freq), SOFTBUS_IPC_ERR, LNN_STATE, "read freq failed");
488 info.mode = (DiscoverMode)mode;
489 info.medium = (ExchangeMedium)medium;
490 info.freq = (ExchangeFreq)freq;
491 LNN_CHECK_AND_RETURN_RET_LOGE(
492 ReadBool(req, &info.isSameAccount), SOFTBUS_IPC_ERR, LNN_STATE, "read isSameAccount failed");
493 LNN_CHECK_AND_RETURN_RET_LOGE(
494 ReadBool(req, &info.isWakeRemote), SOFTBUS_IPC_ERR, LNN_STATE, "read isWakeRemote failed");
495 info.capability = (const char *)ReadString(req, &len);
496 LNN_CHECK_AND_RETURN_RET_LOGE((info.capability != NULL), SOFTBUS_IPC_ERR, LNN_STATE, "read capability failed");
497 LNN_CHECK_AND_RETURN_RET_LOGE(
498 ReadUint32(req, &info.dataLen), SOFTBUS_IPC_ERR, LNN_STATE, "read dataLen failed");
499 if (info.dataLen > 0 && info.dataLen < MAX_CAPABILITYDATA_LEN) {
500 info.capabilityData = (unsigned char *)ReadString(req, &len);
501 LNN_CHECK_AND_RETURN_RET_LOGE(
502 (info.capabilityData != NULL), SOFTBUS_IPC_ERR, LNN_STATE, "read capabilityData failed");
503 } else {
504 info.capabilityData = NULL;
505 info.dataLen = 0;
506 }
507 int32_t ret = LnnIpcRefreshLNN(pkgName, 0, &info);
508 LNN_CHECK_AND_RETURN_RET_LOGE(WriteInt32(reply, ret), ret, LNN_STATE, "write reply failed");
509 if (ret != SOFTBUS_OK) {
510 LNN_LOGE(LNN_STATE, "refresh LNN failed, ret = %{public}d", ret);
511 }
512 return ret;
513 }
514
ServerStopRefreshLNN(IpcIo * req,IpcIo * reply)515 int32_t ServerStopRefreshLNN(IpcIo *req, IpcIo *reply)
516 {
517 LNN_LOGD(LNN_STATE, "ipc server pop");
518 if (req == NULL || reply == NULL) {
519 LNN_LOGE(LNN_STATE, "invalid param");
520 return SOFTBUS_INVALID_PARAM;
521 }
522 size_t len;
523 const char *pkgName = (const char *)ReadString(req, &len);
524 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
525 LNN_LOGE(LNN_STATE, "read pkgName failed");
526 return SOFTBUS_INVALID_PARAM;
527 }
528 int32_t refreshId;
529 ReadInt32(req, &refreshId);
530 int32_t callingUid = GetCallingUid();
531 if (CheckPermission(pkgName, callingUid) != SOFTBUS_OK) {
532 LNN_LOGE(LNN_STATE, "no permission");
533 return SOFTBUS_PERMISSION_DENIED;
534 }
535 int32_t ret = LnnIpcStopRefreshLNN(pkgName, 0, refreshId);
536 if (ret != SOFTBUS_OK) {
537 LNN_LOGE(LNN_STATE, "LnnIpcStopRefreshLNN failed");
538 return SOFTBUS_ERR;
539 }
540 return SOFTBUS_OK;
541 }
542
ServerActiveMetaNode(IpcIo * req,IpcIo * reply)543 int32_t ServerActiveMetaNode(IpcIo *req, IpcIo *reply)
544 {
545 uint32_t size;
546 const char *pkgName = (const char *)ReadString(req, &size);
547 if (pkgName == NULL || size >= PKG_NAME_SIZE_MAX) {
548 LNN_LOGE(LNN_STATE, "read pkgName failed");
549 return SOFTBUS_INVALID_PARAM;
550 }
551 MetaNodeConfigInfo *info = (MetaNodeConfigInfo *)ReadRawData(req, sizeof(MetaNodeConfigInfo));
552 if (info == NULL) {
553 LNN_LOGE(LNN_STATE, "read meta node config info failed");
554 WriteInt32(reply, SOFTBUS_INVALID_PARAM);
555 return SOFTBUS_ERR;
556 }
557 int32_t ret = CheckPermission(pkgName, GetCallingUid());
558 if (ret != SOFTBUS_OK) {
559 WriteInt32(reply, ret);
560 return SOFTBUS_ERR;
561 }
562 char metaNodeId[NETWORK_ID_BUF_LEN] = {0};
563 ret = LnnIpcActiveMetaNode(info, metaNodeId);
564 if (ret != SOFTBUS_OK) {
565 LNN_LOGE(LNN_STATE, "LnnIpcActiveMetaNode failed");
566 WriteInt32(reply, ret);
567 return SOFTBUS_ERR;
568 }
569 if (!(WriteInt32(reply, SOFTBUS_OK))) {
570 LNN_LOGE(LNN_STATE, "write SOFTBUS_OK to reply failed!");
571 return SOFTBUS_ERR;
572 }
573 if (!(WriteString(reply, metaNodeId))) {
574 LNN_LOGE(LNN_STATE, "write metaNodeId to reply failed!");
575 return SOFTBUS_ERR;
576 }
577 return SOFTBUS_OK;
578 }
579
ServerDeactiveMetaNode(IpcIo * req,IpcIo * reply)580 int32_t ServerDeactiveMetaNode(IpcIo *req, IpcIo *reply)
581 {
582 uint32_t size;
583 const char *pkgName = (const char *)ReadString(req, &size);
584 if (pkgName == NULL || size >= PKG_NAME_SIZE_MAX) {
585 LNN_LOGE(LNN_STATE, "read pkgName failed");
586 return SOFTBUS_INVALID_PARAM;
587 }
588 const char *metaNodeId = (const char *)ReadString(req, &size);
589 if (metaNodeId == NULL || size != (NETWORK_ID_BUF_LEN - 1)) {
590 LNN_LOGE(LNN_STATE, "read meta node id failed, size=%{public}d", size);
591 WriteInt32(reply, SOFTBUS_INVALID_PARAM);
592 return SOFTBUS_ERR;
593 }
594 int32_t ret = CheckPermission(pkgName, GetCallingUid());
595 if (ret != SOFTBUS_OK) {
596 WriteInt32(reply, ret);
597 return SOFTBUS_ERR;
598 }
599 ret = LnnIpcDeactiveMetaNode(metaNodeId);
600 if (ret != SOFTBUS_OK) {
601 LNN_LOGE(LNN_STATE, "LnnIpcDeactiveMetaNode failed");
602 WriteInt32(reply, ret);
603 return SOFTBUS_ERR;
604 }
605 WriteInt32(reply, SOFTBUS_OK);
606 return SOFTBUS_OK;
607 }
608
ServerGetAllMetaNodeInfo(IpcIo * req,IpcIo * reply)609 int32_t ServerGetAllMetaNodeInfo(IpcIo *req, IpcIo *reply)
610 {
611 uint32_t size;
612 const char *pkgName = (const char *)ReadString(req, &size);
613 if (pkgName == NULL || size >= PKG_NAME_SIZE_MAX) {
614 LNN_LOGE(LNN_STATE, "read pkgName failed");
615 return SOFTBUS_INVALID_PARAM;
616 }
617 int32_t infoNum;
618 if (!(ReadInt32(req, &infoNum))) {
619 LNN_LOGE(LNN_STATE, "read infoNum failed!");
620 return SOFTBUS_INVALID_PARAM;
621 }
622 if ((uint32_t)infoNum > MAX_META_NODE_NUM) {
623 LNN_LOGE(LNN_STATE, "inivalid param, infoNum=%{public}d, maxNum=%{public}d", infoNum, MAX_META_NODE_NUM);
624 return SOFTBUS_ERR;
625 }
626 MetaNodeInfo infos[MAX_META_NODE_NUM];
627 int32_t ret = CheckPermission(pkgName, GetCallingUid());
628 if (ret != SOFTBUS_OK) {
629 WriteInt32(reply, ret);
630 return SOFTBUS_ERR;
631 }
632 ret = LnnIpcGetAllMetaNodeInfo(infos, &infoNum);
633 if (ret != SOFTBUS_OK) {
634 LNN_LOGE(LNN_STATE, "LnnIpcGetAllMetaNodeInfo failed");
635 WriteInt32(reply, ret);
636 return SOFTBUS_ERR;
637 }
638 if (!(WriteInt32(reply, SOFTBUS_OK))) {
639 LNN_LOGE(LNN_STATE, "write SOFTBUS_OK to reply failed!");
640 return SOFTBUS_ERR;
641 }
642 if (!(WriteInt32(reply, infoNum))) {
643 LNN_LOGE(LNN_STATE, "write infoNum to reply failed!");
644 return SOFTBUS_ERR;
645 }
646 if (infoNum > 0) {
647 WriteUint32(reply, infoNum * sizeof(MetaNodeInfo));
648 WriteBuffer(reply, infos, infoNum * sizeof(MetaNodeInfo));
649 }
650 return SOFTBUS_OK;
651 }
652
ServerShiftLnnGear(IpcIo * req,IpcIo * reply)653 int32_t ServerShiftLnnGear(IpcIo *req, IpcIo *reply)
654 {
655 size_t len;
656 bool targetNetworkIdIsNULL = false;
657 const char *targetNetworkId = NULL;
658
659 const char *pkgName = (const char *)ReadString(req, &len);
660 if (pkgName == NULL || len >= PKG_NAME_SIZE_MAX) {
661 LNN_LOGE(LNN_STATE, "read pkgName failed");
662 goto ERR_RETURN;
663 }
664 const char *callerId = (const char *)ReadString(req, &len);
665 if (callerId == NULL || len == 0 || len >= CALLER_ID_MAX_LEN) {
666 LNN_LOGE(LNN_STATE, "read callerId failed");
667 goto ERR_RETURN;
668 }
669 if (!ReadBool(req, &targetNetworkIdIsNULL)) {
670 LNN_LOGE(LNN_STATE, "read targetNetworkIdIsNULL failed");
671 goto ERR_RETURN;
672 }
673 if (!targetNetworkIdIsNULL) {
674 targetNetworkId = (const char *)ReadString(req, &len);
675 if (targetNetworkId == NULL || len != NETWORK_ID_BUF_LEN - 1) {
676 LNN_LOGE(LNN_STATE, "read targetNetworkId failed");
677 goto ERR_RETURN;
678 }
679 }
680 const GearMode *mode = (GearMode *)ReadRawData(req, sizeof(GearMode));
681 if (mode == NULL) {
682 LNN_LOGE(LNN_STATE, "read gear mode info failed");
683 goto ERR_RETURN;
684 }
685 int32_t ret = CheckPermission(pkgName, GetCallingUid());
686 if (ret != SOFTBUS_OK) {
687 WriteInt32(reply, ret);
688 return SOFTBUS_PERMISSION_DENIED;
689 }
690 ret = LnnIpcShiftLNNGear(pkgName, callerId, targetNetworkId, mode);
691 if (ret != SOFTBUS_OK) {
692 LNN_LOGE(LNN_STATE, "LnnIpcShiftLNNGear failed");
693 WriteInt32(reply, ret);
694 return SOFTBUS_ERR;
695 }
696 if (!(WriteInt32(reply, SOFTBUS_OK))) {
697 LNN_LOGE(LNN_STATE, "write reply failed!");
698 return SOFTBUS_ERR;
699 }
700 return SOFTBUS_OK;
701
702 ERR_RETURN:
703 WriteInt32(reply, SOFTBUS_INVALID_PARAM);
704 return SOFTBUS_ERR;
705 }
706