• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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