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 "disc_coap.h"
17
18 #include <stdio.h>
19 #include "disc_nstackx_adapter.h"
20 #include "softbus_adapter_mem.h"
21 #include "softbus_adapter_thread.h"
22 #include "softbus_errcode.h"
23 #include "softbus_log.h"
24 #include "softbus_utils.h"
25 #include "softbus_hidumper_disc.h"
26 #include "softbus_hisysevt_discreporter.h"
27
28 #define INT32_MAX_BIT_NUM 32
29 #define MAX_CAP_NUM (CAPABILITY_NUM * INT32_MAX_BIT_NUM)
30 #define MAX_SERVICE_DATA 64
31
32 #define COAP_PUBLISH_INFO "coapPublishInfo"
33 #define COAP_SUBSCRIBE_INFO "coapSubscribeInfo"
34
35 typedef struct {
36 uint32_t allCap[CAPABILITY_NUM];
37 int16_t capCount[MAX_CAP_NUM];
38 bool isUpdate;
39 bool isEmpty;
40 SoftBusMutex lock;
41 } DiscCoapInfo;
42
43 static DiscCoapInfo *g_publishMgr = NULL;
44 static DiscCoapInfo *g_subscribeMgr = NULL;
45 static int CoapPubInfoDump(int fd);
46 static int CoapSubInfoDump(int fd);
47
RegisterAllCapBitmap(uint32_t capBitmapNum,const uint32_t inCapBitmap[],DiscCoapInfo * info,uint32_t count)48 static int32_t RegisterAllCapBitmap(uint32_t capBitmapNum, const uint32_t inCapBitmap[], DiscCoapInfo *info,
49 uint32_t count)
50 {
51 if (info == NULL || capBitmapNum == 0 || capBitmapNum > CAPABILITY_NUM || count > MAX_CAP_NUM) {
52 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "%s:invalid param.", __func__);
53 return SOFTBUS_INVALID_PARAM;
54 }
55
56 info->isUpdate = false;
57 for (uint32_t i = 0; i < capBitmapNum; i++) {
58 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "register input bitmap = [%u].", inCapBitmap[i]);
59 for (uint32_t pos = 0; pos < count; pos++) {
60 if (((inCapBitmap[i] >> (pos % INT32_MAX_BIT_NUM)) & 0x1) == 0) {
61 continue;
62 }
63 if ((info->capCount)[pos] == 0) {
64 (info->allCap)[i] |= (0x1 << (pos % INT32_MAX_BIT_NUM));
65 info->isUpdate = true;
66 }
67 (info->capCount)[pos]++;
68 }
69 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "register all cap bitmap = [%u].", (info->allCap)[i]);
70 }
71 return SOFTBUS_OK;
72 }
73
UnregisterAllCapBitmap(uint32_t capBitmapNum,const uint32_t inCapBitmap[],DiscCoapInfo * info,uint32_t count)74 static int32_t UnregisterAllCapBitmap(uint32_t capBitmapNum, const uint32_t inCapBitmap[], DiscCoapInfo *info,
75 uint32_t count)
76 {
77 if (info == NULL || capBitmapNum == 0 || capBitmapNum > CAPABILITY_NUM || count > MAX_CAP_NUM) {
78 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "%s:invalid param.", __func__);
79 return SOFTBUS_INVALID_PARAM;
80 }
81
82 info->isEmpty = true;
83 info->isUpdate = false;
84 for (uint32_t i = 0; i < capBitmapNum; i++) {
85 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "unregister input bitmap = [%u].", inCapBitmap[i]);
86 for (uint32_t pos = 0; pos < count; pos++) {
87 if (((inCapBitmap[i] >> (pos % INT32_MAX_BIT_NUM)) & 0x1) == 0) {
88 continue;
89 }
90 (info->capCount)[pos]--;
91 if ((info->capCount)[pos] <= 0) {
92 (info->allCap)[i] &= (~(0x1 << (pos % INT32_MAX_BIT_NUM)));
93 (info->capCount)[pos] = 0;
94 info->isUpdate = true;
95 }
96 }
97 if ((info->allCap)[i] != 0) {
98 info->isEmpty = false;
99 }
100 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "register all cap bitmap = [%u].", (info->allCap)[i]);
101 }
102 return SOFTBUS_OK;
103 }
104
SetDiscCoapOption(DiscCoapOption * discCoapOption,DiscOption * option)105 static void SetDiscCoapOption(DiscCoapOption *discCoapOption, DiscOption *option)
106 {
107 if (option->isPublish) {
108 discCoapOption->mode = ACTIVE_PUBLISH;
109 discCoapOption->freq = option->option.publishOption.freq;
110 } else {
111 discCoapOption->mode = ACTIVE_DISCOVERY;
112 discCoapOption->freq = option->option.subscribeOption.freq;
113 }
114 }
115
CoapPublish(const PublishOption * option)116 static int32_t CoapPublish(const PublishOption *option)
117 {
118 if (option == NULL || g_publishMgr == NULL) {
119 return SOFTBUS_INVALID_PARAM;
120 }
121
122 if (option->ranging == true) {
123 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "coap publish not support ranging, is it misuse? just ignore");
124 }
125
126 if (SoftBusMutexLock(&(g_publishMgr->lock)) != 0) {
127 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
128 return SOFTBUS_LOCK_ERR;
129 }
130
131 if (RegisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_publishMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
132 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
133 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL);
134 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge publish capability failed.");
135 return SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL;
136 }
137
138 if (g_publishMgr->isUpdate) {
139 if (DiscCoapRegisterCapability(CAPABILITY_NUM, g_publishMgr->allCap) != SOFTBUS_OK) {
140 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
141 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register all capability to dfinder failed.");
142 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL);
143 return SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL;
144 }
145 }
146
147 if (DiscCoapRegisterServiceData(option->capabilityData, option->dataLen) != SOFTBUS_OK) {
148 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
149 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register service data to dfinder failed.");
150 return SOFTBUS_ERR;
151 }
152 DiscCoapOption discCoapOption;
153 DiscOption discOption = {
154 .isPublish = true,
155 .option.publishOption = *option,
156 };
157 SetDiscCoapOption(&discCoapOption, &discOption);
158 if (DiscCoapStartDiscovery(&discCoapOption) != SOFTBUS_OK) {
159 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
160 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "[signaling]:coap start publish failed, allCap:%d",
161 g_publishMgr->allCap[0]);
162 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL);
163 return SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL;
164 }
165
166 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
167 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap publish service, allCap:%d",
168 g_publishMgr->allCap[0]);
169 return SOFTBUS_OK;
170 }
171
CoapUnPublish(const PublishOption * option)172 static int32_t CoapUnPublish(const PublishOption *option)
173 {
174 if (option == NULL || g_publishMgr == NULL) {
175 return SOFTBUS_INVALID_PARAM;
176 }
177
178 if (SoftBusMutexLock(&(g_publishMgr->lock)) != 0) {
179 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
180 return SOFTBUS_LOCK_ERR;
181 }
182 if (UnregisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_publishMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
183 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
184 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "cancel a publish capability failed.");
185 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL);
186 return SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL;
187 }
188 if (g_publishMgr->isUpdate) {
189 if (DiscCoapRegisterCapability(CAPABILITY_NUM, g_publishMgr->allCap) != SOFTBUS_OK) {
190 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
191 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register all capability to dfinder failed.");
192 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL);
193 return SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL;
194 }
195 }
196 if (DiscCoapRegisterServiceData(option->capabilityData, option->dataLen) != SOFTBUS_OK) {
197 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
198 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register service data to dfinder failed.");
199 return SOFTBUS_ERR;
200 }
201 if (g_publishMgr->isEmpty) {
202 if (DiscCoapStopDiscovery() != SOFTBUS_OK) {
203 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
204 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "[signaling]:coap unpublish failed, allCap:%d",
205 g_publishMgr->allCap[0]);
206 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL);
207 return SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL;
208 }
209 }
210 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
211 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap unpublish service, allCap:%d",
212 g_publishMgr->allCap[0]);
213 return SOFTBUS_OK;
214 }
215
CoapStartScan(const PublishOption * option)216 static int32_t CoapStartScan(const PublishOption *option)
217 {
218 if (option == NULL || g_publishMgr == NULL) {
219 return SOFTBUS_INVALID_PARAM;
220 }
221
222 if (option->ranging == true) {
223 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "coap publish not support ranging, is it misuse? just ignore");
224 }
225
226 if (SoftBusMutexLock(&(g_publishMgr->lock)) != 0) {
227 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
228 return SOFTBUS_LOCK_ERR;
229 }
230
231 if (RegisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_publishMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
232 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
233 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge publish capability failed.");
234 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL);
235 return SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL;
236 }
237
238 if (g_publishMgr->isUpdate) {
239 if (DiscCoapRegisterCapability(CAPABILITY_NUM, g_publishMgr->allCap) != SOFTBUS_OK) {
240 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
241 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register all capability to dfinder failed.");
242 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL);
243 return SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL;
244 }
245 }
246
247 if (DiscCoapRegisterServiceData(option->capabilityData, option->dataLen) != SOFTBUS_OK) {
248 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
249 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register service data to dfinder failed.");
250 return SOFTBUS_ERR;
251 }
252 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
253 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap start passive publish, allCap:%d",
254 g_publishMgr->allCap[0]);
255 return SOFTBUS_OK;
256 }
257
CoapStopScan(const PublishOption * option)258 static int32_t CoapStopScan(const PublishOption *option)
259 {
260 if (option == NULL || g_publishMgr == NULL) {
261 return SOFTBUS_INVALID_PARAM;
262 }
263 if (SoftBusMutexLock(&(g_publishMgr->lock)) != 0) {
264 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
265 return SOFTBUS_LOCK_ERR;
266 }
267 if (UnregisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_publishMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
268 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
269 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge publish capability failed.");
270 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL);
271 return SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL;
272 }
273 if (g_publishMgr->isUpdate) {
274 if (DiscCoapRegisterCapability(CAPABILITY_NUM, g_publishMgr->allCap) != SOFTBUS_OK) {
275 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
276 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register all capability to dfinder failed.");
277 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL);
278 return SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL;
279 }
280 }
281 if (DiscCoapRegisterServiceData(option->capabilityData, option->dataLen) != SOFTBUS_OK) {
282 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
283 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register service data to dfinder failed.");
284 return SOFTBUS_ERR;
285 }
286 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
287 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap stop passive publish, allCap:%d",
288 g_publishMgr->allCap[0]);
289 return SOFTBUS_OK;
290 }
291
CoapSubscribe(const SubscribeOption * option)292 static int32_t CoapSubscribe(const SubscribeOption *option)
293 {
294 if (option == NULL || g_subscribeMgr == NULL) {
295 return SOFTBUS_INVALID_PARAM;
296 }
297
298 if (SoftBusMutexLock(&(g_subscribeMgr->lock)) != 0) {
299 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
300 return SOFTBUS_LOCK_ERR;
301 }
302 if (RegisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_subscribeMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
303 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
304 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge discovery capability failed.");
305 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL);
306 return SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL;
307 }
308 if (g_subscribeMgr->isUpdate) {
309 if (DiscCoapSetFilterCapability(CAPABILITY_NUM, g_subscribeMgr->allCap) != SOFTBUS_OK) {
310 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
311 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "set all filter capability to dfinder failed.");
312 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL);
313 return SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL;
314 }
315 }
316 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
317 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "coap start passive discovery.");
318 return SOFTBUS_OK;
319 }
320
CoapUnsubscribe(const SubscribeOption * option)321 static int32_t CoapUnsubscribe(const SubscribeOption *option)
322 {
323 if (option == NULL || g_subscribeMgr == NULL) {
324 return SOFTBUS_INVALID_PARAM;
325 }
326
327 if (SoftBusMutexLock(&(g_subscribeMgr->lock)) != 0) {
328 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
329 return SOFTBUS_LOCK_ERR;
330 }
331 if (UnregisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_subscribeMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
332 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
333 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge discovery capability failed.");
334 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL);
335 return SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL;
336 }
337 if (g_subscribeMgr->isUpdate) {
338 if (DiscCoapSetFilterCapability(CAPABILITY_NUM, g_subscribeMgr->allCap) != SOFTBUS_OK) {
339 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
340 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "set all filter capability to dfinder failed.");
341 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL);
342 return SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL;
343 }
344 }
345 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
346 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap stop passive discovery, allCap:%d",
347 g_subscribeMgr->allCap[0]);
348 return SOFTBUS_OK;
349 }
350
CoapStartAdvertise(const SubscribeOption * option)351 static int32_t CoapStartAdvertise(const SubscribeOption *option)
352 {
353 if (option == NULL || g_subscribeMgr == NULL) {
354 return SOFTBUS_INVALID_PARAM;
355 }
356
357 if (SoftBusMutexLock(&(g_subscribeMgr->lock)) != 0) {
358 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
359 return SOFTBUS_LOCK_ERR;
360 }
361 if (RegisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_subscribeMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
362 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
363 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "merge discovery capability failed.");
364 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL);
365 return SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL;
366 }
367 if (g_subscribeMgr->isUpdate) {
368 if (DiscCoapSetFilterCapability(CAPABILITY_NUM, g_subscribeMgr->allCap) != SOFTBUS_OK) {
369 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
370 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "set all filter capability to dfinder failed.");
371 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL);
372 return SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL;
373 }
374 }
375 if (DiscCoapStopDiscovery() != SOFTBUS_OK) {
376 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
377 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "[signaling]:coap stop discovery failed, allCap:%d",
378 g_subscribeMgr->allCap[0]);
379 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL);
380 return SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL;
381 }
382 DiscCoapOption discCoapOption;
383 DiscOption discOption = {
384 .isPublish = false,
385 .option.subscribeOption = *option,
386 };
387 SetDiscCoapOption(&discCoapOption, &discOption);
388 if (DiscCoapStartDiscovery(&discCoapOption) != SOFTBUS_OK) {
389 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
390 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "[signaling]:coap start advertise failed, allCap:%d",
391 g_subscribeMgr->allCap[0]);
392 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL);
393 return SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL;
394 }
395 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
396 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap start active discovery, allCap:%d",
397 g_subscribeMgr->allCap[0]);
398 return SOFTBUS_OK;
399 }
400
CoapStopAdvertise(const SubscribeOption * option)401 static int32_t CoapStopAdvertise(const SubscribeOption *option)
402 {
403 if (option == NULL || g_subscribeMgr == NULL) {
404 return SOFTBUS_INVALID_PARAM;
405 }
406
407 if (SoftBusMutexLock(&(g_subscribeMgr->lock)) != 0) {
408 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
409 return SOFTBUS_LOCK_ERR;
410 }
411 if (UnregisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_subscribeMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
412 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
413 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "cancel a discovery capability failed.");
414 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL);
415 return SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL;
416 }
417 if (g_subscribeMgr->isUpdate) {
418 if (DiscCoapSetFilterCapability(CAPABILITY_NUM, g_subscribeMgr->allCap) != SOFTBUS_OK) {
419 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
420 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "set all filter capability to dfinder failed.");
421 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL);
422 return SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL;
423 }
424 }
425 if (g_subscribeMgr->isEmpty) {
426 if (DiscCoapStopDiscovery() != SOFTBUS_OK) {
427 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
428 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "[signaling]:coap stop advertise failed, allCap:%d",
429 g_subscribeMgr->allCap[0]);
430 SoftbusRecordDiscFault(COAP, SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL);
431 return SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL;
432 }
433 }
434 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
435 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "[signaling]:coap stop active discovery, allCap:%d",
436 g_subscribeMgr->allCap[0]);
437 return SOFTBUS_OK;
438 }
439
CoapUpdateLocalIp(LinkStatus status)440 static void CoapUpdateLocalIp(LinkStatus status)
441 {
442 DiscCoapUpdateLocalIp(status);
443 }
444
CoapUpdateLocalDeviceInfo(InfoTypeChanged type)445 static void CoapUpdateLocalDeviceInfo(InfoTypeChanged type)
446 {
447 if (type == TYPE_LOCAL_DEVICE_NAME) {
448 DiscCoapUpdateDevName();
449 } else {
450 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_WARN, "the change type not support: %d", type);
451 }
452 }
453
454 static DiscoveryFuncInterface g_discCoapFuncInterface = {
455 .Publish = CoapPublish,
456 .StartScan = CoapStartScan,
457 .Unpublish = CoapUnPublish,
458 .StopScan = CoapStopScan,
459 .StartAdvertise = CoapStartAdvertise,
460 .Subscribe = CoapSubscribe,
461 .StopAdvertise = CoapStopAdvertise,
462 .Unsubscribe = CoapUnsubscribe,
463 .LinkStatusChanged = CoapUpdateLocalIp,
464 .UpdateLocalDeviceInfo = CoapUpdateLocalDeviceInfo
465 };
466
NewDiscCoapInfo(void)467 static DiscCoapInfo *NewDiscCoapInfo(void)
468 {
469 DiscCoapInfo *coapInfo = (DiscCoapInfo*)SoftBusCalloc(sizeof(DiscCoapInfo));
470 if (coapInfo == NULL) {
471 return NULL;
472 }
473 if (SoftBusMutexInit(&(coapInfo->lock), NULL) != 0) {
474 SoftBusFree(coapInfo);
475 return NULL;
476 }
477 return coapInfo;
478 }
479
DeleteDiscCoapInfo(DiscCoapInfo * coapInfo)480 static void DeleteDiscCoapInfo(DiscCoapInfo *coapInfo)
481 {
482 if (coapInfo == NULL) {
483 return;
484 }
485 (void)SoftBusMutexDestroy(&(coapInfo->lock));
486 SoftBusFree(coapInfo);
487 }
488
DeinitCoapManager(void)489 static void DeinitCoapManager(void)
490 {
491 DeleteDiscCoapInfo(g_publishMgr);
492 g_publishMgr = NULL;
493 DeleteDiscCoapInfo(g_subscribeMgr);
494 g_subscribeMgr = NULL;
495 }
496
InitCoapManager(void)497 static int32_t InitCoapManager(void)
498 {
499 if (g_publishMgr == NULL) {
500 g_publishMgr = NewDiscCoapInfo();
501 }
502 if (g_subscribeMgr == NULL) {
503 g_subscribeMgr = NewDiscCoapInfo();
504 }
505 if (g_publishMgr == NULL || g_subscribeMgr == NULL) {
506 DeinitCoapManager();
507 return SOFTBUS_DISCOVER_COAP_INIT_FAIL;
508 }
509 return SOFTBUS_OK;
510 }
511
DiscCoapInit(DiscInnerCallback * discInnerCb)512 DiscoveryFuncInterface *DiscCoapInit(DiscInnerCallback *discInnerCb)
513 {
514 if (InitCoapManager() != SOFTBUS_OK) {
515 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "coap manager init failed.");
516 return NULL;
517 }
518 if (DiscNstackxInit() != SOFTBUS_OK) {
519 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "dfinder init failed.");
520 DeinitCoapManager();
521 return NULL;
522 }
523 if (DiscCoapRegisterCb(discInnerCb) != SOFTBUS_OK) {
524 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "register coap callback to dfinder failed.");
525 DiscCoapDeinit();
526 return NULL;
527 }
528 SoftBusRegDiscVarDump(COAP_PUBLISH_INFO, &CoapPubInfoDump);
529 SoftBusRegDiscVarDump(COAP_SUBSCRIBE_INFO, &CoapSubInfoDump);
530 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_INFO, "coap discovery init success.");
531 return &g_discCoapFuncInterface;
532 }
533
DiscCoapDeinit(void)534 void DiscCoapDeinit(void)
535 {
536 DeinitCoapManager();
537 DiscNstackxDeinit();
538 }
539
CoapPubInfoDump(int fd)540 static int CoapPubInfoDump(int fd)
541 {
542 if (SoftBusMutexLock(&(g_publishMgr->lock)) != SOFTBUS_OK) {
543 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
544 return SOFTBUS_LOCK_ERR;
545 }
546 SOFTBUS_DPRINTF(fd, "\n---------------CoapPublishInfo------------------\n");
547 SOFTBUS_DPRINTF(fd, "publish allCap : %u\n", *(g_publishMgr->allCap));
548 SOFTBUS_DPRINTF(fd, "publish capCount : %hd\n", *(g_publishMgr->capCount));
549 SOFTBUS_DPRINTF(fd, "publish isUpdate : %d\n", g_publishMgr->isUpdate);
550 SOFTBUS_DPRINTF(fd, "publish isEmpty : %d\n", g_publishMgr->isEmpty);
551 (void)SoftBusMutexUnlock(&(g_publishMgr->lock));
552 return SOFTBUS_OK;
553 }
554
CoapSubInfoDump(int fd)555 static int CoapSubInfoDump(int fd)
556 {
557 if (SoftBusMutexLock(&(g_subscribeMgr->lock)) != SOFTBUS_OK) {
558 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "pthread mutex lock failed.");
559 return SOFTBUS_LOCK_ERR;
560 }
561 SOFTBUS_DPRINTF(fd, "\n---------------CoapSubscribeInfo------------------\n");
562 SOFTBUS_DPRINTF(fd, "subscribe allCap : %u\n", *(g_subscribeMgr->allCap));
563 SOFTBUS_DPRINTF(fd, "subscribe capCount : %hd\n", *(g_subscribeMgr->capCount));
564 SOFTBUS_DPRINTF(fd, "subscribe isUpdate : %d\n", g_subscribeMgr->isUpdate);
565 SOFTBUS_DPRINTF(fd, "subscribe isEmpty : %d\n", g_subscribeMgr->isEmpty);
566 (void)SoftBusMutexUnlock(&(g_subscribeMgr->lock));
567 return SOFTBUS_OK;
568 }
569