summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRakesh Sunki <rsunki@qca.qualcomm.com>2014-05-06 17:20:37 -0700
committerPitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com>2014-05-15 16:19:44 +0530
commit2ca851ede4fcc60bb3331158deeba062ed6994d1 (patch)
tree2348a8b5ef3153d2e02b9a27021df90a3da6b3f5
parent1ce135c56ca94825e7a080f941cf5afea1397c19 (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.h1
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c16
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c13
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,