diff options
| author | Rakesh Sunki <rsunki@qca.qualcomm.com> | 2014-05-06 17:20:37 -0700 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com> | 2014-05-15 16:19:44 +0530 |
| commit | 2ca851ede4fcc60bb3331158deeba062ed6994d1 (patch) | |
| tree | 2348a8b5ef3153d2e02b9a27021df90a3da6b3f5 | |
| parent | 1ce135c56ca94825e7a080f941cf5afea1397c19 (diff) | |
qcacld: Block data Tx in SAP mode during CAC on DFS channel.
Drop the Tx Data frames during DFS CAC wait time.
When SAP is operating on a DFS channel and is in
CAC WAIT state, SAP is not allowed to transmit
any frames until the CAC WAIT period is done.
CRs-Fixed: 656975
Change-Id: Ifc88230328dd376fd208340a3800d284ed169c53
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 16 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 3 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_softap_tx_rx.c | 13 |
4 files changed, 26 insertions, 7 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index aeee1145472c..4d2c54423899 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -776,6 +776,7 @@ struct hdd_ap_ctx_s /* SAP Context */ v_PVOID_t sapContext; #endif + v_BOOL_t dfs_cac_block_tx; }; struct hdd_mon_ctx_s diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index afdbc2aad55f..f1c82a862ada 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -141,11 +141,12 @@ int hdd_hostapd_open (struct net_device *dev) goto done; } + WLAN_HDD_GET_AP_CTX_PTR(pAdapter)->dfs_cac_block_tx = VOS_TRUE; + //Turn ON carrier state netif_carrier_on(dev); //Enable all Tx queues netif_tx_start_all_queues(dev); - done: EXIT(); return 0; @@ -744,10 +745,14 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa if (VOS_TRUE == pHddCtx->dfs_radar_found) { pHddCtx->dfs_radar_found = VOS_FALSE; - if (WLAN_HDD_SOFTAP == pHostapdAdapter->device_mode) - { - netif_tx_start_all_queues(dev); - } + } + else + { + if (NV_CHANNEL_DFS != + vos_nv_getChannelEnabledState(pHddApCtx->operatingChannel)) + { + pHddApCtx->dfs_cac_block_tx = VOS_FALSE; + } } //Fill the params for sending IWEVCUSTOM Event with SOFTAP.enabled @@ -798,6 +803,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa case eSAP_DFS_CAC_END: wlan_hdd_send_svc_nlink_msg(WLAN_SVC_DFS_CAC_END_IND); + pHddApCtx->dfs_cac_block_tx = VOS_FALSE; break; case eSAP_DFS_RADAR_DETECT: diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 72a5ebc276a1..55bd5435a0ff 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -6284,8 +6284,7 @@ void hdd_dfs_indicate_radar(void *context, void *param) pAdapter = pAdapterNode->pAdapter; if (WLAN_HDD_SOFTAP == pAdapter->device_mode) { - netif_tx_stop_all_queues(pAdapter->dev); - return; + WLAN_HDD_GET_AP_CTX_PTR(pAdapter)->dfs_cac_block_tx = VOS_TRUE; } else { diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c index 8e6986f115bb..5a5d90cfe7fb 100644 --- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c @@ -559,6 +559,19 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) goto drop_pkt; } + /* + * If the device is operating on a DFS Channel + * then check if SAP is in CAC WAIT state and + * drop the packets. In CAC WAIT state device + * is expected not to transmit any frames. + * SAP starts Tx only after the BSS START is + * done. + */ + if (pHddApCtx->dfs_cac_block_tx) + { + goto drop_pkt; + } + pDestMacAddress = (v_MACADDR_t*)skb->data; VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_INFO, |
