/** @file supplicant.c * * @brief This file defines the API for supplicant * * Copyright (C) 2014-2017, Marvell International Ltd. * * This software file (the "File") is distributed by Marvell International * Ltd. under the terms of the GNU General Public License Version 2, June 1991 * (the "License"). You may use, redistribute and/or modify this File in * accordance with the terms and conditions of the License, a copy of which * is available by writing to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE * ARE EXPRESSLY DISCLAIMED. The License provides additional details about * this warranty disclaimer. */ /****************************************************** Change log: 03/07/2014: Initial version ******************************************************/ #include "wltypes.h" #include "keyMgmtSta.h" #include "keyCommonDef.h" #include "keyMgmtSta.h" #include "pmkCache.h" t_u8 EAPoLKeyPkt_Validation(mlan_buffer *pmbuf) { t_u32 recvd_pkt_len, eapol_pkt_len; EAPOL_KeyMsg_t *pKeyMsg = NULL; pKeyMsg = (EAPOL_KeyMsg_t *)(pmbuf->pbuf + pmbuf->data_offset + sizeof(ether_hdr_t)); /* Received eapol pkt length: DataLen - 802.3 header */ recvd_pkt_len = pmbuf->data_len - sizeof(ether_hdr_t); /* 8021.X header + EAPOL key pkt header */ eapol_pkt_len = sizeof(EAPOL_KeyMsg_t) - sizeof(pKeyMsg->key_data); if (recvd_pkt_len < eapol_pkt_len) { PRINTM(MERROR, "Invalid EAPOL Key Msg, received length: %u, least length: %u\n", recvd_pkt_len, eapol_pkt_len); return 1; } /* Todo: other validation check */ return 0; } static __inline void ProcessEAPoLKeyPkt(phostsa_private priv, mlan_buffer *pmbuf, IEEEtypes_MacAddr_t *sa, IEEEtypes_MacAddr_t *da) { hostsa_mlan_fns *pm_fns = &priv->mlan_fns; t_u8 bss_role = pm_fns->Hostsa_get_bss_role(pm_fns->pmlan_private); PRINTM(MMSG, "ProcessEAPoLKeyPk bss_type=%x bss_role=%x\n", pm_fns->bss_type, bss_role); #ifdef MIB_STATS INC_MIB_STAT(connPtr, eapolRxForESUPPCnt); #endif if (EAPoLKeyPkt_Validation(pmbuf) != 0) return; switch (bss_role) { #ifdef BTAMP case CONNECTION_TYPE_BTAMP: ProcessKeyMgmtDataAmp(bufDesc); break; #endif case MLAN_BSS_ROLE_STA: /*key data */ ProcessKeyMgmtDataSta(priv, pmbuf, sa, da); break; default: #ifdef AUTHENTICATOR if (WIFI_DIRECT_MODE_GO == connPtr->DeviceMode) { ProcessKeyMgmtDataAp(bufDesc); } #endif break; } } t_u8 ProcessEAPoLPkt(void *priv, mlan_buffer *pmbuf) { phostsa_private psapriv = (phostsa_private)priv; ether_hdr_t *pEthHdr = (ether_hdr_t *)(pmbuf->pbuf + pmbuf->data_offset); EAP_PacketMsg_t *pEapPkt = NULL; UINT8 fPacketProcessed = 0; pEapPkt = (EAP_PacketMsg_t *)((t_u8 *)pEthHdr + sizeof(ether_hdr_t)); switch (pEapPkt->hdr_8021x.pckt_type) { case IEEE_8021X_PACKET_TYPE_EAPOL_KEY: ProcessEAPoLKeyPkt(psapriv, pmbuf, (IEEEtypes_MacAddr_t *)pEthHdr->sa, (IEEEtypes_MacAddr_t *)pEthHdr->da); fPacketProcessed = 1; break; #if 0 case IEEE_8021X_PACKET_TYPE_EAP_PACKET: { if (WIFI_DIRECT_MODE_CLIENT == connPtr->DeviceMode || WIFI_DIRECT_MODE_DEVICE == connPtr->DeviceMode) { if (pEapPkt->code == IEEE_8021X_CODE_TYPE_REQUEST) { assocAgent_eapRequestRx(sa); } } } break; #endif default: break; } // CLEAN_FLUSH_CACHED_SQMEM((UINT32)(pEapPkt), bufDesc->DataLen); return fPacketProcessed; } Status_e supplicantRestoreDefaults(void *priv) { pmkCacheInit(priv); return SUCCESS; } /* This can also be removed*/ //#pragma arm section code = ".init" void supplicantFuncInit(void *priv) { supplicantRestoreDefaults(priv); } //#pragma arm section code //#endif /* PSK_SUPPLICANT */