From ef96e1580b3d13e3ca7bdd9f1ded192d663d3a39 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 15 Apr 2016 18:10:33 -0700 Subject: [PATCH] qcacld-3.0: Add support for enhance multicast offload Add supprot for enhance multicast offload feature such that FW can filter out multicast IP data packets transmitted using unicast MAC address. Change-Id: I78066bec094b7b69ba1c2070d23eabb95853f52d CRs-Fixed: 993496 --- core/wma/src/wma_features.c | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 4086ea1281db..bbd89abb8743 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4012,6 +4012,53 @@ static QDF_STATUS wma_add_clear_mcbc_filter(tp_wma_handle wma_handle, vdev_id, multicast_addr, clearList); } +/** + * wma_config_enhance_multicast_offload() - config enhance multicast offload + * @wma_handle: wma handle + * @vdev_id: vdev id + * @action: enable or disable enhance multicast offload + * + * Return: none + */ +static void wma_config_enhance_multicast_offload(tp_wma_handle wma_handle, + uint8_t vdev_id, + uint8_t action) +{ + int status; + wmi_buf_t buf; + wmi_config_enhanced_mcast_filter_cmd_fixed_param *cmd; + + buf = wmi_buf_alloc(wma_handle->wmi_handle, sizeof(*cmd)); + if (!buf) { + WMA_LOGE("Failed to allocate buffer to send set key cmd"); + return; + } + + cmd = (wmi_config_enhanced_mcast_filter_cmd_fixed_param *) + wmi_buf_data(buf); + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_config_enhanced_mcast_filter_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_config_enhanced_mcast_filter_cmd_fixed_param)); + + cmd->vdev_id = vdev_id; + cmd->enable = ((0 == action) ? ENHANCED_MCAST_FILTER_DISABLED : + ENHANCED_MCAST_FILTER_ENABLED); + + WMA_LOGD("%s: config enhance multicast offload action %d for vdev %d", + __func__, action, vdev_id); + + status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, + sizeof(*cmd), WMI_CONFIG_ENHANCED_MCAST_FILTER_CMDID); + if (status) { + qdf_nbuf_free(buf); + WMA_LOGE("%s:Failed to send WMI_CONFIG_ENHANCED_MCAST_FILTER_CMDID", + __func__); + } + + return; +} + /** * wma_process_mcbc_set_filter_req() - process mcbc set filter request * @wma_handle: wma handle @@ -4036,6 +4083,21 @@ QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle, mcbc_param->bssid.bytes); return QDF_STATUS_E_FAILURE; } + + /* + * Configure enhance multicast offload feature for filtering out + * multicast IP data packets transmitted using unicast MAC address + */ + if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap, + WMI_SERVICE_ENHANCED_MCAST_FILTER)) { + WMA_LOGD("%s: FW supports enhance multicast offload", __func__); + wma_config_enhance_multicast_offload(wma_handle, vdev_id, + mcbc_param->action); + } else { + WMA_LOGD("%s: FW does not support enhance multicast offload", + __func__); + } + /* set mcbc_param->action to clear MCList and reset * to configure the MCList in FW */