diff options
| author | Sumathi Mandipati <sumathi@qti.qualcomm.com> | 2013-10-29 19:38:10 +0530 |
|---|---|---|
| committer | Madan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com> | 2013-11-14 19:55:28 -0800 |
| commit | f0be025456c773ca67136129ee06a4639588b0d4 (patch) | |
| tree | 9648b9965ded31743f48574a2ef770377c3e3325 | |
| parent | 3303fc452e8eab1b5dd741cc70bf8eb741a39be8 (diff) | |
cld: wma: Multicast, Broadcast filter configuration
This feature facilitates to configure filter for multicast
and broadcast packets. The mc/bc packets matching these
filters will be processed and others will be dropped. This
feature is applicable only in active mode and also when
chatter is enabled. Host can support upto five filters
and it can be increased till ten filters.
Change-Id: I225336481633efd3b607300bee377cf54e68b6e2
CRs-fixed: 568404
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_wext.c | 9 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/wlan_tgt_def_config.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 66 |
5 files changed, 77 insertions, 1 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 16c754d76214..0b00506f3588 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -1414,6 +1414,7 @@ typedef enum #define HDD_MCASTBCASTFILTER_FILTER_ALL_BROADCAST 0x02 #define HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST_BROADCAST 0x03 #define HDD_MULTICAST_FILTER_LIST 0x04 +#define HDD_MULTICAST_FILTER_LIST_CLEAR 0x05 /* * diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 8a515076e401..8ae96451ba84 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -6294,7 +6294,8 @@ static int iw_set_dynamic_mcbc_filter(struct net_device *dev, return -EBUSY; } - if (HDD_MULTICAST_FILTER_LIST == pRequest->mcastBcastFilterSetting) + if ((HDD_MULTICAST_FILTER_LIST == pRequest->mcastBcastFilterSetting) || + (HDD_MULTICAST_FILTER_LIST_CLEAR == pRequest->mcastBcastFilterSetting)) { #ifdef WLAN_FEATURE_PACKET_FILTERING @@ -6323,6 +6324,11 @@ static int iw_set_dynamic_mcbc_filter(struct net_device *dev, idx, MAC_ADDR_ARRAY(mc_addr_list_ptr->multicastAddr[idx])); } + if (HDD_MULTICAST_FILTER_LIST_CLEAR == pRequest->mcastBcastFilterSetting) + mc_addr_list_ptr->action = 1; //clear + else + mc_addr_list_ptr->action = 0; //set + ret_val = sme_8023MulticastList(hHal, pAdapter->sessionId, mc_addr_list_ptr); vos_mem_free(mc_addr_list_ptr); if (eHAL_STATUS_SUCCESS != ret_val) @@ -6426,6 +6432,7 @@ static int iw_clear_dynamic_mcbc_filter(struct net_device *dev, return -EINVAL; } } + return 0; } diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index 88cd943bde5d..d02c49760e94 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -3774,6 +3774,7 @@ typedef struct sSirRcvFltMcAddrList tSirMacAddr multicastAddr[SIR_MAX_NUM_MULTICAST_ADDRESS]; tSirMacAddr selfMacAddr; tSirMacAddr bssId; + tANI_U8 action; } tSirRcvFltMcAddrList, *tpSirRcvFltMcAddrList; #endif // WLAN_FEATURE_PACKET_FILTERING diff --git a/CORE/SERVICES/COMMON/wlan_tgt_def_config.h b/CORE/SERVICES/COMMON/wlan_tgt_def_config.h index ddc4980c5bd7..258c7d442712 100644 --- a/CORE/SERVICES/COMMON/wlan_tgt_def_config.h +++ b/CORE/SERVICES/COMMON/wlan_tgt_def_config.h @@ -153,6 +153,7 @@ #define CFG_TGT_DEFAULT_MCAST2UCAST_MODE 2 #endif +#define CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES 5 /* * Specify how much memory the target should allocate for a debug log of * tx PPDU meta-information (how large the PPDU was, when it was sent, diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index f99b4b307d36..9950715d9f35 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -508,6 +508,10 @@ static v_VOID_t wma_set_default_tgt_config(tp_wma_handle wma_handle) CFG_TGT_DEFAULT_GTK_OFFLOAD_MAX_VDEV, CFG_TGT_NUM_MSDU_DESC, CFG_TGT_MAX_FRAG_TABLE_ENTRIES, + 0, + 0, + 0, + CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES, }; WMITLV_SET_HDR(&tgt_cfg.tlv_header,WMITLV_TAG_STRUC_wmi_resource_config, @@ -7586,6 +7590,64 @@ wma_data_tx_ack_comp_hdlr(void *wma_context, adf_nbuf_free(netbuf); } +static int wma_add_clear_mcbc_filter(tp_wma_handle wma_handle, uint8_t vdev_id, + tSirMacAddr multicastAddr, bool clearList) +{ + WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param *cmd; + wmi_buf_t buf; + int err; + + buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd)); + if (!buf) { + WMA_LOGE("Failed to allocate buffer to send set_param cmd"); + return -ENOMEM; + } + + cmd = (WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param *) wmi_buf_data(buf); + vos_mem_zero(cmd, sizeof(*cmd)); + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param)); + cmd->action = (clearList? WMI_MCAST_FILTER_DELETE : WMI_MCAST_FILTER_SET); + cmd->vdev_id = vdev_id; + WMI_CHAR_ARRAY_TO_MAC_ADDR(multicastAddr, &cmd->mcastbdcastaddr); + err = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, + sizeof(*cmd), WMI_SET_MCASTBCAST_FILTER_CMDID); + if (err) { + WMA_LOGE("Failed to send set_param cmd"); + adf_os_mem_free(buf); + return -EIO; + } + return 0; +} + +static VOS_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle, + tSirRcvFltMcAddrList *mcbc_param) +{ + uint8_t vdev_id = 0; + int i; + + if(mcbc_param->ulMulticastAddrCnt <= 0) { + WMA_LOGE("Number of multicast addresses is 0"); + return VOS_STATUS_E_FAILURE; + } + + if (!wma_find_vdev_by_addr(wma_handle, mcbc_param->selfMacAddr, &vdev_id)) { + WMA_LOGE("%s: Failed to find vdev id for %pM\n", + __func__, mcbc_param->bssId); + return VOS_STATUS_E_FAILURE; + } + + for (i = 0; i < mcbc_param->ulMulticastAddrCnt; i++) { + wma_add_clear_mcbc_filter(wma_handle, vdev_id, + mcbc_param->multicastAddr[i], + (mcbc_param->action == 1)); + } + return VOS_STATUS_SUCCESS; +} + #ifdef WLAN_FEATURE_GTK_OFFLOAD #define GTK_OFFLOAD_ENABLE 0 #define GTK_OFFLOAD_DISABLE 1 @@ -8067,6 +8129,10 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) wma_resume_req(wma_handle, (tpSirWlanResumeParam)msg->bodyptr); break; + case WDA_8023_MULTICAST_LIST_REQ: + wma_process_mcbc_set_filter_req(wma_handle, + (tpSirRcvFltMcAddrList)msg->bodyptr); + break; #ifdef WLAN_FEATURE_GTK_OFFLOAD case WDA_GTK_OFFLOAD_REQ: wma_process_gtk_offload_req( |
