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);
}