1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Linux cfgp2p driver 4 * 5 * Copyright (C) 1999-2019, Broadcom. 6 * 7 * Unless you and Broadcom execute a separate written software license 8 * agreement governing use of this software, this software is licensed to you 9 * under the terms of the GNU General Public License version 2 (the "GPL"), 10 * available at http://www.broadcom.com/licenses/GPLv2.php, with the 11 * following added to such license: 12 * 13 * As a special exception, the copyright holders of this software give you 14 * permission to link this software with independent modules, and to copy and 15 * distribute the resulting executable under terms of your choice, provided that 16 * you also meet, for each linked independent module, the terms and conditions of 17 * the license of that module. An independent module is a module which is not 18 * derived from this software. The special exception does not apply to any 19 * modifications of the software. 20 * 21 * Notwithstanding the above, under no circumstances may you combine this 22 * software in any way with any other Broadcom software provided under a license 23 * other than the GPL, without Broadcom's express prior written consent. 24 * 25 * 26 * <<Broadcom-WL-IPTag/Open:>> 27 * 28 * $Id: wl_cfgp2p.h 794110 2018-12-12 05:03:21Z $ 29 */ 30 #ifndef _wl_cfgp2p_h_ 31 #define _wl_cfgp2p_h_ 32 #include <802.11.h> 33 #include <p2p.h> 34 35 struct bcm_cfg80211; 36 extern u32 wl_dbg_level; 37 38 typedef struct wifi_p2p_ie wifi_wfd_ie_t; 39 /* Enumeration of the usages of the BSSCFGs used by the P2P Library. Do not 40 * confuse this with a bsscfg index. This value is an index into the 41 * saved_ie[] array of structures which in turn contains a bsscfg index field. 42 */ 43 typedef enum { 44 P2PAPI_BSSCFG_PRIMARY, /**< maps to driver's primary bsscfg */ 45 P2PAPI_BSSCFG_DEVICE, /**< maps to driver's P2P device discovery bsscfg */ 46 P2PAPI_BSSCFG_CONNECTION1, /**< maps to driver's P2P connection bsscfg */ 47 P2PAPI_BSSCFG_CONNECTION2, 48 P2PAPI_BSSCFG_MAX 49 } p2p_bsscfg_type_t; 50 51 typedef enum { 52 P2P_SCAN_PURPOSE_MIN, 53 P2P_SCAN_SOCIAL_CHANNEL, /**< scan for social channel */ 54 P2P_SCAN_AFX_PEER_NORMAL, /**< scan for action frame search */ 55 P2P_SCAN_AFX_PEER_REDUCED, /**< scan for action frame search with short time */ 56 P2P_SCAN_DURING_CONNECTED, /**< scan during connected status */ 57 P2P_SCAN_CONNECT_TRY, /**< scan for connecting */ 58 P2P_SCAN_NORMAL, /**< scan during not-connected status */ 59 P2P_SCAN_PURPOSE_MAX 60 } p2p_scan_purpose_t; 61 62 /** vendor ies max buffer length for probe response or beacon */ 63 #define VNDR_IES_MAX_BUF_LEN 1400 64 /** normal vendor ies buffer length */ 65 #define VNDR_IES_BUF_LEN 512 66 67 struct p2p_bss { 68 s32 bssidx; 69 struct net_device *dev; 70 void *private_data; 71 struct ether_addr mac_addr; 72 }; 73 74 struct p2p_info { 75 bool on; /**< p2p on/off switch */ 76 bool scan; 77 int16 search_state; 78 s8 vir_ifname[IFNAMSIZ]; 79 unsigned long status; 80 struct p2p_bss bss[P2PAPI_BSSCFG_MAX]; 81 timer_list_compat_t listen_timer; 82 wl_p2p_sched_t noa; 83 wl_p2p_ops_t ops; 84 wlc_ssid_t ssid; 85 s8 p2p_go_count; 86 }; 87 88 #define MAX_VNDR_IE_NUMBER 10 89 90 struct parsed_vndr_ie_info { 91 const char *ie_ptr; 92 u32 ie_len; /**< total length including id & length field */ 93 vndr_ie_t vndrie; 94 }; 95 96 struct parsed_vndr_ies { 97 u32 count; 98 struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER]; 99 }; 100 101 /* dongle status */ 102 enum wl_cfgp2p_status { 103 WLP2P_STATUS_DISCOVERY_ON = 0, 104 WLP2P_STATUS_SEARCH_ENABLED, 105 WLP2P_STATUS_IF_ADDING, 106 WLP2P_STATUS_IF_DELETING, 107 WLP2P_STATUS_IF_CHANGING, 108 WLP2P_STATUS_IF_CHANGED, 109 WLP2P_STATUS_LISTEN_EXPIRED, 110 WLP2P_STATUS_ACTION_TX_COMPLETED, 111 WLP2P_STATUS_ACTION_TX_NOACK, 112 WLP2P_STATUS_SCANNING, 113 WLP2P_STATUS_GO_NEG_PHASE, 114 WLP2P_STATUS_DISC_IN_PROGRESS 115 }; 116 117 #define wl_to_p2p_bss_ndev(cfg, type) ((cfg)->p2p->bss[type].dev) 118 #define wl_to_p2p_bss_bssidx(cfg, type) ((cfg)->p2p->bss[type].bssidx) 119 #define wl_to_p2p_bss_macaddr(cfg, type) &((cfg)->p2p->bss[type].mac_addr) 120 #define wl_to_p2p_bss_saved_ie(cfg, type) ((cfg)->p2p->bss[type].saved_ie) 121 #define wl_to_p2p_bss_private(cfg, type) ((cfg)->p2p->bss[type].private_data) 122 #define wl_to_p2p_bss(cfg, type) ((cfg)->p2p->bss[type]) 123 #define wl_get_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \ 124 test_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status)) 125 #define wl_set_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \ 126 set_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status)) 127 #define wl_clr_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \ 128 clear_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status)) 129 #define wl_chg_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \ 130 change_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status)) 131 #define p2p_on(cfg) ((cfg)->p2p->on) 132 #define p2p_scan(cfg) ((cfg)->p2p->scan) 133 #define p2p_is_on(cfg) ((cfg)->p2p && (cfg)->p2p->on) 134 135 /* dword align allocation */ 136 #define WLC_IOCTL_MAXLEN 8192 137 138 #define CFGP2P_ERROR_TEXT DHD_LOG_PREFIXS "CFGP2P-ERROR) " 139 140 #ifdef DHD_LOG_DUMP 141 #define CFGP2P_ERR_MSG(x, args...) \ 142 do { \ 143 if (wl_dbg_level & WL_DBG_ERR) { \ 144 printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : " x, __func__, ## args); \ 145 DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__); \ 146 DHD_LOG_DUMP_WRITE(x, ## args); \ 147 } \ 148 } while (0) 149 #define CFGP2P_ERR(x) CFGP2P_ERR_MSG x 150 #define CFGP2P_INFO_MSG(x, args...) \ 151 do { \ 152 if (wl_dbg_level & WL_DBG_INFO) { \ 153 printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-INFO) %s : " x, __func__, ## args); \ 154 DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__); \ 155 DHD_LOG_DUMP_WRITE(x, ## args); \ 156 } \ 157 } while (0) 158 #define CFGP2P_INFO(x) CFGP2P_INFO_MSG x 159 #define CFGP2P_ACTION_MSG(x, args...) \ 160 do { \ 161 if (wl_dbg_level & WL_DBG_P2P_ACTION) { \ 162 printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-ACTION) %s :" x, __func__, ## args); \ 163 DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__); \ 164 DHD_LOG_DUMP_WRITE(x, ## args); \ 165 } \ 166 } while (0) 167 #define CFGP2P_ACTION(x) CFGP2P_ACTION_MSG x 168 #else 169 #define CFGP2P_ERR_MSG(x, args...) \ 170 do { \ 171 if (wl_dbg_level & WL_DBG_ERR) { \ 172 printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : " x, __func__, ## args); \ 173 } \ 174 } while (0) 175 #define CFGP2P_ERR(x) CFGP2P_ERR_MSG x 176 #define CFGP2P_INFO_MSG(x, args...) \ 177 do { \ 178 if (wl_dbg_level & WL_DBG_INFO) { \ 179 printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-INFO) %s : " x, __func__, ## args); \ 180 } \ 181 } while (0) 182 #define CFGP2P_INFO(x) CFGP2P_INFO_MSG x 183 #define CFGP2P_ACTION_MSG(x, args...) \ 184 do { \ 185 if (wl_dbg_level & WL_DBG_P2P_ACTION) { \ 186 printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-ACTION) %s :" x, __func__, ## args); \ 187 } \ 188 } while (0) 189 #define CFGP2P_ACTION(x) CFGP2P_ACTION_MSG x 190 #endif /* DHD_LOG_DUMP */ 191 192 #define CFGP2P_DBG_MSG(x, args...) \ 193 do { \ 194 if (wl_dbg_level & WL_DBG_DBG) { \ 195 printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-DEBUG) %s :" x, __func__, ## args); \ 196 } \ 197 } while (0) 198 #define CFGP2P_DBG(x) CFGP2P_DBG_MSG x 199 200 #define INIT_TIMER(timer, func, duration, extra_delay) \ 201 do { \ 202 init_timer_compat(timer, func, cfg); \ 203 timer_expires(timer) = jiffies + msecs_to_jiffies(duration + extra_delay); \ 204 add_timer(timer); \ 205 } while (0); 206 207 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(3, 0, 8)) 208 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES 209 #undef WL_SUPPORT_BACKPORTED_KPATCHES 210 #endif 211 #endif 212 213 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) 214 #ifdef WL_CFG80211_STA_EVENT 215 #undef WL_CFG80211_STA_EVENT 216 #endif 217 #endif 218 219 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) && !defined(WL_CFG80211_P2P_DEV_IF) 220 #define WL_CFG80211_P2P_DEV_IF 221 222 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES 223 #undef WL_SUPPORT_BACKPORTED_KPATCHES 224 #endif // endif 225 #else 226 #ifdef WLP2P 227 /* Enable P2P network Interface if P2P support is enabled */ 228 #define WL_ENABLE_P2P_IF 229 #endif /* WLP2P */ 230 #endif /* (LINUX_VERSION >= VERSION(3, 8, 0)) */ 231 232 #ifndef WL_CFG80211_P2P_DEV_IF 233 #endif /* WL_CFG80211_P2P_DEV_IF */ 234 235 #if defined(WL_ENABLE_P2P_IF) && (defined(WL_CFG80211_P2P_DEV_IF) || \ 236 (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))) 237 #error Disable 'WL_ENABLE_P2P_IF', if 'WL_CFG80211_P2P_DEV_IF' is enabled \ 238 or kernel version is 3.8.0 or above 239 #endif /* WL_ENABLE_P2P_IF && (WL_CFG80211_P2P_DEV_IF || (LINUX_VERSION >= VERSION(3, 8, 0))) */ 240 241 #if !defined(WLP2P) && (defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF)) 242 #error WLP2P not defined 243 #endif /* !WLP2P && (WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF) */ 244 245 #if defined(WL_CFG80211_P2P_DEV_IF) 246 #define bcm_struct_cfgdev struct wireless_dev 247 #else 248 #define bcm_struct_cfgdev struct net_device 249 #endif /* WL_CFG80211_P2P_DEV_IF */ 250 251 #define P2P_ECSA_CNT 50 252 253 extern void 254 wl_cfgp2p_listen_expired(unsigned long data); 255 extern bool 256 wl_cfgp2p_is_pub_action(void *frame, u32 frame_len); 257 extern bool 258 wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len); 259 extern bool 260 wl_cfgp2p_is_gas_action(void *frame, u32 frame_len); 261 extern bool 262 wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len); 263 extern bool 264 wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len); 265 extern void 266 wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel); 267 extern s32 268 wl_cfgp2p_init_priv(struct bcm_cfg80211 *cfg); 269 extern void 270 wl_cfgp2p_deinit_priv(struct bcm_cfg80211 *cfg); 271 extern s32 272 wl_cfgp2p_set_firm_p2p(struct bcm_cfg80211 *cfg); 273 extern s32 274 wl_cfgp2p_set_p2p_mode(struct bcm_cfg80211 *cfg, u8 mode, 275 u32 channel, u16 listen_ms, int bssidx); 276 extern s32 277 wl_cfgp2p_ifadd(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type, 278 chanspec_t chspec); 279 extern s32 280 wl_cfgp2p_ifdisable(struct bcm_cfg80211 *cfg, struct ether_addr *mac); 281 extern s32 282 wl_cfgp2p_ifdel(struct bcm_cfg80211 *cfg, struct ether_addr *mac); 283 extern s32 284 wl_cfgp2p_ifchange(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type, 285 chanspec_t chspec, s32 conn_idx); 286 287 extern s32 288 wl_cfgp2p_ifidx(struct bcm_cfg80211 *cfg, struct ether_addr *mac, s32 *index); 289 290 extern s32 291 wl_cfgp2p_init_discovery(struct bcm_cfg80211 *cfg); 292 extern s32 293 wl_cfgp2p_enable_discovery(struct bcm_cfg80211 *cfg, struct net_device *dev, const u8 *ie, 294 u32 ie_len); 295 extern s32 296 wl_cfgp2p_disable_discovery(struct bcm_cfg80211 *cfg); 297 extern s32 298 wl_cfgp2p_escan(struct bcm_cfg80211 *cfg, struct net_device *dev, u16 active, u32 num_chans, 299 u16 *channels, 300 s32 search_state, u16 action, u32 bssidx, struct ether_addr *tx_dst_addr, 301 p2p_scan_purpose_t p2p_scan_purpose); 302 303 extern s32 304 wl_cfgp2p_act_frm_search(struct bcm_cfg80211 *cfg, struct net_device *ndev, 305 s32 bssidx, s32 channel, struct ether_addr *tx_dst_addr); 306 307 extern const wpa_ie_fixed_t * 308 wl_cfgp2p_find_wpaie(const u8 *parse, u32 len); 309 310 extern const wpa_ie_fixed_t * 311 wl_cfgp2p_find_wpsie(const u8 *parse, u32 len); 312 313 extern wifi_p2p_ie_t * 314 wl_cfgp2p_find_p2pie(const u8 *parse, u32 len); 315 316 extern const wifi_wfd_ie_t * 317 wl_cfgp2p_find_wfdie(const u8 *parse, u32 len); 318 extern s32 319 wl_cfgp2p_set_management_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx, 320 s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len); 321 extern s32 322 wl_cfgp2p_clear_management_ie(struct bcm_cfg80211 *cfg, s32 bssidx); 323 324 extern struct net_device * 325 wl_cfgp2p_find_ndev(struct bcm_cfg80211 *cfg, s32 bssidx); 326 extern s32 327 wl_cfgp2p_find_type(struct bcm_cfg80211 *cfg, s32 bssidx, s32 *type); 328 329 extern s32 330 wl_cfgp2p_listen_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, 331 const wl_event_msg_t *e, void *data); 332 extern s32 333 wl_cfgp2p_discover_listen(struct bcm_cfg80211 *cfg, s32 channel, u32 duration_ms); 334 335 extern s32 336 wl_cfgp2p_discover_enable_search(struct bcm_cfg80211 *cfg, u8 enable); 337 338 extern s32 339 wl_cfgp2p_action_tx_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, 340 const wl_event_msg_t *e, void *data); 341 342 extern s32 343 wl_cfgp2p_tx_action_frame(struct bcm_cfg80211 *cfg, struct net_device *dev, 344 wl_af_params_t *af_params, s32 bssidx); 345 346 extern void 347 wl_cfgp2p_generate_bss_mac(struct bcm_cfg80211 *cfg, struct ether_addr *primary_addr); 348 349 extern void 350 wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id); 351 352 extern s32 353 wl_cfgp2p_supported(struct bcm_cfg80211 *cfg, struct net_device *ndev); 354 355 extern s32 356 wl_cfgp2p_down(struct bcm_cfg80211 *cfg); 357 358 extern s32 359 wl_cfgp2p_set_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len); 360 361 extern s32 362 wl_cfgp2p_get_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len); 363 364 extern s32 365 wl_cfgp2p_set_p2p_ps(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len); 366 367 extern s32 368 wl_cfgp2p_set_p2p_ecsa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len); 369 370 extern s32 371 wl_cfgp2p_increase_p2p_bw(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len); 372 373 extern const u8 * 374 wl_cfgp2p_retreive_p2pattrib(const void *buf, u8 element_id); 375 376 extern const u8* 377 wl_cfgp2p_find_attrib_in_all_p2p_Ies(const u8 *parse, u32 len, u32 attrib); 378 379 extern const u8 * 380 wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length); 381 382 extern s32 383 wl_cfgp2p_register_ndev(struct bcm_cfg80211 *cfg); 384 385 extern s32 386 wl_cfgp2p_unregister_ndev(struct bcm_cfg80211 *cfg); 387 388 extern bool 389 wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops); 390 391 extern u32 392 wl_cfgp2p_vndr_ie(struct bcm_cfg80211 *cfg, u8 *iebuf, s32 pktflag, 393 s8 *oui, s32 ie_id, const s8 *data, s32 datalen, const s8* add_del_cmd); 394 395 extern int wl_cfgp2p_get_conn_idx(struct bcm_cfg80211 *cfg); 396 397 extern 398 int wl_cfg_multip2p_operational(struct bcm_cfg80211 *cfg); 399 400 extern 401 int wl_cfgp2p_vif_created(struct bcm_cfg80211 *cfg); 402 403 #if defined(WL_CFG80211_P2P_DEV_IF) 404 extern struct wireless_dev * 405 wl_cfgp2p_add_p2p_disc_if(struct bcm_cfg80211 *cfg); 406 407 extern int 408 wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev); 409 410 extern void 411 wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev); 412 413 extern int 414 wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev, struct bcm_cfg80211 *cfg); 415 416 #endif /* WL_CFG80211_P2P_DEV_IF */ 417 418 extern void 419 wl_cfgp2p_need_wait_actfrmae(struct bcm_cfg80211 *cfg, void *frame, u32 frame_len, bool tx); 420 421 extern int 422 wl_cfgp2p_is_p2p_specific_scan(struct cfg80211_scan_request *request); 423 424 /* WiFi Direct */ 425 #define SOCIAL_CHAN_1 1 426 #define SOCIAL_CHAN_2 6 427 #define SOCIAL_CHAN_3 11 428 #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \ 429 (channel == SOCIAL_CHAN_2) || \ 430 (channel == SOCIAL_CHAN_3)) 431 #define SOCIAL_CHAN_CNT 3 432 #define AF_PEER_SEARCH_CNT 2 433 #define WL_P2P_WILDCARD_SSID "DIRECT-" 434 #define WL_P2P_WILDCARD_SSID_LEN 7 435 #define WL_P2P_INTERFACE_PREFIX "p2p" 436 #define WL_P2P_TEMP_CHAN 11 437 #define WL_P2P_TEMP_CHAN_5G 36 438 #define WL_P2P_AF_STATUS_OFFSET 9 439 440 /* If the provision discovery is for JOIN operations, 441 * or the device discoverablity frame is destined to GO 442 * then we need not do an internal scan to find GO. 443 */ 444 #define IS_ACTPUB_WITHOUT_GROUP_ID(p2p_ie, len) \ 445 (wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL) 446 447 #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \ 448 ((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \ 449 (frame->action == P2PSD_ACTION_ID_GAS_CREQ))) 450 451 #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \ 452 ((subtype == P2P_PAF_GON_CONF) || \ 453 (subtype == P2P_PAF_INVITE_RSP) || \ 454 (subtype == P2P_PAF_PROVDIS_RSP))) 455 #define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3)) 456 #define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \ 457 (len == WL_P2P_WILDCARD_SSID_LEN)) 458 #endif /* _wl_cfgp2p_h_ */ 459