summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKomal Seelam <kseelam@qti.qualcomm.com>2016-04-29 14:01:45 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-05-05 13:05:22 +0530
commitad730e07a674ca5f8dca1e047f52b01a77e1e852 (patch)
tree38355479e6ae5d5cb5961a6afd1bee84bbed2fe8
parent6296b759df3b06eae45d08131d5306892fdd9997 (diff)
qcacld-2.0: Configure SSDP address to FW as WoW pattern or MC list
Incoming Data packets are filtered by FW during WoW based on the pattern configuration done by host. The incoming packet is filtered out to Multicast list if configured, else it looks for other patterns that are configured. SSDP pattern is not configured along with Multicast List, instead it is configured as a normal WoW pattern during system/runtime suspend. So, all the ssdp packets are dropped by FW during WoW. To address this, host should configure the SSDP pattern as a Multicast filter if Multicast filter is enabled in ini, else configure it as a normal WoW Pattern. Hence the fix. Change-Id: I64aa30832999a779591bdfce02e13545a6cbf4f2 CRs-Fixed: 1010542
-rw-r--r--CORE/MAC/inc/aniGlobal.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c126
-rw-r--r--CORE/SERVICES/WMA/wma.h1
-rw-r--r--CORE/VOSS/src/vos_api.c1
4 files changed, 108 insertions, 21 deletions
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 47fba692e2b0..609054461c9f 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -1079,6 +1079,7 @@ typedef struct sMacOpenParameters
*/
tANI_U8 olIniInfo;
v_BOOL_t ssdp;
+ bool enable_mc_list;
bool enable_bcst_ptrn;
/*
* DFS Phyerror Filtering offload status from ini
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 549e29dc92a4..6f7688a11752 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -7249,6 +7249,7 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx,
wma_handle->frame_xln_reqd = mac_params->frameTransRequired;
wma_handle->driver_type = mac_params->driverType;
wma_handle->ssdp = mac_params->ssdp;
+ wma_handle->enable_mc_list = mac_params->enable_mc_list;
wma_handle->enable_bcst_ptrn = mac_params->enable_bcst_ptrn;
#ifdef FEATURE_WLAN_RA_FILTERING
wma_handle->IsRArateLimitEnabled = mac_params->IsRArateLimitEnabled;
@@ -21768,14 +21769,110 @@ static VOS_STATUS wma_wow_sta_ra_filter(tp_wma_handle wma, u_int8_t vdev_id)
}
#endif /* FEATURE_WLAN_RA_FILTERING */
+/**
+ * wma_configure_wow_ssdp() - API to configure WoW SSDP
+ * @wma: WMA Handle
+ * @vdev_id: Vdev Id
+ *
+ * API to configure SSDP pattern as WoW pattern
+ *
+ * Return: Success/Failure
+ */
+static VOS_STATUS wma_configure_wow_ssdp(tp_wma_handle wma, uint8_t vdev_id)
+{
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ static const uint8_t discvr_ptrn[] = { 0xe0, 0x00, 0x00, 0xf8 };
+ static const uint8_t discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
+ static const uint8_t discvr_offset = 30;
+
+ status = wma_send_wow_patterns_to_fw(wma, vdev_id,
+ wma->wow.free_ptrn_id[wma->
+ wow.used_free_ptrn_id++],
+ discvr_ptrn, sizeof(discvr_ptrn),
+ discvr_offset, discvr_mask,
+ sizeof(discvr_ptrn));
+ if (status != VOS_STATUS_SUCCESS)
+ WMA_LOGE("Failed to add WOW mDNS/SSDP/LLMNR pattern");
+
+ return status;
+}
+
+/**
+ * wma_configure_mc_ssdp() - API to configure SSDP address as MC list
+ * @wma: WMA Handle
+ * @vdev_id: Vdev Id
+ *
+ * SSDP address 239.255.255.250 is converted to Multicast Mac address
+ * and configure it to FW. Firmware will apply this pattern on the incoming
+ * packets to filter them out during chatter/wow mode.
+ *
+ * Return: Success/Failure
+ */
+static VOS_STATUS wma_configure_mc_ssdp(tp_wma_handle wma, uint8_t vdev_id)
+{
+ WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param *cmd;
+ wmi_buf_t buf;
+ const tSirMacAddr ssdp_addr = {0x01, 0x00, 0x5e, 0x7f, 0xff, 0xfa};
+ int ret;
+ uint32_t tag =
+ WMITLV_TAG_STRUC_WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param;
+
+ WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param fixed_param;
+
+ buf = wmi_buf_alloc(wma->wmi_handle, sizeof(*cmd));
+ if (!buf) {
+ WMA_LOGE("%s No Memory for MC address", __func__);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ cmd = (WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param *) wmi_buf_data(buf);
+
+ WMITLV_SET_HDR(&cmd->tlv_header, tag,
+ WMITLV_GET_STRUCT_TLVLEN(fixed_param));
+
+ cmd->action = WMI_MCAST_FILTER_SET;
+ cmd->vdev_id = vdev_id;
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(ssdp_addr, &cmd->mcastbdcastaddr);
+ ret = wmi_unified_cmd_send(wma->wmi_handle, buf, sizeof(*cmd),
+ WMI_SET_MCASTBCAST_FILTER_CMDID);
+ if (ret != VOS_STATUS_SUCCESS) {
+ WMA_LOGE("%s Failed to configure FW with SSDP MC address",
+ __func__);
+ wmi_buf_free(buf);
+ return VOS_STATUS_E_FAILURE;
+ }
+ return VOS_STATUS_SUCCESS;
+}
+
+/**
+ * wma_configure_ssdp() - API to Configure SSDP pattern to FW
+ * @wma: WMA Handle
+ * @vdev_id: Vdev Id
+ *
+ * Setup multicast pattern for mDNS 224.0.0.251,
+ * SSDP 239.255.255.250 and LLMNR 224.0.0.252
+ *
+ * Return: Success/Failure.
+ */
+static VOS_STATUS wma_configure_ssdp(tp_wma_handle wma, uint8_t vdev_id)
+{
+ if (!wma->ssdp) {
+ WMA_LOGD("mDNS, SSDP, LLMNR patterns are disabled from ini");
+ return VOS_STATUS_SUCCESS;
+ }
+
+ WMA_LOGD("%s, enable_mc_list:%d", __func__, wma->enable_mc_list);
+
+ if (wma->enable_mc_list)
+ return wma_configure_mc_ssdp(wma, vdev_id);
+ else
+ return wma_configure_wow_ssdp(wma, vdev_id);
+}
/* Configures default WOW pattern for the given vdev_id which is in STA mode. */
static VOS_STATUS wma_wow_sta(tp_wma_handle wma, u_int8_t vdev_id,
u_int8_t *enable_ptrn_match, bool runtime_pm)
{
- static const u_int8_t discvr_ptrn[] = { 0xe0, 0x00, 0x00, 0xf8 };
- static const u_int8_t discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
- static const u_int8_t discvr_offset = 30;
u_int8_t mac_mask[ETH_ALEN], free_slot;
VOS_STATUS ret = VOS_STATUS_SUCCESS;
static const u_int8_t arp_ptrn[] = { 0x08, 0x06 };
@@ -21812,32 +21909,19 @@ static VOS_STATUS wma_wow_sta(tp_wma_handle wma, u_int8_t vdev_id,
return ret;
}
- /*
- * Setup multicast pattern for mDNS 224.0.0.251,
- * SSDP 239.255.255.250 and LLMNR 224.0.0.252
- */
- if (wma->ssdp) {
- ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
- wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++],
- discvr_ptrn, sizeof(discvr_ptrn), discvr_offset,
- discvr_mask, sizeof(discvr_ptrn));
- if (ret != VOS_STATUS_SUCCESS) {
- WMA_LOGE("Failed to add WOW mDNS/SSDP/LLMNR pattern");
- return ret;
- }
- }
- else
- WMA_LOGD("mDNS, SSDP, LLMNR patterns are disabled from ini");
-
if (runtime_pm && wma->enable_bcst_ptrn) {
ret = wma_send_wow_patterns_to_fw(wma, vdev_id,
wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++],
bcst_ptrn, sizeof(bcst_ptrn), bcst_offset,
bcst_mask, sizeof(bcst_mask));
if (ret != VOS_STATUS_SUCCESS)
- WMA_LOGE("Failed to add BCAST wakeup pattern\n");
+ WMA_LOGE("Failed to add BCAST wakeup pattern");
}
+ ret = wma_configure_ssdp(wma, vdev_id);
+ if (ret != VOS_STATUS_SUCCESS)
+ WMA_LOGE("Failed to configure SSDP patterns to FW");
+
/* when arp offload or ns offloaded is disabled
* from ini file, configure broad cast arp pattern
* to fw, so that host can wake up
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index d10035f5e0b0..65d3188fffcb 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -762,6 +762,7 @@ typedef struct wma_handle {
*/
u_int8_t ol_ini_info;
v_BOOL_t ssdp;
+ bool enable_mc_list;
bool enable_bcst_ptrn;
#ifdef FEATURE_RUNTIME_PM
v_BOOL_t runtime_pm;
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 0d14594cc101..6e5629589bd9 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -501,6 +501,7 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize )
macOpenParms.ssdp = pHddCtx->cfg_ini->ssdp;
macOpenParms.enable_bcst_ptrn = pHddCtx->cfg_ini->bcastptrn;
+ macOpenParms.enable_mc_list = pHddCtx->cfg_ini->fEnableMCAddrList;
#ifdef FEATURE_WLAN_RA_FILTERING
macOpenParms.RArateLimitInterval = pHddCtx->cfg_ini->RArateLimitInterval;