summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMing-yi Lin <mylin@qca.qualcomm.com>2014-02-25 14:48:04 +0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-28 15:58:09 -0800
commit5bd9c6942351bb8483a607f29f0efdce2a64ff37 (patch)
tree90b87283c0d278468d757fad52dd7bd138e186d5
parentf434de0471a11724fc29a6461e4b1b5f08fae9c6 (diff)
qcacld: sap: per-interface intra-bss
supplicant had ability to config the intra-bss but it was not supported. Consider the use case when multiple APs existed with different configs, per-vdev intra-bss is introduced. Change-Id: Iec0a4d75e5679f32129a6650e6b86c54b23de2f5 CRs-fixed: 622584
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_fwd.c3
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c9
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c18
-rw-r--r--CORE/MAC/src/include/sirParams.h1
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h1
-rw-r--r--CORE/SERVICES/COMMON/wdi_in.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c24
-rw-r--r--CORE/SME/inc/sme_Api.h2
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c55
-rw-r--r--CORE/SYS/legacy/src/utils/src/macTrace.c1
-rw-r--r--CORE/WDA/inc/legacy/halMsgApi.h6
-rw-r--r--CORE/WDA/inc/wlan_qct_wda.h1
13 files changed, 118 insertions, 6 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
index c77a7ea5fd1a..5ad0233cfcdc 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
@@ -168,7 +168,8 @@ ol_rx_fwd_check(
rx_desc = htt_rx_msdu_desc_retrieve(pdev->htt_pdev, msdu);
- if (htt_rx_msdu_forward(pdev->htt_pdev, rx_desc)) {
+ if (!vdev->disable_intrabss_fwd &&
+ htt_rx_msdu_forward(pdev->htt_pdev, rx_desc)) {
/*
* Use the same vdev that received the frame to
* transmit the frame.
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index 25ded5a54f1e..d0b3b2f63a69 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -1958,3 +1958,12 @@ ol_txrx_peer_stats_copy(
return A_OK;
}
#endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */
+
+void
+ol_vdev_rx_set_intrabss_fwd(
+ ol_txrx_vdev_handle vdev,
+ a_bool_t val)
+{
+ vdev->disable_intrabss_fwd = val;
+}
+
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index f1b185148ea7..94c62e76d17a 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -753,7 +753,7 @@ struct ol_txrx_vdev_t {
adf_os_spinlock_t mutex;
adf_os_timer_t timer;
} ll_pause;
-
+ a_bool_t disable_intrabss_fwd;
};
struct ol_rx_reorder_array_elem_t {
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index e78bd684992f..092d08643ca9 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -2784,11 +2784,15 @@ static int wlan_hdd_cfg80211_change_bss (struct wiphy *wiphy,
struct bss_parameters *params)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ int ret = 0;
+ eHalStatus halStatus;
ENTER();
- hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
- __func__,pAdapter->device_mode);
+ hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d, ap_isolate = %d",
+ __func__,pAdapter->device_mode,
+ params->ap_isolate);
if((pAdapter->device_mode == WLAN_HDD_SOFTAP)
|| (pAdapter->device_mode == WLAN_HDD_P2P_GO)
@@ -2799,11 +2803,19 @@ static int wlan_hdd_cfg80211_change_bss (struct wiphy *wiphy,
if (-1 != params->ap_isolate)
{
pAdapter->sessionCtx.ap.apDisableIntraBssFwd = !!params->ap_isolate;
+
+ halStatus = sme_ApDisableIntraBssFwd(pHddCtx->hHal,
+ pAdapter->sessionId,
+ pAdapter->sessionCtx.ap.apDisableIntraBssFwd);
+ if (!HAL_STATUS_SUCCESS(halStatus))
+ {
+ ret = -EINVAL;
+ }
}
}
EXIT();
- return 0;
+ return ret;
}
static int wlan_hdd_change_iface_to_sta_mode(struct net_device *ndev,
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 41a8a34de5b1..70e693e85b8a 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -649,6 +649,7 @@ typedef struct sSirMbMsgP2p
#endif
#define SIR_HAL_SET_TX_POWER_LIMIT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 251)
+#define SIR_HAL_SET_SAP_INTRABSS_DIS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 252)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
index ec0e2359debe..4ec903979b67 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
@@ -995,5 +995,6 @@ static inline void ol_tx_throttle_init_period(struct ol_txrx_pdev_t *pdev,
}
#endif /* QCA_SUPPORT_TX_THROTTLE_LL */
+void ol_vdev_rx_set_intrabss_fwd(ol_txrx_vdev_handle vdev, a_bool_t val);
#endif /* _OL_TXRX_CTRL_API__H_ */
diff --git a/CORE/SERVICES/COMMON/wdi_in.h b/CORE/SERVICES/COMMON/wdi_in.h
index fa823b65485f..7f7f0c807787 100644
--- a/CORE/SERVICES/COMMON/wdi_in.h
+++ b/CORE/SERVICES/COMMON/wdi_in.h
@@ -1221,6 +1221,7 @@ ol_tx_queue_log_display(ol_txrx_pdev_handle pdev);
#define wdi_in_set_drop_unenc ol_txrx_set_drop_unenc
#define wdi_in_peer_state_update ol_txrx_peer_state_update
#define wdi_in_peer_keyinstalled_state_update ol_txrx_peer_keyinstalled_state_update
+#define wdi_in_vdev_rx_fwd_disabled ol_vdev_rx_set_intrabss_fwd
#include <ol_txrx_dbg.h>
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 76e69872ce95..ac33a682e019 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -14932,6 +14932,25 @@ static void wma_process_set_mimops_req(tp_wma_handle wma_handle,
mimops->sessionId);
}
+/* function : wma_set_vdev_intrabss_fwd
+ * Descriptin : Set intra_fwd value to wni_in.
+ * Args :
+ * wma_handle : Pointer to WMA handle
+ * pdis_intra_fwd : Pointer to DisableIntraBssFwd struct
+ * Returns :
+ */
+static void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
+ tpDisableIntraBssFwd pdis_intra_fwd)
+{
+ ol_txrx_vdev_handle txrx_vdev;
+ WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
+ __func__, pdis_intra_fwd->sessionId,
+ (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
+
+ txrx_vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].handle;
+ wdi_in_vdev_rx_fwd_disabled(txrx_vdev, pdis_intra_fwd->disableintrabssfwd);
+}
+
/*
* function : wma_mc_process_msg
* Descriptin :
@@ -15316,7 +15335,10 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
wma_process_set_mimops_req(wma_handle, (tSetMIMOPS *) msg->bodyptr);
vos_mem_free(msg->bodyptr);
break;
-
+ case WDA_SET_SAP_INTRABSS_DIS:
+ wma_set_vdev_intrabss_fwd(wma_handle, (tDisableIntraBssFwd *)msg->bodyptr);
+ vos_mem_free(msg->bodyptr);
+ break;
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 44468a626cdf..d82b056271c9 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3417,4 +3417,6 @@ eHalStatus sme_SetThermalLevel( tHalHandle hHal, tANI_U8 level );
eHalStatus sme_TxpowerLimit( tHalHandle hHal, tSirTxPowerLimit *psmetx);
#endif
eHalStatus sme_UpdateConnectDebug(tHalHandle hHal, tANI_U32 set_value);
+eHalStatus sme_ApDisableIntraBssFwd(tHalHandle hHal, tANI_U8 sessionId,
+ tANI_BOOLEAN disablefwd);
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 0fbd174d6ca9..fbb9ade935e0 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -11505,3 +11505,58 @@ eHalStatus sme_UpdateConnectDebug(tHalHandle hHal, tANI_U32 set_value)
pMac->fEnableDebugLog = set_value;
return (status);
}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_ApDisableIntraBssFwd
+
+ \brief
+ SME will send message to WMA to set Intra BSS in txrx
+
+ \param
+
+ hHal - The handle returned by macOpen
+
+ sessionId - session id ( vdev id)
+
+ disablefwd - boolean value that indicate disable intrabss fwd disable
+
+ \return eHalStatus
+--------------------------------------------------------------------------- */
+eHalStatus sme_ApDisableIntraBssFwd(tHalHandle hHal, tANI_U8 sessionId,
+ tANI_BOOLEAN disablefwd)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ int status = eHAL_STATUS_SUCCESS;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ vos_msg_t vosMessage;
+ tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
+
+ //Prepare the request to send to SME.
+ pSapDisableIntraFwd = vos_mem_malloc(sizeof(tDisableIntraBssFwd));
+ if (NULL == pSapDisableIntraFwd)
+ {
+ smsLog(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
+ return eSIR_MEM_ALLOC_FAILED;
+ }
+
+ vos_mem_zero(pSapDisableIntraFwd, sizeof(tDisableIntraBssFwd));
+
+ pSapDisableIntraFwd->sessionId = sessionId;
+ pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
+
+ if (eHAL_STATUS_SUCCESS == (status = sme_AcquireGlobalLock(&pMac->sme)))
+ {
+ /* serialize the req through MC thread */
+ vosMessage.bodyptr = pSapDisableIntraFwd;
+ vosMessage.type = WDA_SET_SAP_INTRABSS_DIS;
+ vosStatus = vos_mq_post_message(VOS_MQ_ID_WDA, &vosMessage);
+ if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+ {
+ status = eHAL_STATUS_FAILURE;
+ vos_mem_free(pSapDisableIntraFwd);
+ }
+ sme_ReleaseGlobalLock(&pMac->sme);
+ }
+ return (status);
+}
+
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index 00d289bee7a1..c99ed6905e6c 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -804,6 +804,7 @@ tANI_U8* macTraceGetWdaMsgString( tANI_U16 wdaMsg )
CASE_RETURN_STRING(WDA_DHCP_STOP_IND);
CASE_RETURN_STRING(WDA_INIT_THERMAL_INFO_CMD);
CASE_RETURN_STRING(WDA_SET_THERMAL_LEVEL);
+ CASE_RETURN_STRING(WDA_SET_SAP_INTRABSS_DIS);
default:
return((tANI_U8*) "UNKNOWN" );
break;
diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h
index fdbcfa5cd7b8..cbffb16ce481 100644
--- a/CORE/WDA/inc/legacy/halMsgApi.h
+++ b/CORE/WDA/inc/legacy/halMsgApi.h
@@ -1470,4 +1470,10 @@ typedef __ani_attr_pre_packed struct sRemBeaconFilterMsg
tANI_U8 ucRemIeId[1];
} __ani_attr_packed tRemBeaconFilterMsg, *tpRemBeaconFilterMsg;
+typedef __ani_attr_pre_packed struct sDisableIntraBssFwd
+{
+ tANI_U16 sessionId;
+ tANI_BOOLEAN disableintrabssfwd;
+} __ani_attr_packed tDisableIntraBssFwd, *tpDisableIntraBssFwd;
+
#endif /* _HALMSGAPI_H_ */
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index aa27adeb3bcc..222e78d8a12f 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1321,6 +1321,7 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb);
#define WDA_TDLS_PEER_DISCONNECTED SIR_HAL_TDLS_PEER_DISCONNECTED
#endif
#endif
+#define WDA_SET_SAP_INTRABSS_DIS SIR_HAL_SET_SAP_INTRABSS_DIS
/* Message to Indicate Radar Presence on SAP Channel */
#define WDA_DFS_RADAR_IND SIR_HAL_DFS_RADAR_IND