• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 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 #ifndef NSTACKX_STRUCT_H
17 #define NSTACKX_STRUCT_H
18 
19 #include <stdbool.h>
20 #include <stddef.h>
21 #include <stdint.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define NSTACKX_MAX_DEVICE_NAME_LEN               64
28 #define NSTACKX_MAX_MODULE_NAME_LEN               64
29 #define NSTACKX_MAX_DEVICE_ID_LEN                 96
30 #define NSTACKX_MAX_SENDMSG_DATA_LEN              512
31 #define NSTACKX_MAX_MAC_STRING_LEN                18
32 #define NSTACKX_MAX_IP_STRING_LEN                 46
33 #define NSTACKX_MAX_CAPABILITY_NUM                2
34 #define NSTACKX_MAX_INTERFACE_NAME_LEN            16
35 #define NSTACKX_MAX_SERVICE_DATA_LEN              64
36 #define NSTACKX_MAX_EXTEND_SERVICE_DATA_LEN       128
37 #ifndef NSTACKX_EXTEND_BUSINESSDATA
38 #define NSTACKX_MAX_BUSINESS_DATA_LEN             1
39 #else
40 #define NSTACKX_MAX_BUSINESS_DATA_LEN             300
41 #endif
42 #define NSTACKX_MAX_NOTIFICATION_DATA_LEN         800
43 
44 #ifdef DFINDER_SAVE_DEVICE_LIST
45 #define NSTACKX_MIN_DEVICE_NUM                    1
46 #define NSTACKX_DEFAULT_DEVICE_NUM                20
47 #define NSTACKX_MAX_DEVICE_NUM                    400
48 #define NSTACKX_DEFAULT_AGING_TIME                1
49 #define NSTACKX_MIN_AGING_TIME                    1
50 #define NSTACKX_MAX_AGING_TIME                    10
51 #else
52 #define NSTACKX_MAX_DEVICE_NUM                    1
53 #endif
54 
55 // expand from 131 to 219 (+88) bytes to hold service data
56 // expand from 219 to 400 (+128 +53) bytes to hold extend service data
57 // expand from 400 to (420 + NSTACKX_MAX_BUSINESS_DATA_LEN) bytes to hold business data and type
58 #define NSTACKX_MAX_RESERVED_INFO_LEN             (420 + NSTACKX_MAX_BUSINESS_DATA_LEN)
59 
60 #define DEVICE_HASH_LEN                           21
61 
62 #define NSTACKX_MAX_LISTENED_NIF_NUM              2
63 
64 #define NSTACKX_MIN_ADVERTISE_COUNT               1
65 #define NSTACKX_MAX_ADVERTISE_COUNT               100
66 
67 /* The unit is ms. */
68 #define NSTACKX_MIN_ADVERTISE_DURATION            5000
69 #define NSTACKX_MAX_ADVERTISE_DURATION            50000
70 #define NSTACKX_MIN_ADVERTISE_INTERVAL            10
71 #define NSTACKX_MAX_ADVERTISE_INTERVAL            10000
72 
73 #define PUBLISH_DEVICE_NUM                        1
74 #define INNER_DISCOVERY                           1
75 #define PUBLISH_NUM                               1
76 #define COUNT_INIT                                0
77 
78 #define DFINDER_EVENT_NAME_LEN                    32
79 #define DFINDER_EVENT_TAG_LEN                     16
80 
81 #ifndef DFINDER_EXPORT
82 #ifdef _WIN32
83 #define DFINDER_EXPORT                    __declspec(dllexport)
84 #else
85 #define DFINDER_EXPORT
86 #endif
87 #endif
88 
89 enum {
90     DEFAULT_MODE = 0,
91     DISCOVER_MODE = 1,
92     PUBLISH_MODE_UPLINE = 2,
93     PUBLISH_MODE_OFFLINE = 3,
94     PUBLISH_MODE_PROACTIVE = 10
95 }; // discovery mode
96 
97 enum {
98     NSTACKX_DISCOVERY_TYPE_PASSIVE = 1,
99     NSTACKX_DISCOVERY_TYPE_ACTIVE = 2
100 };
101 
102 /* Remote device information */
103 typedef struct NSTACKX_DeviceInfo {
104     char deviceId[NSTACKX_MAX_DEVICE_ID_LEN];
105     char deviceName[NSTACKX_MAX_DEVICE_NAME_LEN];
106     uint32_t capabilityBitmapNum;
107     uint32_t capabilityBitmap[NSTACKX_MAX_CAPABILITY_NUM];
108     uint32_t deviceType;
109     uint8_t mode;
110     uint8_t update : 1;
111     uint8_t reserved : 7;
112     char networkName[NSTACKX_MAX_INTERFACE_NAME_LEN];
113     uint8_t discoveryType;
114     uint8_t businessType;
115     char reservedInfo[NSTACKX_MAX_RESERVED_INFO_LEN];
116 } NSTACKX_DeviceInfo;
117 
118 
119 typedef struct {
120     char networkName[NSTACKX_MAX_INTERFACE_NAME_LEN];
121     char networkIpAddr[NSTACKX_MAX_IP_STRING_LEN];
122     char serviceData[NSTACKX_MAX_SERVICE_DATA_LEN];
123 } NSTACKX_InterfaceInfo;
124 
125 
126 /* Local device information */
127 typedef struct {
128     char name[NSTACKX_MAX_DEVICE_NAME_LEN];
129     char deviceId[NSTACKX_MAX_DEVICE_ID_LEN];
130     char btMacAddr[NSTACKX_MAX_MAC_STRING_LEN];
131     char wifiMacAddr[NSTACKX_MAX_MAC_STRING_LEN];
132 
133     /* Configuration for network interface */
134     NSTACKX_InterfaceInfo localIfInfo[NSTACKX_MAX_LISTENED_NIF_NUM];
135     uint8_t ifNums;
136 
137     /* Obsoleted. Use localIfInfo instead. */
138     char networkIpAddr[NSTACKX_MAX_IP_STRING_LEN];
139     /* Obsoleted. Use localIfInfo instead. */
140     char networkName[NSTACKX_MAX_INTERFACE_NAME_LEN];
141     uint8_t is5GHzBandSupported;
142     uint8_t businessType;
143     uint32_t deviceType;
144 } NSTACKX_LocalDeviceInfo;
145 
146 typedef enum {
147     NSTACKX_BUSINESS_TYPE_NULL = 0,     /* if not set business type, type null will be used as default choice */
148     NSTACKX_BUSINESS_TYPE_HICOM = 1,    /* designed for hicom, but not used currently */
149     NSTACKX_BUSINESS_TYPE_SOFTBUS = 2,  /* designed for softbus-mineharmony to implement some customized features */
150     NSTACKX_BUSINESS_TYPE_NEARBY = 3,   /* designed to handle the interaction between two nearby service */
151     NSTACKX_BUSINESS_TYPE_AUTONET = 4,  /* designed for softbus-autonet to implement some customized features */
152     NSTACKX_BUSINESS_TYPE_STRATEGY = 5, /* designed for softbus-strategy to report disc result in different rounds */
153     NSTACKX_BUSINESS_TYPE_MAX           /* for parameter legality verification */
154 } NSTACKX_BusinessType;
155 
156 
157 typedef struct {
158     uint8_t businessType;       /* service identify */
159     uint8_t discoveryMode;      /* discovery mode, e.g. PUBLISH_MODE_PROACTIVE */
160     uint32_t advertiseCount;    /* the number of broadcasts to be sent */
161     uint32_t advertiseDuration; /* duration of discovery this time */
162     uint32_t length;            /* the length of business data, include '\0' */
163     char *businessData;         /* business data in broadcast: {"bData":"xxx"} */
164 } NSTACKX_DiscoverySettings;
165 
166 typedef struct {
167     uint8_t businessType;
168     uint8_t discoveryMode;
169     uint32_t intervalArrLen;
170     uint32_t *bcastInterval;
171     uint32_t businessDataLen;
172     char *businessData;
173 } DFinderDiscConfig;
174 
175 typedef struct {
176     const char *name;
177     const char *deviceId;
178     const NSTACKX_InterfaceInfo *localIfInfo;
179     uint32_t ifNums;
180     uint32_t deviceType;
181     uint64_t deviceHash;
182     bool hasDeviceHash;
183     uint8_t businessType;
184 } NSTACKX_LocalDeviceInfoV2;
185 
186 /* Device list change callback type */
187 typedef void (*NSTACKX_OnDeviceListChanged)(const NSTACKX_DeviceInfo *deviceList, uint32_t deviceCount);
188 
189 typedef void (*NSTACKX_OnMsgReceived)(const char *moduleName, const char *deviceId,
190     const uint8_t *data, uint32_t len, const char *srcIp); /* Data receive callback type */
191 
192 /* DFinder message type list. */
193 typedef enum {
194     DFINDER_ON_TOO_BUSY = 1,
195     DFINDER_ON_INNER_ERROR,
196     DFINDER_ON_TOO_MANY_DEVICE,
197 } DFinderMsgType;
198 
199 /* store the notification config, used with interface: NSTACKX_SendNotification */
200 typedef struct {
201     char *msg;                /* notification data in json format */
202     size_t msgLen;            /* strlen of notification data */
203     uint16_t *intervalsMs;    /* pointer to intervals to send notification, first element should be 0 */
204     uint8_t intervalLen;      /* configured number of intervals */
205     uint8_t businessType;     /* service identify, see enum NSTACKX_BusinessType */
206 } NSTACKX_NotificationConfig;
207 
208 /* Data receive callback type */
209 typedef void (*NSTACKX_OnDFinderMsgReceived)(DFinderMsgType msgType);
210 
211 /**
212  * @brief define function pointer type, used to report the notification data received
213  *
214  * @param [out] element: notification data to report, see struct NSTACKX_NotificationConfig
215  */
216 typedef void (*NSTACKX_OnNotificationReceived)(const NSTACKX_NotificationConfig *notification);
217 
218 /* NSTACKX parameter, which contains callback list */
219 typedef struct {
220     NSTACKX_OnDeviceListChanged onDeviceListChanged;
221     NSTACKX_OnDeviceListChanged onDeviceFound;
222     NSTACKX_OnMsgReceived onMsgReceived;
223     NSTACKX_OnDFinderMsgReceived onDFinderMsgReceived;
224     NSTACKX_OnNotificationReceived onNotificationReceived;
225     uint32_t maxDeviceNum; // the size of the device list configured by the caller
226 } NSTACKX_Parameter;
227 
228 /* DFinder log level */
229 enum {
230     DFINDER_LOG_LEVEL_OFF     = 0,
231     DFINDER_LOG_LEVEL_FATAL   = 1,
232     DFINDER_LOG_LEVEL_ERROR   = 2,
233     DFINDER_LOG_LEVEL_WARNING = 3,
234     DFINDER_LOG_LEVEL_INFO    = 4,
235     DFINDER_LOG_LEVEL_DEBUG   = 5,
236     DFINDER_LOG_LEVEL_END,
237 };
238 
239 typedef enum {
240     DFINDER_EVENT_TYPE_FAULT,
241     DFINDER_EVENT_TYPE_STATISTIC,
242     DFINDER_EVENT_TYPE_SECURITY,
243     DFINDER_EVENT_TYPE_BEHAVIOR,
244 } DFinderEventType;
245 
246 typedef enum {
247     DFINDER_EVENT_LEVEL_CRITICAL,
248     DFINDER_EVENT_LEVEL_MINOR,
249 } DFinderEventLevel;
250 
251 typedef enum {
252     DFINDER_PARAM_TYPE_BOOL,
253     DFINDER_PARAM_TYPE_UINT8,
254     DFINDER_PARAM_TYPE_UINT16,
255     DFINDER_PARAM_TYPE_INT32,
256     DFINDER_PARAM_TYPE_UINT32,
257     DFINDER_PARAM_TYPE_UINT64,
258     DFINDER_PARAM_TYPE_FLOAT,
259     DFINDER_PARAM_TYPE_DOUBLE,
260     DFINDER_PARAM_TYPE_STRING,
261 } DFinderEventParamType;
262 
263 typedef struct {
264     DFinderEventParamType type;
265     char name[DFINDER_EVENT_NAME_LEN];
266     union {
267         bool b;
268         uint8_t u8v;
269         uint16_t u16v;
270         int32_t i32v;
271         uint32_t u32v;
272         uint64_t u64v;
273         float f;
274         double d;
275         char str[DFINDER_EVENT_NAME_LEN];
276     } value;
277 } DFinderEventParam;
278 
279 typedef struct {
280     char eventName[DFINDER_EVENT_NAME_LEN];
281     DFinderEventType type;
282     DFinderEventLevel level;
283     char tag[DFINDER_EVENT_TAG_LEN];
284     char desc[DFINDER_EVENT_NAME_LEN];
285     DFinderEventParam *params;
286     uint32_t paramNum;
287 } DFinderEvent;
288 
289 typedef void (*DFinderEventFunc)(void *softObj, const DFinderEvent *info);
290 
291 typedef void (*DFinderDumpFunc)(void *softObj, const char *data, uint32_t len);
292 
293 struct NSTACKX_ServiceData {
294     char ip[NSTACKX_MAX_IP_STRING_LEN];
295     char serviceData[NSTACKX_MAX_SERVICE_DATA_LEN];
296 };
297 
298 typedef struct {
299     char localNetworkName[NSTACKX_MAX_INTERFACE_NAME_LEN];  /* nic name of local device */
300     char remoteIp[NSTACKX_MAX_IP_STRING_LEN];               /* ip of remote device */
301     char *businessData;                                     /* business data in unicast: {"bData":"xxx"} */
302     uint32_t length;                                        /* the length of business data, include '\0' */
303     uint8_t businessType;                                   /* service identify */
304 } NSTACKX_ResponseSettings;
305 
306 #ifdef ENABLE_USER_LOG
307 typedef void (*DFinderLogCallback)(const char *moduleName, uint32_t logLevel, const char *format, ...);
308 #endif
309 
310 #define LINKLESS_MAC_LEN                        6
311 #define LINKLESS_NETWORK_ID_BUF_LEN             65 /* include '\0' */
312 #define LINKLESS_INVALID_ACTION_LISTEN_CHANNEL  0
313 
314 typedef enum {
315     LINKLESS_APP_SHARE,
316     LINKLESS_APP_TOUCH,
317     LINKLESS_APP_CAST,
318     LINKLESS_APP_SERVICE_DISC,
319     LINKLESS_APP_VIRTUAL = 256,
320     LINKLESS_APP_MAX,
321 } LinklessAppId;
322 
323 typedef enum {
324     LINKLESS_LINK_TYPE_AUTO,
325     LINKLESS_LINK_TYPE_DIRECT,
326     LINKLESS_LINK_TYPE_VIRTUAL,
327     LINKLESS_LINK_TYPE_MAX,
328 } LinklessLinkType;
329 
330 typedef enum {
331     LINKLESS_MODE_PUSH,
332     LINKLESS_MODE_PULL,
333     LINKLESS_MODE_MAX,
334 } LinklessMode;
335 
336 typedef enum {
337     LINKLESS_PRIORITY_NORMAL,
338     LINKLESS_PRIORITY_HIGH,
339     LINKLESS_PRIORITY_MAX,
340 } LinklessPriority;
341 
342 typedef enum {
343     LINKLESS_LOG_LEVEL_OFF,
344     LINKLESS_LOG_LEVEL_FATAL,
345     LINKLESS_LOG_LEVEL_ERROR,
346     LINKLESS_LOG_LEVEL_WARNING,
347     LINKLESS_LOG_LEVEL_INFO,
348     LINKLESS_LOG_LEVEL_DEBUG,
349     LINKLESS_LOG_LEVEL_END,
350 } LinklessLogLevel;
351 
352 typedef enum {
353     LINKLESS_MSG_TYPE_REQ,
354     LINKLESS_MSG_TYPE_RESP,
355     LINKLESS_MSG_TYPE_MAX,
356 } LinklessMsgType;
357 
358 typedef enum {
359     LINKLESS_WIFI_STATUS_DEFAULT,
360     LINKLESS_WIFI_STATUS_BUSY,
361     LINKLESS_WIFI_STATUS_MAX,
362 } LinklessWifiStatus;
363 
364 typedef enum {
365     LINKLESS_VIRTUAL_CONNECTED,
366     LINKLESS_VIRTUAL_DISCONNECTED,
367     LINKLESS_VIRTUAL_CONN_MAX,
368 } LinklessVirtualConnStatus;
369 
370 typedef struct {
371     uint16_t appId;
372     uint8_t linkType;
373     uint8_t priority;
374     uint8_t mode;
375     bool proxy;
376     bool enableListen;
377     uint8_t channel;
378     uint8_t mac[LINKLESS_MAC_LEN];
379     bool encrypt;
380     bool needAck;
381     uint8_t *data;
382     uint16_t dataLen;
383     char peerNetworkId[LINKLESS_NETWORK_ID_BUF_LEN];
384 } LinklessParam;
385 
386 typedef struct {
387     int32_t txChannel;
388     uint8_t mac[LINKLESS_MAC_LEN];
389     char peerNetworkId[LINKLESS_NETWORK_ID_BUF_LEN];
390     uint8_t *payload;
391     uint16_t payloadLen;
392 } LinklessActionSendParam;
393 
394 typedef int32_t (*LinklessDirectlySendCb)(const LinklessActionSendParam *param);
395 typedef int32_t (*LinklessStartActionListenCb)(uint8_t *mac, int32_t len, int32_t *channel);
396 typedef int32_t (*LinklessStopActionListenCb)(void);
397 typedef void (*LinklessSendCompleteCb)(int32_t transactionId, uint32_t status);
398 typedef void (*LinklessRecvCb)(const LinklessParam *info);
399 typedef int32_t (*LinklessVirtualSendCb)(const LinklessActionSendParam *param);
400 
401 typedef struct {
402     LinklessStartActionListenCb startListenCb;
403     LinklessStopActionListenCb stopListenCb;
404     LinklessDirectlySendCb directlySendCb;
405     LinklessVirtualSendCb virtualSendCb;
406 } LinklessInitParam;
407 
408 typedef struct {
409     uint16_t appId;
410     LinklessSendCompleteCb onSendComplete;
411     LinklessRecvCb onRecv;
412 } LinklessRegisterCbParam;
413 
414 typedef struct {
415     uint16_t appId;
416     uint8_t channel;
417     uint8_t mac[LINKLESS_MAC_LEN];
418 } LinklessRecvParam;
419 
420 typedef struct {
421     uint8_t txChannel;
422     uint8_t rxChannel;
423     uint8_t peerMac[LINKLESS_MAC_LEN];
424     uint8_t *payload;
425     int32_t payloadLen;
426     char peerNetworkId[LINKLESS_NETWORK_ID_BUF_LEN];
427 } LinklessActionRecvParam;
428 
429 typedef struct {
430     uint8_t channel;
431     uint8_t mac[LINKLESS_MAC_LEN];
432 } LinklessActionStateChangeParam;
433 
434 typedef struct {
435     char *networkId;
436     char *mac;
437     char *ip;
438 } LinklessVirtualConn;
439 
440 enum LinklessErrorCode {
441     LINKLESS_ERRNO_SUCCESS = 0,
442     LINKLESS_ERRNO_FAIL = -101,
443     LINKLESS_ERRNO_INVALID_PARAM = -102,
444     LINKLESS_ERRNO_MODULE_NOT_INIT = -103,
445     LINKLESS_ERRNO_MODULE_ALREADY_INITED = -104,
446     LINKLESS_ERRNO_FEATURE_NOT_IMPLEMENTED = -105,
447     LINKLESS_ERRNO_USER_CALLBACK_NOT_FOUND = -106,
448     LINKLESS_ERRNO_USER_CALLBACK_NOT_REGISTERED = -107,
449     LINKLESS_ERRNO_NO_TRANSACTION_ONGOING = -108,
450     LINKLESS_ERRNO_LISTEN_CHANNEL_CONFLICT = -109,
451     LINKLESS_ERRNO_UNPACK_ACTION_DATA_FAIL = -110,
452     LINKLESS_ERRNO_CREATE_TIMER_FAIL = -111,
453     LINKLESS_ERRNO_START_ACTION_LISTEN_FAIL = -112,
454     LINKLESS_ERRNO_STOP_ACTION_LISTEN_FAIL = -113,
455 };
456 
457 #ifdef __cplusplus
458 }
459 #endif
460 
461 #endif /* NSTACKX_H */
462