1 /* 2 * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #if !defined(WLAN_HDD_HOSTAPD_H) 21 #define WLAN_HDD_HOSTAPD_H 22 23 /** 24 * DOC: wlan_hdd_hostapd.h 25 * 26 * WLAN Host Device driver hostapd header file 27 */ 28 29 /* Include files */ 30 31 #include <linux/netdevice.h> 32 #include <linux/skbuff.h> 33 #include <qdf_list.h> 34 #include <qdf_types.h> 35 #include <wlan_hdd_main.h> 36 37 /* Preprocessor definitions and constants */ 38 39 struct hdd_adapter *hdd_wlan_create_ap_dev(struct hdd_context *hdd_ctx, 40 tSirMacAddr macAddr, 41 unsigned char name_assign_type, 42 uint8_t *name); 43 44 enum csr_akm_type 45 hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4]); 46 47 /** 48 * hdd_filter_ft_info() - 49 * This function to filter fast BSS transition related IE 50 * @frame: pointer to the input frame. 51 * @len: input frame length. 52 * @ft_info_len: store the total length of FT related IE. 53 * 54 * Return: pointer to a buffer which stored the FT related IE 55 * This is a malloced memory that must be freed by the caller 56 */ 57 58 void *hdd_filter_ft_info(const uint8_t *frame, 59 size_t len, uint32_t *ft_info_len); 60 61 /** 62 * hdd_softap_set_channel_change() - 63 * This function to support SAP channel change with CSA IE 64 * set in the beacons. 65 * 66 * @dev: pointer to the net device. 67 * @target_chan_freq: target channel frequency. 68 * @target_bw: Target bandwidth to move. 69 * If no bandwidth is specified, the value is CH_WIDTH_MAX 70 * @forced: Force to switch channel, ignore SCC/MCC check 71 * 72 * Return: 0 for success, non zero for failure 73 */ 74 int hdd_softap_set_channel_change(struct net_device *dev, 75 int target_chan_freq, 76 enum phy_ch_width target_bw, 77 bool forced); 78 /** 79 * hdd_stop_sap_set_tx_power() - Function to set tx power 80 * for unsafe channel if restriction bit mask is set else stop the SAP. 81 * @psoc: PSOC object information 82 * @adapter: AP/SAP adapter 83 * 84 * This function set tx power/stop the SAP interface 85 * 86 * Return: 87 * 88 */ 89 void hdd_stop_sap_set_tx_power(struct wlan_objmgr_psoc *psoc, 90 struct hdd_adapter *adapter); 91 92 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH 93 /** 94 * hdd_sap_restart_with_channel_switch() - SAP channel change with E/CSA 95 * @psoc: psoc common object 96 * @ap_adapter: HDD adapter 97 * @target_chan_freq: Channel frequency to which switch must happen 98 * @target_bw: Bandwidth of the target channel 99 * @forced: Force to switch channel, ignore SCC/MCC check 100 * 101 * Invokes the necessary API to perform channel switch for the SAP or GO 102 * 103 * Return: QDF_STATUS_SUCCESS if successfully 104 */ 105 QDF_STATUS hdd_sap_restart_with_channel_switch(struct wlan_objmgr_psoc *psoc, 106 struct hdd_adapter *ap_adapter, 107 uint32_t target_chan_freq, 108 uint32_t target_bw, 109 bool forced); 110 111 /** 112 * hdd_sap_restart_chan_switch_cb() - Function to restart SAP with 113 * a different channel 114 * @psoc: PSOC object information 115 * @vdev_id: vdev id 116 * @ch_freq: channel to switch 117 * @channel_bw: channel bandwidth 118 * @forced: Force to switch channel, ignore SCC/MCC check 119 * 120 * This function restarts SAP with a different channel 121 * 122 * Return: QDF_STATUS_SUCCESS if successfully 123 * 124 */ 125 QDF_STATUS hdd_sap_restart_chan_switch_cb(struct wlan_objmgr_psoc *psoc, 126 uint8_t vdev_id, uint32_t ch_freq, 127 uint32_t channel_bw, bool forced); 128 129 /** 130 * wlan_hdd_check_cc_intf_cb() - Check force SCC for vdev interface. 131 * @psoc: PSOC object information 132 * @vdev_id: vdev id 133 * @ch_freq: channel frequency to switch to 134 * 135 * This function will return a channel frequency to avoid MCC for SAP/GO. 136 * 137 * Return: QDF_STATUS_SUCCESS if successfully 138 * 139 */ 140 QDF_STATUS wlan_hdd_check_cc_intf_cb(struct wlan_objmgr_psoc *psoc, 141 uint8_t vdev_id, uint32_t *ch_freq); 142 143 /** 144 * wlan_hdd_get_channel_for_sap_restart() - Function to get 145 * suitable channel and restart SAP 146 * @psoc: PSOC object information 147 * @vdev_id: vdev id 148 * @ch_freq: channel to be returned 149 * 150 * This function gets the channel parameters to restart SAP 151 * 152 * Return: None 153 * 154 */ 155 QDF_STATUS wlan_hdd_get_channel_for_sap_restart( 156 struct wlan_objmgr_psoc *psoc, 157 uint8_t vdev_id, uint32_t *ch_freq); 158 159 /** 160 * wlan_get_sap_acs_band() - Get sap acs band 161 * 162 * @psoc: pointer to psoc 163 * @vdev_id: vdev id 164 * @acs_band: Pointer to acs_band 165 * 166 * This function is used to get sap acs band from sap config 167 * 168 * Return: QDF_STATUS_SUCCESS if successful 169 */ 170 uint32_t 171 wlan_get_sap_acs_band(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 172 uint32_t *acs_band); 173 174 /** 175 * wlan_get_ap_prefer_conc_ch_params() - Get prefer sap target channel 176 * bw parameters 177 * @psoc: pointer to psoc 178 * @vdev_id: vdev id 179 * @chan_freq: sap channel 180 * @ch_params: output channel parameters 181 * 182 * This function is used to get prefer sap target channel bw during sap force 183 * scc CSA. The new bw will not exceed the original bw during start ap 184 * request. 185 * 186 * Return: QDF_STATUS_SUCCESS if successfully 187 */ 188 QDF_STATUS 189 wlan_get_ap_prefer_conc_ch_params( 190 struct wlan_objmgr_psoc *psoc, 191 uint8_t vdev_id, uint32_t chan_freq, 192 struct ch_params *ch_params); 193 194 /** 195 * hdd_get_ap_6ghz_capable() - Get ap vdev 6ghz capable flags 196 * @psoc: PSOC object information 197 * @vdev_id: vdev id 198 * 199 * This function gets 6ghz capable information based on hdd ap adapter 200 * context. 201 * 202 * Return: uint32_t, vdev 6g capable flags from enum conn_6ghz_flag 203 */ 204 uint32_t hdd_get_ap_6ghz_capable(struct wlan_objmgr_psoc *psoc, 205 uint8_t vdev_id); 206 #endif 207 208 /** 209 * wlan_hdd_set_sap_csa_reason() - Function to set 210 * sap csa reason 211 * @psoc: PSOC object information 212 * @vdev_id: vdev id 213 * @reason: reason to be updated 214 * 215 * This function sets the reason for SAP channel switch 216 * 217 * Return: None 218 * 219 */ 220 void wlan_hdd_set_sap_csa_reason(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 221 uint8_t reason); 222 eCsrEncryptionType 223 hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4]); 224 225 eCsrEncryptionType 226 hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4]); 227 228 enum csr_akm_type 229 hdd_translate_wpa_to_csr_auth_type(uint8_t auth_suite[4]); 230 231 eCsrEncryptionType 232 hdd_translate_wpa_to_csr_encryption_type(uint8_t cipher_suite[4]); 233 234 QDF_STATUS hdd_softap_sta_deauth(struct hdd_adapter *adapter, 235 struct csr_del_sta_params *param); 236 void hdd_softap_sta_disassoc(struct hdd_adapter *adapter, 237 struct csr_del_sta_params *param); 238 239 QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, 240 void *context); 241 /** 242 * hdd_init_ap_mode() - to init the AP adaptor 243 * @adapter: SAP/GO adapter 244 * @reinit: true if re-init, otherwise initial init 245 * @rtnl_held: true if rtnl lock is taken, otherwise false 246 * 247 * This API can be called to open the SAP session as well as 248 * to create and store the vdev object. It also initializes necessary 249 * SAP adapter related params. 250 */ 251 QDF_STATUS hdd_init_ap_mode(struct hdd_adapter *adapter, 252 bool reinit, 253 bool rtnl_held); 254 255 /** 256 * hdd_deinit_ap_mode() - to deinit the AP adaptor 257 * @link_info: Link info pointer in HDD adapter 258 * 259 * This API can be called to close the SAP session as well as 260 * release the vdev object completely. It also deinitializes necessary 261 * SAP adapter related params. 262 */ 263 void hdd_deinit_ap_mode(struct wlan_hdd_link_info *link_info); 264 265 void hdd_set_ap_ops(struct net_device *dev); 266 /** 267 * hdd_sap_create_ctx() - Wrapper API to create SAP context 268 * @adapter: pointer to adapter 269 * 270 * This wrapper API can be called to create the sap context. It will 271 * eventually calls SAP API to create the sap context 272 * 273 * Return: true or false based on overall success or failure 274 */ 275 bool hdd_sap_create_ctx(struct hdd_adapter *adapter); 276 /** 277 * hdd_sap_destroy_ctx() - Wrapper API to destroy SAP context 278 * @link_info: Pointer of link_info in adapter 279 * 280 * This wrapper API can be called to destroy the sap context. It will 281 * eventually calls SAP API to destroy the sap context 282 * 283 * Return: true or false based on overall success or failure 284 */ 285 bool hdd_sap_destroy_ctx(struct wlan_hdd_link_info *link_info); 286 /** 287 * hdd_sap_destroy_ctx_all() - Wrapper API to destroy all SAP context 288 * @hdd_ctx: pointer to HDD context 289 * @is_ssr: true if SSR is in progress 290 * 291 * This wrapper API can be called to destroy all the sap context. 292 * if is_ssr is true, it will return as sap_ctx will be used when 293 * restart sap. 294 * 295 * Return: none 296 */ 297 void hdd_sap_destroy_ctx_all(struct hdd_context *hdd_ctx, bool is_ssr); 298 299 /** 300 * hdd_hostapd_stop_no_trans() - hdd stop function for hostapd interface 301 * @dev: pointer to net_device structure 302 * 303 * This is called in response to ifconfig down. Vdev sync transaction 304 * should be started before calling this API. 305 * 306 * Return - 0 for success non-zero for failure 307 */ 308 int hdd_hostapd_stop_no_trans(struct net_device *dev); 309 310 int hdd_hostapd_stop(struct net_device *dev); 311 int hdd_sap_context_init(struct hdd_context *hdd_ctx); 312 void hdd_sap_context_destroy(struct hdd_context *hdd_ctx); 313 #ifdef QCA_HT_2040_COEX 314 QDF_STATUS hdd_set_sap_ht2040_mode(struct hdd_adapter *adapter, 315 uint8_t channel_type); 316 317 /** 318 * hdd_get_sap_ht2040_mode() - get ht2040 mode 319 * @adapter: pointer to adapter 320 * @channel_type: given channel type 321 * 322 * Return: QDF_STATUS_SUCCESS if successfully 323 */ 324 QDF_STATUS hdd_get_sap_ht2040_mode(struct hdd_adapter *adapter, 325 enum eSirMacHTChannelType *channel_type); 326 #else 327 static inline QDF_STATUS hdd_set_sap_ht2040_mode(struct hdd_adapter *adapter, 328 uint8_t channel_type) 329 { 330 return QDF_STATUS_SUCCESS; 331 } 332 333 static inline QDF_STATUS hdd_get_sap_ht2040_mode( 334 struct hdd_adapter *adapter, 335 enum eSirMacHTChannelType *channel_type) 336 { 337 return QDF_STATUS_E_FAILURE; 338 } 339 #endif 340 341 #ifdef CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT 342 /** 343 * wlan_hdd_cfg80211_stop_ap() - stop sap 344 * @wiphy: Pointer to wiphy 345 * @dev: Pointer to netdev 346 * @link_id: Link id for which this stop_ap is received. 347 * 348 * Return: zero for success non-zero for failure 349 */ 350 int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev, 351 unsigned int link_id); 352 #else 353 int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, 354 struct net_device *dev); 355 #endif 356 357 int wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, 358 struct net_device *dev, 359 struct cfg80211_ap_settings *params); 360 361 int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy, 362 struct net_device *dev, 363 struct cfg80211_beacon_data *params); 364 365 /** 366 * hdd_is_peer_associated - is peer connected to softap 367 * @adapter: pointer to softap adapter 368 * @mac_addr: address to check in peer list 369 * 370 * This function has to be invoked only when bss is started and is used 371 * to check whether station with specified addr is peer or not 372 * 373 * Return: true if peer mac, else false 374 */ 375 bool hdd_is_peer_associated(struct hdd_adapter *adapter, 376 struct qdf_mac_addr *mac_addr); 377 378 int hdd_destroy_acs_timer(struct hdd_adapter *adapter); 379 380 QDF_STATUS wlan_hdd_config_acs(struct hdd_context *hdd_ctx, 381 struct hdd_adapter *adapter); 382 383 void hdd_sap_indicate_disconnect_for_sta(struct hdd_adapter *adapter); 384 385 /** 386 * hdd_handle_acs_2g_preferred_sap_conc() - Handle 2G pereferred SAP 387 * concurrency with GO 388 * @psoc: soc object 389 * @adapter: HDD adapter context 390 * @sap_config: sap config 391 * 392 * In SAP+GO concurrency, if GO is started on 2G and SAP is 393 * doing ACS with 2G preferred channel list, then we will 394 * move GO to 5G band. The purpose is to have more choice 395 * in SAP ACS instead of starting on GO home channel for SCC. 396 * This API is to check such condition and move GO to 5G. 397 * 398 * Return: void 399 */ 400 void 401 hdd_handle_acs_2g_preferred_sap_conc(struct wlan_objmgr_psoc *psoc, 402 struct hdd_adapter *adapter, 403 struct sap_config *sap_config); 404 405 /** 406 * wlan_hdd_disable_channels() - Cache the channels 407 * and current state of the channels from the channel list 408 * received in the command and disable the channels on the 409 * wiphy and reg table. 410 * @hdd_ctx: Pointer to hdd context 411 * 412 * Return: 0 on success, Error code on failure 413 */ 414 int wlan_hdd_disable_channels(struct hdd_context *hdd_ctx); 415 416 /* 417 * hdd_check_and_disconnect_sta_on_invalid_channel() - Disconnect STA if it is 418 * on invalid channel 419 * @hdd_ctx: pointer to hdd context 420 * @reason: Mac Disconnect reason code as per @enum wlan_reason_code 421 * 422 * STA should be disconnected before starting the SAP if it is on indoor 423 * channel. 424 * 425 * Return: void 426 */ 427 void 428 hdd_check_and_disconnect_sta_on_invalid_channel(struct hdd_context *hdd_ctx, 429 enum wlan_reason_code reason); 430 431 /** 432 * hdd_convert_dot11mode_from_phymode() - get dot11 mode from phymode 433 * @phymode: phymode of sta associated to SAP 434 * 435 * The function is to convert the phymode to corresponding dot11 mode 436 * 437 * Return: dot11mode. 438 */ 439 enum qca_wlan_802_11_mode hdd_convert_dot11mode_from_phymode(int phymode); 440 441 /** 442 * hdd_stop_sap_due_to_invalid_channel() - to stop sap in case of invalid chnl 443 * @work: pointer to work structure 444 * 445 * Let's say SAP detected RADAR and trying to select the new channel and if no 446 * valid channel is found due to none of the channels are available or 447 * regulatory restriction then SAP needs to be stopped. so SAP state-machine 448 * will create a work to stop the bss 449 * 450 * stop bss has to happen through worker thread because radar indication comes 451 * from FW through mc thread or main host thread and if same thread is used to 452 * do stopbss then waiting for stopbss to finish operation will halt mc thread 453 * to freeze which will trigger stopbss timeout. Instead worker thread can do 454 * the stopbss operation while mc thread waits for stopbss to finish. 455 * 456 * Return: none 457 */ 458 void hdd_stop_sap_due_to_invalid_channel(struct work_struct *work); 459 460 /** 461 * hdd_is_any_sta_connecting() - check if any sta is connecting 462 * @hdd_ctx: hdd context 463 * 464 * Return: true if any sta is connecting 465 */ 466 bool hdd_is_any_sta_connecting(struct hdd_context *hdd_ctx); 467 468 /** 469 * wlan_hdd_configure_twt_responder() - configure twt responder in sap_config 470 * @hdd_ctx: Pointer to hdd context 471 * @twt_responder: twt responder configure value 472 * 473 * Return: none 474 */ 475 void 476 wlan_hdd_configure_twt_responder(struct hdd_context *hdd_ctx, 477 bool twt_responder); 478 #ifdef WLAN_FEATURE_11BE_MLO 479 /** 480 * wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails 481 * @link_info: Pointer to link_info in hostapd adapter 482 * 483 * Return: void 484 */ 485 void wlan_hdd_mlo_reset(struct wlan_hdd_link_info *link_info); 486 #else 487 static inline void wlan_hdd_mlo_reset(struct wlan_hdd_link_info *link_info) 488 { 489 } 490 #endif /* end WLAN_FEATURE_11BE_MLO */ 491 492 #ifdef WLAN_FEATURE_SAP_ACS_OPTIMIZE 493 /** 494 * hdd_sap_is_acs_in_progress() - API to return if ACS is in progress 495 * @vdev: pointer t vdev object 496 * 497 * Return: bool 498 */ 499 bool hdd_sap_is_acs_in_progress(struct wlan_objmgr_vdev *vdev); 500 #else 501 static inline 502 bool hdd_sap_is_acs_in_progress(struct wlan_objmgr_vdev *vdev) 503 { 504 return false; 505 } 506 #endif 507 508 #ifdef WLAN_CHIPSET_STATS 509 /* 510 * hdd_cp_stats_cstats_sap_go_start_event() - chipset stats for sap/go start 511 * event 512 * 513 * @link_info: pointer to link_info object 514 * @sap_event: pointer to sap_event object 515 * 516 * Return : void 517 */ 518 void 519 hdd_cp_stats_cstats_sap_go_start_event(struct wlan_hdd_link_info *link_info, 520 struct sap_event *sap_event); 521 522 /** 523 * hdd_cp_stats_cstats_sap_go_stop_event() - chipset stats for sap/go stop event 524 * 525 * @link_info: pointer to link_info object 526 * @sap_event: pointer to sap_event object 527 * 528 * Return : void 529 */ 530 void 531 hdd_cp_stats_cstats_sap_go_stop_event(struct wlan_hdd_link_info *link_info, 532 struct sap_event *sap_event); 533 534 /** 535 * hdd_cp_stats_cstats_log_sap_go_sta_disassoc_event() - chipset stats for 536 * sap/go STA disconnect event 537 * 538 * @li: pointer to link_info object 539 * @sap_evt: pointer to sap_event object 540 * 541 * Return : void 542 */ 543 void 544 hdd_cp_stats_cstats_log_sap_go_sta_disassoc_event(struct wlan_hdd_link_info *li, 545 struct sap_event *sap_evt); 546 547 /** 548 * hdd_cp_stats_cstats_log_sap_go_sta_assoc_reassoc_event() - chipset stats for 549 * sap/go STA assoc event 550 * 551 * @li: pointer to link_info object 552 * @sap_evt: pointer to sap_event object 553 * 554 * Return : void 555 */ 556 void 557 hdd_cp_stats_cstats_log_sap_go_sta_assoc_reassoc_event 558 (struct wlan_hdd_link_info *li, struct sap_event *sap_evt); 559 560 /** 561 * hdd_cp_stats_cstats_log_sap_go_dfs_event() - chipset stats for 562 * sap/go dfs event 563 * 564 * @li: pointer to link_info object 565 * @event_id: eSapHddEvent event 566 * 567 * Return : void 568 */ 569 void hdd_cp_stats_cstats_log_sap_go_dfs_event(struct wlan_hdd_link_info *li, 570 eSapHddEvent event_id); 571 #else 572 static inline void 573 hdd_cp_stats_cstats_sap_go_start_event(struct wlan_hdd_link_info *link_info, 574 struct sap_event *sap_event) 575 { 576 } 577 578 static inline void 579 hdd_cp_stats_cstats_sap_go_stop_event(struct wlan_hdd_link_info *link_info, 580 struct sap_event *sap_event) 581 { 582 } 583 584 static inline void 585 hdd_cp_stats_cstats_log_sap_go_sta_disassoc_event(struct wlan_hdd_link_info *li, 586 struct sap_event *sap_evt) 587 { 588 } 589 590 static inline void 591 hdd_cp_stats_cstats_log_sap_go_sta_assoc_reassoc_event 592 (struct wlan_hdd_link_info *li, struct sap_event *sap_evt) 593 { 594 } 595 596 static inline void 597 hdd_cp_stats_cstats_log_sap_go_dfs_event(struct wlan_hdd_link_info *li, 598 eSapHddEvent event_id) 599 { 600 } 601 #endif /* WLAN_CHIPSET_STATS */ 602 #endif /* end #if !defined(WLAN_HDD_HOSTAPD_H) */ 603