• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __NAN_H__
18 #define __NAN_H__
19 
20 #include <net/if.h>
21 #include <stdbool.h>
22 #include "wifi_hal.h"
23 
24 #ifdef __cplusplus
25 extern "C"
26 {
27 #endif /* __cplusplus */
28 
29 /*****************************************************************************
30  * Neighbour Aware Network Service Structures and Functions
31  *****************************************************************************/
32 
33 /*
34   Definitions
35   All multi-byte fields within all NAN protocol stack messages are assumed to be in Little Endian order.
36 */
37 
38 typedef int NanVersion;
39 typedef u16 transaction_id;
40 typedef u32 NanDataPathId;
41 
42 #define NAN_MAC_ADDR_LEN                6
43 #define NAN_MAJOR_VERSION               4
44 #define NAN_MINOR_VERSION               0
45 #define NAN_MICRO_VERSION               0
46 #define NAN_MAX_SOCIAL_CHANNELS         3
47 
48 /* NAN Maximum Lengths */
49 #define NAN_MAX_SERVICE_NAME_LEN                255
50 #define NAN_MAX_MATCH_FILTER_LEN                255
51 #define NAN_MAX_SERVICE_SPECIFIC_INFO_LEN       1024
52 #define NAN_MAX_VSA_DATA_LEN                    1024
53 #define NAN_MAX_MESH_DATA_LEN                   32
54 #define NAN_MAX_INFRA_DATA_LEN                  32
55 #define NAN_MAX_CLUSTER_ATTRIBUTE_LEN           255
56 #define NAN_MAX_SUBSCRIBE_MAX_ADDRESS           42
57 #define NAN_MAX_FAM_CHANNELS                    32
58 #define NAN_MAX_POSTDISCOVERY_LEN               5
59 #define NAN_MAX_FRAME_DATA_LEN                  504
60 #define NAN_DP_MAX_APP_INFO_LEN                 512
61 #define NAN_ERROR_STR_LEN                       255
62 #define NAN_PMK_INFO_LEN                        32
63 #define NAN_MAX_SCID_BUF_LEN                    1024
64 #define NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN  2048
65 #define NAN_SECURITY_MIN_PASSPHRASE_LEN         8
66 #define NAN_SECURITY_MAX_PASSPHRASE_LEN         63
67 #define NAN_MAX_CHANNEL_INFO_SUPPORTED          4
68 #define NAN_IDENTITY_KEY_LEN                    16
69 #define NAN_IDENTITY_TAG_LEN                    8
70 #define NAN_IDENTITY_NONCE_LEN                  8
71 #define NAN_MAX_MATCH_IDENTITY_LEN             1024
72 /*
73   Definition of various NanResponseType
74 */
75 typedef enum {
76     NAN_RESPONSE_ENABLED                 = 0,
77     NAN_RESPONSE_DISABLED                = 1,
78     NAN_RESPONSE_PUBLISH                 = 2,
79     NAN_RESPONSE_PUBLISH_CANCEL          = 3,
80     NAN_RESPONSE_TRANSMIT_FOLLOWUP       = 4,
81     NAN_RESPONSE_SUBSCRIBE               = 5,
82     NAN_RESPONSE_SUBSCRIBE_CANCEL        = 6,
83     NAN_RESPONSE_STATS                   = 7,
84     NAN_RESPONSE_CONFIG                  = 8,
85     NAN_RESPONSE_TCA                     = 9,
86     NAN_RESPONSE_ERROR                   = 10,
87     NAN_RESPONSE_BEACON_SDF_PAYLOAD      = 11,
88     NAN_GET_CAPABILITIES                 = 12,
89     NAN_DP_INTERFACE_CREATE              = 13,
90     NAN_DP_INTERFACE_DELETE              = 14,
91     NAN_DP_INITIATOR_RESPONSE            = 15,
92     NAN_DP_RESPONDER_RESPONSE            = 16,
93     NAN_DP_END                           = 17,
94     NAN_PAIRING_INITIATOR_RESPONSE       = 18,
95     NAN_PAIRING_RESPONDER_RESPONSE       = 19,
96     NAN_BOOTSTRAPPING_INITIATOR_RESPONSE = 20,
97     NAN_BOOTSTRAPPING_RESPONDER_RESPONSE = 21,
98     NAN_PAIRING_END                      = 22,
99     NAN_SUSPEND_REQUEST_RESPONSE         = 23,
100     NAN_RESUME_REQUEST_RESPONSE          = 24
101 } NanResponseType;
102 
103 /* NAN Publish Types */
104 typedef enum {
105     NAN_PUBLISH_TYPE_UNSOLICITED = 0,
106     NAN_PUBLISH_TYPE_SOLICITED,
107     NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED
108 } NanPublishType;
109 
110 /* NAN Transmit Priorities */
111 typedef enum {
112     NAN_TX_PRIORITY_NORMAL = 0,
113     NAN_TX_PRIORITY_HIGH
114 } NanTxPriority;
115 
116 /* NAN Statistics Request ID Codes */
117 typedef enum {
118     NAN_STATS_ID_DE_PUBLISH = 0,
119     NAN_STATS_ID_DE_SUBSCRIBE,
120     NAN_STATS_ID_DE_MAC,
121     NAN_STATS_ID_DE_TIMING_SYNC,
122     NAN_STATS_ID_DE_DW,
123     NAN_STATS_ID_DE
124 } NanStatsType;
125 
126 /* NAN Protocol Event ID Codes */
127 typedef enum {
128     NAN_EVENT_ID_DISC_MAC_ADDR = 0,
129     NAN_EVENT_ID_STARTED_CLUSTER,
130     NAN_EVENT_ID_JOINED_CLUSTER
131 } NanDiscEngEventType;
132 
133 /* NAN Data Path type */
134 typedef enum {
135     NAN_DATA_PATH_UNICAST_MSG = 0,
136     NAN_DATA_PATH_MULTICAST_MSG
137 } NdpType;
138 
139 /* NAN Ranging Configuration */
140 typedef enum {
141     NAN_RANGING_DISABLE = 0,
142     NAN_RANGING_ENABLE
143 } NanRangingState;
144 
145 /* TCA Type */
146 typedef enum {
147     NAN_TCA_ID_CLUSTER_SIZE = 0
148 } NanTcaType;
149 
150 /* pairing request type*/
151 typedef enum {
152     NAN_PAIRING_SETUP = 0,
153     NAN_PAIRING_VERIFICATION = 1
154 } NanPairingRequestType;
155 
156 /* Nan AKM type */
157 typedef enum {
158     SAE = 0,
159     PASN = 1
160 } NanAkm;
161 
162 /* NAN Channel Info */
163 typedef struct {
164     u32 channel;
165     u32 bandwidth;
166     u32 nss;
167 } NanChannelInfo;
168 
169 /*
170   Various NAN Protocol Response code
171 */
172 typedef enum {
173     /* NAN Protocol Response Codes */
174     NAN_STATUS_SUCCESS = 0,
175     /*  NAN Discovery Engine/Host driver failures */
176     NAN_STATUS_INTERNAL_FAILURE = 1,
177     /*  NAN OTA failures */
178     NAN_STATUS_PROTOCOL_FAILURE = 2,
179     /* if the publish/subscribe id is invalid */
180     NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID = 3,
181     /* If we run out of resources allocated */
182     NAN_STATUS_NO_RESOURCE_AVAILABLE = 4,
183     /* if invalid params are passed */
184     NAN_STATUS_INVALID_PARAM = 5,
185     /*  if the requestor instance id is invalid */
186     NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID = 6,
187     /*  if the ndp id is invalid */
188     NAN_STATUS_INVALID_NDP_ID = 7,
189     /* if NAN is enabled when wifi is turned off */
190     NAN_STATUS_NAN_NOT_ALLOWED = 8,
191     /* if over the air ack is not received */
192     NAN_STATUS_NO_OTA_ACK = 9,
193     /* If NAN is already enabled and we are try to re-enable the same */
194     NAN_STATUS_ALREADY_ENABLED = 10,
195     /* If followup message internal queue is full */
196     NAN_STATUS_FOLLOWUP_QUEUE_FULL = 11,
197     /* Unsupported concurrency session enabled, NAN disabled notified */
198     NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED = 12,
199     /*  if the pairing id is invalid */
200     NAN_STATUS_INVALID_PAIRING_ID = 13,
201     /*  if the bootstrapping id is invalid */
202     NAN_STATUS_INVALID_BOOTSTRAPPING_ID = 14,
203     /* If same request is received again */
204     NAN_STATUS_REDUNDANT_REQUEST = 15,
205     /* If current request is not supported */
206     NAN_STATUS_NOT_SUPPORTED = 16,
207     /* If no Wifi Aware connection is active */
208     NAN_STATUS_NO_CONNECTION = 17,
209 } NanStatusType;
210 
211 /* NAN Transmit Types */
212 typedef enum {
213     NAN_TX_TYPE_BROADCAST = 0,
214     NAN_TX_TYPE_UNICAST
215 } NanTxType;
216 
217 /* NAN Subscribe Type */
218 typedef enum {
219     NAN_SUBSCRIBE_TYPE_PASSIVE = 0,
220     NAN_SUBSCRIBE_TYPE_ACTIVE
221 } NanSubscribeType;
222 
223 /* NAN Service Response Filter Attribute Bit */
224 typedef enum {
225     NAN_SRF_ATTR_BLOOM_FILTER = 0,
226     NAN_SRF_ATTR_PARTIAL_MAC_ADDR
227 } NanSRFType;
228 
229 /* NAN Service Response Filter Include Bit */
230 typedef enum {
231     NAN_SRF_INCLUDE_DO_NOT_RESPOND = 0,
232     NAN_SRF_INCLUDE_RESPOND
233 } NanSRFIncludeType;
234 
235 /* NAN Match indication type */
236 typedef enum {
237     NAN_MATCH_ALG_MATCH_ONCE = 0,
238     NAN_MATCH_ALG_MATCH_CONTINUOUS,
239     NAN_MATCH_ALG_MATCH_NEVER
240 } NanMatchAlg;
241 
242 /* NAN Transmit Window Type */
243 typedef enum {
244     NAN_TRANSMIT_IN_DW = 0,
245     NAN_TRANSMIT_IN_FAW
246 } NanTransmitWindowType;
247 
248 /* NAN SRF State in Subscribe */
249 typedef enum {
250     NAN_DO_NOT_USE_SRF = 0,
251     NAN_USE_SRF
252 } NanSRFState;
253 
254 /* NAN Include SSI in MatchInd */
255 typedef enum {
256     NAN_SSI_NOT_REQUIRED_IN_MATCH_IND = 0,
257     NAN_SSI_REQUIRED_IN_MATCH_IND
258 } NanSsiInMatchInd;
259 
260 /* NAN DP security Configuration */
261 typedef enum {
262     NAN_DP_CONFIG_NO_SECURITY = 0,
263     NAN_DP_CONFIG_SECURITY
264 } NanDataPathSecurityCfgStatus;
265 
266 typedef enum {
267     NAN_QOS_NOT_REQUIRED = 0,
268     NAN_QOS_REQUIRED
269 } NanQosCfgStatus;
270 
271 
272 /* Data request Responder's response */
273 typedef enum {
274     NAN_DP_REQUEST_ACCEPT = 0,
275     NAN_DP_REQUEST_REJECT
276 } NanDataPathResponseCode;
277 
278 /* Pairing request Responder's response */
279 typedef enum {
280     NAN_PAIRING_REQUEST_ACCEPT = 0,
281     NAN_PAIRING_REQUEST_REJECT
282 } NanPairingResponseCode;
283 
284 /* Pairing bootstrapping Responder's response */
285 typedef enum {
286     NAN_BOOTSTRAPPING_REQUEST_ACCEPT = 0,
287     NAN_BOOTSTRAPPING_REQUEST_REJECT = 1,
288     NAN_BOOTSTRAPPING_REQUEST_COMEBACK = 2
289 } NanBootstrappingResponseCode;
290 
291 /* NAN DP channel config options */
292 typedef enum {
293     NAN_DP_CHANNEL_NOT_REQUESTED = 0,
294     NAN_DP_REQUEST_CHANNEL_SETUP,
295     NAN_DP_FORCE_CHANNEL_SETUP
296 } NanDataPathChannelCfg;
297 
298 /* Enable/Disable NAN Ranging Auto response */
299 typedef enum {
300     NAN_RANGING_AUTO_RESPONSE_ENABLE = 1,
301     NAN_RANGING_AUTO_RESPONSE_DISABLE
302 } NanRangingAutoResponse;
303 
304 /* Enable/Disable NAN service range report */
305 typedef enum {
306     NAN_DISABLE_RANGE_REPORT = 1,
307     NAN_ENABLE_RANGE_REPORT
308 } NanRangeReport;
309 
310 /* NAN Range Response */
311 typedef enum {
312     NAN_RANGE_REQUEST_ACCEPT = 1,
313     NAN_RANGE_REQUEST_REJECT,
314     NAN_RANGE_REQUEST_CANCEL
315 } NanRangeResponse;
316 
317 /* NAN Security Key Input Type*/
318 typedef enum {
319     NAN_SECURITY_KEY_INPUT_PMK = 1,
320     NAN_SECURITY_KEY_INPUT_PASSPHRASE
321 } NanSecurityKeyInputType;
322 
323 typedef struct {
324     /* pmk length */
325     u32 pmk_len;
326     /*
327        PMK: Info is optional in Discovery phase.
328        PMK info can be passed during
329        the NDP session.
330      */
331     u8 pmk[NAN_PMK_INFO_LEN];
332 } NanSecurityPmk;
333 
334 typedef struct {
335     /* passphrase length */
336     u32 passphrase_len;
337     /*
338        passphrase info is optional in Discovery phase.
339        passphrase info can be passed during
340        the NDP session.
341      */
342     u8 passphrase[NAN_SECURITY_MAX_PASSPHRASE_LEN];
343 } NanSecurityPassPhrase;
344 
345 typedef struct {
346     NanSecurityKeyInputType key_type;
347     union {
348         NanSecurityPmk pmk_info;
349         NanSecurityPassPhrase passphrase_info;
350     } body;
351 } NanSecurityKeyInfo;
352 
353 /* NAN Security Cipher Suites Mask */
354 #define NAN_CIPHER_SUITE_SHARED_KEY_NONE               0x00
355 #define NAN_CIPHER_SUITE_SHARED_KEY_128_MASK           0x01
356 #define NAN_CIPHER_SUITE_SHARED_KEY_256_MASK           0x02
357 #define NAN_CIPHER_SUITE_PUBLIC_KEY_2WDH_128_MASK      0x04
358 #define NAN_CIPHER_SUITE_PUBLIC_KEY_2WDH_256_MASK      0x08
359 #define NAN_CIPHER_SUITE_PUBLIC_KEY_PASN_128_MASK      0x40
360 #define NAN_CIPHER_SUITE_PUBLIC_KEY_PASN_256_MASK      0x80
361 
362 /* NAN ranging indication condition MASKS */
363 #define NAN_RANGING_INDICATE_CONTINUOUS_MASK   0x01
364 #define NAN_RANGING_INDICATE_INGRESS_MET_MASK  0x02
365 #define NAN_RANGING_INDICATE_EGRESS_MET_MASK   0x04
366 
367 /* NAN schedule update reason MASKS */
368 #define NAN_SCHEDULE_UPDATE_NSS_MASK   0x01
369 #define NAN_SCHEDULE_UPDATE_CHANNEL_MASK  0x02
370 
371 /* NAN pairing bootstrapping method */
372 #define NAN_PAIRING_BOOTSTRAPPING_OPPORTUNISTIC_MASK       0x01
373 #define NAN_PAIRING_BOOTSTRAPPING_PIN_CODE_DISPLAY_MASK    0x02
374 #define NAN_PAIRING_BOOTSTRAPPING_PASSPHRASE_DISPLAY_MASK  0x04
375 #define NAN_PAIRING_BOOTSTRAPPING_QR_DISPLAY_MASK          0x08
376 #define NAN_PAIRING_BOOTSTRAPPING_NFC_TAG_MASK             0x10
377 #define NAN_PAIRING_BOOTSTRAPPING_PIN_CODE_KEYPAD_MASK     0x20
378 #define NAN_PAIRING_BOOTSTRAPPING_PASSPHRASE_KEYPAD_MASK   0x40
379 #define NAN_PAIRING_BOOTSTRAPPING_QR_SCAN_MASK             0x80
380 #define NAN_PAIRING_BOOTSTRAPPING_NFC_READER_MASK          0x100
381 #define NAN_PAIRING_BOOTSTRAPPING_SERVICE_MANAGED_MASK     0x4000
382 #define NAN_PAIRING_BOOTSTRAPPING_HANDSHAKE_SHIP_MASK      0x8000
383 
384 /*
385    Structure to set the Service Descriptor Extension
386    Attribute (SDEA) passed as part of NanPublishRequest/
387    NanSubscribeRequest/NanMatchInd.
388 */
389 typedef struct {
390     /*
391        Optional configuration of Data Path Enable request.
392        configure flag determines whether configuration needs
393        to be passed or not.
394     */
395     u8 config_nan_data_path;
396     NdpType ndp_type;
397     /*
398        NAN secuirty required flag to indicate
399        if the security is enabled or disabled
400     */
401     NanDataPathSecurityCfgStatus security_cfg;
402     /*
403        NAN ranging required flag to indicate
404        if ranging is enabled on disabled
405     */
406     NanRangingState ranging_state;
407     /*
408       Enable/Disable Ranging report,
409       when configured NanRangeReportInd received
410     */
411     NanRangeReport range_report;
412     /*
413       NAN QOS required flag to indicate
414       if QOS is required or not.
415     */
416     NanQosCfgStatus qos_cfg;
417     /*
418       Config to set FSD with Gas bit
419       in the SDEA Control Field.
420      */
421     u8 config_fsd_gas;
422     u8 enable_fsd_gas;
423 
424     /*
425       Config to set FSD Required bit
426       in the SDEA Control Field.
427      */
428     u8 config_fsd_req;
429     u8 enable_fsd_req;
430 
431     /*
432       Config to set gtk protection bit
433       in the SDEA Control Field.
434      */
435     u8 gtk_protection;
436 } NanSdeaCtrlParams;
437 
438 /*
439    Nan Ranging Peer Info in MatchInd
440 */
441 typedef struct {
442     /*
443        Distance to the NAN device with the MAC address indicated
444        with ranged mac address.
445     */
446     u32 range_measurement_mm;
447     /* Ranging event matching the configuration of continuous/ingress/egress. */
448     u32 ranging_event_type;
449 } NanRangeInfo;
450 
451 /* Nan/NDP Capabilites info */
452 typedef struct {
453     u32 max_concurrent_nan_clusters;
454     u32 max_publishes;
455     u32 max_subscribes;
456     u32 max_service_name_len;
457     u32 max_match_filter_len;
458     u32 max_total_match_filter_len;
459     u32 max_service_specific_info_len;
460     u32 max_vsa_data_len;
461     u32 max_mesh_data_len;
462     u32 max_ndi_interfaces;
463     u32 max_ndp_sessions;
464     u32 max_app_info_len;
465     u32 max_queued_transmit_followup_msgs;
466     u32 ndp_supported_bands;
467     u32 cipher_suites_supported;
468     u32 max_scid_len;
469     bool is_ndp_security_supported;
470     u32 max_sdea_service_specific_info_len;
471     u32 max_subscribe_address;
472     u32 ndpe_attr_supported;
473     bool is_instant_mode_supported;
474     bool is_6g_supported;
475     bool is_he_supported;
476     bool is_pairing_supported;
477     bool is_set_cluster_id_supported;
478     bool is_suspension_supported;
479 } NanCapabilities;
480 
481 /*
482   Nan accept policy: Per service basis policy
483   Based on this policy(ALL/NONE), responder side
484   will send ACCEPT/REJECT
485 */
486 typedef enum {
487     NAN_SERVICE_ACCEPT_POLICY_NONE = 0,
488     /* Default value */
489     NAN_SERVICE_ACCEPT_POLICY_ALL
490 } NanServiceAcceptPolicy;
491 
492 /*
493   Host can send Vendor specific attributes which the Discovery Engine can
494   enclose in Beacons and/or Service Discovery frames transmitted.
495   Below structure is used to populate that.
496 */
497 typedef struct {
498     /*
499        0 = transmit only in the next discovery window
500        1 = transmit in next 16 discovery window
501     */
502     u8 payload_transmit_flag;
503     /*
504        Below flags will determine in which all frames
505        the vendor specific attributes should be included
506     */
507     u8 tx_in_discovery_beacon;
508     u8 tx_in_sync_beacon;
509     u8 tx_in_service_discovery;
510     /* Organizationally Unique Identifier */
511     u32 vendor_oui;
512     /*
513        vendor specific attribute to be transmitted
514        vsa_len : Length of the vsa data.
515      */
516     u32 vsa_len;
517     u8 vsa[NAN_MAX_VSA_DATA_LEN];
518 } NanTransmitVendorSpecificAttribute;
519 
520 
521 /*
522   Discovery Engine will forward any Vendor Specific Attributes
523   which it received as part of this structure.
524 */
525 /* Mask to determine on which frames attribute was received */
526 #define RX_DISCOVERY_BEACON_MASK  0x01
527 #define RX_SYNC_BEACON_MASK       0x02
528 #define RX_SERVICE_DISCOVERY_MASK 0x04
529 typedef struct {
530     /*
531        Frames on which this vendor specific attribute
532        was received. Mask defined above
533     */
534     u8 vsa_received_on;
535     /* Organizationally Unique Identifier */
536     u32 vendor_oui;
537     /* vendor specific attribute */
538     u32 attr_len;
539     u8 vsa[NAN_MAX_VSA_DATA_LEN];
540 } NanReceiveVendorSpecificAttribute;
541 
542 /*
543    NAN Beacon SDF Payload Received structure
544    Discovery engine sends the details of received Beacon or
545    Service Discovery Frames as part of this structure.
546 */
547 typedef struct {
548     /* Frame data */
549     u32 frame_len;
550     u8 frame_data[NAN_MAX_FRAME_DATA_LEN];
551 } NanBeaconSdfPayloadReceive;
552 
553 /*
554   Host can set the Periodic scan parameters for each of the
555   3(6, 44, 149) Social channels. Only these channels are allowed
556   any other channels are rejected
557 */
558 typedef enum {
559     NAN_CHANNEL_24G_BAND = 0,
560     NAN_CHANNEL_5G_BAND_LOW,
561     NAN_CHANNEL_5G_BAND_HIGH
562 } NanChannelIndex;
563 
564 /*
565    Structure to set the Social Channel Scan parameters
566    passed as part of NanEnableRequest/NanConfigRequest
567 */
568 typedef struct {
569     /*
570        Dwell time of each social channel in milliseconds
571        NanChannelIndex corresponds to the respective channel
572        If time set to 0 then the FW default time will be used.
573     */
574     u8 dwell_time[NAN_MAX_SOCIAL_CHANNELS]; // default value 200 msec
575 
576     /*
577        Scan period of each social channel in seconds
578        NanChannelIndex corresponds to the respective channel
579        If time set to 0 then the FW default time will be used.
580     */
581     u16 scan_period[NAN_MAX_SOCIAL_CHANNELS]; // default value 20 sec
582 } NanSocialChannelScanParams;
583 
584 /*
585   Host can send Post Connectivity Capability attributes
586   to be included in Service Discovery frames transmitted
587   as part of this structure.
588 */
589 typedef struct {
590     /*
591        0 = transmit only in the next discovery window
592        1 = transmit in next 16 discovery window
593     */
594     u8 payload_transmit_flag;
595     /* 1 - Wifi Direct supported 0 - Not supported */
596     u8 is_wfd_supported;
597     /* 1 - Wifi Direct Services supported 0 - Not supported */
598     u8 is_wfds_supported;
599     /* 1 - TDLS supported 0 - Not supported */
600     u8 is_tdls_supported;
601     /* 1 - IBSS supported 0 - Not supported */
602     u8 is_ibss_supported;
603     /* 1 - Mesh supported 0 - Not supported */
604     u8 is_mesh_supported;
605     /*
606        1 - NAN Device currently connect to WLAN Infra AP
607        0 - otherwise
608     */
609     u8 wlan_infra_field;
610 } NanTransmitPostConnectivityCapability;
611 
612 /*
613   Discovery engine providing the post connectivity capability
614   received.
615 */
616 typedef struct {
617     /* 1 - Wifi Direct supported 0 - Not supported */
618     u8 is_wfd_supported;
619     /* 1 - Wifi Direct Services supported 0 - Not supported */
620     u8 is_wfds_supported;
621     /* 1 - TDLS supported 0 - Not supported */
622     u8 is_tdls_supported;
623     /* 1 - IBSS supported 0 - Not supported */
624     u8 is_ibss_supported;
625     /* 1 - Mesh supported 0 - Not supported */
626     u8 is_mesh_supported;
627     /*
628        1 - NAN Device currently connect to WLAN Infra AP
629        0 - otherwise
630     */
631     u8 wlan_infra_field;
632 } NanReceivePostConnectivityCapability;
633 
634 /*
635   Indicates the availability interval duration associated with the
636   Availability Intervals Bitmap field
637 */
638 typedef enum {
639     NAN_DURATION_16MS = 0,
640     NAN_DURATION_32MS = 1,
641     NAN_DURATION_64MS = 2
642 } NanAvailDuration;
643 
644 /* Further availability per channel information */
645 typedef struct {
646     /* Defined above */
647     NanAvailDuration entry_control;
648     /*
649        1 byte field indicating the frequency band the NAN Device
650        will be available as defined in IEEE Std. 802.11-2012
651        Annex E Table E-4 Global Operating Classes
652     */
653     u8 class_val;
654     /*
655        1 byte field indicating the channel the NAN Device
656        will be available.
657     */
658     u8 channel;
659     /*
660         Map Id - 4 bit field which identifies the Further
661         availability map attribute.
662     */
663     u8 mapid;
664     /*
665        divides the time between the beginnings of consecutive Discovery
666        Windows of a given NAN cluster into consecutive time intervals
667        of equal durations. The time interval duration is specified by
668        the Availability Interval Duration subfield of the Entry Control
669        field.
670 
671        A Nan device that sets the i-th bit of the Availability
672        Intervals Bitmap to 1 shall be present during the corresponding
673        i-th time interval in the operation channel indicated by the
674        Operating Class and Channel Number fields in the same Availability Entry.
675 
676        A Nan device that sets the i-th bit of the Availability Intervals Bitmap to
677        0 may be present during the corresponding i-th time interval in the operation
678        channel indicated by the Operating Class and Channel Number fields in the same
679        Availability Entry.
680 
681        The size of the Bitmap is dependent upon the Availability Interval Duration
682        chosen in the Entry Control Field.  The size can be either 1, 2 or 4 bytes long
683 
684        - Duration field is equal to 0, only AIB[0] is valid
685        - Duration field is equal to 1, only AIB [0] and AIB [1] is valid
686        - Duration field is equal to 2, AIB [0], AIB [1], AIB [2] and AIB [3] are valid
687     */
688     u32 avail_interval_bitmap;
689 } NanFurtherAvailabilityChannel;
690 
691 /*
692   Further availability map which can be sent and received from
693   Discovery engine
694 */
695 typedef struct {
696     /*
697        Number of channels indicates the number of channel
698        entries which is part of fam
699     */
700     u8 numchans;
701     NanFurtherAvailabilityChannel famchan[NAN_MAX_FAM_CHANNELS];
702 } NanFurtherAvailabilityMap;
703 
704 /*
705   Host can send Post-Nan Discovery attributes which the Discovery Engine can
706   enclose in Service Discovery frames
707 */
708 /* Possible connection types in Post NAN Discovery attributes */
709 typedef enum {
710     NAN_CONN_WLAN_INFRA = 0,
711     NAN_CONN_P2P_OPER = 1,
712     NAN_CONN_WLAN_IBSS = 2,
713     NAN_CONN_WLAN_MESH = 3,
714     NAN_CONN_FURTHER_SERVICE_AVAILABILITY = 4,
715     NAN_CONN_WLAN_RANGING = 5
716 } NanConnectionType;
717 
718 /* Possible device roles in Post NAN Discovery attributes */
719 typedef enum {
720     NAN_WLAN_INFRA_AP = 0,
721     NAN_WLAN_INFRA_STA = 1,
722     NAN_P2P_OPER_GO = 2,
723     NAN_P2P_OPER_DEV = 3,
724     NAN_P2P_OPER_CLI = 4
725 } NanDeviceRole;
726 
727 /* Configuration params of NAN Ranging */
728 typedef struct {
729     /*
730       Interval in milli sec between two ranging measurements.
731       If the Awake DW intervals in NanEnable/Config are larger
732       than the ranging intervals priority is given to Awake DW
733       Intervals. Only on a match the ranging is initiated for the
734       peer
735     */
736     u32 ranging_interval_msec;
737     /*
738       Flags indicating the type of ranging event to be notified
739       NAN_RANGING_INDICATE_ MASKS are used to set these.
740       BIT0 - Continuous Ranging event notification.
741       BIT1 - Ingress distance is <=.
742       BIT2 - Egress distance is >=.
743     */
744     u32 config_ranging_indications;
745     /* Ingress distance in millimeters (optional) */
746     u32 distance_ingress_mm;
747     /* Egress distance in millmilliimeters (optional) */
748     u32 distance_egress_mm;
749 } NanRangingCfg;
750 
751 /* NAN Ranging request's response */
752 typedef struct {
753     /* Publish Id of an earlier Publisher */
754     u16 publish_id;
755     /*
756        A 32 bit Requestor instance Id which is sent to the Application.
757        This Id will be used in subsequent RangeResponse on Subscribe side.
758     */
759     u32 requestor_instance_id;
760     /* Peer MAC addr of Range Requestor */
761     u8 peer_addr[NAN_MAC_ADDR_LEN];
762     /* Response indicating ACCEPT/REJECT/CANCEL of Range Request */
763     NanRangeResponse ranging_response;
764 } NanRangeResponseCfg;
765 
766 /* Structure of Post NAN Discovery attribute */
767 typedef struct {
768     /* Connection type of the host */
769     NanConnectionType  type;
770     /*
771        Device role of the host based on
772        the connection type
773     */
774     NanDeviceRole role;
775     /*
776        Flag to send the information as a single shot or repeated
777        for next 16 discovery windows
778        0 - Single_shot
779        1 - next 16 discovery windows
780     */
781     u8 transmit_freq;
782     /* Duration of the availability bitmask */
783     NanAvailDuration duration;
784     /* Availability interval bitmap based on duration */
785     u32 avail_interval_bitmap;
786     /*
787        Mac address depending on the conn type and device role
788        --------------------------------------------------
789        | Conn Type  |  Device Role |  Mac address Usage  |
790        --------------------------------------------------
791        | WLAN_INFRA |  AP/STA      |   BSSID of the AP   |
792        --------------------------------------------------
793        | P2P_OPER   |  GO          |   GO's address      |
794        --------------------------------------------------
795        | P2P_OPER   |  P2P_DEVICE  |   Address of who    |
796        |            |              |   would become GO   |
797        --------------------------------------------------
798        | WLAN_IBSS  |  NA          |   BSSID             |
799        --------------------------------------------------
800        | WLAN_MESH  |  NA          |   BSSID             |
801        --------------------------------------------------
802     */
803     u8 addr[NAN_MAC_ADDR_LEN];
804     /*
805        Mandatory mesh id value if connection type is WLAN_MESH
806        Mesh id contains 0-32 octet identifier and should be
807        as per IEEE Std.802.11-2012 spec.
808     */
809     u16 mesh_id_len;
810     u8 mesh_id[NAN_MAX_MESH_DATA_LEN];
811     /*
812        Optional infrastructure SSID if conn_type is set to
813        NAN_CONN_WLAN_INFRA
814     */
815     u16 infrastructure_ssid_len;
816     u8 infrastructure_ssid_val[NAN_MAX_INFRA_DATA_LEN];
817 } NanTransmitPostDiscovery;
818 
819 /*
820    Discovery engine providing the structure of Post NAN
821    Discovery
822 */
823 typedef struct {
824     /* Connection type of the host */
825     NanConnectionType  type;
826     /*
827        Device role of the host based on
828        the connection type
829     */
830     NanDeviceRole role;
831     /* Duration of the availability bitmask */
832     NanAvailDuration duration;
833     /* Availability interval bitmap based on duration */
834     u32 avail_interval_bitmap;
835     /*
836        Map Id - 4 bit field which identifies the Further
837        availability map attribute.
838     */
839     u8 mapid;
840     /*
841        Mac address depending on the conn type and device role
842        --------------------------------------------------
843        | Conn Type  |  Device Role |  Mac address Usage  |
844        --------------------------------------------------
845        | WLAN_INFRA |  AP/STA      |   BSSID of the AP   |
846        --------------------------------------------------
847        | P2P_OPER   |  GO          |   GO's address      |
848        --------------------------------------------------
849        | P2P_OPER   |  P2P_DEVICE  |   Address of who    |
850        |            |              |   would become GO   |
851        --------------------------------------------------
852        | WLAN_IBSS  |  NA          |   BSSID             |
853        --------------------------------------------------
854        | WLAN_MESH  |  NA          |   BSSID             |
855        --------------------------------------------------
856     */
857     u8 addr[NAN_MAC_ADDR_LEN];
858     /*
859        Mandatory mesh id value if connection type is WLAN_MESH
860        Mesh id contains 0-32 octet identifier and should be
861        as per IEEE Std.802.11-2012 spec.
862     */
863     u16 mesh_id_len;
864     u8 mesh_id[NAN_MAX_MESH_DATA_LEN];
865     /*
866        Optional infrastructure SSID if conn_type is set to
867        NAN_CONN_WLAN_INFRA
868     */
869     u16 infrastructure_ssid_len;
870     u8 infrastructure_ssid_val[NAN_MAX_INFRA_DATA_LEN];
871 } NanReceivePostDiscovery;
872 
873 /*
874    NAN device level configuration of SDF and Sync beacons in both
875    2.4/5GHz bands
876 */
877 typedef struct {
878     /* Configure 2.4GHz DW Band */
879     u8 config_2dot4g_dw_band;
880     /*
881        Indicates the interval for Sync beacons and SDF's in 2.4GHz band.
882        Valid values of DW Interval are: 1, 2, 3, 4 and 5, 0 is reserved.
883        The SDF includes in OTA when enabled. The publish/subscribe period
884        values don't override the device level configurations.
885     */
886     u32 dw_2dot4g_interval_val; // default value 1
887     /* Configure 5GHz DW Band */
888     u8 config_5g_dw_band;
889     /*
890        Indicates the interval for Sync beacons and SDF's in 5GHz band
891        Valid values of DW Interval are: 1, 2, 3, 4 and 5, 0 no wake up for
892        any interval. The SDF includes in OTA when enabled. The publish/subscribe
893        period values don't override the device level configurations.
894     */
895     u32 dw_5g_interval_val; // default value 1 when 5G is enabled
896 } NanConfigDW;
897 
898 /*
899   Enable Request Message Structure
900   The NanEnableReq message instructs the Discovery Engine to enter an operational state
901 */
902 typedef struct {
903     /* Mandatory parameters below */
904     u8 master_pref; // default value 0x02
905     /*
906       A cluster_low value matching cluster_high indicates a request to join
907       a cluster with that value. If the requested cluster is not found the
908       device will start its own cluster.
909     */
910     u16 cluster_low; // default value 0
911     u16 cluster_high; // default value 0xFFFF
912 
913     /*
914       Optional configuration of Enable request.
915       Each of the optional parameters have configure flag which
916       determine whether configuration is to be passed or not.
917     */
918     u8 config_support_5g;
919     u8 support_5g_val; // default value 0; turned off by default
920     /*
921        BIT 0 is used to specify to include Service IDs in Sync/Discovery beacons
922        0 - Do not include SIDs in any beacons
923        1 - Include SIDs in all beacons.
924        Rest 7 bits are count field which allows control over the number of SIDs
925        included in the Beacon.  0 means to include as many SIDs that fit into
926        the maximum allow Beacon frame size
927     */
928     u8 config_sid_beacon;
929     u8 sid_beacon_val; // default value 0x01
930     /*
931        The rssi values below should be specified without sign.
932        For eg: -70dBm should be specified as 70.
933     */
934     u8 config_2dot4g_rssi_close;
935     u8 rssi_close_2dot4g_val;    // default value -60 dBm
936 
937     u8 config_2dot4g_rssi_middle;
938     u8 rssi_middle_2dot4g_val;    // default value -70 dBm
939 
940     u8 config_2dot4g_rssi_proximity;
941     u8 rssi_proximity_2dot4g_val;//  default value -60dBm
942 
943     u8 config_hop_count_limit;
944     u8 hop_count_limit_val; //  default value 0x02
945 
946     /*
947        Defines 2.4G channel access support
948        0 - No Support
949        1 - Supported
950     */
951     u8 config_2dot4g_support;
952     u8 support_2dot4g_val; // default value 0x01
953     /*
954        Defines 2.4G channels will be used for sync/discovery beacons
955        0 - 2.4G channels not used for beacons
956        1 - 2.4G channels used for beacons
957     */
958     u8 config_2dot4g_beacons;
959     u8 beacon_2dot4g_val; // default value 1
960     /*
961        Defines 2.4G channels will be used for Service Discovery frames
962        0 - 2.4G channels not used for Service Discovery frames
963        1 - 2.4G channels used for Service Discovery frames
964     */
965     u8 config_2dot4g_sdf;
966     u8 sdf_2dot4g_val; // default value 1
967     /*
968        Defines 5G channels will be used for sync/discovery beacons
969        0 - 5G channels not used for beacons
970        1 - 5G channels used for beacons
971     */
972     u8 config_5g_beacons;
973     u8 beacon_5g_val; // default value 1 when 5G is enabled
974     /*
975        Defines 5G channels will be used for Service Discovery frames
976        0 - 5G channels not used for Service Discovery frames
977        1 - 5G channels used for Service Discovery frames
978     */
979     u8 config_5g_sdf;
980     u8 sdf_5g_val; // default value is 0 when 5G is enabled
981     /*
982        1 byte value which defines the RSSI in
983        dBm for a close by Peer in 5 Ghz channels.
984        The rssi values should be specified without sign.
985        For eg: -70dBm should be specified as 70.
986     */
987     u8 config_5g_rssi_close;
988     u8 rssi_close_5g_val; // default value -60dBm when 5G is enabled
989     /*
990        1 byte value which defines the RSSI value in
991        dBm for a close by Peer in 5 Ghz channels.
992        The rssi values should be specified without sign.
993        For eg: -70dBm should be specified as 70.
994     */
995     u8 config_5g_rssi_middle;
996     u8 rssi_middle_5g_val; // default value -75dBm when 5G is enabled
997     /*
998        1 byte value which defines the RSSI filter
999        threshold.  Any Service Descriptors received above this
1000        value that are configured for RSSI filtering will be dropped.
1001        The rssi values should be specified without sign.
1002        For eg: -70dBm should be specified as 70.
1003     */
1004     u8 config_5g_rssi_close_proximity;
1005     u8 rssi_close_proximity_5g_val; // default value -60dBm when 5G is enabled
1006     /*
1007        1 byte quantity which defines the window size over
1008        which the “average RSSI” will be calculated over.
1009     */
1010     u8 config_rssi_window_size;
1011     u8 rssi_window_size_val; // default value 0x08
1012     /*
1013        The 24 bit Organizationally Unique ID + the 8 bit Network Id.
1014     */
1015     u8 config_oui;
1016     u32 oui_val; // default value {0x51, 0x6F, 0x9A, 0x01, 0x00, 0x00}
1017     /*
1018        NAN Interface Address, If not configured the Discovery Engine
1019        will generate a 6 byte Random MAC.
1020     */
1021     u8 config_intf_addr;
1022     u8 intf_addr_val[NAN_MAC_ADDR_LEN];
1023     /*
1024        If set to 1, the Discovery Engine will enclose the Cluster
1025        Attribute only sent in Beacons in a Vendor Specific Attribute
1026        and transmit in a Service Descriptor Frame.
1027     */
1028     u8 config_cluster_attribute_val;
1029     /*
1030        The periodicity in seconds between full scan’s to find any new
1031        clusters available in the area.  A Full scan should not be done
1032        more than every 10 seconds and should not be done less than every
1033        30 seconds.
1034     */
1035     u8 config_scan_params;
1036     NanSocialChannelScanParams scan_params_val;
1037     /*
1038        1 byte quantity which forces the Random Factor to a particular
1039        value for all transmitted Sync/Discovery beacons
1040     */
1041     u8 config_random_factor_force;
1042     u8 random_factor_force_val; // default value off and set to 0x00
1043     /*
1044        1 byte quantity which forces the HC for all transmitted Sync and
1045        Discovery Beacon NO matter the real HC being received over the
1046        air.
1047     */
1048     u8 config_hop_count_force;
1049     u8 hop_count_force_val; // default value 0x00
1050 
1051     /* channel frequency in MHz to enable Nan on */
1052     u8 config_24g_channel;
1053     wifi_channel channel_24g_val; // default value channel 0x6
1054 
1055     u8 config_5g_channel;
1056     wifi_channel channel_5g_val; // default value channel 44 or 149 regulatory
1057                                  // domain
1058     /* Configure 2.4/5GHz DW */
1059     NanConfigDW config_dw;
1060 
1061     /*
1062        By default discovery MAC address randomization is enabled
1063        and default interval value is 30 minutes i.e. 1800 seconds.
1064        The value 0 is used to disable MAC addr randomization.
1065     */
1066     u8 config_disc_mac_addr_randomization;
1067     u32 disc_mac_addr_rand_interval_sec; // default value 1800 sec
1068 
1069     /*
1070       Set/Enable corresponding bits to disable Discovery indications:
1071       BIT0 - Disable Discovery MAC Address Event.
1072       BIT1 - Disable Started Cluster Event.
1073       BIT2 - Disable Joined Cluster Event.
1074     */
1075     u8 discovery_indication_cfg;  // default value 0x0
1076     /*
1077        BIT 0 is used to specify to include Service IDs in Sync/Discovery beacons
1078        0 - Do not include SIDs in any beacons
1079        1 - Include SIDs in all beacons.
1080        Rest 7 bits are count field which allows control over the number of SIDs
1081        included in the Beacon.  0 means to include as many SIDs that fit into
1082        the maximum allow Beacon frame size
1083     */
1084     u8 config_subscribe_sid_beacon;
1085     u32 subscribe_sid_beacon_val; // default value 0x0
1086     /*
1087        Discovery Beacon Interval config.
1088        Default value is 128 msec in 2G DW and 176 msec in 2G/5G DW.
1089        When 0 value is passed it is reset to default value of 128 or 176 msec.
1090     */
1091     u8 config_discovery_beacon_int;
1092     u32 discovery_beacon_interval;
1093     /*
1094        Enable Number of Spatial Streams.
1095        This is NAN Power Optimization feature for NAN discovery.
1096     */
1097     u8 config_nss;
1098     // default value is implementation specific and passing 0 sets it to default
1099     u32 nss;
1100     /*
1101        Enable device level NAN Ranging feature.
1102        0 - Disable
1103        1 - Enable
1104     */
1105     u8 config_enable_ranging;
1106     u32 enable_ranging;
1107     /*
1108        Enable/Disable DW Early termination.
1109        0 - Disable
1110        1 - Enable
1111     */
1112     u8 config_dw_early_termination;
1113     u32 enable_dw_termination;
1114     /*
1115        Indicate whether to use NDPE attribute to bring-up TCP/IP connection.
1116        If config_ndpe_attr is not configured, the default behavior is
1117        not using NDPE attr, and the capability is not advertised.
1118        0 - Not use
1119        1 - Use
1120     */
1121     u8 config_ndpe_attr;
1122     u32 use_ndpe_attr;
1123     /*
1124         Enable NAN v3.1 instant communication mode.
1125         0 - Disable
1126         1 - Enable
1127     */
1128     u8 config_enable_instant_mode;
1129     u32 enable_instant_mode;
1130     /*
1131         Config NAN v3.1 instant communication channel frequency selected over NFC/OOB method.
1132         If dual band is supported default channel is 149 or 44 as per regulatory domain,
1133         else channel 6 (send frequency in MHz).
1134         Sometimes depending on country code retrictions, even 149/44 may be restricted
1135         in those cases instant channel will be operational only in 2.4GHz.
1136         Use wifi_get_usable_channels() API to get supported bands/channels before
1137         Instant mode NFC handshake is triggered
1138     */
1139     u8 config_instant_mode_channel;
1140     wifi_channel instant_mode_channel;
1141 
1142     /*
1143        Enable/Disable unsync service discovery.
1144        0 - Disable
1145        1 - Enable
1146     */
1147     u8 config_unsync_srvdsc;
1148     u8 enable_unsync_srvdsc;
1149 
1150     /*
1151       Configure regulatory information.
1152     */
1153     u8 config_reg_info;
1154     u8 reg_info_val;
1155 } NanEnableRequest;
1156 
1157 /*
1158   NAN pairing config.
1159 */
1160 typedef struct {
1161 
1162     /*
1163       Enable Nan pairing setup
1164     */
1165     u32 enable_pairing_setup;
1166 
1167     /*
1168       Enable cache NIK/NPK after Nan pairing setup
1169     */
1170     u32 enable_pairing_cache;
1171 
1172     /*
1173       Enable Nan pairing verification with cached NIK/NPK
1174     */
1175     u32 enable_pairing_verification;
1176 
1177     /*
1178       The set of supported bootstrapping methods.
1179     */
1180     u16 supported_bootstrapping_methods;
1181 } NanPairingConfig;
1182 
1183 /*
1184   Publish Msg Structure
1185   Message is used to request the DE to publish the Service Name
1186   using the parameters passed into the Discovery Window
1187 */
1188 typedef struct {
1189     u16 publish_id;/* id  0 means new publish, any other id is existing publish */
1190     u16 ttl; /* how many seconds to run for. 0 means forever until canceled */
1191     /*
1192        period: Awake DW Interval for publish(service)
1193        Indicates the interval between two Discovery Windows in which
1194        the device supporting the service is awake to transmit or
1195        receive the Service Discovery frames.
1196        Valid values of Awake DW Interval are: 1, 2, 4, 8 and 16, value 0 will
1197        default to 1.
1198     */
1199     u16 period;
1200     NanPublishType publish_type;/* 0= unsolicited, solicited = 1, 2= both */
1201     NanTxType tx_type; /* 0 = broadcast, 1= unicast  if solicited publish */
1202     u8 publish_count; /* number of OTA Publish, 0 means forever until canceled */
1203     u16 service_name_len; /* length of service name */
1204     u8 service_name[NAN_MAX_SERVICE_NAME_LEN];/* UTF-8 encoded string identifying the service */
1205     /*
1206        Field which specifies how the matching indication to host is controlled.
1207        0 - Match and Indicate Once
1208        1 - Match and Indicate continuous
1209        2 - Match and Indicate never. This means don't indicate the match to the host.
1210        3 - Reserved
1211     */
1212     NanMatchAlg publish_match_indicator;
1213 
1214     /*
1215        Sequence of values
1216        NAN Device that has invoked a Subscribe method corresponding to this Publish method
1217     */
1218     u16 service_specific_info_len;
1219     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
1220 
1221     /*
1222        Ordered sequence of <length, value> pairs which specify further response conditions
1223        beyond the service name used to filter subscribe messages to respond to.
1224        This is only needed when the PT is set to NAN_SOLICITED or NAN_SOLICITED_UNSOLICITED.
1225     */
1226     u16 rx_match_filter_len;
1227     u8 rx_match_filter[NAN_MAX_MATCH_FILTER_LEN];
1228 
1229     /*
1230        Ordered sequence of <length, value> pairs to be included in the Discovery Frame.
1231        If present it is always sent in a Discovery Frame
1232     */
1233     u16 tx_match_filter_len;
1234     u8 tx_match_filter[NAN_MAX_MATCH_FILTER_LEN];
1235 
1236     /*
1237        flag which specifies that the Publish should use the configured RSSI
1238        threshold and the received RSSI in order to filter requests
1239        0 – ignore the configured RSSI threshold when running a Service
1240            Descriptor attribute or Service ID List Attribute through the DE matching logic.
1241        1 – use the configured RSSI threshold when running a Service
1242            Descriptor attribute or Service ID List Attribute through the DE matching logic.
1243 
1244     */
1245     u8 rssi_threshold_flag;
1246 
1247     /*
1248        8-bit bitmap which allows the Host to associate this publish
1249        with a particular Post-NAN Connectivity attribute
1250        which has been sent down in a NanConfigureRequest/NanEnableRequest
1251        message.  If the DE fails to find a configured Post-NAN
1252        connectivity attributes referenced by the bitmap,
1253        the DE will return an error code to the Host.
1254        If the Publish is configured to use a Post-NAN Connectivity
1255        attribute and the Host does not refresh the Post-NAN Connectivity
1256        attribute the Publish will be canceled and the Host will be sent
1257        a PublishTerminatedIndication message.
1258     */
1259     u8 connmap;
1260     /*
1261       Set/Enable corresponding bits to disable any indications that follow a publish.
1262       BIT0 - Disable publish termination indication.
1263       BIT1 - Disable match expired indication.
1264       BIT2 - Disable followUp indication received (OTA).
1265       BIT3 - Disable publishReplied indication.
1266     */
1267     u8 recv_indication_cfg;
1268     /*
1269       Nan accept policy for the specific service(publish)
1270     */
1271     NanServiceAcceptPolicy service_responder_policy;
1272     /* NAN Cipher Suite Type */
1273     u32 cipher_type;
1274     /*
1275        Nan Security Key Info is optional in Discovery phase.
1276        PMK or passphrase info can be passed during
1277        the NDP session.
1278     */
1279     NanSecurityKeyInfo key_info;
1280 
1281     /* Security Context Identifiers length */
1282     u32 scid_len;
1283     /*
1284        Security Context Identifier attribute contains PMKID
1285        shall be included in NDP setup and response messages.
1286        Security Context Identifier, Identifies the Security
1287        Context. For NAN Shared Key Cipher Suite, this field
1288        contains the 16 octet PMKID identifying the PMK used
1289        for setting up the Secure Data Path.
1290     */
1291     u8 scid[NAN_MAX_SCID_BUF_LEN];
1292 
1293     /* NAN configure service discovery extended attributes */
1294     NanSdeaCtrlParams sdea_params;
1295 
1296     /* NAN Ranging configuration */
1297     NanRangingCfg ranging_cfg;
1298 
1299     /* Enable/disable NAN serivce Ranging auto response mode */
1300     NanRangingAutoResponse ranging_auto_response;
1301 
1302     /*
1303       When the ranging_auto_response_cfg is not set, NanRangeRequestInd is
1304       received. Nan Range Response to Peer MAC Addr is notified to indicate
1305       ACCEPT/REJECT/CANCEL to the requestor.
1306     */
1307     NanRangeResponseCfg range_response_cfg;
1308 
1309     /*
1310        Sequence of values indicating the service specific info in SDEA
1311     */
1312     u16 sdea_service_specific_info_len;
1313     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
1314 
1315     /*
1316        The Identity key for pairing, used to generate NIRA
1317     */
1318     u8 nan_identity_key[NAN_IDENTITY_KEY_LEN];
1319 
1320     /*
1321       The config for Nan pairing
1322     */
1323     NanPairingConfig nan_pairing_config;
1324 
1325     /*
1326       Specifies whether suspension can be possible in this publish session.
1327       The request would fail if enable_suspendability is true but
1328       is_suspension_supported is false in NanCapabilities.
1329     */
1330     bool enable_suspendability;
1331 
1332     /* s3 capabilities */
1333     u16 s3_capabilities;
1334 
1335     /* cipher capabilities */
1336     u8 cipher_capabilities;
1337 } NanPublishRequest;
1338 
1339 /*
1340   Publish Cancel Msg Structure
1341   The PublishServiceCancelReq Message is used to request the DE to stop publishing
1342   the Service Name identified by the Publish Id in the message.
1343 */
1344 typedef struct {
1345     u16 publish_id;
1346 } NanPublishCancelRequest;
1347 
1348 /*
1349   NAN Subscribe Structure
1350   The SubscribeServiceReq message is sent to the Discovery Engine
1351   whenever the Upper layers would like to listen for a Service Name
1352 */
1353 typedef struct {
1354     u16 subscribe_id; /* id 0 means new subscribe, non zero is existing subscribe */
1355     u16 ttl; /* how many seconds to run for. 0 means forever until canceled */
1356     /*
1357        period: Awake DW Interval for subscribe(service)
1358        Indicates the interval between two Discovery Windows in which
1359        the device supporting the service is awake to transmit or
1360        receive the Service Discovery frames.
1361        Valid values of Awake DW Interval are: 1, 2, 4, 8 and 16, value 0 will
1362        default to 1.
1363     */
1364     u16 period;
1365 
1366     /* Flag which specifies how the Subscribe request shall be processed. */
1367     NanSubscribeType subscribe_type; /* 0 - PASSIVE , 1- ACTIVE */
1368 
1369     /* Flag which specifies on Active Subscribes how the Service Response Filter attribute is populated.*/
1370     NanSRFType serviceResponseFilter; /* 0 - Bloom Filter, 1 - MAC Addr */
1371 
1372     /* Flag which specifies how the Service Response Filter Include bit is populated.*/
1373     NanSRFIncludeType serviceResponseInclude; /* 0=Do not respond if in the Address Set, 1= Respond */
1374 
1375     /* Flag which specifies if the Service Response Filter should be used when creating Subscribes.*/
1376     NanSRFState useServiceResponseFilter; /* 0=Do not send the Service Response Filter,1= send */
1377 
1378     /*
1379        Flag which specifies if the Service Specific Info is needed in
1380        the Publish message before creating the MatchIndication
1381     */
1382     NanSsiInMatchInd ssiRequiredForMatchIndication; /* 0=Not needed, 1= Required */
1383 
1384     /*
1385        Field which specifies how the matching indication to host is controlled.
1386        0 - Match and Indicate Once
1387        1 - Match and Indicate continuous
1388        2 - Match and Indicate never. This means don't indicate the match to the host.
1389        3 - Reserved
1390     */
1391     NanMatchAlg subscribe_match_indicator;
1392 
1393     /*
1394        The number of Subscribe Matches which should occur
1395        before the Subscribe request is automatically terminated.
1396     */
1397     u8 subscribe_count; /* If this value is 0 this field is not used by the DE.*/
1398 
1399     u16 service_name_len;/* length of service name */
1400     u8 service_name[NAN_MAX_SERVICE_NAME_LEN]; /* UTF-8 encoded string identifying the service */
1401 
1402     /* Sequence of values which further specify the published service beyond the service name*/
1403     u16 service_specific_info_len;
1404     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
1405 
1406     /*
1407        Ordered sequence of <length, value> pairs used to filter out received publish discovery messages.
1408        This can be sent both for a Passive or an Active Subscribe
1409     */
1410     u16 rx_match_filter_len;
1411     u8 rx_match_filter[NAN_MAX_MATCH_FILTER_LEN];
1412 
1413     /*
1414        Ordered sequence of <length, value> pairs  included in the
1415        Discovery Frame when an Active Subscribe is used.
1416     */
1417     u16 tx_match_filter_len;
1418     u8 tx_match_filter[NAN_MAX_MATCH_FILTER_LEN];
1419 
1420     /*
1421        Flag which specifies that the Subscribe should use the configured RSSI
1422        threshold and the received RSSI in order to filter requests
1423        0 – ignore the configured RSSI threshold when running a Service
1424            Descriptor attribute or Service ID List Attribute through the DE matching logic.
1425        1 – use the configured RSSI threshold when running a Service
1426            Descriptor attribute or Service ID List Attribute through the DE matching logic.
1427 
1428     */
1429     u8 rssi_threshold_flag;
1430 
1431     /*
1432        8-bit bitmap which allows the Host to associate this Active
1433        Subscribe with a particular Post-NAN Connectivity attribute
1434        which has been sent down in a NanConfigureRequest/NanEnableRequest
1435        message.  If the DE fails to find a configured Post-NAN
1436        connectivity attributes referenced by the bitmap,
1437        the DE will return an error code to the Host.
1438        If the Subscribe is configured to use a Post-NAN Connectivity
1439        attribute and the Host does not refresh the Post-NAN Connectivity
1440        attribute the Subscribe will be canceled and the Host will be sent
1441        a SubscribeTerminatedIndication message.
1442     */
1443     u8 connmap;
1444     /*
1445        NAN Interface Address, conforming to the format as described in
1446        8.2.4.3.2 of IEEE Std. 802.11-2012.
1447     */
1448     u8 num_intf_addr_present;
1449     u8 intf_addr[NAN_MAX_SUBSCRIBE_MAX_ADDRESS][NAN_MAC_ADDR_LEN];
1450     /*
1451       Set/Enable corresponding bits to disable indications that follow a subscribe.
1452       BIT0 - Disable subscribe termination indication.
1453       BIT1 - Disable match expired indication.
1454       BIT2 - Disable followUp indication received (OTA).
1455     */
1456     u8 recv_indication_cfg;
1457 
1458     /* NAN Cipher Suite Type */
1459     u32 cipher_type;
1460     /*
1461        Nan Security Key Info is optional in Discovery phase.
1462        PMK or passphrase info can be passed during
1463        the NDP session.
1464     */
1465     NanSecurityKeyInfo key_info;
1466 
1467     /* Security Context Identifiers length */
1468     u32 scid_len;
1469     /*
1470        Security Context Identifier attribute contains PMKID
1471        shall be included in NDP setup and response messages.
1472        Security Context Identifier, Identifies the Security
1473        Context. For NAN Shared Key Cipher Suite, this field
1474        contains the 16 octet PMKID identifying the PMK used
1475        for setting up the Secure Data Path.
1476     */
1477     u8 scid[NAN_MAX_SCID_BUF_LEN];
1478 
1479     /* NAN configure service discovery extended attributes */
1480     NanSdeaCtrlParams sdea_params;
1481 
1482     /* NAN Ranging configuration */
1483     NanRangingCfg ranging_cfg;
1484 
1485     /* Enable/disable NAN serivce Ranging auto response mode */
1486     NanRangingAutoResponse ranging_auto_response;
1487 
1488     /*
1489       When the ranging_auto_response_cfg is not set, NanRangeRequestInd is
1490       received. Nan Range Response to Peer MAC Addr is notified to indicate
1491       ACCEPT/REJECT/CANCEL to the requestor.
1492     */
1493     NanRangeResponseCfg range_response_cfg;
1494 
1495     /*
1496        Sequence of values indicating the service specific info in SDEA
1497     */
1498     u16 sdea_service_specific_info_len;
1499     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
1500     /*
1501        The Identity key for pairing, used to generate NIRA
1502     */
1503     u8 nan_identity_key[NAN_IDENTITY_KEY_LEN];
1504 
1505     /*
1506       The config for Nan pairing
1507     */
1508     NanPairingConfig nan_pairing_config;
1509 
1510     /*
1511       Specifies whether suspension can be possible in this subscribe session.
1512       The request would fail if enable_suspendability is true but
1513       is_suspension_supported is false in NanCapabilities.
1514     */
1515     bool enable_suspendability;
1516 
1517     /* cipher capabilities */
1518     u8 cipher_capabilities;
1519 } NanSubscribeRequest;
1520 
1521 /*
1522   NAN Subscribe Cancel Structure
1523   The SubscribeCancelReq Message is used to request the DE to stop looking for the Service Name.
1524 */
1525 typedef struct {
1526     u16 subscribe_id;
1527 } NanSubscribeCancelRequest;
1528 
1529 /*
1530   Transmit follow up Structure
1531   The TransmitFollowupReq message is sent to the DE to allow the sending of the Service_Specific_Info
1532   to a particular MAC address.
1533 */
1534 typedef struct {
1535     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
1536     u16 publish_subscribe_id;
1537 
1538     /*
1539        This Id is the Requestor Instance that is passed as
1540        part of earlier MatchInd/FollowupInd message.
1541     */
1542     u32 requestor_instance_id;
1543     u8 addr[NAN_MAC_ADDR_LEN]; /* Unicast address */
1544     NanTxPriority priority; /* priority of the request 2=high */
1545     NanTransmitWindowType dw_or_faw; /* 0= send in a DW, 1=send in FAW */
1546 
1547     /*
1548        Sequence of values which further specify the published service beyond
1549        the service name.
1550     */
1551     u16 service_specific_info_len;
1552     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
1553     /*
1554       Set/Enable corresponding bits to disable responses after followUp.
1555       BIT0 - Disable followUp response from FW.
1556     */
1557     u8 recv_indication_cfg;
1558 
1559     /*
1560        Sequence of values indicating the service specific info in SDEA
1561     */
1562     u16 sdea_service_specific_info_len;
1563     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
1564 
1565     /*
1566        Add shared key descriptor attribute to the Followup request when the
1567        flag is set
1568     */
1569     u8 shared_key_desc_flag;
1570 } NanTransmitFollowupRequest;
1571 
1572 /*
1573   Stats Request structure
1574   The Discovery Engine can be queried at runtime by the Host processor for statistics
1575   concerning various parts of the Discovery Engine.
1576 */
1577 typedef struct {
1578     NanStatsType stats_type; /* NAN Statistics Request Type */
1579     u8 clear; /* 0= Do not clear the stats and return the current contents , 1= Clear the associated stats  */
1580 } NanStatsRequest;
1581 
1582 /*
1583   Suspend Request Structure
1584   The SuspendRequest message is used to request that the specified session is suspended.
1585   The session can be resumed using the NanResumeRequest message.
1586 */
1587 typedef struct {
1588     u16 publish_subscribe_id;
1589 } NanSuspendRequest;
1590 
1591 /*
1592   Resume Request Structure
1593   The ResumeRequest message is used to request that the specified session is resumed.
1594 */
1595 typedef struct {
1596     u16 publish_subscribe_id;
1597 } NanResumeRequest;
1598 
1599 /*
1600   Config Structure
1601   The NanConfigurationReq message is sent by the Host to the
1602   Discovery Engine in order to configure the Discovery Engine during runtime.
1603 */
1604 typedef struct {
1605     u8 config_sid_beacon;
1606     u8 sid_beacon;
1607     u8 config_rssi_proximity;
1608     u8 rssi_proximity; // default value -60dBm
1609     u8 config_master_pref;
1610     u8 master_pref; // default value 0x02
1611     /*
1612        1 byte value which defines the RSSI filter threshold.
1613        Any Service Descriptors received above this value
1614        that are configured for RSSI filtering will be dropped.
1615        The rssi values should be specified without sign.
1616        For eg: -70dBm should be specified as 70.
1617     */
1618     u8 config_5g_rssi_close_proximity;
1619     u8 rssi_close_proximity_5g_val;  // default value -60dBm
1620     /*
1621       Optional configuration of Configure request.
1622       Each of the optional parameters have configure flag which
1623       determine whether configuration is to be passed or not.
1624     */
1625     /*
1626        1 byte quantity which defines the window size over
1627        which the “average RSSI” will be calculated over.
1628     */
1629     u8 config_rssi_window_size;
1630     u8 rssi_window_size_val; // default value 0x08
1631     /*
1632        If set to 1, the Discovery Engine will enclose the Cluster
1633        Attribute only sent in Beacons in a Vendor Specific Attribute
1634        and transmit in a Service Descriptor Frame.
1635     */
1636     u8 config_cluster_attribute_val;
1637     /*
1638       The periodicity in seconds between full scan’s to find any new
1639       clusters available in the area.  A Full scan should not be done
1640       more than every 10 seconds and should not be done less than every
1641       30 seconds.
1642     */
1643     u8 config_scan_params;
1644     NanSocialChannelScanParams scan_params_val;
1645     /*
1646        1 byte quantity which forces the Random Factor to a particular
1647        value for all transmitted Sync/Discovery beacons
1648     */
1649     u8 config_random_factor_force;
1650     u8 random_factor_force_val; // default value 0x00
1651     /*
1652        1 byte quantity which forces the HC for all transmitted Sync and
1653        Discovery Beacon NO matter the real HC being received over the
1654        air.
1655     */
1656     u8 config_hop_count_force;
1657     u8 hop_count_force_val; // default value of 0
1658     /* NAN Post Connectivity Capability */
1659     u8 config_conn_capability;
1660     NanTransmitPostConnectivityCapability conn_capability_val;
1661     /* NAN Post Discover Capability */
1662     u8 num_config_discovery_attr;
1663     NanTransmitPostDiscovery discovery_attr_val[NAN_MAX_POSTDISCOVERY_LEN];
1664     /* NAN Further availability Map */
1665     u8 config_fam;
1666     NanFurtherAvailabilityMap fam_val;
1667     /* Configure 2.4/5GHz DW */
1668     NanConfigDW config_dw;
1669     /*
1670        By default discovery MAC address randomization is enabled
1671        and default interval value is 30 minutes i.e. 1800 seconds.
1672        The value 0 is used to disable MAC addr randomization.
1673     */
1674     u8 config_disc_mac_addr_randomization;
1675     u32 disc_mac_addr_rand_interval_sec; // default value of 30 minutes
1676 
1677     /*
1678       Set/Enable corresponding bits to disable Discovery indications:
1679       BIT0 - Disable Discovery MAC Address Event.
1680       BIT1 - Disable Started Cluster Event.
1681       BIT2 - Disable Joined Cluster Event.
1682     */
1683     u8 discovery_indication_cfg; // default value of 0
1684     /*
1685        BIT 0 is used to specify to include Service IDs in Sync/Discovery beacons
1686        0 - Do not include SIDs in any beacons
1687        1 - Include SIDs in all beacons.
1688        Rest 7 bits are count field which allows control over the number of SIDs
1689        included in the Beacon.  0 means to include as many SIDs that fit into
1690        the maximum allow Beacon frame size
1691     */
1692     u8 config_subscribe_sid_beacon;
1693     u32 subscribe_sid_beacon_val; // default value 0x0
1694     /*
1695        Discovery Beacon Interval config.
1696        Default value is 128 msec in 2G DW and 176 msec in 2G/5G DW.
1697        When 0 value is passed it is reset to default value of 128 or 176 msec.
1698     */
1699     u8 config_discovery_beacon_int;
1700     u32 discovery_beacon_interval;
1701     /*
1702        Enable Number of Spatial Streams.
1703        This is NAN Power Optimization feature for NAN discovery.
1704     */
1705     u8 config_nss;
1706     // default value is implementation specific and passing 0 sets it to default
1707     u32 nss;
1708     /*
1709        Enable device level NAN Ranging feature.
1710        0 - Disable
1711        1 - Enable
1712     */
1713     u8 config_enable_ranging;
1714     u32 enable_ranging;
1715     /*
1716        Enable/Disable DW Early termination.
1717        0 - Disable
1718        1 - Enable
1719     */
1720     u8 config_dw_early_termination;
1721     u32 enable_dw_termination;
1722     /*
1723        Indicate whether to use NDPE attribute to bring-up TCP/IP connection
1724        If config_ndpe_attr is not configured, the default behavior is
1725        not using NDPE attr, and the capability is not advertised.
1726        0 - Not use
1727        1 - Use
1728     */
1729     u8 config_ndpe_attr;
1730     u32 use_ndpe_attr;
1731     /*
1732             Enable NAN v3.1 instant communication mode.
1733             0 - Disable
1734             1 - Enable
1735     */
1736     u8 config_enable_instant_mode;
1737     u32 enable_instant_mode;
1738     /*
1739         Config NAN v3.1 instant communication channel selected over NFC/OOB method.
1740         If dual band is supported default channel is 149 or 44 as per regulatory domain,
1741         else channel 6 (send frequency in MHz).
1742         Sometimes depending on country code retrictions, even 149/44 may be restricted
1743         in those cases instant channel will be operational only in 2.4GHz.
1744         Use wifi_get_usable_channels() API to get supported bands/channels before
1745         Instant mode NFC handshake is triggered
1746     */
1747     u8 config_instant_mode_channel;
1748     wifi_channel instant_mode_channel;
1749     /*
1750        Config cluster ID with the cluster ID selected over NFC/OOB method.
1751     */
1752     u8 config_cluster_id;
1753     u16 cluster_id_val; // default value 0x0
1754 } NanConfigRequest;
1755 
1756 /*
1757   TCA Structure
1758   The Discovery Engine can be configured to send up Events whenever a configured
1759   Threshold Crossing Alert (TCA) Type crosses an integral threshold in a particular direction.
1760 */
1761 typedef struct {
1762     NanTcaType tca_type; /* Nan Protocol Threshold Crossing Alert (TCA) Codes */
1763 
1764     /* flag which control whether or not an event is generated for the Rising direction */
1765     u8 rising_direction_evt_flag; /* 0 - no event, 1 - event */
1766 
1767     /* flag which control whether or not an event is generated for the Falling direction */
1768     u8 falling_direction_evt_flag;/* 0 - no event, 1 - event */
1769 
1770     /* flag which requests a previous TCA request to be cleared from the DE */
1771     u8 clear;/*0= Do not clear the TCA, 1=Clear the TCA */
1772 
1773     /* 32 bit value which represents the threshold to be used.*/
1774     u32 threshold;
1775 } NanTCARequest;
1776 
1777 /*
1778   Beacon Sdf Payload Structure
1779   The Discovery Engine can be configured to publish vendor specific attributes as part of
1780   beacon or service discovery frame transmitted as part of this request..
1781 */
1782 typedef struct {
1783     /*
1784        NanVendorAttribute will have the Vendor Specific Attribute which the
1785        vendor wants to publish as part of Discovery or Sync or Service discovery frame
1786     */
1787     NanTransmitVendorSpecificAttribute vsa;
1788 } NanBeaconSdfPayloadRequest;
1789 
1790 /* Publish statistics. */
1791 typedef struct
1792 {
1793     u32 validPublishServiceReqMsgs;
1794     u32 validPublishServiceRspMsgs;
1795     u32 validPublishServiceCancelReqMsgs;
1796     u32 validPublishServiceCancelRspMsgs;
1797     u32 validPublishRepliedIndMsgs;
1798     u32 validPublishTerminatedIndMsgs;
1799     u32 validActiveSubscribes;
1800     u32 validMatches;
1801     u32 validFollowups;
1802     u32 invalidPublishServiceReqMsgs;
1803     u32 invalidPublishServiceCancelReqMsgs;
1804     u32 invalidActiveSubscribes;
1805     u32 invalidMatches;
1806     u32 invalidFollowups;
1807     u32 publishCount;
1808     u32 publishNewMatchCount;
1809     u32 pubsubGlobalNewMatchCount;
1810 } NanPublishStats;
1811 
1812 /* Subscribe statistics. */
1813 typedef struct
1814 {
1815     u32 validSubscribeServiceReqMsgs;
1816     u32 validSubscribeServiceRspMsgs;
1817     u32 validSubscribeServiceCancelReqMsgs;
1818     u32 validSubscribeServiceCancelRspMsgs;
1819     u32 validSubscribeTerminatedIndMsgs;
1820     u32 validSubscribeMatchIndMsgs;
1821     u32 validSubscribeUnmatchIndMsgs;
1822     u32 validSolicitedPublishes;
1823     u32 validMatches;
1824     u32 validFollowups;
1825     u32 invalidSubscribeServiceReqMsgs;
1826     u32 invalidSubscribeServiceCancelReqMsgs;
1827     u32 invalidSubscribeFollowupReqMsgs;
1828     u32 invalidSolicitedPublishes;
1829     u32 invalidMatches;
1830     u32 invalidFollowups;
1831     u32 subscribeCount;
1832     u32 bloomFilterIndex;
1833     u32 subscribeNewMatchCount;
1834     u32 pubsubGlobalNewMatchCount;
1835 } NanSubscribeStats;
1836 
1837 /* NAN DW Statistics*/
1838 typedef struct
1839 {
1840     /* RX stats */
1841     u32 validFrames;
1842     u32 validActionFrames;
1843     u32 validBeaconFrames;
1844     u32 ignoredActionFrames;
1845     u32 ignoredBeaconFrames;
1846     u32 invalidFrames;
1847     u32 invalidActionFrames;
1848     u32 invalidBeaconFrames;
1849     u32 invalidMacHeaders;
1850     u32 invalidPafHeaders;
1851     u32 nonNanBeaconFrames;
1852 
1853     u32 earlyActionFrames;
1854     u32 inDwActionFrames;
1855     u32 lateActionFrames;
1856 
1857     /* TX stats */
1858     u32 framesQueued;
1859     u32 totalTRSpUpdates;
1860     u32 completeByTRSp;
1861     u32 completeByTp75DW;
1862     u32 completeByTendDW;
1863     u32 lateActionFramesTx;
1864 } NanDWStats;
1865 
1866 /* NAN MAC Statistics. */
1867 typedef struct
1868 {
1869     /* RX stats */
1870     u32 validFrames;
1871     u32 validActionFrames;
1872     u32 validBeaconFrames;
1873     u32 ignoredActionFrames;
1874     u32 ignoredBeaconFrames;
1875     u32 invalidFrames;
1876     u32 invalidActionFrames;
1877     u32 invalidBeaconFrames;
1878     u32 invalidMacHeaders;
1879     u32 invalidPafHeaders;
1880     u32 nonNanBeaconFrames;
1881 
1882     u32 earlyActionFrames;
1883     u32 inDwActionFrames;
1884     u32 lateActionFrames;
1885 
1886     /* TX stats */
1887     u32 framesQueued;
1888     u32 totalTRSpUpdates;
1889     u32 completeByTRSp;
1890     u32 completeByTp75DW;
1891     u32 completeByTendDW;
1892     u32 lateActionFramesTx;
1893 
1894     u32 twIncreases;
1895     u32 twDecreases;
1896     u32 twChanges;
1897     u32 twHighwater;
1898     u32 bloomFilterIndex;
1899 } NanMacStats;
1900 
1901 /* NAN Sync Statistics*/
1902 typedef struct
1903 {
1904     u64 currTsf;
1905     u64 myRank;
1906     u64 currAmRank;
1907     u64 lastAmRank;
1908     u32 currAmBTT;
1909     u32 lastAmBTT;
1910     u8  currAmHopCount;
1911     u8  currRole;
1912     u16 currClusterId;
1913 
1914     u64 timeSpentInCurrRole;
1915     u64 totalTimeSpentAsMaster;
1916     u64 totalTimeSpentAsNonMasterSync;
1917     u64 totalTimeSpentAsNonMasterNonSync;
1918     u32 transitionsToAnchorMaster;
1919     u32 transitionsToMaster;
1920     u32 transitionsToNonMasterSync;
1921     u32 transitionsToNonMasterNonSync;
1922     u32 amrUpdateCount;
1923     u32 amrUpdateRankChangedCount;
1924     u32 amrUpdateBTTChangedCount;
1925     u32 amrUpdateHcChangedCount;
1926     u32 amrUpdateNewDeviceCount;
1927     u32 amrExpireCount;
1928     u32 mergeCount;
1929     u32 beaconsAboveHcLimit;
1930     u32 beaconsBelowRssiThresh;
1931     u32 beaconsIgnoredNoSpace;
1932     u32 beaconsForOurCluster;
1933     u32 beaconsForOtherCluster;
1934     u32 beaconCancelRequests;
1935     u32 beaconCancelFailures;
1936     u32 beaconUpdateRequests;
1937     u32 beaconUpdateFailures;
1938     u32 syncBeaconTxAttempts;
1939     u32 syncBeaconTxFailures;
1940     u32 discBeaconTxAttempts;
1941     u32 discBeaconTxFailures;
1942     u32 amHopCountExpireCount;
1943     u32 ndpChannelFreq;
1944     u32 ndpChannelFreq2;
1945     u32 schedUpdateChannelFreq;
1946 } NanSyncStats;
1947 
1948 /* NAN Misc DE Statistics */
1949 typedef struct
1950 {
1951     u32 validErrorRspMsgs;
1952     u32 validTransmitFollowupReqMsgs;
1953     u32 validTransmitFollowupRspMsgs;
1954     u32 validFollowupIndMsgs;
1955     u32 validConfigurationReqMsgs;
1956     u32 validConfigurationRspMsgs;
1957     u32 validStatsReqMsgs;
1958     u32 validStatsRspMsgs;
1959     u32 validEnableReqMsgs;
1960     u32 validEnableRspMsgs;
1961     u32 validDisableReqMsgs;
1962     u32 validDisableRspMsgs;
1963     u32 validDisableIndMsgs;
1964     u32 validEventIndMsgs;
1965     u32 validTcaReqMsgs;
1966     u32 validTcaRspMsgs;
1967     u32 validTcaIndMsgs;
1968     u32 invalidTransmitFollowupReqMsgs;
1969     u32 invalidConfigurationReqMsgs;
1970     u32 invalidStatsReqMsgs;
1971     u32 invalidEnableReqMsgs;
1972     u32 invalidDisableReqMsgs;
1973     u32 invalidTcaReqMsgs;
1974 } NanDeStats;
1975 
1976 /* Publish Response Message structure */
1977 typedef struct {
1978     u16 publish_id;
1979 } NanPublishResponse;
1980 
1981 /* Subscribe Response Message structure */
1982 typedef struct {
1983     u16 subscribe_id;
1984 } NanSubscribeResponse;
1985 
1986 /*
1987   Stats Response Message structure
1988   The Discovery Engine response to a request by the Host for statistics.
1989 */
1990 typedef struct {
1991     NanStatsType stats_type;
1992     union {
1993         NanPublishStats publish_stats;
1994         NanSubscribeStats subscribe_stats;
1995         NanMacStats mac_stats;
1996         NanSyncStats sync_stats;
1997         NanDeStats de_stats;
1998         NanDWStats dw_stats;
1999     } data;
2000 } NanStatsResponse;
2001 
2002 /* Response returned for Initiators Data request */
2003 typedef struct {
2004     /*
2005       Unique token Id generated on the initiator
2006       side used for a NDP session between two NAN devices
2007     */
2008     NanDataPathId ndp_instance_id;
2009 } NanDataPathRequestResponse;
2010 
2011 /* Response returned for Initiators pairing request */
2012 typedef struct {
2013     /*
2014       Unique token Id generated on the initiator
2015       side used for a pairing session between two NAN devices
2016     */
2017     u32 paring_instance_id;
2018 } NanPairingRequestResponse;
2019 
2020 /* Response returned for Initiators bootstrapping request */
2021 typedef struct {
2022     /*
2023       Unique token Id generated on the initiator
2024       side used for a bootstrapping session between two NAN devices
2025     */
2026     u32 bootstrapping_instance_id;
2027 } NanBootstrappingRequestResponse;
2028 
2029 /*
2030   NAN Response messages
2031 */
2032 typedef struct {
2033     NanStatusType status; /* contains the result code */
2034     char nan_error[NAN_ERROR_STR_LEN]; /* Describe the NAN error type */
2035     NanResponseType response_type; /* NanResponseType Definitions */
2036     union {
2037         NanPublishResponse publish_response;
2038         NanSubscribeResponse subscribe_response;
2039         NanStatsResponse stats_response;
2040         NanDataPathRequestResponse data_request_response;
2041         NanCapabilities nan_capabilities;
2042         NanPairingRequestResponse pairing_request_response;
2043         NanBootstrappingRequestResponse bootstrapping_request_response;
2044     } body;
2045 } NanResponseMsg;
2046 
2047 /*
2048   Publish Replied Indication
2049   The PublishRepliedInd Message is sent by the DE when an Active Subscribe is
2050   received over the air and it matches a Solicited PublishServiceReq which had
2051   been created with the replied_event_flag set.
2052 */
2053 typedef struct {
2054     /*
2055        A 32 bit Requestor Instance Id which is sent to the Application.
2056        This Id will be sent in any subsequent UnmatchInd/FollowupInd
2057        messages
2058     */
2059     u32 requestor_instance_id;
2060     u8 addr[NAN_MAC_ADDR_LEN];
2061     /*
2062        If RSSI filtering was configured in NanPublishRequest then this
2063        field will contain the received RSSI value. 0 if not
2064     */
2065     u8 rssi_value;
2066 } NanPublishRepliedInd;
2067 
2068 /*
2069   Publish Terminated
2070   The PublishTerminatedInd message is sent by the DE whenever a Publish
2071   terminates from a user-specified timeout or a unrecoverable error in the DE.
2072 */
2073 typedef struct {
2074     /* Id returned during the initial Publish */
2075     u16 publish_id;
2076     /*
2077       For all user configured termination NAN_STATUS_SUCCESS
2078       and no other reasons expected from firmware.
2079     */
2080     NanStatusType reason;
2081     char nan_reason[NAN_ERROR_STR_LEN]; /* Describe the NAN reason type */
2082 } NanPublishTerminatedInd;
2083 
2084 /* The NIRA used to identify the pairing devices*/
2085 typedef struct {
2086     u8 nonce[NAN_IDENTITY_NONCE_LEN];
2087     u8 tag[NAN_IDENTITY_TAG_LEN];
2088 } NanIdentityResolutionAttribute;
2089 
2090 /*
2091   Match Indication
2092   The MatchInd message is sent once per responding MAC address whenever
2093   the Discovery Engine detects a match for a previous SubscribeServiceReq
2094   or PublishServiceReq.
2095 */
2096 typedef struct {
2097     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
2098     u16 publish_subscribe_id;
2099     /*
2100        A 32 bit Requestor Instance Id which is sent to the Application.
2101        This Id will be sent in any subsequent UnmatchInd/FollowupInd
2102        messages
2103     */
2104     u32 requestor_instance_id;
2105     u8 addr[NAN_MAC_ADDR_LEN];
2106 
2107     /*
2108        Sequence of octets which were received in a Discovery Frame matching the
2109        Subscribe Request.
2110     */
2111     u16 service_specific_info_len;
2112     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
2113 
2114     /*
2115        Ordered sequence of <length, value> pairs received in the Discovery Frame
2116        matching the Subscribe Request.
2117     */
2118     u16 sdf_match_filter_len;
2119     u8 sdf_match_filter[NAN_MAX_MATCH_FILTER_LEN];
2120 
2121     /*
2122        flag to indicate if the Match occurred in a Beacon Frame or in a
2123        Service Discovery Frame.
2124          0 - Match occured in a Service Discovery Frame
2125          1 - Match occured in a Beacon Frame
2126     */
2127     u8 match_occured_flag;
2128 
2129     /*
2130        flag to indicate FW is out of resource and that it can no longer
2131        track this Service Name. The Host still need to send the received
2132        Match_Handle but duplicate MatchInd messages may be received on
2133        this Handle until the resource frees up.
2134          0 - FW is caching this match
2135          1 - FW is unable to cache this match
2136     */
2137     u8 out_of_resource_flag;
2138 
2139     /*
2140        If RSSI filtering was configured in NanSubscribeRequest then this
2141        field will contain the received RSSI value. 0 if not.
2142        All rssi values should be specified without sign.
2143        For eg: -70dBm should be specified as 70.
2144     */
2145     u8 rssi_value;
2146 
2147     /*
2148        optional attributes. Each optional attribute is associated with a flag
2149        which specifies whether the attribute is valid or not
2150     */
2151     /* NAN Post Connectivity Capability received */
2152     u8 is_conn_capability_valid;
2153     NanReceivePostConnectivityCapability conn_capability;
2154 
2155     /* NAN Post Discover Capability */
2156     u8 num_rx_discovery_attr;
2157     NanReceivePostDiscovery discovery_attr[NAN_MAX_POSTDISCOVERY_LEN];
2158 
2159     /* NAN Further availability Map */
2160     u8 num_chans;
2161     NanFurtherAvailabilityChannel famchan[NAN_MAX_FAM_CHANNELS];
2162 
2163     /* NAN Cluster Attribute */
2164     u8 cluster_attribute_len;
2165     u8 cluster_attribute[NAN_MAX_CLUSTER_ATTRIBUTE_LEN];
2166 
2167     /* NAN Cipher Suite */
2168     u32 peer_cipher_type;
2169 
2170     /* Security Context Identifiers length */
2171     u32 scid_len;
2172     /*
2173        Security Context Identifier attribute contains PMKID
2174        shall be included in NDP setup and response messages.
2175        Security Context Identifier, Identifies the Security
2176        Context. For NAN Shared Key Cipher Suite, this field
2177        contains the 16 octet PMKID identifying the PMK used
2178        for setting up the Secure Data Path.
2179     */
2180     u8 scid[NAN_MAX_SCID_BUF_LEN];
2181 
2182     /* Peer service discovery extended attributes */
2183     NanSdeaCtrlParams peer_sdea_params;
2184 
2185     /*
2186       Ranging indication and NanMatchAlg are not tied.
2187       Ex: NanMatchAlg can indicate Match_ONCE, but ranging
2188       indications can be continuous. All ranging indications
2189       depend on SDEA control parameters of ranging required for
2190       continuous, and ingress/egress values in the ranging config.
2191       Ranging indication data is notified if:
2192       1) Ranging required is enabled in SDEA.
2193          range info notified continuous.
2194       2) if range_limit ingress/egress MASKS are enabled
2195          notify once for ingress >= ingress_distance
2196          and egress <= egress_distance, same for ingress_egress_both
2197       3) if the Awake DW intervals are higher than the ranging intervals,
2198          priority is given to the device DW intervalsi.
2199     */
2200     /*
2201       Range Info includes:
2202       1) distance to the NAN device with the MAC address indicated
2203          with ranged mac address.
2204       2) Ranging event matching the configuration of continuous/ingress/egress.
2205     */
2206     NanRangeInfo range_info;
2207 
2208     /*
2209        Sequence of values indicating the service specific info in SDEA
2210     */
2211     u16 sdea_service_specific_info_len;
2212     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
2213 
2214     /*
2215       The config for Nan pairing set by the peer
2216     */
2217     NanPairingConfig peer_pairing_config;
2218 
2219     /*
2220       The NIRA from peer for Nan pairing verification
2221     */
2222     NanIdentityResolutionAttribute nira;
2223 } NanMatchInd;
2224 
2225 /*
2226   MatchExpired Indication
2227   The MatchExpiredInd message is sent whenever the Discovery Engine detects that
2228   a previously Matched Service has been gone for too long. If the previous
2229   MatchInd message for this Publish/Subscribe Id had the out_of_resource_flag
2230   set then this message will not be received
2231 */
2232 typedef struct {
2233     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
2234     u16 publish_subscribe_id;
2235     /*
2236        32 bit value sent by the DE in a previous
2237        MatchInd/FollowupInd to the application.
2238     */
2239     u32 requestor_instance_id;
2240 } NanMatchExpiredInd;
2241 
2242 /*
2243   Subscribe Terminated
2244   The SubscribeTerminatedInd message is sent by the DE whenever a
2245   Subscribe terminates from a user-specified timeout or a unrecoverable error in the DE.
2246 */
2247 typedef struct {
2248     /* Id returned during initial Subscribe */
2249     u16 subscribe_id;
2250     /*
2251       For all user configured termination NAN_STATUS_SUCCESS
2252       and no other reasons expected from firmware.
2253     */
2254     NanStatusType reason;
2255     char nan_reason[NAN_ERROR_STR_LEN]; /* Describe the NAN reason type */
2256 } NanSubscribeTerminatedInd;
2257 
2258 /*
2259   Followup Indication Message
2260   The FollowupInd message is sent by the DE to the Host whenever it receives a
2261   Followup message from another peer.
2262 */
2263 typedef struct {
2264     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
2265     u16 publish_subscribe_id;
2266     /*
2267        A 32 bit Requestor instance Id which is sent to the Application.
2268        This Id will be used in subsequent UnmatchInd/FollowupInd messages.
2269     */
2270     u32 requestor_instance_id;
2271     u8 addr[NAN_MAC_ADDR_LEN];
2272 
2273     /* Flag which the DE uses to decide if received in a DW or a FAW*/
2274     u8 dw_or_faw; /* 0=Received  in a DW, 1 = Received in a FAW*/
2275 
2276     /*
2277        Sequence of values which further specify the published service beyond
2278        the service name
2279     */
2280     u16 service_specific_info_len;
2281     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
2282 
2283     /*
2284        Sequence of values indicating the service specific info in SDEA
2285     */
2286     u16 sdea_service_specific_info_len;
2287     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
2288 } NanFollowupInd;
2289 
2290 /*
2291    Event data notifying the Mac address of the Discovery engine.
2292    which is reported as one of the Discovery engine event
2293 */
2294 typedef struct {
2295     u8 addr[NAN_MAC_ADDR_LEN];
2296 } NanMacAddressEvent;
2297 
2298 /*
2299    Event data notifying the Cluster address of the cluster
2300    which is reported as one of the Discovery engine event
2301 */
2302 typedef struct {
2303     u8 addr[NAN_MAC_ADDR_LEN];
2304 } NanClusterEvent;
2305 
2306 /*
2307   Discovery Engine Event Indication
2308   The Discovery Engine can inform the Host when significant events occur
2309   The data following the EventId is dependent upon the EventId type.
2310   In other words, each new event defined will carry a different
2311   structure of information back to the host.
2312 */
2313 typedef struct {
2314     NanDiscEngEventType event_type; /* NAN Protocol Event Codes */
2315     union {
2316         /*
2317            MacAddressEvent which will have 6 byte mac address
2318            of the Discovery engine.
2319         */
2320         NanMacAddressEvent mac_addr;
2321         /*
2322            Cluster Event Data which will be obtained when the
2323            device starts a new cluster or joins a cluster.
2324            The event data will have 6 byte octet string of the
2325            cluster started or joined.
2326         */
2327         NanClusterEvent cluster;
2328     } data;
2329 } NanDiscEngEventInd;
2330 
2331 /* Cluster size TCA event*/
2332 typedef struct {
2333     /* size of the cluster*/
2334     u32 cluster_size;
2335 } NanTcaClusterEvent;
2336 
2337 /*
2338   NAN TCA Indication
2339   The Discovery Engine can inform the Host when significant events occur.
2340   The data following the TcaId is dependent upon the TcaId type.
2341   In other words, each new event defined will carry a different structure
2342   of information back to the host.
2343 */
2344 typedef struct {
2345     NanTcaType tca_type;
2346     /* flag which defines if the configured Threshold has risen above the threshold */
2347     u8 rising_direction_evt_flag; /* 0 - no event, 1 - event */
2348 
2349     /* flag which defines if the configured Threshold has fallen below the threshold */
2350     u8 falling_direction_evt_flag;/* 0 - no event, 1 - event */
2351     union {
2352         /*
2353            This event in obtained when the cluser size threshold
2354            is crossed. Event will have the cluster size
2355         */
2356         NanTcaClusterEvent cluster;
2357     } data;
2358 } NanTCAInd;
2359 
2360 /*
2361   NAN Disabled Indication
2362   The NanDisableInd message indicates to the upper layers that the Discovery
2363   Engine has flushed all state and has been shutdown.  When this message is received
2364   the DE is guaranteed to have left the NAN cluster it was part of and will have terminated
2365   any in progress Publishes or Subscribes.
2366 */
2367 typedef struct {
2368     /*
2369       Following reasons expected:
2370       NAN_STATUS_SUCCESS
2371       NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED
2372     */
2373     NanStatusType reason;
2374     char nan_reason[NAN_ERROR_STR_LEN]; /* Describe the NAN reason type */
2375 } NanDisabledInd;
2376 
2377 /*
2378   NAN Beacon or SDF Payload Indication
2379   The NanBeaconSdfPayloadInd message indicates to the upper layers that information
2380   elements were received either in a Beacon or SDF which needs to be delivered
2381   outside of a Publish/Subscribe Handle.
2382 */
2383 typedef struct {
2384     /* The MAC address of the peer which sent the attributes.*/
2385     u8 addr[NAN_MAC_ADDR_LEN];
2386     /*
2387        Optional attributes. Each optional attribute is associated with a flag
2388        which specifies whether the attribute is valid or not
2389     */
2390     /* NAN Receive Vendor Specific Attribute*/
2391     u8 is_vsa_received;
2392     NanReceiveVendorSpecificAttribute vsa;
2393 
2394     /* NAN Beacon or SDF Payload Received*/
2395     u8 is_beacon_sdf_payload_received;
2396     NanBeaconSdfPayloadReceive data;
2397 } NanBeaconSdfPayloadInd;
2398 
2399 /*
2400   Event Indication notifying the
2401   transmit followup in progress
2402 */
2403 typedef struct {
2404    transaction_id id;
2405    /*
2406      Following reason codes returned:
2407      NAN_STATUS_SUCCESS
2408      NAN_STATUS_NO_OTA_ACK
2409      NAN_STATUS_PROTOCOL_FAILURE
2410    */
2411    NanStatusType reason;
2412    char nan_reason[NAN_ERROR_STR_LEN]; /* Describe the NAN reason type */
2413 } NanTransmitFollowupInd;
2414 
2415 /*
2416   Data request Initiator/Responder
2417   app/service related info
2418 */
2419 typedef struct {
2420     u16 ndp_app_info_len;
2421     u8 ndp_app_info[NAN_DP_MAX_APP_INFO_LEN];
2422 } NanDataPathAppInfo;
2423 
2424 /* QoS configuration */
2425 typedef enum {
2426     NAN_DP_CONFIG_NO_QOS = 0,
2427     NAN_DP_CONFIG_QOS
2428 } NanDataPathQosCfg;
2429 
2430 /* Configuration params of Data request Initiator/Responder */
2431 typedef struct {
2432     /* Status Indicating Security/No Security */
2433     NanDataPathSecurityCfgStatus security_cfg;
2434     NanDataPathQosCfg qos_cfg;
2435 } NanDataPathCfg;
2436 
2437 /* Nan Data Path Initiator requesting a data session */
2438 typedef struct {
2439     /*
2440      Unique Instance Id identifying the Responder's service.
2441      This is same as publish_id notified on the subscribe side
2442      in a publish/subscribe scenario
2443     */
2444     u32 requestor_instance_id; /* Value 0 for no publish/subscribe */
2445 
2446     /* Config flag for channel request */
2447     NanDataPathChannelCfg channel_request_type;
2448     /* Channel frequency in MHz to start data-path */
2449     wifi_channel channel;
2450     /*
2451       Discovery MAC addr of the publisher/peer
2452     */
2453     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2454     /*
2455      Interface name on which this NDP session is to be started.
2456      This will be the same interface name provided during interface
2457      create.
2458     */
2459     char ndp_iface[IFNAMSIZ+1];
2460     /* Initiator/Responder Security/QoS configuration */
2461     NanDataPathCfg ndp_cfg;
2462     /* App/Service information of the Initiator */
2463     NanDataPathAppInfo app_info;
2464     /* NAN Cipher Suite Type */
2465     u32 cipher_type;
2466     /*
2467        Nan Security Key Info is optional in Discovery phase.
2468        PMK or passphrase info can be passed during
2469        the NDP session.
2470     */
2471     NanSecurityKeyInfo key_info;
2472     /* length of service name */
2473     u32 service_name_len;
2474     /*
2475        UTF-8 encoded string identifying the service name.
2476        The service name field is only used if a Nan discovery
2477        is not associated with the NDP (out-of-band discovery).
2478     */
2479     u8 service_name[NAN_MAX_SERVICE_NAME_LEN];
2480 
2481     /* Security Context Identifiers length */
2482     u32 scid_len;
2483     /*
2484        Security Context Identifier attribute contains PMKID
2485        shall be included in NDP setup and response messages.
2486        Security Context Identifier, Identifies the Security
2487        Context. For NAN Shared Key Cipher Suite, this field
2488        contains the 16 octet PMKID identifying the PMK used
2489        for setting up the Secure Data Path.
2490     */
2491     u8 scid[NAN_MAX_SCID_BUF_LEN];
2492 
2493     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
2494     u16 publish_subscribe_id;
2495 
2496     /* configure CSIA (Cipher Suite Information attribute) capability to specify GTK, IGTK, BIGTK
2497        are supported or not
2498     */
2499     u8 csia_capabilities;
2500 
2501     /* configure GTK(Group Transient Key) protection required or not */
2502     u8 gtk_protection;
2503 
2504 } NanDataPathInitiatorRequest;
2505 
2506 /*
2507   Data struct to initiate a data response on the responder side
2508   for an indication received with a data request
2509 */
2510 typedef struct {
2511     /*
2512       Unique token Id generated on the initiator/responder
2513       side used for a NDP session between two NAN devices
2514     */
2515     NanDataPathId ndp_instance_id;
2516     /*
2517      Interface name on which this NDP session is to be started.
2518      This will be the same interface name provided during interface
2519      create.
2520     */
2521     char ndp_iface[IFNAMSIZ+1];
2522     /* Initiator/Responder Security/QoS configuration */
2523     NanDataPathCfg ndp_cfg;
2524     /* App/Service information of the responder */
2525     NanDataPathAppInfo app_info;
2526     /* Response Code indicating ACCEPT/REJECT/DEFER */
2527     NanDataPathResponseCode rsp_code;
2528     /* NAN Cipher Suite Type */
2529     u32 cipher_type;
2530     /*
2531        Nan Security Key Info is optional in Discovery phase.
2532        PMK or passphrase info can be passed during
2533        the NDP session.
2534     */
2535     NanSecurityKeyInfo key_info;
2536     /* length of service name */
2537     u32 service_name_len;
2538     /*
2539        UTF-8 encoded string identifying the service name.
2540        The service name field is only used if a Nan discovery
2541        is not associated with the NDP (out-of-band discovery).
2542     */
2543     u8 service_name[NAN_MAX_SERVICE_NAME_LEN];
2544 
2545     /* Security Context Identifiers length */
2546     u32 scid_len;
2547     /*
2548        Security Context Identifier attribute contains PMKID
2549        shall be included in NDP setup and response messages.
2550        Security Context Identifier, Identifies the Security
2551        Context. For NAN Shared Key Cipher Suite, this field
2552        contains the 16 octet PMKID identifying the PMK used
2553        for setting up the Secure Data Path.
2554     */
2555     u8 scid[NAN_MAX_SCID_BUF_LEN];
2556 
2557     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
2558     u16 publish_subscribe_id;
2559 
2560     /*
2561       Discovery MAC addr of the publisher/peer
2562     */
2563     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2564 
2565     /* configure CSIA (Cipher Suite Information attribute) capability to specify GTK, IGTK, BIGTK
2566        are supported or not
2567     */
2568     u8 csia_capabilities;
2569 
2570     /* configure GTK(Group Transient Key) protection required or not */
2571     u8 gtk_protection;
2572 } NanDataPathIndicationResponse;
2573 
2574 /* Sub slot parameters */
2575 typedef struct {
2576     u8 entry_control;
2577     u16 time_bitmap_control;
2578     u32 time_bitmap;
2579 } NanS3Params;
2580 
2581 /* NDP termination info */
2582 typedef struct {
2583     u8 num_ndp_instances;
2584     /*
2585       Unique token Id generated on the initiator/responder side
2586       used for a NDP session between two NAN devices
2587     */
2588     NanDataPathId ndp_instance_id[];
2589 } NanDataPathEndRequest;
2590 
2591 /*
2592   Event indication received on the
2593   responder side when a Nan Data request or
2594   NDP session is initiated on the Initiator side
2595 */
2596 typedef struct {
2597     /*
2598       Unique Instance Id corresponding to a service/session.
2599       This is similar to the publish_id generated on the
2600       publisher side
2601     */
2602     u16 service_instance_id;
2603     /* Discovery MAC addr of the peer/initiator */
2604     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2605     /*
2606       Unique token Id generated on the initiator/responder side
2607       used for a NDP session between two NAN devices
2608     */
2609     NanDataPathId ndp_instance_id;
2610     /* Initiator/Responder Security/QoS configuration */
2611     NanDataPathCfg ndp_cfg;
2612     /* App/Service information of the initiator */
2613     NanDataPathAppInfo app_info;
2614 
2615     /* Security Context Identifiers length */
2616     u32 scid_len;
2617     /*
2618        Security Context Identifier attribute contains PMKID
2619        shall be included in NDP setup and response messages.
2620        Security Context Identifier, Identifies the Security
2621        Context. For NAN Shared Key Cipher Suite, this field
2622        contains the 16 octet PMKID identifying the PMK used
2623        for setting up the Secure Data Path.
2624     */
2625     u8 scid[NAN_MAX_SCID_BUF_LEN];
2626 
2627     /* configure CSIA (Cipher Suite Information attribute) capability to specify GTK, IGTK, BIGTK
2628        are supported or not
2629     */
2630     u8 csia_capabilities;
2631 
2632     /* configure GTK(Group Transient Key) protection required or not */
2633     u8 gtk_protection;
2634 } NanDataPathRequestInd;
2635 
2636 /*
2637  Event indication of data confirm is received on both
2638  initiator and responder side confirming a NDP session
2639 */
2640 typedef struct {
2641     /*
2642       Unique token Id generated on the initiator/responder side
2643       used for a NDP session between two NAN devices
2644     */
2645     NanDataPathId ndp_instance_id;
2646     /*
2647       NDI mac address of the peer
2648       (required to derive target ipv6 address)
2649     */
2650     u8 peer_ndi_mac_addr[NAN_MAC_ADDR_LEN];
2651     /* App/Service information of Initiator/Responder */
2652     NanDataPathAppInfo app_info;
2653     /* Response code indicating ACCEPT/REJECT/DEFER */
2654     NanDataPathResponseCode rsp_code;
2655     /*
2656       Reason code indicating the cause for REJECT.
2657       NAN_STATUS_SUCCESS and NAN_STATUS_PROTOCOL_FAILURE are
2658       expected reason codes.
2659     */
2660     NanStatusType reason_code;
2661     /* Number of channels for which info is indicated */
2662     u32 num_channels;
2663     /*
2664       Data indicating the Channel list and BW of the channel.
2665     */
2666     NanChannelInfo channel_info[NAN_MAX_CHANNEL_INFO_SUPPORTED];
2667 } NanDataPathConfirmInd;
2668 
2669 /*
2670  Event indication of schedule update is received on both
2671  initiator and responder when a schedule change occurs
2672 */
2673 typedef struct {
2674     /*
2675       NMI mac address
2676     */
2677     u8 peer_mac_addr[NAN_MAC_ADDR_LEN];
2678     /*
2679       Reason code indicating the cause of schedule update.
2680       BIT_0 NSS Update
2681       BIT_1 Channel list update
2682     */
2683     u32 schedule_update_reason_code;
2684     /* Number of channels for which info is indicated */
2685     u32 num_channels;
2686     /*
2687       Data indicating the Channel list and BW of the channel.
2688     */
2689     NanChannelInfo channel_info[NAN_MAX_CHANNEL_INFO_SUPPORTED];
2690     /* Number of NDP instance Ids */
2691     u8 num_ndp_instances;
2692     /*
2693       Unique token Id generated on the initiator/responder side
2694       used for a NDP session between two NAN devices
2695     */
2696     NanDataPathId ndp_instance_id[];
2697 } NanDataPathScheduleUpdateInd;
2698 
2699 /*
2700   Event indication received on the
2701   initiator/responder side terminating
2702   a NDP session
2703 */
2704 typedef struct {
2705     u8 num_ndp_instances;
2706     /*
2707       Unique token Id generated on the initiator/responder side
2708       used for a NDP session between two NAN devices
2709     */
2710     NanDataPathId ndp_instance_id[];
2711 } NanDataPathEndInd;
2712 
2713 /*
2714   Event indicating Range Request received on the
2715   Published side.
2716 */
2717 typedef struct {
2718     u16 publish_id;/* id is existing publish */
2719     /* Range Requestor's MAC address */
2720     u8 range_req_intf_addr[NAN_MAC_ADDR_LEN];
2721 } NanRangeRequestInd;
2722 
2723 /*
2724   Event indicating Range report on the
2725   Published side.
2726 */
2727 typedef struct {
2728     u16 publish_id;/* id is existing publish */
2729     /* Range Requestor's MAC address */
2730     u8 range_req_intf_addr[NAN_MAC_ADDR_LEN];
2731     /*
2732        Distance to the NAN device with the MAC address indicated
2733        with ranged mac address.
2734     */
2735     u32 range_measurement_mm;
2736 } NanRangeReportInd;
2737 
2738 /*
2739   NAN pairing initator request
2740 */
2741 typedef struct {
2742     /*
2743        This Id is the Requestor Instance that is passed as
2744        part of earlier MatchInd/FollowupInd message.
2745     */
2746     u32 requestor_instance_id;
2747 
2748     /*
2749       Discovery MAC addr of the publisher/peer
2750     */
2751     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2752 
2753     /*
2754       Indicate the pairing session is of setup or verification
2755     */
2756     NanPairingRequestType nan_pairing_request_type;
2757 
2758     /*
2759       whether the pairing is opportunistic or password
2760     */
2761     u8 is_opportunistic;
2762 
2763     /*
2764       Security key info used for the pairing setup or verification
2765     */
2766     NanSecurityKeyInfo key_info;
2767     /*
2768       AKM used for the pairing verification
2769     */
2770     NanAkm akm;
2771 
2772     /*
2773       Whether should cache the negotiated NIK/NPK for future verification
2774     */
2775     u8 enable_pairing_cache;
2776 
2777     /*
2778       The Identity key for pairing, can be used for pairing verification
2779     */
2780     u8 nan_identity_key[NAN_IDENTITY_KEY_LEN];
2781 
2782     /*
2783       NAN Cipher Suite Type
2784     */
2785     u32 cipher_type;
2786 
2787 } NanPairingRequest;
2788 
2789 /*
2790   Data struct to initiate a pairing response on the responder side for an indication received with a
2791   pairing request
2792 */
2793 typedef struct {
2794 
2795     /*
2796       Unique token Id generated on the initiator/responder side
2797       used for a pairing session between two NAN devices
2798     */
2799     u32 pairing_instance_id;
2800 
2801     /*
2802       Indicate the pairing session is setup or verification
2803     */
2804     NanPairingRequestType nan_pairing_request_type;
2805 
2806     /* Response Code indicating ACCEPT/REJECT */
2807     NanPairingResponseCode rsp_code;
2808 
2809     /*
2810       whether the pairing is opportunistic or password
2811     */
2812     u8 is_opportunistic;
2813 
2814     /*
2815       Security key info used for the pairing setup or verification
2816     */
2817     NanSecurityKeyInfo key_info;
2818 
2819     /*
2820       AKM used for the pairing verification
2821     */
2822     NanAkm akm;
2823 
2824     /*
2825       Whether should cache the negotiated NIK/NPK for future verification
2826     */
2827     u8 enable_pairing_cache;
2828 
2829     /*
2830       The Identity key for pairing, can be used for pairing verification
2831     */
2832     u8 nan_identity_key[NAN_IDENTITY_KEY_LEN];
2833 
2834     /*
2835       NAN Cipher Suite Type
2836     */
2837     u32 cipher_type;
2838 } NanPairingIndicationResponse;
2839 
2840 typedef struct {
2841     /*
2842       Unique token Id generated on the initiator/responder side
2843       used for a pairing session between two NAN devices
2844     */
2845     u32 pairing_instance_id;
2846 } NanPairingEndRequest;
2847 
2848 /*
2849   Event indication received on the responder side when a Nan pairing session is initiated on the
2850   Initiator side
2851 */
2852 typedef struct {
2853     /* Publish instance id generated on Publisher side corresponding to a session */
2854     u16 publish_subscribe_id;
2855     /*
2856       This Id is the Requestor Instance that is passed as
2857       part of earlier MatchInd/FollowupInd message.
2858     */
2859     u32 requestor_instance_id;
2860     /*
2861       Unique Instance Id corresponding to a service/session.
2862       This is similar to the publish_id generated on the
2863       publisher side
2864     */
2865     u32 pairing_instance_id;
2866     /* Discovery MAC addr of the peer/initiator */
2867     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2868     /* Indicate the pairing session is setup or verification */
2869     NanPairingRequestType nan_pairing_request_type;
2870     /* Whether should cache the negotiated NIK/NPK for future verification */
2871     u8 enable_pairing_cache;
2872     /* The NIRA from peer for Nan pairing verification */
2873     NanIdentityResolutionAttribute nira;
2874 } NanPairingRequestInd;
2875 
2876 /*
2877   The security info negotiate after the pairing setup for caching
2878 */
2879 typedef struct {
2880     /* The inentity key of peer device*/
2881     u8 peer_nan_identity_key[NAN_IDENTITY_KEY_LEN];
2882     /* The inentity key of local device*/
2883     u8 local_nan_identity_key[NAN_IDENTITY_KEY_LEN];
2884     /* The PMK excahnge between two devices*/
2885     NanSecurityPmk npk;
2886     /* The AKM used during the key exchange*/
2887     NanAkm akm;
2888     /* NAN Cipher Suite Type */
2889     u32 cipher_type;
2890 } NpkSecurityAssociation;
2891 
2892 /*
2893  Event indication of pairing confirm is received on both
2894  initiator and responder side confirming a pairing session
2895 */
2896 typedef struct {
2897     /*
2898       Unique token Id generated on the initiator/responder side
2899       used for a pairing session between two NAN devices
2900     */
2901     u32 pairing_instance_id;
2902     /* Response code indicating ACCEPT/REJECT */
2903     NanPairingResponseCode rsp_code;
2904     /*
2905       Reason code indicating the cause for REJECT.
2906       NAN_STATUS_SUCCESS and NAN_STATUS_PROTOCOL_FAILURE are
2907       expected reason codes.
2908     */
2909     NanStatusType reason_code;
2910     /*
2911       Indicate the pairing session is setup or verification
2912     */
2913     NanPairingRequestType nan_pairing_request_type;
2914     /* Whether should cache the negotiated NIK/NPK for future verification */
2915     u8 enable_pairing_cache;
2916     /*
2917       The security association info negotiated in the pairing setup, used for future verification
2918     */
2919     NpkSecurityAssociation npk_security_association;
2920 } NanPairingConfirmInd;
2921 
2922 /*
2923   NAN pairing bootstrapping initiator request
2924 */
2925 typedef struct {
2926     /* Publish or Subscribe Id of local Publish/Subscribe */
2927     u16 publish_subscribe_id;
2928 
2929     /*
2930        This Id is the Requestor Instance that is passed as
2931        part of earlier MatchInd/FollowupInd message.
2932     */
2933     u32 requestor_instance_id;
2934 
2935     /*
2936       Discovery MAC addr of the publisher/peer
2937     */
2938     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2939 
2940     /* Proposed bootstrapping method */
2941     u16 request_bootstrapping_method;
2942 
2943     /*
2944        Sequence of values which further specify the published service beyond
2945        the service name.
2946     */
2947     u16 service_specific_info_len;
2948     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
2949 
2950     /*
2951        Sequence of values indicating the service specific info in SDEA
2952        Used for service managed bootstrapping method
2953     */
2954     u16 sdea_service_specific_info_len;
2955     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
2956 
2957     /* Indicates that this is comeback Bootstrapping request */
2958     u8 comeback;
2959 
2960     /* The length of cookie. */
2961     u32 cookie_length;
2962 
2963     /* Cookie for the follow up request */
2964     u8 cookie[];
2965 
2966 } NanBootstrappingRequest;
2967 /*
2968  NAN pairing bootstrapping response from responder to a initate request
2969 */
2970 typedef struct {
2971     /* Publish or Subscribe Id of local Publish/Subscribe */
2972     u16 publish_subscribe_id;
2973 
2974     /*
2975        This Id is the Peer Instance that is passed as
2976        part of earlier MatchInd/FollowupInd message.
2977     */
2978     u32 service_instance_id;
2979 
2980     /* Discovery MAC addr of the peer/initiator */
2981     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
2982 
2983     /*
2984        Sequence of values which further specify the published service beyond
2985        the service name.
2986     */
2987     u16 service_specific_info_len;
2988     u8 service_specific_info[NAN_MAX_SERVICE_SPECIFIC_INFO_LEN];
2989 
2990     /*
2991        Sequence of values indicating the service specific info in SDEA
2992        Used for service managed bootstrapping method
2993     */
2994     u16 sdea_service_specific_info_len;
2995     u8 sdea_service_specific_info[NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN];
2996 
2997     /* Response Code indicating ACCEPT/REJECT */
2998     NanBootstrappingResponseCode rsp_code;
2999 
3000     /* The delay of bootstrapping in seconds */
3001     u32 come_back_delay;
3002 
3003     /* The length of cookie. */
3004     u32 cookie_length;
3005 
3006     /* Cookie for the follow up response */
3007     u8 cookie[];
3008 
3009 } NanBootstrappingIndicationResponse;
3010 
3011 /*
3012   Event indication received on the responder side when a Nan bootsrapping session is initiated on
3013   the Initiator side
3014 */
3015 typedef struct {
3016     /* Publish or Subscribe Id of an earlier Publish/Subscribe */
3017     u16 publish_subscribe_id;
3018     /*
3019       Unique Instance Id corresponding to a service/session.
3020       This is similar to the publish_id generated on the
3021       publisher side
3022     */
3023     u32 bootstrapping_instance_id;
3024     /*
3025       This Id is the Requestor Instance that is passed as
3026       part of earlier MatchInd/FollowupInd message.
3027     */
3028     u32 requestor_instance_id;
3029     /* Discovery MAC addr of the peer/initiator */
3030     u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN];
3031     /* Proposed bootstrapping method from peer*/
3032     u16 request_bootstrapping_method;
3033 
3034 } NanBootstrappingRequestInd;
3035 
3036 /*
3037  Event indication of bootstapping confirm is received on both
3038  initiator side confirming a bootstrapping method
3039 */
3040 typedef struct {
3041     /*
3042       Unique token Id generated on the initiator/responder side
3043       used for a bootstrapping session between two NAN devices
3044     */
3045     u32 bootstrapping_instance_id;
3046     /* Response Code indicating ACCEPT/REJECT */
3047     NanBootstrappingResponseCode rsp_code;
3048     /*
3049       Reason code indicating the cause for REJECT.
3050       NAN_STATUS_SUCCESS and NAN_STATUS_PROTOCOL_FAILURE are
3051       expected reason codes.
3052     */
3053     NanStatusType reason_code;
3054     /* The delay of bootstrapping in seconds */
3055     u32 come_back_delay;
3056 
3057     /* The length of cookie. */
3058     u32 cookie_length;
3059 
3060     /* Cookie received from the comeback response */
3061     u8 cookie[];
3062 
3063 } NanBootstrappingConfirmInd;
3064 
3065 /*
3066  Event indication the device enter or exist the suspension mode
3067 */
3068 typedef struct {
3069     /* Indication the device is suspended or not */
3070     bool is_suspended;
3071 } NanSuspensionModeChangeInd;
3072 
3073 /* Response and Event Callbacks */
3074 typedef struct {
3075     /* NotifyResponse invoked to notify the status of the Request */
3076     void (*NotifyResponse)(transaction_id id, NanResponseMsg* rsp_data);
3077     /* Callbacks for various Events */
3078     void (*EventPublishReplied)(NanPublishRepliedInd *event);
3079     void (*EventPublishTerminated)(NanPublishTerminatedInd* event);
3080     void (*EventMatch) (NanMatchInd* event);
3081     void (*EventMatchExpired) (NanMatchExpiredInd* event);
3082     void (*EventSubscribeTerminated) (NanSubscribeTerminatedInd* event);
3083     void (*EventFollowup) (NanFollowupInd* event);
3084     void (*EventDiscEngEvent) (NanDiscEngEventInd* event);
3085     void (*EventDisabled) (NanDisabledInd* event);
3086     void (*EventTca) (NanTCAInd* event);
3087     void (*EventBeaconSdfPayload) (NanBeaconSdfPayloadInd* event);
3088     void (*EventDataRequest)(NanDataPathRequestInd* event);
3089     void (*EventDataConfirm)(NanDataPathConfirmInd* event);
3090     void (*EventDataEnd)(NanDataPathEndInd* event);
3091     void (*EventTransmitFollowup) (NanTransmitFollowupInd* event);
3092     void (*EventRangeRequest) (NanRangeRequestInd* event);
3093     void (*EventRangeReport) (NanRangeReportInd* event);
3094     void (*EventScheduleUpdate) (NanDataPathScheduleUpdateInd* event);
3095     void (*EventPairingRequest) (NanPairingRequestInd* event);
3096     void (*EventPairingConfirm) (NanPairingConfirmInd* event);
3097     void (*EventBootstrappingRequest) (NanBootstrappingRequestInd* event);
3098     void (*EventBootstrappingConfirm) (NanBootstrappingConfirmInd* event);
3099     void (*EventSuspensionModeChange) (NanSuspensionModeChangeInd* event);
3100 } NanCallbackHandler;
3101 
3102 /**@brief nan_enable_request
3103  *        Enable NAN functionality
3104  *
3105  * @param transaction_id:
3106  * @param wifi_interface_handle:
3107  * @param NanEnableRequest:
3108  * @return Synchronous wifi_error
3109  * @return Asynchronous NotifyResponse CB return
3110  *                      NAN_STATUS_SUCCESS
3111  *                      NAN_STATUS_ALREADY_ENABLED
3112  *                      NAN_STATUS_INVALID_PARAM
3113  *                      NAN_STATUS_INTERNAL_FAILURE
3114  *                      NAN_STATUS_PROTOCOL_FAILURE
3115  *                      NAN_STATUS_NAN_NOT_ALLOWED
3116  */
3117 wifi_error nan_enable_request(transaction_id id,
3118                               wifi_interface_handle iface,
3119                               NanEnableRequest* msg);
3120 
3121 /**@brief nan_disbale_request
3122  *        Disable NAN functionality.
3123  *
3124  * @param transaction_id:
3125  * @param wifi_interface_handle:
3126  * @param NanDisableRequest:
3127  * @return Synchronous wifi_error
3128  * @return Asynchronous NotifyResponse CB return
3129  *                      NAN_STATUS_SUCCESS
3130  *                      NAN_STATUS_PROTOCOL_FAILURE
3131  *
3132  */
3133 wifi_error nan_disable_request(transaction_id id,
3134                                wifi_interface_handle iface);
3135 
3136 /**@brief nan_publish_request
3137  *        Publish request to advertize a service
3138  *
3139  * @param transaction_id:
3140  * @param wifi_interface_handle:
3141  * @param NanPublishRequest:
3142  * @return Synchronous wifi_error
3143  * @return Asynchronous NotifyResponse CB return
3144  *                      NAN_STATUS_SUCCESS
3145  *                      NAN_STATUS_INVALID_PARAM
3146  *                      NAN_STATUS_PROTOCOL_FAILURE
3147  *                      NAN_STATUS_NO_RESOURCE_AVAILABLE
3148  *                      NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID
3149  */
3150 wifi_error nan_publish_request(transaction_id id,
3151                                wifi_interface_handle iface,
3152                                NanPublishRequest* msg);
3153 
3154 /**@brief nan_publish_cancel_request
3155  *        Cancel previous publish request
3156  *
3157  * @param transaction_id:
3158  * @param wifi_interface_handle:
3159  * @param NanPublishCancelRequest:
3160  * @return Synchronous wifi_error
3161  * @return Asynchronous NotifyResponse CB return
3162  *                      NAN_STATUS_SUCCESS
3163  *                      NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID
3164  *                      NAN_STATUS_INTERNAL_FAILURE
3165  */
3166 wifi_error nan_publish_cancel_request(transaction_id id,
3167                                       wifi_interface_handle iface,
3168                                       NanPublishCancelRequest* msg);
3169 
3170 /**@brief nan_subscribe_request
3171  *        Subscribe request to search for a service
3172  *
3173  * @param transaction_id:
3174  * @param wifi_interface_handle:
3175  * @param NanSubscribeRequest:
3176  * @return Synchronous wifi_error
3177  * @return Asynchronous NotifyResponse CB return
3178  *                      NAN_STATUS_SUCCESS
3179  *                      NAN_STATUS_INVALID_PARAM
3180  *                      NAN_STATUS_PROTOCOL_FAILURE
3181  *                      NAN_STATUS_INTERNAL_FAILURE
3182  *                      NAN_STATUS_NO_SPACE_AVAILABLE
3183  *                      NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID
3184  */
3185 wifi_error nan_subscribe_request(transaction_id id,
3186                                  wifi_interface_handle iface,
3187                                  NanSubscribeRequest* msg);
3188 
3189 /**@brief nan_subscribe_cancel_request
3190  *         Cancel previous subscribe requests.
3191  *
3192  * @param transaction_id:
3193  * @param wifi_interface_handle:
3194  * @param NanSubscribeRequest:
3195  * @return Synchronous wifi_error
3196  * @return Asynchronous NotifyResponse CB return
3197  *                      NAN_STATUS_SUCCESS
3198  *                      NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID
3199  *                      NAN_STATUS_INTERNAL_FAILURE
3200  */
3201 wifi_error nan_subscribe_cancel_request(transaction_id id,
3202                                         wifi_interface_handle iface,
3203                                         NanSubscribeCancelRequest* msg);
3204 
3205 /**@brief nan_transmit_followup_request
3206  *         NAN transmit follow up request
3207  *
3208  * @param transaction_id:
3209  * @param wifi_interface_handle:
3210  * @param NanTransmitFollowupRequest:
3211  * @return Synchronous wifi_error
3212  * @return Asynchronous NotifyResponse CB return
3213  *                      NAN_STATUS_SUCCESS
3214  *                      NAN_STATUS_INVALID_PARAM
3215  *                      NAN_STATUS_INTERNAL_FAILURE
3216  *                      NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID
3217  *                      NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID
3218  *                      NAN_STATUS_FOLLOWUP_QUEUE_FULL
3219  * @return Asynchronous TransmitFollowupInd CB return
3220  *                      NAN_STATUS_SUCCESS
3221  *                      NAN_STATUS_PROTOCOL_FAILURE
3222  *                      NAN_STATUS_NO_OTA_ACK
3223  */
3224 wifi_error nan_transmit_followup_request(transaction_id id,
3225                                          wifi_interface_handle iface,
3226                                          NanTransmitFollowupRequest* msg);
3227 
3228 /**@brief nan_stats_request
3229  *        Request NAN statistics from Discovery Engine.
3230  *
3231  * @param transaction_id:
3232  * @param wifi_interface_handle:
3233  * @param NanStatsRequest:
3234  * @return Synchronous wifi_error
3235  * @return Asynchronous NotifyResponse CB return
3236  *                      NAN_STATUS_SUCCESS
3237  *                      NAN_STATUS_INTERNAL_FAILURE
3238  *                      NAN_STATUS_INVALID_PARAM
3239  */
3240 wifi_error nan_stats_request(transaction_id id,
3241                              wifi_interface_handle iface,
3242                              NanStatsRequest* msg);
3243 
3244 /**@brief nan_config_request
3245  *        NAN configuration request.
3246  *
3247  * @param transaction_id:
3248  * @param wifi_interface_handle:
3249  * @param NanConfigRequest:
3250  * @return Synchronous wifi_error
3251  * @return Asynchronous NotifyResponse CB return
3252  *                      NAN_STATUS_SUCCESS
3253  *                      NAN_STATUS_INVALID_PARAM
3254  *                      NAN_STATUS_PROTOCOL_FAILURE
3255  *                      NAN_STATUS_INTERNAL_FAILURE
3256  */
3257 wifi_error nan_config_request(transaction_id id,
3258                               wifi_interface_handle iface,
3259                               NanConfigRequest* msg);
3260 
3261 /**@brief nan_tca_request
3262  *        Configure the various Threshold crossing alerts
3263  *
3264  * @param transaction_id:
3265  * @param wifi_interface_handle:
3266  * @param NanStatsRequest:
3267  * @return Synchronous wifi_error
3268  * @return Asynchronous NotifyResponse CB return
3269  *                      NAN_STATUS_SUCCESS
3270  *                      NAN_STATUS_INVALID_PARAM
3271  *                      NAN_STATUS_INTERNAL_FAILURE
3272  */
3273 wifi_error nan_tca_request(transaction_id id,
3274                            wifi_interface_handle iface,
3275                            NanTCARequest* msg);
3276 
3277 /**@brief nan_beacon_sdf_payload_request
3278  *        Set NAN Beacon or sdf payload to discovery engine.
3279  *          This instructs the Discovery Engine to begin publishing the
3280  *        received payload in any Beacon or Service Discovery Frame transmitted
3281  *
3282  * @param transaction_id:
3283  * @param wifi_interface_handle:
3284  * @param NanStatsRequest:
3285  * @return Synchronous wifi_error
3286  * @return Asynchronous NotifyResponse CB return
3287  *                      NAN_STATUS_SUCCESS
3288  *                      NAN_STATUS_INVALID_PARAM
3289  *                      NAN_STATUS_INTERNAL_FAILURE
3290  */
3291 wifi_error nan_beacon_sdf_payload_request(transaction_id id,
3292                                          wifi_interface_handle iface,
3293                                          NanBeaconSdfPayloadRequest* msg);
3294 
3295 /* Register NAN callbacks. */
3296 wifi_error nan_register_handler(wifi_interface_handle iface,
3297                                 NanCallbackHandler handlers);
3298 
3299 /*  Get NAN HAL version. */
3300 wifi_error nan_get_version(wifi_handle handle,
3301                            NanVersion* version);
3302 
3303 /**@brief nan_get_capabilities
3304  *        Get NAN Capabilities
3305  *
3306  * @param transaction_id:
3307  * @param wifi_interface_handle:
3308  * @return Synchronous wifi_error
3309  * @return Asynchronous NotifyResponse CB return
3310  *                      NAN_STATUS_SUCCESS
3311  */
3312 /*  Get NAN capabilities. */
3313 wifi_error nan_get_capabilities(transaction_id id,
3314                                 wifi_interface_handle iface);
3315 
3316 /* ========== Nan Data Path APIs ================ */
3317 /**@brief nan_data_interface_create
3318  *        Create NAN Data Interface.
3319  *
3320  * @param transaction_id:
3321  * @param wifi_interface_handle:
3322  * @param iface_name:
3323  * @return Synchronous wifi_error
3324  * @return Asynchronous NotifyResponse CB return
3325  *                      NAN_STATUS_SUCCESS
3326  *                      NAN_STATUS_INVALID_PARAM
3327  *                      NAN_STATUS_INTERNAL_FAILURE
3328  */
3329 wifi_error nan_data_interface_create(transaction_id id,
3330                                      wifi_interface_handle iface,
3331                                      char* iface_name);
3332 
3333 /**@brief nan_data_interface_delete
3334  *        Delete NAN Data Interface.
3335  *
3336  * @param transaction_id:
3337  * @param wifi_interface_handle:
3338  * @param iface_name:
3339  * @return Synchronous wifi_error
3340  * @return Asynchronous NotifyResponse CB return
3341  *                      NAN_STATUS_SUCCESS
3342  *                      NAN_STATUS_INVALID_PARAM
3343  *                      NAN_STATUS_INTERNAL_FAILURE
3344  */
3345 wifi_error nan_data_interface_delete(transaction_id id,
3346                                      wifi_interface_handle iface,
3347                                      char* iface_name);
3348 
3349 /**@brief nan_data_request_initiator
3350  *        Initiate a NAN Data Path session.
3351  *
3352  * @param transaction_id:
3353  * @param wifi_interface_handle:
3354  * @param NanDataPathInitiatorRequest:
3355  * @return Synchronous wifi_error
3356  * @return Asynchronous NotifyResponse CB return
3357  *                      NAN_STATUS_SUCCESS
3358  *                      NAN_STATUS_INVALID_PARAM
3359  *                      NAN_STATUS_INTERNAL_FAILURE
3360  *                      NAN_STATUS_PROTOCOL_FAILURE
3361  *                      NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID
3362  */
3363 wifi_error nan_data_request_initiator(transaction_id id,
3364                                       wifi_interface_handle iface,
3365                                       NanDataPathInitiatorRequest* msg);
3366 
3367 /**@brief nan_data_indication_response
3368  *         Response to a data indication received
3369  *         corresponding to a NDP session. An indication
3370  *         is received with a data request and the responder
3371  *         will send a data response
3372  *
3373  * @param transaction_id:
3374  * @param wifi_interface_handle:
3375  * @param NanDataPathIndicationResponse:
3376  * @return Synchronous wifi_error
3377  * @return Asynchronous NotifyResponse CB return
3378  *                      NAN_STATUS_SUCCESS
3379  *                      NAN_STATUS_INVALID_PARAM
3380  *                      NAN_STATUS_INTERNAL_FAILURE
3381  *                      NAN_STATUS_PROTOCOL_FAILURE
3382  *                      NAN_STATUS_INVALID_NDP_ID
3383  */
3384 wifi_error nan_data_indication_response(transaction_id id,
3385                                         wifi_interface_handle iface,
3386                                         NanDataPathIndicationResponse* msg);
3387 
3388 /**@brief nan_data_end
3389  *         NDL termination request: from either Initiator/Responder
3390  *
3391  * @param transaction_id:
3392  * @param wifi_interface_handle:
3393  * @param NanDataPathEndRequest:
3394  * @return Synchronous wifi_error
3395  * @return Asynchronous NotifyResponse CB return
3396  *                      NAN_STATUS_SUCCESS
3397  *                      NAN_STATUS_INVALID_PARAM
3398  *                      NAN_STATUS_INTERNAL_FAILURE
3399  *                      NAN_STATUS_PROTOCOL_FAILURE
3400  *                      NAN_STATUS_INVALID_NDP_ID
3401  */
3402 wifi_error nan_data_end(transaction_id id,
3403                         wifi_interface_handle iface,
3404                         NanDataPathEndRequest* msg);
3405 /**@brief nan_pairing_request
3406  *        Initiate a NAN Pairingsession.
3407  *
3408  * @param transaction_id:
3409  * @param wifi_interface_handle:
3410  * @param NanPairingRequest:
3411  * @return Synchronous wifi_error
3412  * @return Asynchronous NotifyResponse CB return
3413  *                      NAN_STATUS_SUCCESS
3414  *                      NAN_STATUS_INVALID_PARAM
3415  *                      NAN_STATUS_INTERNAL_FAILURE
3416  *                      NAN_STATUS_PROTOCOL_FAILURE
3417  *                      NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID
3418  */
3419 wifi_error nan_pairing_request(transaction_id id, wifi_interface_handle iface,
3420                                NanPairingRequest* msg);
3421 
3422 /**@brief nan_pairing_indication_response
3423  *        Response to a pairing indication received
3424  *        corresponding to a pairing session. An indication
3425  *        is received with a pairing request and the responder
3426  *        will send a pairing response
3427  *
3428  * @param transaction_id:
3429  * @param wifi_interface_handle:
3430  * @param NanPairingIndicationResponse:
3431  * @return Synchronous wifi_error
3432  * @return Asynchronous NotifyResponse CB return
3433  *                      NAN_STATUS_SUCCESS
3434  *                      NAN_STATUS_INVALID_PARAM
3435  *                      NAN_STATUS_INTERNAL_FAILURE
3436  *                      NAN_STATUS_PROTOCOL_FAILURE
3437  *                      NAN_STATUS_INVALID_PAIRING_ID
3438  */
3439 wifi_error nan_pairing_indication_response(transaction_id id, wifi_interface_handle iface,
3440                                            NanPairingIndicationResponse* msg);
3441 
3442 /**@brief nan_pairing_end
3443  *        Cancel and remove the existing Pairing setups
3444  *
3445  * @param transaction_id:
3446  * @param wifi_interface_handle:
3447  * @param NanPairingEndRequest:
3448  * @return Synchronous wifi_error
3449  * @return Asynchronous NotifyResponse CB return
3450  *                      NAN_STATUS_SUCCESS
3451  *                      NAN_STATUS_INVALID_PARAM
3452  *                      NAN_STATUS_INTERNAL_FAILURE
3453  *                      NAN_STATUS_PROTOCOL_FAILURE
3454  *                      NAN_STATUS_INVALID_PAIRING_ID
3455  */
3456 wifi_error nan_pairing_end(transaction_id id, wifi_interface_handle iface,
3457                                                  NanPairingEndRequest* msg);
3458 
3459 /**@brief nan_bootstrapping_request
3460  *        Initiate a NAN Bootstrapping session.
3461  *
3462  * @param transaction_id:
3463  * @param wifi_interface_handle:
3464  * @param NanBootstrappingRequest:
3465  * @return Synchronous wifi_error
3466  * @return Asynchronous NotifyResponse CB return
3467  *                      NAN_STATUS_SUCCESS
3468  *                      NAN_STATUS_INVALID_PARAM
3469  *                      NAN_STATUS_INTERNAL_FAILURE
3470  *                      NAN_STATUS_PROTOCOL_FAILURE
3471  *                      NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID
3472  */
3473 wifi_error nan_bootstrapping_request(transaction_id id, wifi_interface_handle iface,
3474                                      NanBootstrappingRequest* msg);
3475 
3476 /**@brief nan_bootstrapping_indication_response
3477  *         Response to a pairing indication received
3478  *         corresponding to a pairing session. An indication
3479  *         is received with a pairing request and the responder
3480  *         will send a pairing response
3481  *
3482  * @param transaction_id:
3483  * @param wifi_interface_handle:
3484  * @param NanBootstrappingIndicationResponse:
3485  * @return Synchronous wifi_error
3486  * @return Asynchronous NotifyResponse CB return
3487  *                      NAN_STATUS_SUCCESS
3488  *                      NAN_STATUS_INVALID_PARAM
3489  *                      NAN_STATUS_INTERNAL_FAILURE
3490  *                      NAN_STATUS_PROTOCOL_FAILURE
3491  *                      NAN_STATUS_INVALID_BOOTSTRAPPING_ID
3492  */
3493 wifi_error nan_bootstrapping_indication_response(transaction_id id, wifi_interface_handle iface,
3494                                                  NanBootstrappingIndicationResponse* msg);
3495 
3496 #ifdef __cplusplus
3497 }
3498 #endif /* __cplusplus */
3499 
3500 #endif /* __NAN_H__ */
3501