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