From 117c2031eebebd6cfd0a0f8625f596f0c8e3e9ea Mon Sep 17 00:00:00 2001 From: Vignesh Viswanathan Date: Wed, 20 Dec 2017 12:31:11 +0530 Subject: [PATCH] qcacld-3.0: Add suppport to forward GAS action frames to supplicant Add changes identify and forward GAS public action frames to supplicant in lim_process_action_frame_no_session. Change-Id: Id872e2b0b8b7a203b472e0bd152f25f63c873b4f CRs-Fixed: 2161785 --- core/mac/inc/sir_mac_prot_def.h | 5 + .../mac/src/pe/lim/lim_process_action_frame.c | 150 +++++++----------- 2 files changed, 64 insertions(+), 91 deletions(-) diff --git a/core/mac/inc/sir_mac_prot_def.h b/core/mac/inc/sir_mac_prot_def.h index 2c617566f491..0f3cf19170c8 100644 --- a/core/mac/inc/sir_mac_prot_def.h +++ b/core/mac/inc/sir_mac_prot_def.h @@ -226,6 +226,11 @@ #define SIR_MAC_ACTION_2040_BSS_COEXISTENCE 0 #define SIR_MAC_ACTION_EXT_CHANNEL_SWITCH_ID 4 +/* Public Action frames for GAS */ +#define SIR_MAC_ACTION_GAS_INITIAL_REQUEST 0x0A +#define SIR_MAC_ACTION_GAS_INITIAL_RESPONSE 0x0B +#define SIR_MAC_ACTION_GAS_COMEBACK_REQUEST 0x0C +#define SIR_MAC_ACTION_GAS_COMEBACK_RESPONSE 0x0D #ifdef WLAN_FEATURE_11W /* 11w SA query request/response action frame category code */ diff --git a/core/mac/src/pe/lim/lim_process_action_frame.c b/core/mac/src/pe/lim/lim_process_action_frame.c index 559177f63153..fab2f8d2d9c6 100644 --- a/core/mac/src/pe/lim/lim_process_action_frame.c +++ b/core/mac/src/pe/lim/lim_process_action_frame.c @@ -2052,57 +2052,47 @@ void lim_process_action_frame(tpAniSirGlobal mac_ctx, break; case SIR_MAC_ACTION_PUBLIC_USAGE: switch (action_hdr->actionID) { + case SIR_MAC_ACTION_EXT_CHANNEL_SWITCH_ID: + lim_process_ext_channel_switch_action_frame(mac_ctx, + rx_pkt_info, session); + break; case SIR_MAC_ACTION_VENDOR_SPECIFIC: pub_action = (tpSirMacVendorSpecificPublicActionFrameHdr) action_hdr; - mac_hdr = NULL; - frame_len = 0; - mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); - frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info); - /* Check if it is a DPP public action frame. */ - if (!qdf_mem_cmp(pub_action->Oui, dpp_oui, 4)) { - /* - * Forward to the SME to HDD to wpa_supplicant - * type is ACTION - */ - lim_send_sme_mgmt_frame_ind(mac_ctx, - mac_hdr->fc.subType, - (uint8_t *) mac_hdr, - frame_len + - sizeof(tSirMacMgmtHdr), - session->smeSessionId, - WMA_GET_RX_CH(rx_pkt_info), - session, WMA_GET_RX_RSSI_RAW(rx_pkt_info)); - } else { + /* + * Check if it is a DPP public action frame and fall + * thru, else drop the frame. + */ + if (qdf_mem_cmp(pub_action->Oui, dpp_oui, 4)) { pe_debug("Unhandled public action frame (Vendor specific) OUI: %x %x %x %x", pub_action->Oui[0], pub_action->Oui[1], pub_action->Oui[2], pub_action->Oui[3]); + break; } - break; - /* Handle vendor specific action */ case SIR_MAC_ACTION_VENDOR_SPECIFIC_CATEGORY: - { - tpSirMacMgmtHdr header; - uint32_t frame_len; - - header = WMA_GET_RX_MAC_HEADER(rx_pkt_info); - frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info); - lim_send_sme_mgmt_frame_ind(mac_ctx, header->fc.subType, - (uint8_t *)header, frame_len + sizeof(tSirMacMgmtHdr), 0, - WMA_GET_RX_CH(rx_pkt_info), NULL, - WMA_GET_RX_RSSI_RAW(rx_pkt_info)); - break; - } - case SIR_MAC_ACTION_2040_BSS_COEXISTENCE: + case SIR_MAC_ACTION_GAS_INITIAL_REQUEST: + case SIR_MAC_ACTION_GAS_INITIAL_RESPONSE: + case SIR_MAC_ACTION_GAS_COMEBACK_REQUEST: + case SIR_MAC_ACTION_GAS_COMEBACK_RESPONSE: mac_hdr = NULL; frame_len = 0; mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info); + if (frame_len < sizeof(pub_action)) { + pe_debug("Received public action frame of invalid len %d", + frame_len); + return; + } + + /* + * Forward to the SME to HDD to wpa_supplicant + * type is ACTION + */ lim_send_sme_mgmt_frame_ind(mac_ctx, mac_hdr->fc.subType, (uint8_t *) mac_hdr, @@ -2111,11 +2101,6 @@ void lim_process_action_frame(tpAniSirGlobal mac_ctx, WMA_GET_RX_CH(rx_pkt_info), session, WMA_GET_RX_RSSI_NORMALIZED( rx_pkt_info)); - break; - - case SIR_MAC_ACTION_EXT_CHANNEL_SWITCH_ID: - lim_process_ext_channel_switch_action_frame(mac_ctx, - rx_pkt_info, session); break; default: pe_warn("Unhandled public action frame: %x", @@ -2229,55 +2214,6 @@ void lim_process_action_frame(tpAniSirGlobal mac_ctx, } } -/* - * lim_process_action_vendor_specific() - Process action frame received - * @mac_ctx: Pointer to Global MAC structure - * @pkt_info: A pointer to packet info structure - * @action_hdr: Pointer to vendor specific action frame hdr - * @session: PE session entry - * - * Return: none - */ -static void lim_process_action_vendor_specific(tpAniSirGlobal mac_ctx, - uint8_t *pkt_info, - tpSirMacVendorSpecificPublicActionFrameHdr action_hdr, - tpPESession session) -{ - - tpSirMacMgmtHdr mac_hdr; - uint32_t frame_len; - uint8_t session_id = 0; - uint8_t dpp_oui[] = { 0x50, 0x6F, 0x9A, 0x1A }; - - mac_hdr = WMA_GET_RX_MAC_HEADER(pkt_info); - frame_len = WMA_GET_RX_PAYLOAD_LEN(pkt_info); - if (frame_len < sizeof(action_hdr)) { - pe_debug("Received action frame of invalid len %d", frame_len); - return; - } - - if (session) - session_id = session->smeSessionId; - - /* Check if it is a DPP public action frame. */ - if (!qdf_mem_cmp(action_hdr->Oui, dpp_oui, 4)) { - /* Forward to the SME to HDD to wpa_supplicant */ - /* type is ACTION */ - lim_send_sme_mgmt_frame_ind(mac_ctx, mac_hdr->fc.subType, - (uint8_t *) mac_hdr, frame_len + - sizeof(tSirMacMgmtHdr), session_id, - WMA_GET_RX_CH(pkt_info), session, - WMA_GET_RX_RSSI_NORMALIZED( - pkt_info)); - } else { - pe_debug("Unhandled public action frame (Vendor specific) OUI: %x %x %x %x", - action_hdr->Oui[0], - action_hdr->Oui[1], - action_hdr->Oui[2], - action_hdr->Oui[3]); - } -} - /** * lim_process_action_frame_no_session * @@ -2300,6 +2236,9 @@ static void lim_process_action_vendor_specific(tpAniSirGlobal mac_ctx, void lim_process_action_frame_no_session(tpAniSirGlobal pMac, uint8_t *pBd) { uint8_t *pBody = WMA_GET_RX_MPDU_DATA(pBd); + tpSirMacMgmtHdr mac_hdr; + uint32_t frame_len; + uint8_t dpp_oui[] = { 0x50, 0x6F, 0x9A, 0x1A }; tpSirMacVendorSpecificPublicActionFrameHdr pActionHdr = (tpSirMacVendorSpecificPublicActionFrameHdr) pBody; @@ -2309,9 +2248,38 @@ void lim_process_action_frame_no_session(tpAniSirGlobal pMac, uint8_t *pBd) case SIR_MAC_ACTION_PUBLIC_USAGE: switch (pActionHdr->actionID) { case SIR_MAC_ACTION_VENDOR_SPECIFIC: - lim_process_action_vendor_specific(pMac, pBd, - pActionHdr, NULL); - break; + /* + * Check if it is a DPP public action frame and fall + * thru, else drop the frame. + */ + if (qdf_mem_cmp(pActionHdr->Oui, dpp_oui, 4)) { + pe_debug("Unhandled public action frame (Vendor specific) OUI: %x %x %x %x", + pActionHdr->Oui[0], pActionHdr->Oui[1], + pActionHdr->Oui[2], pActionHdr->Oui[3]); + break; + } + case SIR_MAC_ACTION_GAS_INITIAL_REQUEST: + case SIR_MAC_ACTION_GAS_INITIAL_RESPONSE: + case SIR_MAC_ACTION_GAS_COMEBACK_REQUEST: + case SIR_MAC_ACTION_GAS_COMEBACK_RESPONSE: + mac_hdr = WMA_GET_RX_MAC_HEADER(pBd); + frame_len = WMA_GET_RX_PAYLOAD_LEN(pBd); + if (frame_len < sizeof(pActionHdr)) { + pe_debug("Received action frame of invalid len %d", + frame_len); + return; + } + /* + * Forward the GAS frames to wpa_supplicant + * type is ACTION + */ + lim_send_sme_mgmt_frame_ind(pMac, + mac_hdr->fc.subType, + (uint8_t *) mac_hdr, + frame_len + sizeof(tSirMacMgmtHdr), 0, + WMA_GET_RX_CH(pBd), NULL, + WMA_GET_RX_RSSI_NORMALIZED(pBd)); + break; default: pe_warn("Unhandled public action frame: %x", pActionHdr->actionID);