BOOLEAN hs20IsGratuitousArp( IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb ) { PUINT_8 pucSenderIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SENDER_IP_OFFSET; PUINT_8 pucTargetIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_IP_OFFSET; PUINT_8 pucSenderMac = ((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SNEDER_MAC_OFFSET); #if CFG_HS20_DEBUG && 0 // UINT_8 aucIpAllZero[4] = {0,0,0,0}; // UINT_8 aucMACAllZero[MAC_ADDR_LEN] = {0,0,0,0,0,0}; PUINT_8 pucTargetMac = ((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_MAC_OFFSET); #endif #if CFG_HS20_DEBUG && 0 PUINT_16 pu2ArpOper = (PUINT_16)((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_OPERATION_OFFSET); kalPrint("Recv ARP 0x%04X\n", htons(*pu2ArpOper)); kalPrint("SENDER["MACSTR"] [%d:%d:%d:%d]\n", MAC2STR(pucSenderMac), *pucSenderIP, *(pucSenderIP+1), *(pucSenderIP+2), *(pucSenderIP+3)); kalPrint("TARGET["MACSTR"] [%d:%d:%d:%d]\n", MAC2STR(pucTargetMac), *pucTargetIP, *(pucTargetIP+1), *(pucTargetIP+2), *(pucTargetIP+3)); #endif // IsGratuitousArp if(!kalMemCmp(pucSenderIP, pucTargetIP, 4)) { kalPrint("Drop Gratuitous ARP from ["MACSTR"] [%d:%d:%d:%d]\n", MAC2STR(pucSenderMac), *pucTargetIP, *(pucTargetIP+1), *(pucTargetIP+2), *(pucTargetIP+3)); return TRUE; } return FALSE; }
BOOLEAN hs20IsUnsolicitedNeighborAdv( IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb ) { PUINT_8 pucIpv6Protocol = ((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_IP_PROTOCOL_OFFSET); //kalPrint("pucIpv6Protocol [%02X:%02X]\n", *pucIpv6Protocol, IPV6_PROTOCOL_ICMPV6); if(*pucIpv6Protocol == IPV6_PROTOCOL_ICMPV6) { PUINT_8 pucICMPv6Type = ((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_TYPE_OFFSET); //kalPrint("pucICMPv6Type [%02X:%02X]\n", *pucICMPv6Type, ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT); if(*pucICMPv6Type == ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT) { PUINT_8 pucICMPv6Flag = ((PUINT_8)prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_FLAG_OFFSET); PUINT_8 pucSrcMAC = ((PUINT_8)prCurrSwRfb->pvHeader + MAC_ADDR_LEN); #if CFG_HS20_DEBUG kalPrint("NAdv Flag [%02X] [R(%d)\\S(%d)\\O(%d)]\n", *pucICMPv6Flag, (UINT_8)(*pucICMPv6Flag & ICMPV6_FLAG_ROUTER_BIT) >> 7, (UINT_8)(*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT) >> 6, (UINT_8)(*pucICMPv6Flag & ICMPV6_FLAG_OVERWRITE_BIT) >> 5); #endif if(!(*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT)) { kalPrint("Drop Unsolicited Neighbor Advertisement from ["MACSTR"] \n", MAC2STR(pucSrcMAC)); return TRUE; } }
VOID hs20FillExtCapIE(P_ADAPTER_T prAdapter, P_BSS_INFO_T prBssInfo, P_MSDU_INFO_T prMsduInfo) { P_HS20_EXT_CAP_T prExtCap; ASSERT(prAdapter); ASSERT(prMsduInfo); /* Add Extended Capabilities IE */ prExtCap = (P_HS20_EXT_CAP_T) (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength); prExtCap->ucId = ELEM_ID_EXTENDED_CAP; if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) prExtCap->ucLength = ELEM_MAX_LEN_EXT_CAP; else prExtCap->ucLength = 3 - ELEM_HDR_LEN; kalMemZero(prExtCap->aucCapabilities, prExtCap->ucLength); prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL; if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP; if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) { SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_BSS_TRANSITION_BIT); SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_UTC_TSF_OFFSET_BIT); SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_INTERWORKING_BIT); /* For R2 WNM-Notification */ SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_WNM_NOTIFICATION_BIT); } kalPrint("IE_SIZE(prExtCap) = %d, %d %d\n", IE_SIZE(prExtCap), ELEM_HDR_LEN, ELEM_MAX_LEN_EXT_CAP); ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP)); prMsduInfo->u2FrameLength += IE_SIZE(prExtCap); }