• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Neighbor Awareness Networking
3  *
4  * Copyright (C) 1999-2017, Broadcom Corporation
5  *
6  *      Unless you and Broadcom execute a separate written software license
7  * agreement governing use of this software, this software is licensed to you
8  * under the terms of the GNU General Public License version 2 (the "GPL"),
9  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10  * following added to such license:
11  *
12  *      As a special exception, the copyright holders of this software give you
13  * permission to link this software with independent modules, and to copy and
14  * distribute the resulting executable under terms of your choice, provided that
15  * you also meet, for each linked independent module, the terms and conditions of
16  * the license of that module.  An independent module is a module which is not
17  * derived from this software.  The special exception does not apply to any
18  * modifications of the software.
19  *
20  *      Notwithstanding the above, under no circumstances may you combine this
21  * software in any way with any other Broadcom software provided under a license
22  * other than the GPL, without Broadcom's express prior written consent.
23  *
24  * <<Broadcom-WL-IPTag/Open:>>
25  *
26  * $Id: wl_cfgnan.h 650782 2016-07-22 11:51:53Z $
27  */
28 
29 #ifndef _wl_cfgnan_h_
30 #define _wl_cfgnan_h_
31 
32 #define NAN_IOCTL_BUF_SIZE            512
33 #define NAN_EVENT_NAME_MAX_LEN        40
34 #define NAN_CONFIG_ATTR_MAX_LEN        24
35 #define NAN_RTT_IOVAR_BUF_SIZE        1024
36 #define WL_NAN_EVENT_CLEAR_BIT        32
37 #define NAN_EVENT_MASK_ALL            0x7fffffff
38 
39 #define NAN_MAXIMUM_ID_NUMBER 255
40 #define NAN_MAXIMUM_MASTER_PREFERENCE 255
41 #ifdef NAN_DP
42 #define MAX_IF_ADD_WAIT_TIME    1000
43 #endif /* NAN_DP */
44 #define NAN_INVALID_ID(id)    (id > NAN_MAXIMUM_ID_NUMBER)
45 #define NAN_INVALID_ROLE(role)    (role > WL_NAN_ROLE_ANCHOR_MASTER)
46 #define NAN_INVALID_CHANSPEC(chanspec)    ((chanspec == INVCHANSPEC) || \
47     (chanspec == 0))
48 #define NAN_INVALID_EVENT(num)    ((num < WL_NAN_EVENT_START) || \
49     (num >= WL_NAN_EVENT_INVALID))
50 #define NAN_INVALID_PROXD_EVENT(num)    (num != WLC_E_PROXD_NAN_EVENT)
51 #define NAN_EVENT_BIT(event) (1U << (event - WL_NAN_EVENT_START))
52 #define NAME_TO_STR(name) #name
53 #define NAN_ID_CTRL_SIZE ((NAN_MAXIMUM_ID_NUMBER/8) + 1)
54 
55 #define SUPP_EVENT_PREFIX        "CTRL-EVENT-"
56 #define EVENT_RTT_STATUS_STR    "NAN-RTT-STATUS"
57 
58 #define TIMESTAMP_PREFIX    "TSF="            /* timestamp */
59 #define AMR_PREFIX            "AMR="            /* anchor master rank */
60 #define DISTANCE_PREFIX        "DIST="            /* distance */
61 #define ATTR_PREFIX            "ATTR="            /* attribute */
62 #define ROLE_PREFIX            "ROLE="            /* role */
63 #define CHAN_PREFIX            "CHAN="            /* channel */
64 #define BITMAP_PREFIX        "BMAP="            /* bitmap */
65 #define DEBUG_PREFIX        "DEBUG="        /* debug enable/disable flag */
66 #define DW_LEN_PREFIX        "DW_LEN="        /* discovery window length */
67 #define DW_INT_PREFIX        "DW_INT="        /* discovery window interval */
68 #define STATUS_PREFIX        "STATUS="        /* status */
69 #define PUB_ID_PREFIX        "PUB_ID="        /* publisher id */
70 #define SUB_ID_PREFIX        "SUB_ID="        /* subscriber id */
71 #define INSTANCE_ID_PREFIX        "LOCAL_ID="        /* Instance id */
72 #define REMOTE_INSTANCE_ID_PREFIX        "PEER_ID="        /* Peer id */
73 
74 #ifdef NAN_P2P_CONFIG
75 #define P2P_IE_PREFIX        "P2P_IE="        /* p2p ie  id */
76 #define IE_EN_PREFIX        "ENBLE_IE="        /* enable p2p ie  */
77 #endif
78 #define PUB_PR_PREFIX        "PUB_PR="        /* publish period */
79 #define PUB_INT_PREFIX        "PUB_INT="        /* publish interval (ttl) */
80 #define CLUS_ID_PREFIX        "CLUS_ID="        /* cluster id */
81 #define IF_ADDR_PREFIX        "IF_ADDR="        /* IF address */
82 #define MAC_ADDR_PREFIX        "MAC_ADDR="        /* mac address */
83 #define SVC_HASH_PREFIX        "SVC_HASH="        /* service hash */
84 #define SVC_INFO_PREFIX        "SVC_INFO="        /* service information */
85 #define HOP_COUNT_PREFIX    "HOP_COUNT="    /* hop count */
86 #define MASTER_PREF_PREFIX    "MASTER_PREF="    /* master preference */
87 #define ACTIVE_OPTION        "ACTIVE"        /* Active Subscribe. */
88 #define SOLICITED_OPTION    "SOLICITED"        /* Solicited Publish. */
89 #define UNSOLICITED_OPTION    "UNSOLICITED"    /* Unsolicited Publish. */
90 /* anchor master beacon transmission time */
91 #define AMBTT_PREFIX        "AMBTT="
92 /* passive scan period for cluster merge */
93 #define SCAN_PERIOD_PREFIX    "SCAN_PERIOD="
94 /* passive scan interval for cluster merge */
95 #define SCAN_INTERVAL_PREFIX    "SCAN_INTERVAL="
96 #define BCN_INTERVAL_PREFIX        "BCN_INTERVAL="
97 
98 #define NAN_EVENT_STR_STARTED               "NAN-STARTED"
99 #define NAN_EVENT_STR_JOINED                "NAN-JOINED"
100 #define NAN_EVENT_STR_ROLE_CHANGE           "NAN-ROLE-CHANGE"
101 #define NAN_EVENT_STR_SCAN_COMPLETE         "NAN-SCAN-COMPLETE"
102 #define NAN_EVENT_STR_SDF_RX                "NAN-SDF-RX"
103 #define NAN_EVENT_STR_REPLIED               "NAN-REPLIED"
104 #define NAN_EVENT_STR_TERMINATED            "NAN-TERMINATED"
105 #define NAN_EVENT_STR_FOLLOWUP_RX           "NAN-FOLLOWUP-RX"
106 #define NAN_EVENT_STR_STATUS_CHANGE         "NAN-STATUS-CHANGE"
107 #define NAN_EVENT_STR_MERGED                "NAN-MERGED"
108 #define NAN_EVENT_STR_STOPPED               "NAN-STOPPED"
109 #define NAN_EVENT_STR_P2P_RX                "NAN-P2P-RX"
110 #define NAN_EVENT_STR_WINDOW_BEGUN_P2P      "NAN-WINDOW-BEGUN-P2P"
111 #define NAN_EVENT_STR_WINDOW_BEGUN_MESH     "NAN-WINDOW-BEGUN-MESH"
112 #define NAN_EVENT_STR_WINDOW_BEGUN_IBSS     "NAN-WINDOW-BEGUN-IBSS"
113 #define NAN_EVENT_STR_WINDOW_BEGUN_RANGING  "NAN-WINDOW-BEGUN-RANGING"
114 #define NAN_EVENT_STR_INVALID               "NAN-INVALID"
115 
116 #ifdef NAN_DP
117 enum nan_dp_states {
118     NAN_DP_STATE_DISABLED = 0,
119     NAN_DP_STATE_ENABLED = 1
120 };
121 #endif /* NAN_DP */
122 
123 enum nan_de_event_type {
124     NAN_EVENT_START = 0,
125     NAN_EVENT_JOIN = 1
126 };
127 
128 typedef struct nan_str_data {
129     u8 *data;
130     u32 dlen;
131 } nan_str_data_t;
132 
133 typedef struct nan_mac_list {
134     u8 *list;
135     u32 num_mac_addr;
136 } nan_mac_list_t;
137 
138 typedef struct nan_config_attr {
139     char name[NAN_CONFIG_ATTR_MAX_LEN];    /* attribute name */
140     u16 type;                            /* attribute xtlv type */
141 } nan_config_attr_t;
142 
143 typedef struct wl_nan_sid_beacon_tune {
144     u8 sid_enable;    /* flag for sending service id in beacon */
145     u8 sid_count;    /* Limit for number of SIDs to be included in Beacons */
146 } wl_nan_sid_beacon_ctrl_t;
147 
148 typedef struct nan_cmd_data {
149     nan_config_attr_t attr;            /* set config attributes */
150     nan_str_data_t svc_hash;        /* service hash */
151     nan_str_data_t svc_info;        /* service information */
152     nan_str_data_t p2p_info;        /* p2p information */
153     struct ether_addr mac_addr;        /* mac address */
154     struct ether_addr clus_id;        /* cluster id */
155     struct ether_addr if_addr;        /* if addr */
156     u32 beacon_int;                    /* beacon interval */
157     u32 ttl;                      /* time to live */
158     u32 period;                   /* publish period */
159     u32 bmap;                        /* bitmap */
160     u32 role;                        /* role */
161     wl_nan_instance_id_t pub_id;    /* publisher id */
162     wl_nan_instance_id_t sub_id;    /* subscriber id */
163     wl_nan_instance_id_t local_id;    /* Local id */
164     wl_nan_instance_id_t remote_id;    /* Remote id */
165     uint32 flags;                    /* Flag bits */
166     u16 dw_len;                        /* discovery window length */
167     u16 master_pref;                /* master preference */
168     chanspec_t chanspec;            /* channel */
169     u8 debug_flag;                    /* debug enable/disable flag */
170     u8 life_count;             /* life count of the instance */
171     u8 srf_type;               /* SRF type */
172     u8 srf_include;            /* SRF include */
173     u8 use_srf;                /* use SRF */
174     nan_str_data_t rx_match;    /* matching filter rx */
175     nan_str_data_t tx_match;    /* matching filter tx */
176     nan_mac_list_t mac_list;   /* mac list */
177     uint8 hop_count_limit;     /* hop count limit */
178     uint8 nan_band;            /* nan band <A/B/AUTO> */
179     uint8 support_5g;          /* To decide dual band support */
180     uint32 nan_oui;            /* configured nan oui */
181 #ifdef NAN_DP
182     struct ether_addr data_cluster_id;        /* data cluster id */
183 #endif /* NAN_DP */
184     wl_nan_sid_beacon_ctrl_t sid_beacon;          /* sending service id in beacon */
185 } nan_cmd_data_t;
186 
187 typedef int (nan_func_t)(struct net_device *ndev, struct bcm_cfg80211 *cfg,
188     char *cmd, int size, nan_cmd_data_t *cmd_data);
189 
190 typedef struct nan_cmd {
191     const char *name;                    /* command name */
192     nan_func_t *func;                    /* command hadler */
193 } nan_cmd_t;
194 
195 typedef struct nan_event_hdr {
196     u16 event_subtype;
197     u32 flags;                            /* future use */
198 } nan_event_hdr_t;
199 
200 typedef struct wl_nan_tlv_data {
201     wl_nan_status_t nstatus;            /* status data */
202     wl_nan_disc_params_t params;        /* discovery parameters */
203     struct ether_addr mac_addr;            /* peer mac address */
204     struct ether_addr clus_id;            /* cluster id */
205     nan_str_data_t svc_info;            /* service info */
206     nan_str_data_t vend_info;            /* vendor info */
207     /* anchor master beacon transmission time */
208     u32 ambtt;
209     u32 dev_role;                        /* device role */
210     u16 inst_id;                        /* instance id */
211     u16 peer_inst_id;                    /* Peer instance id */
212     u16 pub_id;                            /* publisher id */
213     u16 sub_id;                            /* subscriber id */
214     u16 master_pref;                    /* master preference */
215     chanspec_t chanspec;                /* channel */
216     u8 amr[NAN_MASTER_RANK_LEN];        /* anchor master role */
217     u8 svc_name[WL_NAN_SVC_HASH_LEN];    /* service name */
218     u8 hop_count;                        /* hop count */
219     u8 enabled;                            /* nan status flag */
220     nan_scan_params_t scan_params;        /* scan_param */
221     int reason_code;              /* reason code */
222 } wl_nan_tlv_data_t;
223 
224 typedef struct _nan_de_event_data {
225     wl_nan_cfg_status_t *nstatus;
226     u8 nan_de_evt_type;
227 } nan_de_event_data_t;
228 
229 typedef struct _nan_hal_resp {
230     unsigned short instance_id;
231     unsigned short subcmd;
232     int status;
233     int value;
234 } nan_hal_resp_t;
235 
236 #ifdef NAN_DP
237 typedef struct nan_data_path_peer {
238     struct ether_addr addr;        /* peer mac address */
239     chanspec_t chanspec;           /* Channel Specification */
240 } nan_data_path_peer_t;
241 #endif /* NAN_DP */
242 
243 extern int wl_cfgnan_set_vars_cbfn(void *ctx, uint8 *tlv_buf,
244     uint16 type, uint16 len);
245 extern int wl_cfgnan_enable_events(struct net_device *ndev,
246     struct bcm_cfg80211 *cfg);
247 extern int wl_cfgnan_start_handler(struct net_device *ndev,
248     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
249 extern int wl_cfgnan_stop_handler(struct net_device *ndev,
250     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
251 extern int wl_cfgnan_support_handler(struct net_device *ndev,
252     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
253 extern int wl_cfgnan_status_handler(struct net_device *ndev,
254     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
255 extern int wl_cfgnan_pub_handler(struct net_device *ndev,
256     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
257 extern int wl_cfgnan_p2p_ie_add_handler(struct net_device *ndev,
258     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
259 extern int wl_cfgnan_p2p_ie_enable_handler(struct net_device *ndev,
260     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
261 extern int wl_cfgnan_p2p_ie_del_handler(struct net_device *ndev,
262     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
263 
264 extern int wl_cfgnan_sub_handler(struct net_device *ndev,
265     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
266 extern int wl_cfgnan_cancel_pub_handler(struct net_device *ndev,
267     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
268 extern int wl_cfgnan_cancel_sub_handler(struct net_device *ndev,
269     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
270 extern int wl_cfgnan_transmit_handler(struct net_device *ndev,
271     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
272 extern int wl_cfgnan_set_config_handler(struct net_device *ndev,
273     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
274 extern int wl_cfgnan_rtt_config_handler(struct net_device *ndev,
275     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
276 extern int wl_cfgnan_rtt_find_handler(struct net_device *ndev,
277     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
278 #ifdef WL_NAN_DEBUG
279 extern int wl_cfgnan_debug_handler(struct net_device *ndev,
280     struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
281 #endif /* WL_NAN_DEBUG */
282 extern int wl_cfgnan_cmd_handler(struct net_device *dev,
283     struct bcm_cfg80211 *cfg, char *cmd, int cmd_len);
284 extern s32 wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg,
285     bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data);
286 extern s32 wl_cfgnan_notify_proxd_status(struct bcm_cfg80211 *cfg,
287     bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data);
288 extern int wl_cfgnan_generate_inst_id(struct bcm_cfg80211 *cfg,
289     uint8 inst_type, uint8 *p_inst_id);
290 extern int wl_cfgnan_validate_inst_id(struct bcm_cfg80211 *cfg,
291     uint8 inst_id);
292 extern int wl_cfgnan_remove_inst_id(struct bcm_cfg80211 *cfg,
293     uint8 inst_id);
294 extern int wl_cfgnan_get_inst_type(struct bcm_cfg80211 *cfg,
295     uint8 inst_id, uint8 *inst_type);
296 
297 typedef enum {
298     NAN_ATTRIBUTE_HEADER = 100,
299     NAN_ATTRIBUTE_HANDLE,
300     NAN_ATTRIBUTE_TRANSAC_ID,
301     /* NAN Enable request attributes */
302     NAN_ATTRIBUTE_5G_SUPPORT,
303     NAN_ATTRIBUTE_CLUSTER_LOW,
304     NAN_ATTRIBUTE_CLUSTER_HIGH,
305     NAN_ATTRIBUTE_SID_BEACON,
306     NAN_ATTRIBUTE_SYNC_DISC_5G,
307     NAN_ATTRIBUTE_RSSI_CLOSE,
308     NAN_ATTRIBUTE_RSSI_MIDDLE,
309     NAN_ATTRIBUTE_RSSI_PROXIMITY,
310     NAN_ATTRIBUTE_HOP_COUNT_LIMIT,
311     NAN_ATTRIBUTE_RANDOM_TIME,
312     NAN_ATTRIBUTE_MASTER_PREF,
313     NAN_ATTRIBUTE_PERIODIC_SCAN_INTERVAL,
314     /* Nan Publish/Subscribe request Attributes */
315     NAN_ATTRIBUTE_PUBLISH_ID,
316     NAN_ATTRIBUTE_TTL,
317     NAN_ATTRIBUTE_PERIOD,
318     NAN_ATTRIBUTE_REPLIED_EVENT_FLAG,
319     NAN_ATTRIBUTE_PUBLISH_TYPE,
320     NAN_ATTRIBUTE_TX_TYPE,
321     NAN_ATTRIBUTE_PUBLISH_COUNT,
322     NAN_ATTRIBUTE_SERVICE_NAME_LEN,
323     NAN_ATTRIBUTE_SERVICE_NAME,
324     NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN,
325     NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO,
326     NAN_ATTRIBUTE_RX_MATCH_FILTER_LEN,
327     NAN_ATTRIBUTE_RX_MATCH_FILTER,
328     NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN,
329     NAN_ATTRIBUTE_TX_MATCH_FILTER,
330     NAN_ATTRIBUTE_SUBSCRIBE_ID,
331     NAN_ATTRIBUTE_SUBSCRIBE_TYPE,
332     NAN_ATTRIBUTE_SERVICERESPONSEFILTER,
333     NAN_ATTRIBUTE_SERVICERESPONSEINCLUDE,
334     NAN_ATTRIBUTE_USESERVICERESPONSEFILTER,
335     NAN_ATTRIBUTE_SSIREQUIREDFORMATCHINDICATION,
336     NAN_ATTRIBUTE_SUBSCRIBE_MATCH,
337     NAN_ATTRIBUTE_SUBSCRIBE_COUNT,
338     NAN_ATTRIBUTE_MAC_ADDR,
339     NAN_ATTRIBUTE_MAC_ADDR_LIST,
340     NAN_ATTRIBUTE_MAC_ADDR_LIST_NUM_ENTRIES,
341     NAN_ATTRIBUTE_PUBLISH_MATCH,
342     /* Nan Event attributes */
343     NAN_ATTRIBUTE_ENABLE_STATUS,
344     NAN_ATTRIBUTE_JOIN_STATUS,
345     NAN_ATTRIBUTE_ROLE,
346     NAN_ATTRIBUTE_CHANNEL,    /* channel */
347     NAN_ATTRIBUTE_PEER_ID,
348     NAN_ATTRIBUTE_INST_ID,
349     NAN_ATTRIBUTE_OUI,
350     NAN_ATTRIBUTE_DATA_IF_ADD,       /* NAN DP Interface Address */
351     NAN_ATTRIBUTE_STATUS,
352     NAN_ATTRIBUTE_DE_EVENT_TYPE
353 } NAN_ATTRIBUTE;
354 
355 #define NAN_BLOOM_LENGTH_DEFAULT        240
356 #define NAN_SRF_MAX_MAC (NAN_BLOOM_LENGTH_DEFAULT / ETHER_ADDR_LEN)
357 
358 #ifdef NAN_DP
359 int wl_cfgnan_data_path_open_handler(struct net_device *ndev,
360         struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
361 int wl_cfgnan_data_path_close_handler(struct net_device *ndev,
362         struct bcm_cfg80211 *cfg, char *cmd, int size, nan_cmd_data_t *cmd_data);
363 #endif /* NAN_DP */
364 #endif    /* _wl_cfgnan_h_ */
365