summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@codeaurora.org>2016-08-24 18:28:55 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-29 18:33:38 +0530
commitf6bd21dec610336fc48928aeffd2f4910c106d1d (patch)
treea8ea2d06d0c0a5f08bbc2f8963e8b097935bc97a
parentfb66184323e4d69801f4dc647a4e78ce42ca8c09 (diff)
qcacld-2.0: Cache ARP/NS offload request at wma layer
As Current WMI interface need both the ARP/NS configuration in single command. To support active offload host need to cache the ARP/NS at wma layer so host can fill the other request and configure down to firmware complete request (ARP+NS). Change-Id: Ie0a57d216379817ff0ae48f4f582c9108e8ecca1 CRs-Fixed: 1059739
-rw-r--r--CORE/SERVICES/WMA/wma.c442
-rw-r--r--CORE/SERVICES/WMA/wma.h8
2 files changed, 285 insertions, 165 deletions
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 98090a2b7210..9be67e2be2b2 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -2180,6 +2180,12 @@ static int wma_vdev_stop_ind(tp_wma_handle wma, u_int8_t *buf)
goto free_req_msg;
}
+ /* Clear arp and ns offload cache */
+ vos_mem_zero(&iface->ns_offload_req,
+ sizeof(iface->ns_offload_req));
+ vos_mem_zero(&iface->arp_offload_req,
+ sizeof(iface->arp_offload_req));
+
#ifdef QCA_IBSS_SUPPORT
if ( wma_is_vdev_in_ibss_mode(wma, resp_event->vdev_id))
wma_delete_all_ibss_peers(wma, resp_event->vdev_id);
@@ -24781,208 +24787,322 @@ out:
}
#endif
-/*
- * Function : wma_enable_arp_ns_offload
- * Description : To configure ARP NS off load data to firmware
- * when target goes to wow mode.
- * Args : @wma - wma handle, @tpSirHostOffloadReq -
- * pHostOffloadParams,@bool bArpOnly
- * Returns : Returns Failure or Success based on WMI cmd.
- * Comments : Since firware expects ARP and NS to be configured
- * at a time, Arp info is cached in wma and send along
- * with NS info to make both work.
- */
-static VOS_STATUS wma_enable_arp_ns_offload(tp_wma_handle wma, tpSirHostOffloadReq pHostOffloadParams, bool bArpOnly)
+/**
+ * wma_fill_arp_offload_params() - Fill ARP offload data
+ * @wma: wma handle
+ * @tpSirHostOffloadReq: offload request
+ * @buf_ptr: buffer pointer
+ *
+ * To fill ARP offload data to firmware
+ * when target goes to wow mode.
+ *
+ * Return: None
+ */
+static void wma_fill_arp_offload_params(tp_wma_handle wma,
+ tpSirHostOffloadReq hostoffloadreq, uint8_t **buf_ptr)
{
+
int32_t i;
+ WMI_ARP_OFFLOAD_TUPLE *arp_tuple;
+ bool enableOrDisable = hostoffloadreq->enableOrDisable;
+
+ WMITLV_SET_HDR(*buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ (WMI_MAX_ARP_OFFLOADS*sizeof(WMI_ARP_OFFLOAD_TUPLE)));
+ *buf_ptr += WMI_TLV_HDR_SIZE;
+ for (i = 0; i < WMI_MAX_ARP_OFFLOADS; i++) {
+ arp_tuple = (WMI_ARP_OFFLOAD_TUPLE *)*buf_ptr;
+ WMITLV_SET_HDR(&arp_tuple->tlv_header,
+ WMITLV_TAG_STRUC_WMI_ARP_OFFLOAD_TUPLE,
+ WMITLV_GET_STRUCT_TLVLEN(WMI_ARP_OFFLOAD_TUPLE));
+
+ /* Fill data for ARP and NS in the first tupple for LA */
+ if ((enableOrDisable & SIR_OFFLOAD_ENABLE) && (i == 0)) {
+ /* Copy the target ip addr and flags */
+ arp_tuple->flags = WMI_ARPOFF_FLAGS_VALID;
+ A_MEMCPY(&arp_tuple->target_ipaddr,
+ hostoffloadreq->params.hostIpv4Addr,
+ SIR_IPV4_ADDR_LEN);
+ WMA_LOGD("ARPOffload IP4 address: %pI4",
+ hostoffloadreq->params.hostIpv4Addr);
+ }
+ *buf_ptr += sizeof(WMI_ARP_OFFLOAD_TUPLE);
+ }
+}
+
+#ifdef WLAN_NS_OFFLOAD
+/**
+ * wma_fill_ns_offload_params() - Fill NS offload data
+ * @wma: wma handle
+ * @tpSirHostOffloadReq: offload request
+ * @buf_ptr: buffer pointer
+ *
+ * To fill NS offload data to firmware
+ * when target goes to wow mode.
+ *
+ * Return: None
+ */
+static void wma_fill_ns_offload_params(tp_wma_handle wma,
+ tpSirHostOffloadReq hostoffloadreq, uint8_t **buf_ptr)
+{
+
+ int32_t i;
+ WMI_NS_OFFLOAD_TUPLE *ns_tuple;
+ tSirNsOffloadReq ns_req;
+
+ ns_req = hostoffloadreq->nsOffloadInfo;
+ WMITLV_SET_HDR(*buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ (WMI_MAX_NS_OFFLOADS*sizeof(WMI_NS_OFFLOAD_TUPLE)));
+ *buf_ptr += WMI_TLV_HDR_SIZE;
+ for (i = 0; i < WMI_MAX_NS_OFFLOADS; i++) {
+ ns_tuple = (WMI_NS_OFFLOAD_TUPLE *)*buf_ptr;
+ WMITLV_SET_HDR(&ns_tuple->tlv_header,
+ WMITLV_TAG_STRUC_WMI_NS_OFFLOAD_TUPLE,
+ (sizeof(WMI_NS_OFFLOAD_TUPLE) - WMI_TLV_HDR_SIZE));
+
+ /*
+ * Fill data only for NS offload in the first ARP tuple for LA
+ */
+ if ((hostoffloadreq->enableOrDisable & SIR_OFFLOAD_ENABLE)) {
+ ns_tuple->flags |= WMI_NSOFF_FLAGS_VALID;
+ /* Copy the target/solicitation/remote ip addr */
+ if (ns_req.targetIPv6AddrValid[i])
+ A_MEMCPY(&ns_tuple->target_ipaddr[0],
+ &ns_req.targetIPv6Addr[i],
+ sizeof(WMI_IPV6_ADDR));
+ A_MEMCPY(&ns_tuple->solicitation_ipaddr,
+ &ns_req.selfIPv6Addr[i],
+ sizeof(WMI_IPV6_ADDR));
+ if (ns_req.target_ipv6_addr_type[i]) {
+ ns_tuple->flags |=
+ WMI_NSOFF_FLAGS_IS_IPV6_ANYCAST;
+ }
+ WMA_LOGD("Index %d NS solicitedIp %pI6, targetIp %pI6",
+ i, &ns_req.selfIPv6Addr[i],
+ &ns_req.targetIPv6Addr[i]);
+
+ /* target MAC is optional, check if it is valid,
+ * if this is not valid, the target will use the known
+ * local MAC address rather than the tuple
+ */
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(
+ ns_req.selfMacAddr,
+ &ns_tuple->target_mac);
+ if ((ns_tuple->target_mac.mac_addr31to0 != 0) ||
+ (ns_tuple->target_mac.mac_addr47to32 != 0)) {
+ ns_tuple->flags |= WMI_NSOFF_FLAGS_MAC_VALID;
+ }
+ }
+ *buf_ptr += sizeof(WMI_NS_OFFLOAD_TUPLE);
+ }
+}
+
+
+/**
+ * wma_fill_nsoffload_ext() - Fill NS offload ext data
+ * @wma: wma handle
+ * @tpSirHostOffloadReq: offload request
+ * @buf_ptr: buffer pointer
+ *
+ * To fill extended NS offload extended data to firmware
+ * when target goes to wow mode.
+ *
+ * Return: None
+ */
+static void wma_fill_nsoffload_ext(tp_wma_handle wma, tpSirHostOffloadReq
+ hostoffloadreq, uint8_t **buf_ptr)
+{
+ int32_t i;
+ WMI_NS_OFFLOAD_TUPLE *ns_tuple;
+ uint32_t count, num_ns_ext_tuples;
+ tSirNsOffloadReq ns_req;
+
+ ns_req = hostoffloadreq->nsOffloadInfo;
+ count = hostoffloadreq->num_ns_offload_count;
+ num_ns_ext_tuples = hostoffloadreq->num_ns_offload_count -
+ WMI_MAX_NS_OFFLOADS;
+
+ /* Populate extended NS offload tuples */
+ WMITLV_SET_HDR(*buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ (num_ns_ext_tuples * sizeof(WMI_NS_OFFLOAD_TUPLE)));
+ *buf_ptr += WMI_TLV_HDR_SIZE;
+ for (i = WMI_MAX_NS_OFFLOADS; i < count; i++) {
+ ns_tuple = (WMI_NS_OFFLOAD_TUPLE *)*buf_ptr;
+ WMITLV_SET_HDR(&ns_tuple->tlv_header,
+ WMITLV_TAG_STRUC_WMI_NS_OFFLOAD_TUPLE,
+ (sizeof(WMI_NS_OFFLOAD_TUPLE)-WMI_TLV_HDR_SIZE));
+
+ /*
+ * Fill data only for NS offload in the first ARP tuple for LA
+ */
+ if ((hostoffloadreq->enableOrDisable & SIR_OFFLOAD_ENABLE)) {
+ ns_tuple->flags |= WMI_NSOFF_FLAGS_VALID;
+ /* Copy the target/solicitation/remote ip addr */
+ if (ns_req.targetIPv6AddrValid[i])
+ A_MEMCPY(&ns_tuple->target_ipaddr[0],
+ &ns_req.targetIPv6Addr[i],
+ sizeof(WMI_IPV6_ADDR));
+ A_MEMCPY(&ns_tuple->solicitation_ipaddr,
+ &ns_req.selfIPv6Addr[i],
+ sizeof(WMI_IPV6_ADDR));
+ if (ns_req.target_ipv6_addr_type[i]) {
+ ns_tuple->flags |=
+ WMI_NSOFF_FLAGS_IS_IPV6_ANYCAST;
+ }
+ WMA_LOGD("Index %d NS solicitedIp %pI6, targetIp %pI6",
+ i, &ns_req.selfIPv6Addr[i],
+ &ns_req.targetIPv6Addr[i]);
+
+ /* target MAC is optional, check if it is valid,
+ * if this is not valid, the target will use the
+ * known local MAC address rather than the tuple
+ */
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(
+ ns_req.selfMacAddr,
+ &ns_tuple->target_mac);
+ if ((ns_tuple->target_mac.mac_addr31to0 != 0) ||
+ (ns_tuple->target_mac.mac_addr47to32 != 0)) {
+ ns_tuple->flags |= WMI_NSOFF_FLAGS_MAC_VALID;
+ }
+ }
+ *buf_ptr += sizeof(WMI_NS_OFFLOAD_TUPLE);
+ }
+}
+#else
+static inline void wma_fill_ns_offload_params(tp_wma_handle wma,
+ tpSirHostOffloadReq hostoffloadreq, uint8_t **buf_ptr)
+{
+ return;
+}
+
+static inline void wma_fill_nsoffload_ext(tp_wma_handle wma,
+ tpSirHostOffloadReq hostoffloadreq, uint8_t **buf_ptr)
+{
+ return;
+}
+#endif
+
+
+/**
+ * wma_enable_arp_ns_offload() - enable ARP NS offload
+ * @wma: wma handle
+ * @tpSirHostOffloadReq: offload request
+ * @config_arp: flag
+ *
+ * To configure ARP NS off load data to firmware
+ * when target goes to wow mode.
+ *
+ * Return: VOS Status
+ */
+static VOS_STATUS wma_enable_arp_ns_offload(tp_wma_handle wma,
+ tpSirHostOffloadReq hostoffloadreq, bool config_arp)
+{
int32_t res;
WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param *cmd;
- WMI_NS_OFFLOAD_TUPLE *ns_tuple;
- WMI_ARP_OFFLOAD_TUPLE *arp_tuple;
A_UINT8* buf_ptr;
wmi_buf_t buf;
int32_t len;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
u_int8_t vdev_id;
+ tpSirHostOffloadReq ns_offload_req;
+ tpSirHostOffloadReq arp_offload_req;
uint32_t count = 0, num_ns_ext_tuples = 0;
/* Get the vdev id */
- if (!wma_find_vdev_by_bssid(wma, pHostOffloadParams->bssId, &vdev_id)) {
- WMA_LOGE("vdev handle is invalid for %pM", pHostOffloadParams->bssId);
- vos_mem_free(pHostOffloadParams);
- return VOS_STATUS_E_INVAL;
+ if (!wma_find_vdev_by_bssid(wma, hostoffloadreq->bssId, &vdev_id)) {
+ WMA_LOGE("Invalid vdev handle for %pM", hostoffloadreq->bssId);
+ status = VOS_STATUS_E_FAILURE;
+ goto err_vdev;
}
if (!wma->interfaces[vdev_id].vdev_up) {
-
WMA_LOGE("vdev %d is not up skipping arp/ns offload", vdev_id);
- vos_mem_free(pHostOffloadParams);
- return VOS_STATUS_E_FAILURE;
+ status = VOS_STATUS_E_FAILURE;
+ goto err_vdev;
}
- if (!bArpOnly)
- count = pHostOffloadParams->num_ns_offload_count;
+ /*
+ * config_arp is true means arp request comes from upper layer
+ * Hence ns request need to used from wma cached request.
+ */
+ if (config_arp) {
+ arp_offload_req = hostoffloadreq;
+ ns_offload_req = &wma->interfaces[vdev_id].ns_offload_req;
+ count = ns_offload_req->num_ns_offload_count;
+ } else {
+ ns_offload_req = hostoffloadreq;
+ arp_offload_req = &wma->interfaces[vdev_id].arp_offload_req;
+ count = hostoffloadreq->num_ns_offload_count;
+ }
len = sizeof(WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param) +
- WMI_TLV_HDR_SIZE + // TLV place holder size for array of NS tuples
+ WMI_TLV_HDR_SIZE + /* Add size for array of NS tuples */
WMI_MAX_NS_OFFLOADS*sizeof(WMI_NS_OFFLOAD_TUPLE) +
- WMI_TLV_HDR_SIZE + // TLV place holder size for array of ARP tuples
+ WMI_TLV_HDR_SIZE + /* Add size for array of ARP tuples */
WMI_MAX_ARP_OFFLOADS*sizeof(WMI_ARP_OFFLOAD_TUPLE);
- /*
- * If there are more than WMI_MAX_NS_OFFLOADS addresses then allocate
- * extra length for extended NS offload tuples which follows ARP offload
- * tuples. Host needs to fill this structure in following format:
- * 2 NS ofload tuples
- * 2 ARP offload tuples
- * N numbers of extended NS offload tuples if HDD has given more than
- * 2 NS offload addresses
- */
- if (!bArpOnly && count > WMI_MAX_NS_OFFLOADS) {
+ if (count > WMI_MAX_NS_OFFLOADS) {
num_ns_ext_tuples = count - WMI_MAX_NS_OFFLOADS;
- len += WMI_TLV_HDR_SIZE + num_ns_ext_tuples *
- sizeof(WMI_NS_OFFLOAD_TUPLE);
+ len += WMI_TLV_HDR_SIZE + num_ns_ext_tuples
+ * sizeof(WMI_NS_OFFLOAD_TUPLE);
}
buf = wmi_buf_alloc(wma->wmi_handle, len);
if (!buf) {
WMA_LOGE("%s: wmi_buf_alloc failed", __func__);
- vos_mem_free(pHostOffloadParams);
- return VOS_STATUS_E_NOMEM;
+ status = VOS_STATUS_E_NOMEM;
+ goto err_vdev;
}
buf_ptr = (A_UINT8*)wmi_buf_data(buf);
+
cmd = (WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param *)buf_ptr;
WMITLV_SET_HDR(&cmd->tlv_header,
- WMITLV_TAG_STRUC_WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param,
- WMITLV_GET_STRUCT_TLVLEN(WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param));
+ WMITLV_TAG_STRUC_WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param));
cmd->flags = 0;
cmd->vdev_id = vdev_id;
- if (!bArpOnly)
- cmd->num_ns_ext_tuples = num_ns_ext_tuples;
-
- WMA_LOGD("ARP NS Offload vdev_id: %d",cmd->vdev_id);
-
- /* Have copy of arp info to send along with NS, Since FW expects
- * both ARP and NS info in single cmd */
- if(bArpOnly)
- vos_mem_copy(&wma->mArpInfo, pHostOffloadParams, sizeof(tSirHostOffloadReq));
+ cmd->num_ns_ext_tuples = num_ns_ext_tuples;
buf_ptr += sizeof(WMI_SET_ARP_NS_OFFLOAD_CMD_fixed_param);
- WMITLV_SET_HDR(buf_ptr,WMITLV_TAG_ARRAY_STRUC,(WMI_MAX_NS_OFFLOADS*sizeof(WMI_NS_OFFLOAD_TUPLE)));
- buf_ptr += WMI_TLV_HDR_SIZE;
- for(i = 0; i < WMI_MAX_NS_OFFLOADS; i++ ){
- ns_tuple = (WMI_NS_OFFLOAD_TUPLE *)buf_ptr;
- WMITLV_SET_HDR(&ns_tuple->tlv_header,
- WMITLV_TAG_STRUC_WMI_NS_OFFLOAD_TUPLE,
- (sizeof(WMI_NS_OFFLOAD_TUPLE)-WMI_TLV_HDR_SIZE));
-
- /* Fill data only for NS offload in the first ARP tuple for LA */
- if (!bArpOnly &&
- ((pHostOffloadParams->enableOrDisable & SIR_OFFLOAD_ENABLE))) {
- ns_tuple->flags |= WMI_NSOFF_FLAGS_VALID;
-
-#ifdef WLAN_NS_OFFLOAD
- /*Copy the target/solicitation/remote ip addr */
- if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[i])
- A_MEMCPY(&ns_tuple->target_ipaddr[0],
- &pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[i], sizeof(WMI_IPV6_ADDR));
- A_MEMCPY(&ns_tuple->solicitation_ipaddr,
- &pHostOffloadParams->nsOffloadInfo.selfIPv6Addr[i], sizeof(WMI_IPV6_ADDR));
- if(pHostOffloadParams->nsOffloadInfo.target_ipv6_addr_type[i])
- ns_tuple->flags |= WMI_NSOFF_FLAGS_IS_IPV6_ANYCAST;
- WMA_LOGD("Index %d NS solicitedIp: %pI6, targetIp: %pI6", i,
- &pHostOffloadParams->nsOffloadInfo.selfIPv6Addr[i],
- &pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[i]);
-
- /* target MAC is optional, check if it is valid, if this is not valid,
- * the target will use the known local MAC address rather than the tuple */
- WMI_CHAR_ARRAY_TO_MAC_ADDR(pHostOffloadParams->nsOffloadInfo.selfMacAddr,
- &ns_tuple->target_mac);
-#endif
- if ((ns_tuple->target_mac.mac_addr31to0 != 0) ||
- (ns_tuple->target_mac.mac_addr47to32 != 0))
- {
- ns_tuple->flags |= WMI_NSOFF_FLAGS_MAC_VALID;
- }
- }
- buf_ptr += sizeof(WMI_NS_OFFLOAD_TUPLE);
- }
-
- WMITLV_SET_HDR(buf_ptr,WMITLV_TAG_ARRAY_STRUC,(WMI_MAX_ARP_OFFLOADS*sizeof(WMI_ARP_OFFLOAD_TUPLE)));
- buf_ptr += WMI_TLV_HDR_SIZE;
- for(i = 0; i < WMI_MAX_ARP_OFFLOADS; i++){
- arp_tuple = (WMI_ARP_OFFLOAD_TUPLE *)buf_ptr;
- WMITLV_SET_HDR(&arp_tuple->tlv_header,
- WMITLV_TAG_STRUC_WMI_ARP_OFFLOAD_TUPLE,
- WMITLV_GET_STRUCT_TLVLEN(WMI_ARP_OFFLOAD_TUPLE));
-
- /* Fill data for ARP and NS in the first tupple for LA */
- if ((wma->mArpInfo.enableOrDisable & SIR_OFFLOAD_ENABLE) && (i==0)) {
- /*Copy the target ip addr and flags*/
- arp_tuple->flags = WMI_ARPOFF_FLAGS_VALID;
- A_MEMCPY(&arp_tuple->target_ipaddr,wma->mArpInfo.params.hostIpv4Addr,
- SIR_IPV4_ADDR_LEN);
- WMA_LOGD("ARPOffload IP4 address: %pI4",
- wma->mArpInfo.params.hostIpv4Addr);
- }
- buf_ptr += sizeof(WMI_ARP_OFFLOAD_TUPLE);
- }
-
- /* Populate extended NS offload tuples */
- WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
- (num_ns_ext_tuples*sizeof(WMI_NS_OFFLOAD_TUPLE)));
- buf_ptr += WMI_TLV_HDR_SIZE;
-
- if (num_ns_ext_tuples) {
- for(i = WMI_MAX_NS_OFFLOADS; i < count; i++ ){
- ns_tuple = (WMI_NS_OFFLOAD_TUPLE *)buf_ptr;
- WMITLV_SET_HDR(&ns_tuple->tlv_header,
- WMITLV_TAG_STRUC_WMI_NS_OFFLOAD_TUPLE,
- (sizeof(WMI_NS_OFFLOAD_TUPLE)-WMI_TLV_HDR_SIZE));
-
- /* Fill data only for NS offload in the first ARP tuple for LA */
- if (!bArpOnly &&
- ((pHostOffloadParams->enableOrDisable & SIR_OFFLOAD_ENABLE))) {
- ns_tuple->flags |= WMI_NSOFF_FLAGS_VALID;
-#ifdef WLAN_NS_OFFLOAD
- /*Copy the target/solicitation/remote ip addr */
- if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[i])
- A_MEMCPY(&ns_tuple->target_ipaddr[0],
- &pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[i],
- sizeof(WMI_IPV6_ADDR));
- A_MEMCPY(&ns_tuple->solicitation_ipaddr,
- &pHostOffloadParams->nsOffloadInfo.selfIPv6Addr[i],
- sizeof(WMI_IPV6_ADDR));
- if(pHostOffloadParams->nsOffloadInfo.target_ipv6_addr_type[i])
- ns_tuple->flags |= WMI_NSOFF_FLAGS_IS_IPV6_ANYCAST;
- WMA_LOGD("Index %d NS solicitedIp: %pI6, targetIp: %pI6", i,
- &pHostOffloadParams->nsOffloadInfo.selfIPv6Addr[i],
- &pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[i]);
-
- /* target MAC is optional, check if it is valid, if this is not valid,
- * the target will use the known local MAC address rather than the tuple */
- WMI_CHAR_ARRAY_TO_MAC_ADDR(pHostOffloadParams->nsOffloadInfo.selfMacAddr,
- &ns_tuple->target_mac);
-#endif
- if ((ns_tuple->target_mac.mac_addr31to0 != 0) ||
- (ns_tuple->target_mac.mac_addr47to32 != 0)) {
- ns_tuple->flags |= WMI_NSOFF_FLAGS_MAC_VALID;
- }
- }
- buf_ptr += sizeof(WMI_NS_OFFLOAD_TUPLE);
- }
+ if (config_arp)
+ WMA_LOGD(" %s: ARP Offload vdev_id: %d enable: %d ns_count: %u",
+ __func__, cmd->vdev_id,
+ hostoffloadreq->enableOrDisable,
+ hostoffloadreq->num_ns_offload_count);
+ else
+ WMA_LOGD(" %s: NS Offload vdev_id: %d enable: %d ns_count: %u",
+ __func__, cmd->vdev_id,
+ hostoffloadreq->enableOrDisable,
+ hostoffloadreq->num_ns_offload_count);
+
+ wma_fill_ns_offload_params(wma, ns_offload_req, &buf_ptr);
+ wma_fill_arp_offload_params(wma, arp_offload_req, &buf_ptr);
+ if (count > WMI_MAX_NS_OFFLOADS)
+ wma_fill_nsoffload_ext(wma, ns_offload_req, &buf_ptr);
+
+ res = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
+ WMI_SET_ARP_NS_OFFLOAD_CMDID);
+ if (res) {
+ WMA_LOGE("Failed to enable ARP NDP/NSffload");
+ goto err_cmd_send;
}
- res = wmi_unified_cmd_send(wma->wmi_handle, buf, len, WMI_SET_ARP_NS_OFFLOAD_CMDID);
- if(res) {
- WMA_LOGE("Failed to enable ARP NDP/NSffload");
- wmi_buf_free(buf);
- vos_mem_free(pHostOffloadParams);
- return VOS_STATUS_E_FAILURE;
+ if (config_arp) {
+ vos_mem_copy(&wma->interfaces[vdev_id].arp_offload_req,
+ hostoffloadreq, sizeof(tSirHostOffloadReq));
+ } else {
+ vos_mem_copy(&wma->interfaces[vdev_id].ns_offload_req,
+ hostoffloadreq, sizeof(tSirHostOffloadReq));
}
- vos_mem_free(pHostOffloadParams);
- return VOS_STATUS_SUCCESS;
+ vos_mem_free(hostoffloadreq);
+ return status;
+err_cmd_send:
+ wmi_buf_free(buf);
+err_vdev:
+ vos_mem_free(hostoffloadreq);
+ return status;
}
typedef struct {
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 4da10b0b678e..0304f1ce2d2f 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -596,6 +596,10 @@ struct wma_txrx_node {
v_BOOL_t vdev_up;
u_int64_t tsfadjust;
void *addBssStaContext;
+ /* Have a back up of arp offload req */
+ tSirHostOffloadReq arp_offload_req;
+ /* tSirHostOffloadReq of ns offload req */
+ tSirHostOffloadReq ns_offload_req;
tANI_U8 aid;
/* Robust Management Frame (RMF) enabled/disabled */
tANI_U8 rmfEnabled;
@@ -789,10 +793,6 @@ typedef struct wma_handle {
u_int8_t no_of_suspend_ind;
u_int8_t no_of_resume_ind;
- /* Have a back up of arp info to send along
- * with ns info suppose if ns also enabled
- */
- tSirHostOffloadReq mArpInfo;
struct wma_tx_ack_work_ctx *ack_work_ctx;
u_int8_t powersave_mode;
v_BOOL_t ptrn_match_enable_all_vdev;