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