diff options
| author | Mukul Sharma <mukul@codeaurora.org> | 2016-08-24 18:28:55 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-08-29 18:33:38 +0530 |
| commit | f6bd21dec610336fc48928aeffd2f4910c106d1d (patch) | |
| tree | a8ea2d06d0c0a5f08bbc2f8963e8b097935bc97a | |
| parent | fb66184323e4d69801f4dc647a4e78ce42ca8c09 (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.c | 442 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 8 |
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; |
