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