static int handle_rx(void *skb, struct metadata *md) { struct __sk_buff *skb2 = (struct __sk_buff *)skb; void *data = (void *)(long)skb2->data; void *data_end = (void *)(long)skb2->data_end; struct eth_hdr *eth = data; if (data + sizeof(*eth) > data_end) return RX_DROP; u32 in_ifc = md->in_ifc; #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: in_ifc=%d\n", md->module_id, in_ifc); #endif // port security on source mac #ifdef MAC_SECURITY_INGRESS __be64 *mac_lookup = securitymac.lookup(&in_ifc); if (mac_lookup) if (eth->src != *mac_lookup) { #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: mac INGRESS %lx mismatch %lx -> DROP\n", md->module_id, PRINT_MAC(eth->src), PRINT_MAC(*mac_lookup)); #endif return RX_DROP; } #endif // port security on source ip #ifdef IP_SECURITY_INGRESS if (eth->proto == bpf_htons(ETH_P_IP)) { __be32 *ip_lookup = securityip.lookup(&in_ifc); if (ip_lookup) { struct ip_t *ip = data + sizeof(*eth); if (data + sizeof(*eth) + sizeof(*ip) > data_end) return RX_DROP; if (ip->src != *ip_lookup) { #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: IP INGRESS %x mismatch %x -> DROP\n", md->module_id, bpf_htonl(ip->src), bpf_htonl(*ip_lookup)); #endif return RX_DROP; } } } #endif #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: mac src:%lx dst:%lx\n", md->module_id, PRINT_MAC(eth->src), PRINT_MAC(eth->dst)); #endif //LEARNING PHASE: mapping in_ifc with src_interface __be64 src_key = eth->src; //lookup in fwdtable. if no key present initialize with interface u32 *interface_lookup = fwdtable.lookup_or_init(&src_key, &in_ifc); //if the same mac has changed interface, update it if (*interface_lookup != in_ifc) *interface_lookup = in_ifc; //FORWARDING PHASE: select interface(s) to send the packet __be64 dst_mac = eth->dst; //lookup in forwarding table fwdtable u32 *dst_interface = fwdtable.lookup(&dst_mac); if (dst_interface) { //HIT in forwarding table //redirect packet to dst_interface #ifdef MAC_SECURITY_EGRESS u32 out_iface = *dst_interface; __be64 *mac_lookup = securitymac.lookup(&out_iface); if (mac_lookup) if (eth->dst != *mac_lookup){ #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: mac EGRESS %lx mismatch %lx -> DROP\n", md->module_id, PRINT_MAC(eth->dst), PRINT_MAC(*mac_lookup)); #endif return RX_DROP; } #endif /* do not send packet back on the ingress interface */ if (*dst_interface == in_ifc) return RX_DROP; pkt_redirect(skb, md, *dst_interface); #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: redirect out_ifc=%d\n", md->module_id, *dst_interface); #endif return RX_REDIRECT; } else { #ifdef BPF_TRACE bpf_trace_printk("[switch-%d]: Broadcast\n", md->module_id); #endif pkt_controller(skb, md, PKT_BROADCAST); return RX_CONTROLLER; } }
static VOID APPeerAuthReqAtIdleAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { INT i; USHORT Seq, Alg, RspReason, Status; UCHAR Addr1[MAC_ADDR_LEN]; UCHAR Addr2[MAC_ADDR_LEN]; CHAR Chtxt[CIPHER_TEXT_LEN]; UINT32 apidx; PHEADER_802_11 pRcvHdr; HEADER_802_11 AuthHdr; PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; ULONG FrameLen = 0; MAC_TABLE_ENTRY *pEntry; UCHAR ChTxtIe = 16, ChTxtLen = CIPHER_TEXT_LEN; if (! APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, &Alg, &Seq, &Status, Chtxt )) return; /* Find which MBSSID to be authenticate */ for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { if (RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN)) break; } if (apidx >= pAd->ApCfg.BssidNum) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid not found\n")); return; } if ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev))) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid IF didn't up yet.\n")); return; } /* End of if */ pEntry = MacTableLookup(pAd, Addr2); if (pEntry && IS_ENTRY_CLIENT(pEntry)) { if (!RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, MAC_ADDR_LEN)) { MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); pEntry = NULL; DBGPRINT(RT_DEBUG_WARN, ("AUTH - Bssid does not match\n")); } else { if (pEntry->bIAmBadAtheros == TRUE) { AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("Atheros Problem. Turn on RTS/CTS!!!\n")); pEntry->bIAmBadAtheros = FALSE; } #ifdef DOT11_N_SUPPORT BASessionTearDownALL(pAd, pEntry->Aid); #endif /* DOT11_N_SUPPORT */ ASSERT(pEntry->Aid == Elem->Wcid); } } pRcvHdr = (PHEADER_802_11)(Elem->Msg); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from " "[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", apidx, Seq, Alg, Status, Elem->Wcid, PRINT_MAC(Addr2))); #ifdef WSC_V2_SUPPORT /* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */ if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2) && (pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bWpsEnable) && (pAd->ApCfg.MBSSID[apidx].AccessControlList.Policy == 1)) ; else #endif /* WSC_V2_SUPPORT */ /* fail in ACL checking => send an AUTH-Fail seq#2. */ if (! ApCheckAccessControlList(pAd, Addr2, apidx)) { ASSERT(Seq == 1); ASSERT(pEntry == NULL); APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_UNSPECIFY_FAIL); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); RTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, Addr2, apidx, 0); DBGPRINT(RT_DEBUG_TRACE, ("Failed in ACL checking => send an AUTH seq#2 with " "Status code = %d\n", MLME_UNSPECIFY_FAIL)); return; } if ((Alg == AUTH_MODE_OPEN) && (pAd->ApCfg.MBSSID[apidx].AuthMode != Ndis802_11AuthModeShared)) { if (!pEntry) pEntry = MacTableInsertEntry(pAd, Addr2, apidx, OPMODE_AP, TRUE); if (pEntry) { { pEntry->AuthState = AS_AUTH_OPEN; pEntry->Sst = SST_AUTH; /* what if it already in SST_ASSOC ??????? */ } APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_SUCCESS); } else ; /* MAC table full, what should we respond ????? */ } else if ((Alg == AUTH_MODE_KEY) && ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeShared) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeAutoSwitch))) { if (!pEntry) pEntry = MacTableInsertEntry(pAd, Addr2, apidx, OPMODE_AP, TRUE); if (pEntry) { pEntry->AuthState = AS_AUTHENTICATING; pEntry->Sst = SST_NOT_AUTH; /* what if it already in SST_ASSOC ??????? */ /* log this STA in AuthRspAux machine, only one STA is stored. If two STAs using */ /* SHARED_KEY authentication mingled together, then the late comer will win. */ COPY_MAC_ADDR(&pAd->ApMlmeAux.Addr, Addr2); for(i=0; i<CIPHER_TEXT_LEN; i++) pAd->ApMlmeAux.Challenge[i] = RandomByte(pAd); RspReason = 0; Seq++; NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if(NStatus != NDIS_STATUS_SUCCESS) return; /* if no memory, can't do anything */ DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH seq#2 (Challenge)\n")); MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr2, pAd->ApCfg.MBSSID[apidx].Bssid); MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &AuthHdr, 2, &Alg, 2, &Seq, 2, &RspReason, 1, &ChTxtIe, 1, &ChTxtLen, CIPHER_TEXT_LEN, pAd->ApMlmeAux.Challenge, END_OF_ARGS); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); } else ; /* MAC table full, what should we respond ???? */ } else { /* wrong algorithm */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_ALG_NOT_SUPPORT); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Alg=%d, Seq=%d, AuthMode=%d\n", Alg, Seq, pAd->ApCfg.MBSSID[apidx].AuthMode)); } }
int rt28xx_init( IN PRTMP_ADAPTER pAd, IN PSTRING pDefaultMac, IN PSTRING pHostName) { UINT index; UCHAR TmpPhy; NDIS_STATUS Status; UINT32 MacCsr0 = 0; // reset Adapter flags RTMP_CLEAR_FLAGS(pAd); // Init BssTab & ChannelInfo tabbles for auto channel select. #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { //#ifdef AUTO_CH_SELECT_ENHANCE AutoChBssTableInit(pAd); ChannelInfoInit(pAd); //#endif // AUTO_CH_SELECT_ENHANCE // } #endif // CONFIG_AP_SUPPORT // #ifdef DOT11_N_SUPPORT // Allocate BA Reordering memory if (ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM) != TRUE) goto err1; #endif // DOT11_N_SUPPORT // // Make sure MAC gets ready. index = 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); pAd->MACVersion = MacCsr0; if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF)) break; if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) goto err1; RTMPusecDelay(10); } while (index++ < 100); DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion)); // Disable DMA RT28XXDMADisable(pAd); // Load 8051 firmware Status = NICLoadFirmware(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status)); goto err1; } NICLoadRateSwitchingParams(pAd); // Disable interrupts here which is as soon as possible // This statement should never be true. We might consider to remove it later #ifdef RESOURCE_PRE_ALLOC Status = RTMPInitTxRxRingMemory(pAd); #else Status = RTMPAllocTxRxRingMemory(pAd); #endif // RESOURCE_PRE_ALLOC // if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("RTMPAllocTxRxMemory failed, Status[=0x%08x]\n", Status)); goto err2; } RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); // initialize MLME // Status = RtmpMgmtTaskInit(pAd); if (Status != NDIS_STATUS_SUCCESS) goto err3; Status = MlmeInit(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("MlmeInit failed, Status[=0x%08x]\n", Status)); goto err4; } #ifdef RMTP_RBUS_SUPPORT #ifdef VIDEO_TURBINE_SUPPORT VideoConfigInit(pAd); #endif // VIDEO_TURBINE_SUPPORT // #endif // RMTP_RBUS_SUPPORT // // Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default // UserCfgInit(pAd); Status = RtmpNetTaskInit(pAd); if (Status != NDIS_STATUS_SUCCESS) goto err5; // COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr); // pAd->bForcePrintTX = TRUE; CfgInitHook(pAd); #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) APInitialize(pAd); #endif // CONFIG_AP_SUPPORT // #ifdef BLOCK_NET_IF initblockQueueTab(pAd); #endif // BLOCK_NET_IF // Status = MeasureReqTabInit(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("MeasureReqTabInit failed, Status[=0x%08x]\n",Status)); goto err6; } Status = TpcReqTabInit(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("TpcReqTabInit failed, Status[=0x%08x]\n",Status)); goto err6; } // // Init the hardware, we need to init asic before read registry, otherwise mac register will be reset // Status = NICInitializeAdapter(pAd, TRUE); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICInitializeAdapter failed, Status[=0x%08x]\n", Status)); if (Status != NDIS_STATUS_SUCCESS) goto err6; } #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { } #endif // CONFIG_AP_SUPPORT // // Read parameters from Config File /* unknown, it will be updated in NICReadEEPROMParameters */ pAd->RfIcType = RFIC_UNKNOWN; Status = RTMPReadParametersHook(pAd); DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("RTMPReadParametersHook failed, Status[=0x%08x]\n",Status)); goto err6; } #ifdef RTMP_MAC_USB pAd->CommonCfg.bMultipleIRP = FALSE; if (pAd->CommonCfg.bMultipleIRP) pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE; else pAd->CommonCfg.NumOfBulkInIRP = 1; #endif // RTMP_MAC_USB // #ifdef DOT11_N_SUPPORT //Init Ba Capability parameters. // RT28XX_BA_INIT(pAd); pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable; pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; pAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; // UPdata to HT IE pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; #endif // DOT11_N_SUPPORT // // after reading Registry, we now know if in AP mode or STA mode // Load 8051 firmware; crash when FW image not existent // Status = NICLoadFirmware(pAd); // if (Status != NDIS_STATUS_SUCCESS) // break; DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); // We should read EEPROM for all cases. rt2860b NICReadEEPROMParameters(pAd, (PUCHAR)pDefaultMac); DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); NICInitAsicFromEEPROM(pAd); //rt2860b #ifdef RTMP_INTERNAL_TX_ALC // // Initialize the desired TSSI table // InitDesiredTSSITable(pAd); #endif // RTMP_INTERNAL_TX_ALC // // Set PHY to appropriate mode TmpPhy = pAd->CommonCfg.PhyMode; pAd->CommonCfg.PhyMode = 0xff; RTMPSetPhyMode(pAd, TmpPhy); #ifdef DOT11_N_SUPPORT SetCommonHT(pAd); #endif // DOT11_N_SUPPORT // // No valid channels. if (pAd->ChannelListNum == 0) { DBGPRINT(RT_DEBUG_ERROR, ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n")); goto err6; } #ifdef DOT11_N_SUPPORT DBGPRINT(RT_DEBUG_OFF, ("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0], pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2], pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4])); #endif // DOT11_N_SUPPORT // #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { #ifdef AP_QLOAD_SUPPORT /* init QBSS Element */ QBSS_LoadInit(pAd); #endif // AP_QLOAD_SUPPORT // //#ifdef DOT11K_RRM_SUPPORT // RRM_CfgInit(pAd); //#endif // DOT11K_RRM_SUPPORT // } #endif // CONFIG_AP_SUPPORT // // APInitialize(pAd); #ifdef IKANOS_VX_1X0 VR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress); #endif // IKANOS_VX_1X0 // #ifdef RTMP_MAC_USB AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02); RTMPusecDelay(10000); #endif // RTMP_MAC_USB // #ifdef CONFIG_AP_SUPPORT // // Initialize RF register to default value // if (pAd->OpMode == OPMODE_AP) { AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); } #endif // CONFIG_AP_SUPPORT // /* Some modules init must be called before APStartUp(). Or APStartUp() will make up beacon content and call other modules API to get some information to fill. */ #ifdef WMM_ACM_SUPPORT #ifdef CONFIG_AP_SUPPORT ACMP_Init(pAd, pAd->CommonCfg.APEdcaParm.bACM[0], pAd->CommonCfg.APEdcaParm.bACM[1], pAd->CommonCfg.APEdcaParm.bACM[2], pAd->CommonCfg.APEdcaParm.bACM[3], 0); #endif // CONFIG_AP_SUPPORT // #endif // WMM_ACM_SUPPORT // if (pAd && (Status != NDIS_STATUS_SUCCESS)) { // // Undo everything if it failed // if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) { // NdisMDeregisterInterrupt(&pAd->Interrupt); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); } // RTMPFreeAdapter(pAd); // we will free it in disconnect() } else if (pAd) { // Microsoft HCT require driver send a disconnect event after driver initialization. OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE); DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n")); #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if (pAd->ApCfg.bAutoChannelAtBootup || (pAd->CommonCfg.Channel == 0)) { UINT8 BBPValue = 0; // Enable Interrupt first due to we need to scan channel to receive beacons. RTMP_IRQ_ENABLE(pAd); #ifdef RTMP_MAC_USB RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); // // Support multiple BulkIn IRP, // the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. // for(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++) { RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n" )); } #endif // RTMP_MAC_USB // // Now Enable RxTx RTMPEnableRxTx(pAd); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); // Let BBP register at 20MHz to do scan RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); BBPValue &= (~0x18); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); DBGPRINT(RT_DEBUG_ERROR, ("SYNC - BBP R4 to 20MHz.l\n")); // Now we can receive the beacon and do the listen beacon // use default BW to select channel pAd->CommonCfg.Channel = AP_AUTO_CH_SEL(pAd, pAd->ApCfg.AutoChannelAlg); pAd->ApCfg.bAutoChannelAtBootup = FALSE; } #ifdef DOT11_N_SUPPORT // If phymode > PHY_11ABGN_MIXED and BW=40 check extension channel, after select channel N_ChannelCheck(pAd); #ifdef DOT11N_DRAFT3 /* We only do this Overlapping BSS Scan when system up, for the other situation of channel changing, we depends on station's report to adjust ourself. */ if (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("Disable 20/40 BSSCoex Channel Scan(BssCoex=%d, 40MHzIntolerant=%d)\n", pAd->CommonCfg.bBssCoexEnable, pAd->CommonCfg.bForty_Mhz_Intolerant)); } else if(pAd->CommonCfg.bBssCoexEnable == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("Enable 20/40 BSSCoex Channel Scan(BssCoex=%d)\n", pAd->CommonCfg.bBssCoexEnable)); APOverlappingBSSScan(pAd); } RTMP_11N_D3_TimerInit(pAd); // RTMPInitTimer(pAd, &pAd->CommonCfg.Bss2040CoexistTimer, GET_TIMER_FUNCTION(Bss2040CoexistTimeOut), pAd, FALSE); #endif // DOT11N_DRAFT3 // #endif // DOT11_N_SUPPORT // APStartUp(pAd); DBGPRINT(RT_DEBUG_OFF, ("Main bssid = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pAd->ApCfg.MBSSID[BSS0].Bssid))); } #endif // CONFIG_AP_SUPPORT // #ifdef RTMP_MAC_USB RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); // // Support multiple BulkIn IRP, // the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. // for(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++) { RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n" )); } #endif // RTMP_MAC_USB // }// end of else #ifdef WSC_INCLUDED #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { INT apidx; #ifdef HOSTAPD_SUPPORT if (pAd->ApCfg.Hostapd == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n")); } else #endif //HOSTAPD_SUPPORT// for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { PWSC_CTRL pWscControl; UCHAR zeros16[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl; DBGPRINT(RT_DEBUG_TRACE, ("Generate UUID for apidx(%d)\n", apidx)); if (NdisEqualMemory(&pWscControl->Wsc_Uuid_E[0], zeros16, UUID_LEN_HEX)) WscGenerateUUID(pAd, &pWscControl->Wsc_Uuid_E[0], &pWscControl->Wsc_Uuid_Str[0], apidx, FALSE); WscInit(pAd, FALSE, apidx); } } #endif // CONFIG_AP_SUPPORT // /* WSC hardware push button function 0811 */ WSC_HDR_BTN_Init(pAd); #endif // WSC_INCLUDED // // Set up the Mac address RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]); // Various AP function init #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { #ifdef MBSS_SUPPORT /* the function can not be moved to RT2860_probe() even register_netdev() is changed as register_netdevice(). Or in some PC, kernel will panic (Fedora 4) */ RT28xx_MBSS_Init(pAd, pAd->net_dev); #endif // MBSS_SUPPORT // #ifdef WDS_SUPPORT RT28xx_WDS_Init(pAd, pAd->net_dev); #endif // WDS_SUPPORT // #ifdef APCLI_SUPPORT RT28xx_ApCli_Init(pAd, pAd->net_dev); #endif // APCLI_SUPPORT // } #endif // CONFIG_AP_SUPPORT // #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { #ifdef MAT_SUPPORT MATEngineInit(pAd); #endif // MAT_SUPPORT // #ifdef CLIENT_WDS CliWds_ProxyTabInit(pAd); #endif // CLIENT_WDS // } #endif // CONFIG_AP_SUPPORT // #ifdef RT33xx if (IS_RT3390(pAd)) { RTMP_TxEvmCalibration(pAd); } #endif // RT33xx // DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status)); return TRUE; err6: MeasureReqTabExit(pAd); TpcReqTabExit(pAd); err5: RtmpNetTaskExit(pAd); UserCfgExit(pAd); err4: MlmeHalt(pAd); err3: RtmpMgmtTaskExit(pAd); err2: #ifdef RESOURCE_PRE_ALLOC RTMPResetTxRxRingMemory(pAd); #else RTMPFreeTxRxRingMemory(pAd); #endif // RESOURCE_PRE_ALLOC // err1: #ifdef DOT11_N_SUPPORT if(pAd->mpdu_blk_pool.mem) os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool #endif // DOT11_N_SUPPORT // // shall not set priv to NULL here because the priv didn't been free yet. //net_dev->priv = 0; #ifdef INF_AMAZON_SE err0: #endif // INF_AMAZON_SE // #ifdef ST err0: #endif // ST // DBGPRINT(RT_DEBUG_ERROR, ("!!! rt28xx Initialized fail !!!\n")); return FALSE; }
/* ========================================================================== Description: When waiting joining the (I)BSS, beacon received from external ========================================================================== */ static VOID ApCliPeerProbeRspAtJoinAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT LenVIE; UCHAR *VarIE = NULL; NDIS_802_11_VARIABLE_IEs *pVIE = NULL; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; PAPCLI_STRUCT pApCliEntry = NULL; struct wifi_dev *wdev; #ifdef DOT11_N_SUPPORT UCHAR CentralChannel; #endif /* DOT11_N_SUPPORT */ USHORT ifIndex = (USHORT)(Elem->Priv); ULONG *pCurrState; BCN_IE_LIST *ie_list = NULL; UCHAR PhyMode = pAd->CommonCfg.PhyMode; PFRAME_802_11 pFrame = NULL; if (ifIndex >= MAX_APCLI_NUM) return; /* Init Variable IE structure */ os_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN); if (VarIE == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__)); goto LabelErr; } pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; pVIE->Length = 0; os_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST)); if (ie_list == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate ie_list fail!!!\n", __FUNCTION__)); goto LabelErr; } NdisZeroMemory(ie_list, sizeof(BCN_IE_LIST)); pFrame = (PFRAME_802_11)Elem->Msg; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; if (PeerBeaconAndProbeRspSanity(pAd, Elem->Msg, Elem->MsgLen, Elem->Channel, ie_list, &LenVIE, pVIE)) { /* BEACON from desired BSS/IBSS found. We should be able to decide most BSS parameters here. Q. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION? Do we need to receover back all parameters belonging to previous BSS? A. Should be not. There's no back-door recover to previous AP. It still need a new JOIN-AUTH-ASSOC sequence. */ INT ssidEqualFlag = FALSE; INT ssidEmptyFlag = FALSE; INT bssidEqualFlag = FALSE; INT bssidEmptyFlag = FALSE; INT matchFlag = FALSE; ULONG Bssidx; LONG RealRssi = -127; #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE RealRssi = (LONG)(RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2))); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ /* Update ScanTab */ Bssidx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel); if (Bssidx == BSS_NOT_FOUND) { /* discover new AP of this network, create BSS entry */ #ifdef CUSTOMER_DCC_FEATURE Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -127, LenVIE, pVIE, Elem->Snr0, Elem->Snr1); #else Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -127, LenVIE, pVIE); #endif if (Bssidx == BSS_NOT_FOUND) /* return if BSS table full */ { DBGPRINT(RT_DEBUG_ERROR, ("ERROR: Driver ScanTable Full In Apcli ProbeRsp Join\n")); goto LabelErr; } NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4); NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); pAd->ScanTab.BssEntry[Bssidx].MinSNR = Elem->Signal % 10; if (pAd->ScanTab.BssEntry[Bssidx].MinSNR == 0) pAd->ScanTab.BssEntry[Bssidx].MinSNR = -5; NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN); } #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE DBGPRINT(RT_DEBUG_TRACE, ("Info: Update the SSID %s in Kernel Table\n", ie_list->Ssid)); RT_CFG80211_SCANNING_INFORM(pAd, Bssidx, ie_list->Channel, (UCHAR *)Elem->Msg, Elem->MsgLen, RealRssi); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; wdev = &pApCliEntry->wdev; /* Check the Probe-Rsp's Ssid. */ #ifdef WSC_AP_SUPPORT if ((pApCliEntry->WscControl.WscConfMode != WSC_DISABLE) && (pApCliEntry->WscControl.bWscTrigger == TRUE)) { #ifdef SMART_MESH if((pApCliEntry->WscControl.WscMode == 2) && (pApCliEntry->WscControl.bWscPBCAddrMode == TRUE)) bssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->WscControl.WscPBCAddr, ie_list->Bssid); else #endif /* SMART_MESH */ { if(!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) bssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid); else bssidEmptyFlag = TRUE; } if(pApCliEntry->WscControl.WscSsid.SsidLength != 0) ssidEqualFlag = SSID_EQUAL(pApCliEntry->WscControl.WscSsid.Ssid, pApCliEntry->WscControl.WscSsid.SsidLength,ie_list->Ssid, ie_list->SsidLen); else ssidEmptyFlag = TRUE; } else #endif /* WSC_AP_SUPPORT */ { /* Check the Probe-Rsp's Bssid. */ if(!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) bssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid); else bssidEmptyFlag = TRUE; if(pApCliEntry->CfgSsidLen != 0) ssidEqualFlag = SSID_EQUAL(pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, ie_list->Ssid, ie_list->SsidLen); else ssidEmptyFlag = TRUE; } /* bssid and ssid, Both match. */ if (bssidEqualFlag && ssidEqualFlag) matchFlag = TRUE; /* ssid match but bssid doesn't be indicate. */ else if(ssidEqualFlag && bssidEmptyFlag) matchFlag = TRUE; /* user doesn't indicate any bssid or ssid. AP-Clinet will auto pick a AP to join by most strong siganl strength. */ else if (bssidEmptyFlag && ssidEmptyFlag) { matchFlag = TRUE; #ifdef SMART_MESH matchFlag = FALSE; #endif /* SMART_MESH */ } DBGPRINT(RT_DEBUG_TRACE, ("SYNC - bssidEqualFlag=%d, ssidEqualFlag=%d, matchFlag=%d\n", bssidEqualFlag, ssidEqualFlag, matchFlag)); if (matchFlag) { /* Validate RSN IE if necessary, then copy store this information */ if ((LenVIE > 0) #ifdef WSC_AP_SUPPORT && ((pApCliEntry->WscControl.WscConfMode == WSC_DISABLE) || (pApCliEntry->WscControl.bWscTrigger == FALSE)) #endif /* WSC_AP_SUPPORT */ #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE /* When using CFG80211 and trigger WPS, do not check security. */ && ! (pApCliEntry->wpa_supplicant_info.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS) #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ ) { if (ApCliValidateRSNIE(pAd, (PEID_STRUCT)pVIE, LenVIE, ifIndex)) { pApCliEntry->MlmeAux.VarIELen = LenVIE; NdisMoveMemory(pApCliEntry->MlmeAux.VarIEs, pVIE, pApCliEntry->MlmeAux.VarIELen); } else { /* ignore this response */ pApCliEntry->MlmeAux.VarIELen = 0; DBGPRINT(RT_DEBUG_ERROR, ("ERROR: The RSN IE of this received Probe-resp is dis-match !!!!!!!!!! \n")); goto LabelErr; } } else { if (pApCliEntry->wdev.AuthMode >= Ndis802_11AuthModeWPA #ifdef WSC_AP_SUPPORT && ((pApCliEntry->WscControl.WscConfMode == WSC_DISABLE) || (pApCliEntry->WscControl.bWscTrigger == FALSE)) #endif /* WSC_AP_SUPPORT */ ) { /* ignore this response */ DBGPRINT(RT_DEBUG_ERROR, ("ERROR: The received Probe-resp has empty RSN IE !!!!!!!!!! \n")); goto LabelErr; } pApCliEntry->MlmeAux.VarIELen = 0; } #ifdef SMART_MESH PSMART_MESH_CFG pSmartMeshCfg = NULL; pSmartMeshCfg = &pApCliEntry->SmartMeshCfg; if(((pSmartMeshCfg->HiFiFlagMask != 0) && (pSmartMeshCfg->HiFiFlagValue != 0)) && ((ie_list->VIEFlag & pSmartMeshCfg->HiFiFlagMask) == pSmartMeshCfg->HiFiFlagValue)) { pAd->ScanTab.BssEntry[Bssidx].bHyperFiPeer = TRUE; pApCliEntry->MlmeAux.bHyperFiPeer = TRUE; } else { pAd->ScanTab.BssEntry[Bssidx].bHyperFiPeer = FALSE; pApCliEntry->MlmeAux.bHyperFiPeer = FALSE; } if((pSmartMeshCfg->bHiFiPeerFilter == TRUE) && (pAd->ScanTab.BssEntry[Bssidx].bHyperFiPeer == FALSE)) { DBGPRINT(RT_DEBUG_OFF, ("Reject this PROBE_RSP due to not desired Hyper-Fi peer(%02X:%02X:%02X:%02X:%02X:%02X).\n",PRINT_MAC(pAd->ScanTab.BssEntry[Bssidx].Bssid))); goto LabelErr; } if(pAd->ScanTab.BssEntry[Bssidx].bSupportSmartMesh != ie_list->bSupportSmartMesh) pAd->ScanTab.BssEntry[Bssidx].bSupportSmartMesh = ie_list->bSupportSmartMesh; if(pAd->ScanTab.BssEntry[Bssidx].bSupportSmartMesh) { pApCliEntry->MlmeAux.bSupportSmartMesh = TRUE; DBGPRINT(RT_DEBUG_OFF, ("AP supports SMART MESH\n")); } else pApCliEntry->MlmeAux.bSupportSmartMesh = FALSE; if(pAd->ScanTab.BssEntry[Bssidx].bHyperFiPeer) DBGPRINT(RT_DEBUG_OFF, ("AP is Hyper-Fi device\n")); #endif /* SMART_MESH */ #ifdef MWDS if(pAd->ScanTab.BssEntry[Bssidx].bSupportMWDS != ie_list->bSupportMWDS) pAd->ScanTab.BssEntry[Bssidx].bSupportMWDS = ie_list->bSupportMWDS; if(pAd->ScanTab.BssEntry[Bssidx].bSupportMWDS) { pApCliEntry->MlmeAux.bSupportMWDS = TRUE; DBGPRINT(RT_DEBUG_OFF, ("AP supports MWDS\n")); } else pApCliEntry->MlmeAux.bSupportMWDS = FALSE; #endif /* MWDS */ #ifdef WSC_AP_SUPPORT #ifdef SMART_MESH_HIDDEN_WPS if(pAd->ScanTab.BssEntry[Bssidx].bSupportHiddenWPS != ie_list->bSupportHiddenWPS) pAd->ScanTab.BssEntry[Bssidx].bSupportHiddenWPS = ie_list->bSupportHiddenWPS; if(pAd->ScanTab.BssEntry[Bssidx].bSupportHiddenWPS) DBGPRINT(RT_DEBUG_OFF, ("AP supports HiddenWPS\n")); if(pAd->ScanTab.BssEntry[Bssidx].bRunningHiddenWPS != ie_list->bRunningHiddenWPS) pAd->ScanTab.BssEntry[Bssidx].bRunningHiddenWPS = ie_list->bRunningHiddenWPS; if(pAd->ScanTab.BssEntry[Bssidx].bRunningHiddenWPS) DBGPRINT(RT_DEBUG_OFF, ("AP is running HiddenWPS\n")); #endif /* SMART_MESH_HIDDEN_WPS */ #endif /* WSC_AP_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("SYNC - receive desired PROBE_RSP at JoinWaitProbeRsp... Channel = %d\n", ie_list->Channel)); /* if the Bssid doesn't be indicated then you need to decide which AP to connect by most strong Rssi signal strength. */ if (bssidEqualFlag == FALSE) { /* caculate real rssi value. */ CHAR Rssi0 = ConvertToRssi(pAd, Elem->Rssi0, RSSI_0); CHAR Rssi1 = ConvertToRssi(pAd, Elem->Rssi1, RSSI_1); CHAR Rssi2 = ConvertToRssi(pAd, Elem->Rssi2, RSSI_2); LONG RealMaxRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2)); DBGPRINT(RT_DEBUG_TRACE, ("SYNC - previous Rssi = %ld current Rssi=%ld\n", pApCliEntry->MlmeAux.Rssi, (LONG)RealMaxRssi)); if (pApCliEntry->MlmeAux.Rssi > (LONG)RealMaxRssi) goto LabelErr; else pApCliEntry->MlmeAux.Rssi = RealMaxRssi; } else { BOOLEAN Cancelled; RTMPCancelTimer(&pApCliEntry->MlmeAux.ProbeTimer, &Cancelled); } NdisMoveMemory(pApCliEntry->MlmeAux.Ssid, ie_list->Ssid, ie_list->SsidLen); pApCliEntry->MlmeAux.SsidLen = ie_list->SsidLen; NdisMoveMemory(pApCliEntry->MlmeAux.Bssid, ie_list->Bssid, MAC_ADDR_LEN); pApCliEntry->MlmeAux.CapabilityInfo = ie_list->CapabilityInfo & SUPPORTED_CAPABILITY_INFO; pApCliEntry->MlmeAux.BssType = ie_list->BssType; pApCliEntry->MlmeAux.BeaconPeriod = ie_list->BeaconPeriod; pApCliEntry->MlmeAux.Channel = ie_list->Channel; pApCliEntry->MlmeAux.CentralChannel = ie_list->Channel; /* by default */ pApCliEntry->MlmeAux.AtimWin = ie_list->AtimWin; pApCliEntry->MlmeAux.CfpPeriod = ie_list->CfParm.CfpPeriod; pApCliEntry->MlmeAux.CfpMaxDuration = ie_list->CfParm.CfpMaxDuration; pApCliEntry->MlmeAux.APRalinkIe = ie_list->RalinkIe; /* Copy AP's supported rate to MlmeAux for creating assoication request */ /* Also filter out not supported rate */ pApCliEntry->MlmeAux.SupRateLen = ie_list->SupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, ie_list->SupRate, ie_list->SupRateLen); RTMPCheckRates(pAd, pApCliEntry->MlmeAux.SupRate, &pApCliEntry->MlmeAux.SupRateLen); pApCliEntry->MlmeAux.ExtRateLen = ie_list->ExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, ie_list->ExtRate, ie_list->ExtRateLen); RTMPCheckRates(pAd, pApCliEntry->MlmeAux.ExtRate, &pApCliEntry->MlmeAux.ExtRateLen); #ifdef APCLI_CERT_SUPPORT /* Get the ext capability info element */ if (pAd->bApCliCertTest == TRUE #ifdef DOT11N_DRAFT3 && pAd->CommonCfg.bBssCoexEnable == TRUE #endif /* DOT11N_DRAFT3 */ ) { NdisMoveMemory(&pApCliEntry->MlmeAux.ExtCapInfo, &ie_list->ExtCapInfo,sizeof(ie_list->ExtCapInfo)); #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 DBGPRINT(RT_DEBUG_TRACE, ("\x1b[31m ApCliMlmeAux.ExtCapInfo=%d \x1b[m\n", pApCliEntry->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport)); //zero debug 210121122 pAd->CommonCfg.ExtCapIE.BssCoexistMgmtSupport = 1; #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ } #endif /* APCLI_CERT_SUPPORT */ #ifdef DOT11_N_SUPPORT NdisZeroMemory(pApCliEntry->RxMcsSet,sizeof(pApCliEntry->RxMcsSet)); #ifdef APCLI_AUTO_BW_SUPPORT PhyMode = pApCliEntry->wdev.PhyMode; DBGPRINT(RT_DEBUG_OFF, ("%s: check HT Rule --> %d %d %d %d\n", __FUNCTION__, (ie_list->HtCapabilityLen > 0), (pApCliEntry->wdev.DesiredHtPhyInfo.bHtEnable), WMODE_CAP_N(pApCliEntry->wdev.PhyMode), !(pAd->CommonCfg.HT_DisallowTKIP && IS_INVALID_HT_SECURITY(wdev->WepStatus)))); #endif /* APCLI_AUTO_BW_SUPPORT */ /* filter out un-supported ht rates */ if ((ie_list->HtCapabilityLen > 0) && (pApCliEntry->wdev.DesiredHtPhyInfo.bHtEnable) && WMODE_CAP_N(PhyMode) && /* For Dissallow TKIP rule on STA */ !(pAd->CommonCfg.HT_DisallowTKIP && IS_INVALID_HT_SECURITY(wdev->WepStatus))) { RTMPZeroMemory(&pApCliEntry->MlmeAux.HtCapability, SIZE_HT_CAP_IE); pApCliEntry->MlmeAux.NewExtChannelOffset = ie_list->NewExtChannelOffset; pApCliEntry->MlmeAux.HtCapabilityLen = ie_list->HtCapabilityLen; ApCliCheckHt(pAd, ifIndex, &ie_list->HtCapability, &ie_list->AddHtInfo); if (ie_list->AddHtInfoLen > 0) { CentralChannel = ie_list->AddHtInfo.ControlChan; /* Check again the Bandwidth capability of this AP. */ CentralChannel = get_cent_ch_by_htinfo(pAd, &ie_list->AddHtInfo, &ie_list->HtCapability); pApCliEntry->MlmeAux.CentralChannel = CentralChannel; DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAtJoinAction HT===>CentralCh = %d, ControlCh = %d\n", CentralChannel, ie_list->AddHtInfo.ControlChan)); } } else #endif /* DOT11_N_SUPPORT */ { RTMPZeroMemory(&pApCliEntry->MlmeAux.HtCapability, SIZE_HT_CAP_IE); RTMPZeroMemory(&pApCliEntry->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); pApCliEntry->MlmeAux.HtCapabilityLen = 0; } ApCliUpdateMlmeRate(pAd, ifIndex); #ifdef DOT11_N_SUPPORT /* copy QOS related information */ if (WMODE_CAP_N(PhyMode)) { NdisMoveMemory(&pApCliEntry->MlmeAux.APEdcaParm, &ie_list->EdcaParm, sizeof(EDCA_PARM)); NdisMoveMemory(&pApCliEntry->MlmeAux.APQbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM)); NdisMoveMemory(&pApCliEntry->MlmeAux.APQosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM)); } else #endif /* DOT11_N_SUPPORT */ { NdisZeroMemory(&pApCliEntry->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); NdisZeroMemory(&pApCliEntry->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); NdisZeroMemory(&pApCliEntry->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); } DBGPRINT(RT_DEBUG_TRACE, ("APCLI SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n", pApCliEntry->MlmeAux.SupRateLen, pApCliEntry->MlmeAux.ExtRateLen)); if (ie_list->AironetCellPowerLimit != 0xFF) { /* We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power */ ChangeToCellPowerLimit(pAd, ie_list->AironetCellPowerLimit); } else /* Used the default TX Power Percentage. */ pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; #ifdef APCLI_AUTO_BW_SUPPORT if ((ie_list->HtCapabilityLen > 0) && (ie_list->HtCapability.HtCapInfo.ChannelWidth == BW_40)) { ApCliAutoBwAction(pAd, ifIndex); } #endif /* APCLI_AUTO_BW_SUPPORT */ if(bssidEqualFlag == TRUE) { *pCurrState = APCLI_SYNC_IDLE; ApCliCtrlMsg.Status = MLME_SUCCESS; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } #ifdef SMART_MESH_MONITOR if(pFrame && (pFrame->Hdr.FC.SubType == SUBTYPE_PROBE_RSP)) { struct nsmpif_drvevnt_buf drvevnt; drvevnt.data.proberesp.type = NSMPIF_DRVEVNT_AP_PROBE_RESP; drvevnt.data.proberesp.channel = ie_list->Channel; COPY_MAC_ADDR(drvevnt.data.proberesp.ap_mac, ie_list->Addr2); drvevnt.data.proberesp.is_ucast = 1; drvevnt.data.proberesp.rate = pAd->LastMgmtRxRate; drvevnt.data.proberesp.rssi = RealRssi; drvevnt.data.proberesp.snr = ConvertToSnr(pAd, Elem->Signal); #ifdef RTMP_MAC if (pAd->chipCap.hif_type == HIF_RTMP) { if (IS_RT6352(pAd)) { if ((42 - drvevnt.data.proberesp.snr) >= 0) drvevnt.data.proberesp.snr = (42 - drvevnt.data.proberesp.snr); else drvevnt.data.proberesp.snr = 0; } } #endif /* RTMP_MAC */ NdisZeroMemory(drvevnt.data.proberesp.ssid,sizeof(drvevnt.data.proberesp.ssid)); NdisCopyMemory(drvevnt.data.proberesp.ssid,ie_list->Ssid,ie_list->SsidLen); drvevnt.data.proberesp.cap = 0; #ifdef DOT11_N_SUPPORT if(ie_list->HtCapabilityLen > 0) drvevnt.data.proberesp.cap |= NSMP_WLCAP_80211_N; #endif /* DOT11_N_SUPPORT */ #ifdef DOT11_VHT_AC if (ie_list->vht_cap_len > 0) drvevnt.data.proberesp.cap |= NSMP_WLCAP_80211_AC; #endif /* DOT11_VHT_AC */ // Bandwdith if (ie_list->HtCapability.HtCapInfo.ChannelWidth == BW_40) { #ifdef DOT11_VHT_AC if(ie_list->vht_op_len > 0 && ie_list->vht_op_ie.vht_op_info.ch_width >= 1) drvevnt.data.proberesp.cap |= NSMP_WLCAP_HT80; else #endif /* DOT11_VHT_AC */ drvevnt.data.proberesp.cap |= NSMP_WLCAP_HT40; } // RX/TX STREAM drvevnt.data.proberesp.cap |= \ (ie_list->HtCapability.MCSSet[3] != 0x00) ? (NSMP_WLCAP_RX_4_STREAMS|NSMP_WLCAP_TX_4_STREAMS) :\ (ie_list->HtCapability.MCSSet[2] != 0x00) ? (NSMP_WLCAP_RX_3_STREAMS|NSMP_WLCAP_TX_3_STREAMS) :\ (ie_list->HtCapability.MCSSet[1] != 0x00) ? (NSMP_WLCAP_RX_2_STREAMS|NSMP_WLCAP_TX_2_STREAMS) : 0; /* Vendor information element */ drvevnt.data.proberesp.ntgr_vie_len = ie_list->vendor_ie_len; NdisZeroMemory(drvevnt.data.proberesp.ntgr_vie,sizeof(drvevnt.data.proberesp.ntgr_vie)); if(ie_list->vendor_ie_len > 0) NdisCopyMemory(drvevnt.data.proberesp.ntgr_vie,ie_list->vendor_ie,ie_list->vendor_ie_len); RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM,NSMPIF_DRVEVNT_AP_PROBE_RESP, NULL, (PUCHAR)&drvevnt.data.proberesp, sizeof(drvevnt.data.proberesp)); } #endif /* SMART_MESH_MONITOR */ } } LabelErr: if (VarIE != NULL) os_free_mem(NULL, VarIE); if (ie_list != NULL) os_free_mem(NULL, ie_list); return; }
static void slave_port_init(uint16_t portid, struct rte_mempool *mbuf_pool) { int retval; uint16_t nb_rxd = RTE_RX_DESC_DEFAULT; uint16_t nb_txd = RTE_TX_DESC_DEFAULT; struct rte_eth_dev_info dev_info; struct rte_eth_rxconf rxq_conf; struct rte_eth_txconf txq_conf; struct rte_eth_conf local_port_conf = port_conf; if (!rte_eth_dev_is_valid_port(portid)) rte_exit(EXIT_FAILURE, "Invalid port\n"); rte_eth_dev_info_get(portid, &dev_info); if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) local_port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE; local_port_conf.rx_adv_conf.rss_conf.rss_hf &= dev_info.flow_type_rss_offloads; if (local_port_conf.rx_adv_conf.rss_conf.rss_hf != port_conf.rx_adv_conf.rss_conf.rss_hf) { printf("Port %u modified RSS hash function based on hardware support," "requested:%#"PRIx64" configured:%#"PRIx64"\n", portid, port_conf.rx_adv_conf.rss_conf.rss_hf, local_port_conf.rx_adv_conf.rss_conf.rss_hf); } retval = rte_eth_dev_configure(portid, 1, 1, &local_port_conf); if (retval != 0) rte_exit(EXIT_FAILURE, "port %u: configuration failed (res=%d)\n", portid, retval); retval = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd, &nb_txd); if (retval != 0) rte_exit(EXIT_FAILURE, "port %u: rte_eth_dev_adjust_nb_rx_tx_desc " "failed (res=%d)\n", portid, retval); /* RX setup */ rxq_conf = dev_info.default_rxconf; rxq_conf.offloads = local_port_conf.rxmode.offloads; retval = rte_eth_rx_queue_setup(portid, 0, nb_rxd, rte_eth_dev_socket_id(portid), &rxq_conf, mbuf_pool); if (retval < 0) rte_exit(retval, " port %u: RX queue 0 setup failed (res=%d)", portid, retval); /* TX setup */ txq_conf = dev_info.default_txconf; txq_conf.offloads = local_port_conf.txmode.offloads; retval = rte_eth_tx_queue_setup(portid, 0, nb_txd, rte_eth_dev_socket_id(portid), &txq_conf); if (retval < 0) rte_exit(retval, "port %u: TX queue 0 setup failed (res=%d)", portid, retval); retval = rte_eth_dev_start(portid); if (retval < 0) rte_exit(retval, "Start port %d failed (res=%d)", portid, retval); struct ether_addr addr; rte_eth_macaddr_get(portid, &addr); printf("Port %u MAC: ", portid); PRINT_MAC(addr); printf("\n"); }
VOID PMF_PeerSAQueryReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Action = Elem->Msg[LENGTH_802_11+1]; if (Action == ACTION_SAQ_REQUEST) { PMAC_TABLE_ENTRY pEntry; PFRAME_802_11 pHeader; USHORT TransactionID; PUCHAR pOutBuffer = NULL; HEADER_802_11 SAQRspHdr; UINT32 FrameLen = 0; UCHAR SACategoryType, SAActionType; UINT ccmp_len = LEN_CCMP_HDR + LEN_CCMP_MIC; UCHAR ccmp_buf[ccmp_len]; DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Receive SA Query Request\n", __FUNCTION__)); pHeader = (PFRAME_802_11) Elem->Msg; pEntry = MacTableLookup(pAd, pHeader->Hdr.Addr2); if (!pEntry) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is not found, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); return; } if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PMF_CAPABLE))) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); return; } NdisMoveMemory(&TransactionID, &Elem->Msg[LENGTH_802_11+2], sizeof(USHORT)); /* Response the SA Query */ os_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER); if(pOutBuffer == NULL) return; #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { MgtMacHeaderInit(pAd, &SAQRspHdr, SUBTYPE_ACTION, 0, pHeader->Hdr.Addr2,pAd->ApCfg.MBSSID[pEntry->apidx].wdev.if_addr, pAd->ApCfg.MBSSID[pEntry->apidx].wdev.bssid); } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { MgtMacHeaderInit(pAd, &SAQRspHdr, SUBTYPE_ACTION, 0, pHeader->Hdr.Addr2, pAd->CurrentAddress, pAd->CurrentAddress); } #endif /* CONFIG_STA_SUPPORT */ SACategoryType = CATEGORY_SA; SAActionType = ACTION_SAQ_RESPONSE; MakeOutgoingFrame(pOutBuffer, (ULONG *) &FrameLen, sizeof(HEADER_802_11), &SAQRspHdr, 1, &SACategoryType, 1, &SAActionType, 2, &TransactionID, END_OF_ARGS); /* transmit the frame */ MiniportMMRequest(pAd, QID_MGMT, pOutBuffer, FrameLen); os_free_mem(NULL, pOutBuffer); DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s - Send SA Query Response to STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(SAQRspHdr.Addr1))); }
VOID FT_OTD_PeerRspAtSeq2Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR TargetAddr[MAC_ADDR_LEN]; USHORT Status; BOOLEAN TimerCancelled; ULONG BssIdx = 0; FT_FTIE FtIe; FT_MDIE MdIe; PFRAME_802_11 pFrame = (PFRAME_802_11) Elem->Msg; MLME_ASSOC_REQ_STRUCT AssocReq; UCHAR BBPValue = 0; DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - PeerFtRspAtSeq2Action MlmeAux.Bssid = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pAd->MlmeAux.Bssid))); if (PeerFtRspSanity (pAd, Elem->Msg, Elem->MsgLen, TargetAddr, &FtIe, &MdIe, &Status)) { if (MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pFrame->Hdr.Addr2)) { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me ( Status=%d)\n", Status)); RTMPCancelTimer(&pAd->MlmeAux.FtOtdActTimer, &TimerCancelled); if (Status == MLME_SUCCESS) { UINT8 ptk_len; PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[MCAST_WCID]; NdisMoveMemory(pEntry->SNonce, FtIe.SNonce, 32); /* Get ANonce from authentication-response */ NdisMoveMemory(pEntry->ANonce, FtIe.ANonce, 32); hex_dump("anonce", pEntry->ANonce, 32); hex_dump("snonce", pEntry->SNonce, 32); FT_DerivePMKR1(pAd->StaCfg.Dot11RCommInfo.PMKR0, pAd->StaCfg.Dot11RCommInfo.PMKR0Name, TargetAddr, /*pAd->MlmeAux.Bssid, */ pAd->CurrentAddress, pEntry->FT_PMK_R1, pEntry->FT_PMK_R1_NAME); if (pEntry->WepStatus == Ndis802_11TKIPEnable) ptk_len = 32 + 32; else ptk_len = 32 + 16; /* Derive FT PTK and PTK-NAME */ FT_DerivePTK(pEntry->FT_PMK_R1, pEntry->FT_PMK_R1_NAME, pEntry->ANonce, pEntry->SNonce, TargetAddr, /*pAd->MlmeAux.Bssid, */ pAd->CurrentAddress, ptk_len, pEntry->PTK, pEntry->PTK_NAME); /* How to know there is resource request session now ???????? */ if ((pAd->StaCfg.Dot11RCommInfo.bSupportResource) && (pAd->MlmeAux.MdIeInfo.FtCapPlc.field.RsrReqCap)) { /* Prepare to send FT Confirm packet. */ DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me, Prepare to send FT Confirm. \n")); pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_WAIT_SEQ4; } else { BSS_ENTRY *pBss = NULL; /* Doesn't need to send FT Confirm packet. */ DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me, Prepare to send Reassoc. \n")); pAd->StaCfg.Dot11RCommInfo.FtRspSuccess = FT_OTD_RESPONSE; pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_IDLE; RTMPMoveMemory(pAd->MlmeAux.Bssid, TargetAddr, MAC_ADDR_LEN); /* find the desired BSS in the latest SCAN result table search 2.4G band first */ BssIdx = BssTableSearch(&pAd->ScanTab, TargetAddr, 1); /* search 5G band, if AP does not exist in 2.4G band */ if (BssIdx == BSS_NOT_FOUND) BssIdx = BssTableSearch(&pAd->ScanTab, TargetAddr, 36); if (BssIdx == BSS_NOT_FOUND) { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n")); pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; return; } pBss = &pAd->ScanTab.BssEntry[BssIdx]; pAd->MlmeAux.Channel = pBss->Channel; pAd->MlmeAux.CentralChannel = pBss->CentralChannel; RTMPZeroMemory(pAd->MlmeAux.ExtRate, MAX_LEN_OF_SUPPORTED_RATES); RTMPZeroMemory(pAd->MlmeAux.SupRate, MAX_LEN_OF_SUPPORTED_RATES); pAd->MlmeAux.ExtRateLen = pBss->ExtRateLen; RTMPMoveMemory(pAd->MlmeAux.ExtRate, pBss->ExtRate, pBss->ExtRateLen); pAd->MlmeAux.SupRateLen = pBss->SupRateLen; RTMPMoveMemory(pAd->MlmeAux.SupRate, pBss->SupRate, pBss->SupRateLen); RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->MlmeAux.SsidLen = pBss->SsidLen; RTMPMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); /* StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability */ if (pBss->HtCapabilityLen) { RTMPMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, pBss->HtCapability.MCSSet, 16); } else { NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); } bbp_set_bw(pAd, BW_20); AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE); AsicLockChannel(pAd, pAd->MlmeAux.Channel); RTMPUpdateMlmeRate(pAd); AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ, sizeof (MLME_ASSOC_REQ_STRUCT), &AssocReq, 0); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC; } } else { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, pFrame->Hdr.Addr2); pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_FT_OTD_CONF, 2, &Status, 0); } } } else { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - PeerFtRspSanity() sanity check fail\n")); } }
/* ========================================================================== Description: Upper Layer request to kick out a STA ========================================================================== */ static VOID APMlmeDeauthReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_DEAUTH_REQ_STRUCT *pInfo; HEADER_802_11 Hdr; PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; ULONG FrameLen = 0; MAC_TABLE_ENTRY *pEntry; UCHAR apidx; pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; if (Elem->Wcid < MAX_LEN_OF_MAC_TABLE) { pEntry = &pAd->MacTab.Content[Elem->Wcid]; if (!pEntry) return; #ifdef WAPI_SUPPORT WAPI_InternalCmdAction(pAd, pEntry->AuthMode, pEntry->func_tb_idx, pEntry->Addr, WAI_MLME_DISCONNECT); #endif /* WAPI_SUPPORT */ /* send wireless event - for deauthentication */ RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pInfo->Addr, 0, 0); #ifdef ALL_NET_EVENT wext_send_event(pEntry->wdev->if_dev, pEntry->Addr, pEntry->bssid, pAd->CommonCfg.Channel, RTMPAvgRssi(pAd, &pEntry->RssiSample), FBT_LINK_OFFLINE_NOTIFY); #endif /* ALL_NET_EVENT */ ApLogEvent(pAd, pInfo->Addr, EVENT_DISASSOCIATED); apidx = pEntry->func_tb_idx; /* 1. remove this STA from MAC table */ MacTableDeleteEntry(pAd, Elem->Wcid, pInfo->Addr); /* 2. send out DE-AUTH request frame */ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) return; DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send DE-AUTH req to %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pInfo->Addr))); MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, pAd->ApCfg.MBSSID[apidx].wdev.if_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid); MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &Hdr, 2, &pInfo->Reason, END_OF_ARGS); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); } }
static VOID APPeerAuthConfirmAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { AUTH_FRAME_INFO auth_info; PHEADER_802_11 pRcvHdr; MAC_TABLE_ENTRY *pEntry; UINT32 apidx, u4MaxMBSSIDSize; #ifdef DOT11R_FT_SUPPORT PFT_CFG pFtCfg; PFT_INFO pFtInfoBuf; #endif /* DOT11R_FT_SUPPORT */ if (pAd == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: pAd is NULL\n",__FUNCTION__)); return; } if (!APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, &auth_info)) return; u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]); apidx = get_apidx_by_addr(pAd, auth_info.addr1); if ((apidx >= pAd->ApCfg.BssidNum) || (apidx >= u4MaxMBSSIDSize)) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid not found\n")); return; } if ((pAd->ApCfg.MBSSID[apidx].wdev.if_dev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].wdev.if_dev))) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid IF didn't up yet.\n")); return; } /* End of if */ if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) { DBGPRINT(RT_DEBUG_ERROR, ("AUTH - Invalid wcid (%d).\n", Elem->Wcid)); return; } pEntry = &pAd->MacTab.Content[Elem->Wcid]; if (pEntry && IS_ENTRY_CLIENT(pEntry)) { if (!RTMPEqualMemory(auth_info.addr1, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, MAC_ADDR_LEN)) { MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); pEntry = NULL; DBGPRINT(RT_DEBUG_WARN, ("AUTH - Bssid does not match\n")); } else { if (pEntry->bIAmBadAtheros == TRUE) { AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("Atheros Problem. Turn on RTS/CTS!!!\n")); pEntry->bIAmBadAtheros = FALSE; } ASSERT(pEntry->Aid == Elem->Wcid); #ifdef DOT11_N_SUPPORT BASessionTearDownALL(pAd, pEntry->wcid); #endif /* DOT11_N_SUPPORT */ } } pRcvHdr = (PHEADER_802_11)(Elem->Msg); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from " "[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", apidx, auth_info.auth_seq, auth_info.auth_alg, auth_info.auth_status, Elem->Wcid, PRINT_MAC(auth_info.addr2))); if (pEntry && MAC_ADDR_EQUAL(auth_info.addr2, pAd->ApMlmeAux.Addr)) { #ifdef DOT11R_FT_SUPPORT pFtCfg = &pAd->ApCfg.MBSSID[apidx].FtCfg; if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && (auth_info.auth_alg == AUTH_MODE_FT)) { USHORT result; os_alloc_mem(pAd, (UCHAR **)&pFtInfoBuf, sizeof(FT_INFO)); if (pFtInfoBuf) { os_alloc_mem(pAd, (UCHAR **)&(pFtInfoBuf->RicInfo.pRicInfo), 512); if (pFtInfoBuf->RicInfo.pRicInfo != NULL) { result = FT_AuthConfirmHandler(pAd, pEntry, &auth_info.FtInfo, pFtInfoBuf); FT_EnqueueAuthReply(pAd, pRcvHdr, auth_info.auth_alg, 4, result, &pFtInfoBuf->MdIeInfo, &pFtInfoBuf->FtIeInfo, &pFtInfoBuf->RicInfo, pFtInfoBuf->RSN_IE, pFtInfoBuf->RSNIE_Len); os_free_mem(NULL, pFtInfoBuf->RicInfo.pRicInfo); } os_free_mem(NULL, pFtInfoBuf); } } else #endif /* DOT11R_FT_SUPPORT */ if ((pRcvHdr->FC.Wep == 1) && NdisEqualMemory(auth_info.Chtxt, pAd->ApMlmeAux.Challenge, CIPHER_TEXT_LEN)) { /* Successful */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_SUCCESS); pEntry->AuthState = AS_AUTH_KEY; pEntry->Sst = SST_AUTH; } else { /* send wireless event - Authentication rejected because of challenge failure */ RTMPSendWirelessEvent(pAd, IW_AUTH_REJECT_CHALLENGE_FAILURE, pEntry->Addr, 0, 0); /* fail - wep bit is not set or challenge text is not equal */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_REJ_CHALLENGE_FAILURE); MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); /*Chtxt[127]='\0'; */ /*pAd->ApMlmeAux.Challenge[127]='\0'; */ DBGPRINT(RT_DEBUG_TRACE, ("%s\n", ((pRcvHdr->FC.Wep == 1) ? "challenge text is not equal" : "wep bit is not set"))); /*DBGPRINT(RT_DEBUG_TRACE, ("Sent Challenge = %s\n",&pAd->ApMlmeAux.Challenge[100])); */ /*DBGPRINT(RT_DEBUG_TRACE, ("Rcv Challenge = %s\n",&Chtxt[100])); */ } } else { /* fail for unknown reason. most likely is AuthRspAux machine be overwritten by another */ /* STA also using SHARED_KEY authentication */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); } }
static VOID APPeerDeauthReqAction( IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem) { UCHAR Addr2[MAC_ADDR_LEN]; UINT16 Reason, SeqNum; MAC_TABLE_ENTRY *pEntry; if (! PeerDeauthReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &SeqNum, &Reason)) return; pEntry = NULL; /*pEntry = MacTableLookup(pAd, Addr2); */ if (Elem->Wcid < MAX_LEN_OF_MAC_TABLE) { pEntry = &pAd->MacTab.Content[Elem->Wcid]; { /* Add Hotspot2.0 Rlease 1 Prestested Code */ BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; unsigned char *tmp = (unsigned char *)pMbss->wdev.bssid; unsigned char *tmp2 = (unsigned char *)&Fr->Hdr.Addr1; if (memcmp(&Fr->Hdr.Addr1, pMbss->wdev.bssid, 6) != 0) { DBGPRINT(RT_DEBUG_INFO, ("da not match bssid,bssid:0x%02x%02x%02x%02x%02x%02x, addr1:0x%02x%02x%02x%02x%02x%02x\n", *tmp, *(tmp+1), *(tmp+2), *(tmp+3), *(tmp+4), *(tmp+5), *tmp2, *(tmp2+1), *(tmp2+2), *(tmp2+3), *(tmp2+4), *(tmp2+5))); return; } else { DBGPRINT(RT_DEBUG_INFO,("da match,0x%02x%02x%02x%02x%02x%02x\n", *tmp, *(tmp+1), *(tmp+2), *(tmp+3), *(tmp+4), *(tmp+5))); } } #ifdef DOT1X_SUPPORT /* Notify 802.1x daemon to clear this sta info */ if (pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.IEEE8021X) DOT1X_InternalCmdAction(pAd, pEntry, DOT1X_DISCONNECT_ENTRY); #endif /* DOT1X_SUPPORT */ #ifdef WAPI_SUPPORT WAPI_InternalCmdAction(pAd, pEntry->AuthMode, pEntry->func_tb_idx, pEntry->Addr, WAI_MLME_DISCONNECT); #endif /* WAPI_SUPPORT */ /* send wireless event - for deauthentication */ RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, Addr2, 0, 0); #ifdef ALL_NET_EVENT wext_send_event(pEntry->wdev->if_dev, pEntry->Addr, pEntry->bssid, pAd->CommonCfg.Channel, RTMPAvgRssi(pAd, &pEntry->RssiSample), FBT_LINK_OFFLINE_NOTIFY); #endif /* ALL_NET_EVENT */ ApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED); if (pEntry->CMTimerRunning == TRUE) { /* If one who initilized Counter Measure deauth itself, AP doesn't log the MICFailTime */ pAd->ApCfg.aMICFailTime = pAd->ApCfg.PrevaMICFailTime; } MacTableDeleteEntry(pAd, Elem->Wcid, Addr2); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - receive DE-AUTH(seq-%d) from " "%02x:%02x:%02x:%02x:%02x:%02x, reason=%d\n", SeqNum, PRINT_MAC(Addr2), Reason)); #ifdef MAC_REPEATER_SUPPORT if (pAd->ApCfg.bMACRepeaterEn == TRUE) { UCHAR apCliIdx, CliIdx; REPEATER_CLIENT_ENTRY *pReptEntry = NULL; pReptEntry = RTMPLookupRepeaterCliEntry(pAd, TRUE, Addr2); if (pReptEntry && (pReptEntry->CliConnectState != 0)) { apCliIdx = pReptEntry->MatchApCliIdx; CliIdx = pReptEntry->MatchLinkIdx; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, (64 + MAX_EXT_MAC_ADDR_SIZE*apCliIdx + CliIdx)); RTMP_MLME_HANDLER(pAd); //RTMPRemoveRepeaterEntry(pAd, apCliIdx, CliIdx); } } #endif /* MAC_REPEATER_SUPPORT */ } }
static VOID APPeerAuthReqAtIdleAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) { INT i; USHORT RspReason; AUTH_FRAME_INFO auth_info; UINT32 apidx; PHEADER_802_11 pRcvHdr; HEADER_802_11 AuthHdr; PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; ULONG FrameLen = 0; MAC_TABLE_ENTRY *pEntry; #ifdef DOT11W_PMF_SUPPORT STA_TR_ENTRY *tr_entry; #endif /* DOT11W_PMF_SUPPORT */ UCHAR ChTxtIe = 16, ChTxtLen = CIPHER_TEXT_LEN; #ifdef DOT11R_FT_SUPPORT PFT_CFG pFtCfg; PFT_INFO pFtInfoBuf; #endif /* DOT11R_FT_SUPPORT */ BSS_STRUCT *pMbss; struct wifi_dev *wdev; UINT32 u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]); #ifdef BAND_STEERING BOOLEAN bBndStrgCheck = TRUE; #endif /* BAND_STEERING */ if (pAd->ApCfg.BANClass3Data == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("Disallow new Association\n")); return; } if (!APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, &auth_info)) return; /* Find which MBSSID to be authenticate */ apidx = get_apidx_by_addr(pAd, auth_info.addr1); if ((apidx >= pAd->ApCfg.BssidNum) || (apidx >= u4MaxMBSSIDSize)) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid not found\n")); return; } pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; ASSERT((wdev->func_idx == apidx)); if ((wdev->if_dev == NULL) || ((wdev->if_dev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev)))) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid IF didn't up yet.\n")); return; } pEntry = MacTableLookup(pAd, auth_info.addr2); if (pEntry && IS_ENTRY_CLIENT(pEntry)) { #ifdef DOT11W_PMF_SUPPORT tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; if ((CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PMF_CAPABLE)) && (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) goto SendAuth; #endif /* DOT11W_PMF_SUPPORT */ if (!RTMPEqualMemory(auth_info.addr1, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, MAC_ADDR_LEN)) { MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); pEntry = NULL; DBGPRINT(RT_DEBUG_WARN, ("AUTH - Bssid does not match\n")); } else { if (pEntry->bIAmBadAtheros == TRUE) { AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("Atheros Problem. Turn on RTS/CTS!!!\n")); pEntry->bIAmBadAtheros = FALSE; } #ifdef DOT11_N_SUPPORT BASessionTearDownALL(pAd, pEntry->wcid); #endif /* DOT11_N_SUPPORT */ ASSERT(pEntry->Aid == Elem->Wcid); } } #ifdef DOT11W_PMF_SUPPORT SendAuth: #endif /* DOT11W_PMF_SUPPORT */ pRcvHdr = (PHEADER_802_11)(Elem->Msg); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from " "[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", apidx, auth_info.auth_seq, auth_info.auth_alg, auth_info.auth_status, Elem->Wcid, PRINT_MAC(auth_info.addr2))); #ifdef WSC_V2_SUPPORT /* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */ if ((pMbss->WscControl.WscConfMode != WSC_DISABLE) && (pMbss->WscControl.WscV2Info.bEnableWpsV2) && (pMbss->WscControl.WscV2Info.bWpsEnable) && (pMbss->AccessControlList.Policy == 1)) ; else #endif /* WSC_V2_SUPPORT */ /* fail in ACL checking => send an AUTH-Fail seq#2. */ if (! ApCheckAccessControlList(pAd, auth_info.addr2, apidx)) { ASSERT(auth_info.auth_seq == 1); ASSERT(pEntry == NULL); APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); RTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, auth_info.addr2, wdev->wdev_idx, 0); DBGPRINT(RT_DEBUG_TRACE, ("Failed in ACL checking => send an AUTH seq#2 with " "Status code = %d\n", MLME_UNSPECIFY_FAIL)); return; } #ifdef BAND_STEERING BND_STRG_CHECK_CONNECTION_REQ( pAd, NULL, auth_info.addr2, Elem->MsgType, Elem->rssi_info, &bBndStrgCheck); if (bBndStrgCheck == FALSE) return; #endif /* BAND_STEERING */ #ifdef DOT11R_FT_SUPPORT pFtCfg = &pMbss->FtCfg; if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && (auth_info.auth_alg == AUTH_MODE_FT)) { USHORT result; if (!pEntry) pEntry = MacTableInsertEntry(pAd, auth_info.addr2, wdev, ENTRY_CLIENT, OPMODE_AP, TRUE); if (pEntry != NULL) { os_alloc_mem(pAd, (UCHAR **)&pFtInfoBuf, sizeof(FT_INFO)); if (pFtInfoBuf) { result = FT_AuthReqHandler(pAd, pEntry, &auth_info.FtInfo, pFtInfoBuf); if (result == MLME_SUCCESS) { NdisMoveMemory(&pEntry->MdIeInfo, &auth_info.FtInfo.MdIeInfo, sizeof(FT_MDIE_INFO)); pEntry->AuthState = AS_AUTH_OPEN; pEntry->Sst = SST_AUTH; } FT_EnqueueAuthReply(pAd, pRcvHdr, auth_info.auth_alg, 2, result, &pFtInfoBuf->MdIeInfo, &pFtInfoBuf->FtIeInfo, NULL, pFtInfoBuf->RSN_IE, pFtInfoBuf->RSNIE_Len); os_free_mem(NULL, pFtInfoBuf); } } return; } else #endif /* DOT11R_FT_SUPPORT */ if ((auth_info.auth_alg == AUTH_MODE_OPEN) && (pMbss->wdev.AuthMode != Ndis802_11AuthModeShared)) { if (!pEntry) pEntry = MacTableInsertEntry(pAd, auth_info.addr2, wdev, ENTRY_CLIENT, OPMODE_AP, TRUE); if (pEntry) { #ifdef DOT11W_PMF_SUPPORT tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PMF_CAPABLE)) || (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED)) #endif /* DOT11W_PMF_SUPPORT */ { pEntry->AuthState = AS_AUTH_OPEN; pEntry->Sst = SST_AUTH; /* what if it already in SST_ASSOC ??????? */ } APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_SUCCESS); } else ; /* MAC table full, what should we respond ????? */ } else if ((auth_info.auth_alg == AUTH_MODE_KEY) && ((wdev->AuthMode == Ndis802_11AuthModeShared) || (wdev->AuthMode == Ndis802_11AuthModeAutoSwitch))) { if (!pEntry) pEntry = MacTableInsertEntry(pAd, auth_info.addr2, wdev, ENTRY_CLIENT, OPMODE_AP, TRUE); if (pEntry) { pEntry->AuthState = AS_AUTHENTICATING; pEntry->Sst = SST_NOT_AUTH; /* what if it already in SST_ASSOC ??????? */ /* log this STA in AuthRspAux machine, only one STA is stored. If two STAs using */ /* SHARED_KEY authentication mingled together, then the late comer will win. */ COPY_MAC_ADDR(&pAd->ApMlmeAux.Addr, auth_info.addr2); for(i=0; i<CIPHER_TEXT_LEN; i++) pAd->ApMlmeAux.Challenge[i] = RandomByte(pAd); RspReason = 0; auth_info.auth_seq++; NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if(NStatus != NDIS_STATUS_SUCCESS) return; /* if no memory, can't do anything */ DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH seq#2 (Challenge)\n")); MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, auth_info.addr2, wdev->if_addr, wdev->bssid); MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &AuthHdr, 2, &auth_info.auth_alg, 2, &auth_info.auth_seq, 2, &RspReason, 1, &ChTxtIe, 1, &ChTxtLen, CIPHER_TEXT_LEN, pAd->ApMlmeAux.Challenge, END_OF_ARGS); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); } else ; /* MAC table full, what should we respond ???? */ } else { /* wrong algorithm */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_ALG_NOT_SUPPORT); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Alg=%d, Seq=%d, AuthMode=%d\n", auth_info.auth_alg, auth_info.auth_seq, pAd->ApCfg.MBSSID[apidx].wdev.AuthMode)); } }
/* ========================================================================== Description: Send Publiac action frame. But with ACtion is GAS_INITIAL_RSP (12). 802.11u. 7.4.7.10 Parameters: Note: ========================================================================== */ VOID MlmeGASIntialRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Action = Elem->Msg[LENGTH_802_11+1]; PMLME_P2P_ACTION_STRUCT pReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg; PHEADER_802_11 pHeader; PUCHAR pAdProtocolElem; PUCHAR pQueryRsp; PUCHAR pOutBuffer; ULONG FrameLen = 0; PUCHAR pDest; NDIS_STATUS NStatus; PUCHAR pServLen = NULL, pQueryLen = NULL, pTotalQueryLen = NULL; USHORT ServLen = 0, QueryLen = 0, TotalQueryLen = 0; PRT_P2P_CLIENT_ENTRY pP2pEntry = NULL; UCHAR AnqpQueryInfoId[2] = {0xdd, 0xdd}; UINT32 TempLen = 0; ULONG tmpValue = 0; DBGPRINT(RT_DEBUG_TRACE, ("MlmeGASIntialRspAction. \n")); NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) return; pP2pEntry = &pAd->P2pTable.Client[pReq->TabIndex]; DBGPRINT(RT_DEBUG_TRACE, ("MlmeGASIntialRspAction. TO %02x:%02x:%02x:%02x:%02x:%02x.\n", PRINT_MAC(pReq->Addr))); pHeader = (PHEADER_802_11)pOutBuffer; ActHeaderInit(pAd, pHeader, pReq->Addr, pAd->P2PCurrentAddress, pAd->P2PCurrentAddress); FrameLen = sizeof(HEADER_802_11); pDest = pOutBuffer + sizeof(HEADER_802_11); /* Category */ *pDest = CATEGORY_PUBLIC; /* Action */ *(pDest+1) = ACTION_GAS_INITIAL_RSP; /* Dialog Token */ *(pDest+2) = pP2pEntry->DialogToken; /* Status Code */ *(pDest+3) = 0; *(pDest+4) = 0; /* GAS Comeback Delay */ *(pDest+5) = 0; *(pDest+6) = 0; pDest += 7; FrameLen += 7; /* Advertisement Protocol information element */ /* Element ID */ *pDest = IE_ADVERTISEMENT_PROTO; /* Length */ *(pDest+1) = 2; /* Advertisement Protocol Tuple */ /* Query Response Length Limit(7b) + PAME-BI(1b) */ *(pDest+2) = 0; /* Advertisement Protol ID */ *(pDest + 3) = ACCESS_NETWORK_QUERY_PROTOCOL; /* ANQP */ FrameLen += 4; pDest += 4; /* Query Request Length */ pTotalQueryLen = pDest; FrameLen += 2; pDest += 2; /* ANQP Query Response */ /* Info ID (56797) */ RTMPMoveMemory(pDest, AnqpQueryInfoId, 2); /* Length */ pQueryLen = (pDest + 2); /* Vendor Specific OUI for P2P defined by WFA. */ RTMPMoveMemory(pDest + 4, P2POUIBYTE, 4); pDest += 8; FrameLen += 8; /* Service Update Indicator */ *pDest = 0; *(pDest + 1) = 0; /* Length */ pServLen = (pDest + 2); /* Service Protocol Type */ *(pDest + 4) = SERVICE_PROTOCOL_TYPE_WFD; /* WiFi-Display */ /* Service Transaction ID */ *(pDest + 5) = pAd->P2pCfg.ServiceTransac; /* Status Code */ *(pDest + 6) = 0; pDest += 7; FrameLen += 7; #ifdef WFD_SUPPORT if (pAd->StaCfg.WfdCfg.bWfdEnable) { /* Response Data */ if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_device_info_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_DEVICE_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_associate_bssid_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ASSOCIATED_BSSID, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_audio_format_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_AUDIO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_video_format_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_VIDEO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_3d_video_format_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_3D_VIDEO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_content_proctection) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_CONTENT_PROTECTION, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_couple_sink_info_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_COUPLED_SINK_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_extent_capability_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_EXTENDED_CAP, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_local_ip_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_LOCAL_IP_ADDR, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_session_info_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_SESSION_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } if (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_alternate_mac_addr_ie) { TempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ALTERNATE_MAC_ADDR, NULL, pDest, ACTION_GAS_INITIAL_RSP); FrameLen += TempLen; ServLen += TempLen; pDest += TempLen; } } #endif /* WFD_SUPPORT */ //ServLen += 2; ServLen += 3; /* Including Status Code */ tmpValue = cpu2le16(ServLen); RTMPMoveMemory(pServLen, &tmpValue, 2); QueryLen = ServLen + 8; tmpValue = cpu2le16(QueryLen); RTMPMoveMemory(pQueryLen, &tmpValue, 2); TotalQueryLen = QueryLen + 4; tmpValue = cpu2le16(TotalQueryLen); RTMPMoveMemory(pTotalQueryLen, &tmpValue, 2); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); }
/* ========================================================================== Description: Send Publiac action frame. But with ACtion is GAS_INITIAL_REQ (11). 802.11u. 7.4.7.10 Parameters: Note: ========================================================================== */ VOID MlmeGASIntialReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; UCHAR Action = Elem->Msg[LENGTH_802_11+1]; PMLME_P2P_ACTION_STRUCT pReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg; PHEADER_802_11 pHeader; PUCHAR pAdProtocolElem; PUCHAR pQueryReq; PUCHAR pOutBuffer; ULONG FrameLen = 0; PUCHAR pDest; NDIS_STATUS NStatus; PUCHAR pServLen = NULL, pQueryLen = NULL, pTotalQueryLen = NULL; USHORT ServLen = 0, QueryLen = 0, TotalQueryLen = 0; int i, iSubId; UCHAR AnqpQueryInfoId[2] = {0xdd, 0xdd}; ULONG tmpValue = 0; DBGPRINT(RT_DEBUG_TRACE, ("MlmeGASIntialReqAction.Token = %d\n", pAd->P2pCfg.Token)); NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) return; DBGPRINT(RT_DEBUG_TRACE, ("%s:: TO %02x:%02x:%02x:%02x:%02x:%02x.\n", __FUNCTION__, PRINT_MAC(pReq->Addr))); pHeader = (PHEADER_802_11)pOutBuffer; ActHeaderInit(pAd, pHeader, pReq->Addr, pP2PCtrl->CurrentAddress, pReq->Addr); FrameLen += sizeof(HEADER_802_11); DBGPRINT(RT_DEBUG_TRACE, ("Use Token = %d. \n", pP2PCtrl->Token)); pDest = pOutBuffer + sizeof(HEADER_802_11); /* Category */ *pDest = CATEGORY_PUBLIC; /* Action */ *(pDest + 1) = ACTION_GAS_INITIAL_REQ; /* Dialog Token */ *(pDest + 2) = pP2PCtrl->Token; pDest += 3; FrameLen += 3; /* Advertisement Protocol Information Element */ /* Element ID */ *pDest = IE_ADVERTISEMENT_PROTO; /* Length */ *(pDest + 1) = 2; /* Advertisement Protocol Tuple */ /* Query Response Length Limit(7b) + PAME-BI(1b) */ *(pDest+2) = 0; /* Advertisement Protocol ID */ *(pDest + 3) = ACCESS_NETWORK_QUERY_PROTOCOL; /* ANQP */ pDest += 4; FrameLen += 4; /* Query Request Length */ pTotalQueryLen = pDest; pDest += 2; FrameLen += 2; /* ANQP Query Request */ /* Info ID (56797) */ RTMPMoveMemory(pDest, AnqpQueryInfoId, 2); /* Length */ pQueryLen = (pDest + 2); /* Vendor Specific OUI for P2P defined by WFA. */ RTMPMoveMemory(pDest + 4, P2POUIBYTE, 4); pDest += 8; FrameLen += 8; /* Service Update Indicator */ *pDest = 0; *(pDest + 1) = 0; /* Length */ pDest += 2; FrameLen += 2; #ifdef WFD_SUPPORT if (pAd->StaCfg.WfdCfg.bWfdEnable) { for (i = 0; i < WFD_DEVICE_TYPE_END; i++) { ServLen = 0; pServLen = pDest; pDest += 2; FrameLen += 2; /* Service Protocol Type */ *pDest = SERVICE_PROTOCOL_TYPE_WFD; /* WiFi-Display */ pDest += 1; /* Service Transaction ID */ *pDest = 0; pDest += 1; /* Requested Device Role, add for WFD Spec. D1.38 and above */ switch (i) { case 0: *pDest = WFD_SOURCE; break; case 1: *pDest = WFD_PRIMARY_SINK; break; case 2: *pDest = WFD_SECONDARY_SINK; break; case 3: *pDest = WFD_SOURCE_PRIMARY_SINK; break; } pDest += 1; FrameLen += 3; ServLen += 3; /* Including Requested Device Role */ /* List of WFD Subelement IDs */ for (iSubId = 0; iSubId < SUBID_WFD_END; iSubId++) { if (pAd->StaCfg.WfdCfg.WfdSerDiscCapable & (0x01 << iSubId)) { *pDest = iSubId; FrameLen += 1; ServLen += 1; pDest += 1; } } tmpValue = cpu2le16(ServLen); RTMPMoveMemory(pServLen, &tmpValue, 2); QueryLen += ServLen + 2; } } #endif /* WFD_SUPPORT */ QueryLen += 6; tmpValue = cpu2le16(QueryLen); RTMPMoveMemory(pQueryLen, &tmpValue, 2); TotalQueryLen = QueryLen + 4; tmpValue = cpu2le16(TotalQueryLen); RTMPMoveMemory(pTotalQueryLen, &tmpValue, 2); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); }
int show_ipv6(int argc, char **argv) { int i, j, k; char buf[128]; char buf6[INET6_ADDRSTRLEN + 1]; struct in6_addr ipaddr; struct in_addr in; int off1, off2, off3; int max6 = 0; int id = -1; printf("\n"); if (argc == 3) { if (!strncmp(argv[2], "all", strlen(argv[2]))) { for (i = 0; i < num_pths; i++) { if (vpc[i].ip6.ip.addr32[0] != 0 || vpc[i].ip6.ip.addr32[1] != 0 || vpc[i].ip6.ip.addr32[2] != 0 || vpc[i].ip6.ip.addr32[3] != 0) { memset(buf6, 0, INET6_ADDRSTRLEN + 1); memcpy(ipaddr.s6_addr, vpc[i].ip6.ip.addr8, 16); vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1); j = sprintf(buf, "%s/%d", buf6, vpc[i].ip6.cidr); if (j > max6) max6 = j; } } memset(buf, 0, sizeof(buf)); memset(buf, ' ', sizeof(buf) - 1); off1 = 7; off2 = off1 + max6 + 2; off3 = off2 + 17 + 2; j = sprintf(buf, "NAME"); buf[j] = ' '; j = sprintf(buf + off1, "IP/MASK"); buf[j + off1] = ' '; j = sprintf(buf + off2, "ROUTER LINK-LAYER"); buf[j + off2] = ' '; j = sprintf(buf + off3, "MTU"); printf("%s\n", buf); for (i = 0; i < num_pths; i++) { memset(buf, 0, sizeof(buf)); memset(buf, ' ', sizeof(buf) - 1); if (strcmp(vpc[i].xname, "VPCS")== 0) j = sprintf(buf, "%s%d", vpc[i].xname, i + 1); else j = sprintf(buf, "%s", vpc[i].xname); buf[j] = ' '; memset(buf6, 0, INET6_ADDRSTRLEN + 1); memcpy(ipaddr.s6_addr, vpc[i].link6.ip.addr8, 16); vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1); sprintf(buf + 7, "%s/%d", buf6, vpc[i].link6.cidr); j = printf("%s", buf); if (vpc[i].ip6.ip.addr32[0] != 0 || vpc[i].ip6.ip.addr32[1] != 0 || vpc[i].ip6.ip.addr32[2] != 0 || vpc[i].ip6.ip.addr32[3] != 0) { memset(buf6, 0, INET6_ADDRSTRLEN + 1); memcpy(ipaddr.s6_addr, vpc[i].ip6.ip.addr8, 16); vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1); printf("\n"); for (k = 0; k < off1; k++) printf(" "); j = printf("%s/%d", buf6, vpc[i].ip6.cidr); j += off1; } for (k = j; k < off2; k++) printf(" "); if (etherIsZero(vpc[i].ip6.gmac)) { j = sprintf(buf, " "); } else { j = 0; for (k = 0; k < 6; k++) j += sprintf(buf + k * 3, "%2.2x:", vpc[i].ip6.gmac[k]); } buf[j - 1] = ' '; if (vpc[i].ip6.mtu) j += sprintf(buf + j, " %4.4d", vpc[i].ip6.mtu); else j += sprintf(buf + j, " "); //buf[j] = ' '; printf("%s\n", buf); } return 1; } if (strlen(argv[2]) == 1 && digitstring(argv[2])){ id = argv[2][0] - '1'; } } else if (argc == 2) id = pcid; if (id != -1) { printf("NAME : %s[%d]\n", vpc[id].xname, id + 1); printf("LINK-LOCAL SCOPE : "); memset(buf6, 0, INET6_ADDRSTRLEN + 1); memcpy(ipaddr.s6_addr, vpc[id].link6.ip.addr8, 16); vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1); printf("%s/%d\n", buf6, vpc[id].link6.cidr); printf("GLOBAL SCOPE : "); if (vpc[id].ip6.ip.addr32[0] != 0 || vpc[id].ip6.ip.addr32[1] != 0 || vpc[id].ip6.ip.addr32[2] != 0 || vpc[id].ip6.ip.addr32[3] != 0) { memset(buf6, 0, INET6_ADDRSTRLEN + 1); memcpy(ipaddr.s6_addr, vpc[id].ip6.ip.addr8, 16); vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1); printf("%s/%d", buf6, vpc[id].ip6.cidr); } printf("\n"); printf("ROUTER LINK-LAYER : "); if (!etherIsZero(vpc[id].ip6.gmac)) PRINT_MAC(vpc[id].ip6.gmac); printf("\n"); printf("MAC : "); PRINT_MAC(vpc[id].ip4.mac); printf("\n"); printf("LPORT : %d\n", vpc[id].lport); in.s_addr = vpc[id].rhost; printf("RHOST:PORT : %s:%d\n", inet_ntoa(in), vpc[id].rport); printf("MTU: : "); if (vpc[id].ip6.mtu) printf("%d", vpc[id].ip6.mtu); printf("\n"); return 1; } argv[argc - 1 ] = "?"; help_show(argc, argv); return 1; }
VOID RTMPAddPMKIDCache( IN PRTMP_ADAPTER pAd, IN INT apidx, IN PUCHAR pAddr, IN UCHAR *PMKID, IN UCHAR *PMK) { INT i, CacheIdx; /* Update PMKID status */ if ((CacheIdx = RTMPSearchPMKIDCache(pAd, apidx, pAddr)) != -1) { NdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].RefreshTime)); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].PMKID, PMKID, LEN_PMKID); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].PMK, PMK, PMK_LEN); DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddPMKIDCache update %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\n", PRINT_MAC(pAddr), CacheIdx, apidx)); return; } /* Add a new PMKID */ for (i = 0; i < MAX_PMKID_COUNT; i++) { if (!pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid) { pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid = TRUE; NdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime)); COPY_MAC_ADDR(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].MAC, pAddr); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].PMKID, PMKID, LEN_PMKID); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].PMK, PMK, PMK_LEN); DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddPMKIDCache add %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\n", PRINT_MAC(pAddr), i, apidx)); break; } } if (i == MAX_PMKID_COUNT) { ULONG timestamp = 0, idx = 0; DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddPMKIDCache(IF(%d) Cache full\n", apidx)); for (i = 0; i < MAX_PMKID_COUNT; i++) { if (pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid) { if (((timestamp == 0) && (idx == 0)) || ((timestamp != 0) && timestamp < pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime)) { timestamp = pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime; idx = i; } } } pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].Valid = TRUE; NdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].RefreshTime)); COPY_MAC_ADDR(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].MAC, pAddr); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].PMKID, PMKID, LEN_PMKID); NdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].PMK, PMK, PMK_LEN); DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddPMKIDCache add %02x:%02x:%02x:%02x:%02x:%02x cache(%ld) from IF(ra%d)\n", PRINT_MAC(pAddr), idx, apidx)); } }
/* ======================================================================== Routine Description: Send log message through wireless event Support standard iw_event with IWEVCUSTOM. It is used below. iwreq_data.data.flags is used to store event_flag that is defined by user. iwreq_data.data.length is the length of the event log. The format of the event log is composed of the entry's MAC address and the desired log message (refer to pWirelessEventText). ex: 11:22:33:44:55:66 has associated successfully p.s. The requirement of Wireless Extension is v15 or newer. ======================================================================== */ VOID RTMPSendWirelessEvent( IN PRTMP_ADAPTER pAd, IN USHORT Event_flag, IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi) { #if WIRELESS_EXT >= 15 union iwreq_data wrqu; PUCHAR pBuf = NULL, pBufPtr = NULL; USHORT event, type, BufLen; UCHAR event_table_len = 0; type = Event_flag & 0xFF00; event = Event_flag & 0x00FF; switch (type) { case IW_SYS_EVENT_FLAG_START: event_table_len = IW_SYS_EVENT_TYPE_NUM; break; case IW_SPOOF_EVENT_FLAG_START: event_table_len = IW_SPOOF_EVENT_TYPE_NUM; break; case IW_FLOOD_EVENT_FLAG_START: event_table_len = IW_FLOOD_EVENT_TYPE_NUM; break; } if (event_table_len == 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type)); return; } if (event >= event_table_len) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event)); return; } //Allocate memory and copy the msg. if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) { //Prepare the payload memset(pBuf, 0, IW_CUSTOM_MAX_LEN); pBufPtr = pBuf; if (pAddr) pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr)); else if (BssIdx < MAX_MBSSID_NUM) pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx); else pBufPtr += sprintf(pBufPtr, "(RT2860) "); if (type == IW_SYS_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]); else if (type == IW_SPOOF_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi); else if (type == IW_FLOOD_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]); else pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); pBufPtr[pBufPtr - pBuf] = '\0'; BufLen = pBufPtr - pBuf; memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = Event_flag; wrqu.data.length = BufLen; //send wireless event wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf); //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf)); kfree(pBuf); } else DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__)); #else DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__)); #endif /* WIRELESS_EXT >= 15 */ }
/* ======================================================================== Routine Description: Handle a alarm. Arguments: pAd - WLAN control block pointer Return Value: None Note: You can use different methods to handle QBSS Load alarm here. Current methods are: 1. Change 20/40 to 20-only. 2. Change channel to the clear channel. ======================================================================== */ static VOID QBSS_LoadAlarm( IN RTMP_ADAPTER *pAd) { /* suspend alarm until channel switch */ QBSS_LoadAlarmSuspend(pAd); pAd->phy_ctrl.QloadAlarmNumber ++; /* check if we have already been 20M bandwidth */ #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 if ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) && (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0)) { MAC_TABLE *pMacTable; UINT32 StaId; DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Change to 20 bw...\n")); /* disassociate stations without D3 2040Coexistence function */ pMacTable = &pAd->MacTab; for(StaId=1; StaId<MAX_LEN_OF_MAC_TABLE; StaId++) { MAC_TABLE_ENTRY *pEntry = &pMacTable->Content[StaId]; BOOLEAN bDisconnectSta = FALSE; if (!IS_ENTRY_CLIENT(pEntry)) continue; if (pEntry->Sst != SST_ASSOC) continue; if (pEntry->BSS2040CoexistenceMgmtSupport) bDisconnectSta = TRUE; if (bDisconnectSta) { /* send wireless event - for ageout */ RTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0); { PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; ULONG FrameLen = 0; HEADER_802_11 DeAuthHdr; USHORT Reason; /* send out a DISASSOC request frame */ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, (" MlmeAllocateMemory fail ..\n")); /*NdisReleaseSpinLock(&pAd->MacTabLock); */ continue; } Reason = REASON_DEAUTH_STA_LEAVING; MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.if_addr, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid); MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &DeAuthHdr, 2, &Reason, END_OF_ARGS); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); } DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Deauth the station " "%02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pEntry->Addr))); MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); continue; } } /* for 11n */ pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0; pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0; /* always 20M */ pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; /* mark alarm flag */ pAd->phy_ctrl.FlgQloadAlarm = TRUE; QBSS_LoadAlarmResume(pAd); } else #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ { /* we are in 20MHz bandwidth so try to switch channel */ DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Switch channel...\n")); /* send command to switch channel */ RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESCAN, NULL, 0); } }
INT BndStrg_DeleteEntry(PBND_STRG_CLI_TABLE table, PUCHAR pAddr, UINT32 Index) { USHORT HashIdx; PBND_STRG_CLI_ENTRY entry, pre_entry, this_entry; INT ret_val = BND_STRG_SUCCESS; NdisAcquireSpinLock(&table->Lock); HashIdx = MAC_ADDR_HASH_INDEX(pAddr); if (Index >= BND_STRG_MAX_TABLE_SIZE) { entry = table->Hash[HashIdx]; while (entry) { if (MAC_ADDR_EQUAL(pAddr, entry->Addr)) { /* this is the entry we're looking for */ break; } else { entry = entry->pNext; } } if (entry == NULL) { BND_STRG_DBGPRINT(RT_DEBUG_WARN, ("%s(): Index=%u, %02x:%02x:%02x:%02x:%02x:%02x, " "Entry not found.\n", __FUNCTION__, Index, PRINT_MAC(pAddr))); NdisReleaseSpinLock(&table->Lock); return BND_STRG_INVALID_ARG; } } else entry = &table->Entry[Index]; if (entry && entry->bValid) { { pre_entry = NULL; this_entry = table->Hash[HashIdx]; ASSERT(this_entry); if (this_entry != NULL) { /* update Hash list*/ do { if (this_entry == entry) { if (pre_entry == NULL) table->Hash[HashIdx] = entry->pNext; else pre_entry->pNext = entry->pNext; break; } pre_entry = this_entry; this_entry = this_entry->pNext; } while (this_entry); } /* not found !!!*/ ASSERT(this_entry != NULL); NdisZeroMemory(entry->Addr, MAC_ADDR_LEN); entry->pNext = NULL; entry->bValid = FALSE; table->Size--; } } NdisReleaseSpinLock(&table->Lock); return ret_val; }
VOID PMF_MlmeSAQueryReq( IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry) { PUCHAR pOutBuffer = NULL; HEADER_802_11 SAQReqHdr; UINT32 FrameLen = 0; UCHAR SACategoryType, SAActionType; UINT ccmp_len = LEN_CCMP_HDR + LEN_CCMP_MIC; UCHAR ccmp_buf[ccmp_len]; PPMF_CFG pPmfCfg = NULL; if (!pEntry) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is NULL\n", __FUNCTION__)); return; } if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PMF_CAPABLE))) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pEntry->Addr))); return; } if (pEntry->SAQueryStatus == SAQ_SENDING) return; #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { pPmfCfg = &pAd->ApCfg.MBSSID[pEntry->apidx].PmfCfg; } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { pPmfCfg = &pAd->StaCfg.PmfCfg; } #endif /* CONFIG_STA_SUPPORT */ if (pPmfCfg) { /* Send the SA Query Request */ os_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER); if(pOutBuffer == NULL) return; #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { MgtMacHeaderInit(pAd, &SAQReqHdr, SUBTYPE_ACTION, 0, pEntry->Addr,pAd->ApCfg.MBSSID[pEntry->apidx].wdev.if_addr, pAd->ApCfg.MBSSID[pEntry->apidx].wdev.bssid); } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { MgtMacHeaderInit(pAd, &SAQReqHdr, SUBTYPE_ACTION, 0, pEntry->Addr, pAd->CurrentAddress, pAd->CurrentAddress); } #endif /* CONFIG_STA_SUPPORT */ pEntry->TransactionID++; SACategoryType = CATEGORY_SA; SAActionType = ACTION_SAQ_REQUEST; MakeOutgoingFrame(pOutBuffer, (ULONG *) &FrameLen, sizeof(HEADER_802_11), &SAQReqHdr, 1, &SACategoryType, 1, &SAActionType, 2, &pEntry->TransactionID, END_OF_ARGS); if (pEntry->SAQueryStatus == SAQ_IDLE) { RTMPSetTimer(&pEntry->SAQueryTimer, 1000); /* 1000ms */ DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s -- SAQueryTimer\n", __FUNCTION__)); } pEntry->SAQueryStatus = SAQ_SENDING; RTMPSetTimer(&pEntry->SAQueryConfirmTimer, 200); /* 200ms */ /* transmit the frame */ MiniportMMRequest(pAd, QID_MGMT, pOutBuffer, FrameLen); os_free_mem(NULL, pOutBuffer); DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s - Send SA Query Request to STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pEntry->Addr))); } }
BOOLEAN BARecSessionAdd( IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, IN PFRAME_ADDBA_REQ pFrame) { BA_REC_ENTRY *pBAEntry = NULL; BOOLEAN Status = TRUE; BOOLEAN Cancelled; USHORT Idx; UCHAR TID; UCHAR BAWinSize; //UINT32 Value; //UINT offset; ASSERT(pEntry); // find TID TID = pFrame->BaParm.TID; BAWinSize = min(((UCHAR)pFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit); // Intel patch if (BAWinSize == 0) { BAWinSize = 64; } Idx = pEntry->BARecWcidArray[TID]; if (Idx == 0) { pBAEntry = BATableAllocRecEntry(pAd, &Idx); } else { pBAEntry = &pAd->BATable.BARecEntry[Idx]; // flush all pending reordering mpdus ba_refresh_reordering_mpdus(pAd, pBAEntry); } DBGPRINT(RT_DEBUG_TRACE,("%s(%ld): Idx = %d, BAWinSize(req %d) = %d\n", __func__, pAd->BATable.numAsRecipient, Idx, pFrame->BaParm.BufSize, BAWinSize)); // Start fill in parameters. if (pBAEntry != NULL) { ASSERT(pBAEntry->list.qlen == 0); pBAEntry->REC_BA_Status = Recipient_HandleRes; pBAEntry->BAWinSize = BAWinSize; pBAEntry->Wcid = pEntry->Aid; pBAEntry->TID = TID; pBAEntry->TimeOutValue = pFrame->TimeOutValue; pBAEntry->REC_BA_Status = Recipient_Accept; // initial sequence number pBAEntry->LastIndSeq = RESET_RCV_SEQ; //pFrame->BaStartSeq.field.StartSeq; printk("Start Seq = %08x\n", pFrame->BaStartSeq.field.StartSeq); if (pEntry->RXBAbitmap & (1<<TID)) { RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled); } else { RTMPInitTimer(pAd, &pBAEntry->RECBATimer, GET_TIMER_FUNCTION(BARecSessionIdleTimeout), pBAEntry, TRUE); } #if 0 // for debugging RTMPSetTimer(&pBAEntry->RECBATimer, REC_BA_SESSION_IDLE_TIMEOUT); #endif // Set Bitmap flag. pEntry->RXBAbitmap |= (1<<TID); pEntry->BARecWcidArray[TID] = Idx; pEntry->BADeclineBitmap &= ~(1<<TID); // Set BA session mask in WCID table. RT28XX_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID); DBGPRINT(RT_DEBUG_TRACE,("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n", pEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID])); } else { Status = FALSE; DBGPRINT(RT_DEBUG_TRACE,("Can't Accept ADDBA for %02x:%02x:%02x:%02x:%02x:%02x TID = %d\n", PRINT_MAC(pEntry->Addr), TID)); } return(Status); }
/* ========================================================================== Description: peer sends assoc rsp back Parameters: Elme - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; USHORT CapabilityInfo, Status, Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; UCHAR CkipFlag; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; HT_CAPABILITY_IE HtCapability; ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ UCHAR HtCapabilityLen; UCHAR AddHtInfoLen; UCHAR NewExtChannelOffset = 0xff; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; PAPCLI_STRUCT pApCliEntry = NULL; ULONG P2PSubelementLen = 0; UCHAR *P2pSubelement; os_alloc_mem(NULL, (UCHAR **)&P2pSubelement, MAX_VIE_LEN); if (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, &P2PSubelementLen, P2pSubelement, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) { /* The frame is for me ? */ if(MAC_ADDR_EQUAL(Addr2, pAd->ApCliMlmeAux.Bssid)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); RTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (P2PSubelementLen > 0) { /*UCHAR P2pIdx = P2P_NOT_FOUND; ULONG TmpLen; PUCHAR pData;*/ pApCliEntry->bP2pClient = TRUE; } else pApCliEntry->bP2pClient = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("%s:: recv peer ASSOC RSP from %02x:%02x:%02x:%02x:%02x:%02x. bP2pClient = %d\n", __FUNCTION__, PRINT_MAC(Addr2), pApCliEntry->bP2pClient)); if(Status == MLME_SUCCESS) { /* go to procedure listed on page 376 */ ApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); pAd->ApCliMlmeAux.Aid=Aid; ApCliCtrlMsg.Status = MLME_SUCCESS; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { ApCliCtrlMsg.Status = Status; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } *pCurrState = APCLI_ASSOC_IDLE; } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\n")); } if (P2pSubelement != NULL) os_free_mem(NULL, P2pSubelement); return; }
/* ======================================================================== Description: This routine frees all packets in PSQ that's destined to a specific DA. BCAST/MCAST in DTIMCount=0 case is also handled here, just like a PS-POLL is received from a WSTA which has MAC address FF:FF:FF:FF:FF:FF ======================================================================== */ VOID RtmpHandleRxPsPoll(RTMP_ADAPTER *pAd, UCHAR *pAddr, USHORT wcid, BOOLEAN isActive) { MAC_TABLE_ENTRY *pMacEntry; STA_TR_ENTRY *tr_entry = NULL; ASSERT(wcid < MAX_LEN_OF_MAC_TABLE); pMacEntry = &pAd->MacTab.Content[wcid]; tr_entry = &pAd->MacTab.tr_entry[wcid]; if (!RTMPEqualMemory(pMacEntry->Addr, pAddr, MAC_ADDR_LEN)) { DBGPRINT(RT_DEBUG_WARN | DBG_FUNC_PS,("%s(%d) PS-POLL (MAC addr not match) from %02x:%02x:%02x:%02x:%02x:%02x. Why???\n", __FUNCTION__, __LINE__, PRINT_MAC(pAddr))); return; } #ifdef UAPSD_SUPPORT00 if (UAPSD_MR_IS_ALL_AC_UAPSD(isActive, pMacEntry)) { /* IEEE802.11e spec. 11.2.1.7 Receive operation for STAs in PS mode during the CP When a non-AP QSTA that is using U-APSD and has all ACs delivery-enabled detects that the bit corresponding to its AID is set in the TIM, the non-AP QSTA shall issue a trigger frame or a PS-Poll frame to retrieve the buffered MSDU or management frames. WMM Spec. v1.1a 070601 3.6.2 U-APSD STA Operation 3.6.2.3 In case one or more ACs are not delivery-enabled ACs, the WMM STA may retrieve MSDUs and MMPDUs belonging to those ACs by sending PS-Polls to the WMM AP. In case all ACs are delivery enabled ACs, WMM STA should only use trigger frames to retrieve MSDUs and MMPDUs belonging to those ACs, and it should not send PS-Poll frames. Different definitions in IEEE802.11e and WMM spec. But we follow the WiFi WMM Spec. */ DBGPRINT(RT_DEBUG_TRACE, ("All AC are UAPSD, can not use PS-Poll\n")); return; /* all AC are U-APSD, can not use PS-Poll */ } #endif /* UAPSD_SUPPORT */ /* Reset ContinueTxFailCnt */ pMacEntry->ContinueTxFailCnt = 0; pAd->MacTab.tr_entry[pMacEntry->wcid].ContinueTxFailCnt = 0; if (isActive == FALSE) { if (tr_entry->PsDeQWaitCnt == 0) { tr_entry->PsDeQWaitCnt = 1; } else { DBGPRINT(RT_DEBUG_TRACE, ("%s(): : packet not send by HW then ignore other PS-Poll Aid[%d]!\n", __FUNCTION__, pMacEntry->Aid)); return; } } else tr_entry->PsDeQWaitCnt = 0; #ifdef CONFIG_AP_SUPPORT #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) { MtHandleRxPsPoll(pAd, pAddr, wcid, isActive); } #endif /* MT_MAC */ #if defined(RTMP_MAC) || defined(RLT_MAC) if ((pAd->chipCap.hif_type == HIF_RTMP) || (pAd->chipCap.hif_type == HIF_RLT)) { RalHandleRxPsPoll(pAd, pAddr, wcid, isActive); } #endif /* RTMP_MAC || RLT_MAC */ #endif /* CONFIG_AP_SUPPORT */ }
/* ======================================================================== Routine Description: Send log message through wireless event Support standard iw_event with IWEVCUSTOM. It is used below. iwreq_data.data.flags is used to store event_flag that is defined by user. iwreq_data.data.length is the length of the event log. The format of the event log is composed of the entry's MAC address and the desired log message (refer to pWirelessEventText). ex: 11:22:33:44:55:66 has associated successfully p.s. The requirement of Wireless Extension is v15 or newer. ======================================================================== */ VOID RtmpDrvSendWirelessEvent( IN VOID *pAdSrc, IN USHORT Event_flag, IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PSTRING pBuf = NULL, pBufPtr = NULL; USHORT event, type, BufLen; UCHAR event_table_len = 0; if (pAd->CommonCfg.bWirelessEvent == FALSE) return; type = Event_flag & 0xFF00; event = Event_flag & 0x00FF; switch (type) { case IW_SYS_EVENT_FLAG_START: event_table_len = IW_SYS_EVENT_TYPE_NUM; break; #ifdef IDS_SUPPORT case IW_SPOOF_EVENT_FLAG_START: event_table_len = IW_SPOOF_EVENT_TYPE_NUM; break; case IW_FLOOD_EVENT_FLAG_START: event_table_len = IW_FLOOD_EVENT_TYPE_NUM; break; #endif /* IDS_SUPPORT */ #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ } if (event_table_len == 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type)); return; } if (event >= event_table_len) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event)); return; } /*Allocate memory and copy the msg. */ /* if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */ os_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN); if(pBuf != NULL) { /*Prepare the payload */ memset(pBuf, 0, IW_CUSTOM_MAX_LEN); pBufPtr = pBuf; if (pAddr) pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr)); else if (BssIdx < MAX_MBSSID_NUM(pAd)) pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx); else pBufPtr += sprintf(pBufPtr, "(RT2860) "); if (type == IW_SYS_EVENT_FLAG_START) { pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]); if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG) { pBufPtr += sprintf(pBufPtr, "%3d", Rssi); } } #ifdef IDS_SUPPORT else if (type == IW_SPOOF_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi); else if (type == IW_FLOOD_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]); #endif /* IDS_SUPPORT */ #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ else pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); pBufPtr[pBufPtr - pBuf] = '\0'; BufLen = pBufPtr - pBuf; RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen); /*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); */ /* kfree(pBuf); */ os_free_mem(NULL, pBuf); } else DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__)); }
VOID RTMPHandleSTAKey( IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, IN MLME_QUEUE_ELEM *Elem) { extern UCHAR OUI_WPA2_WEP40[]; ULONG FrameLen = 0; PUCHAR pOutBuffer = NULL; UCHAR Header802_3[14]; UCHAR *mpool; PEAPOL_PACKET pOutPacket; PEAPOL_PACKET pSTAKey; PHEADER_802_11 pHeader; UCHAR Offset = 0; ULONG MICMsgLen; UCHAR DA[MAC_ADDR_LEN]; UCHAR Key_Data[512]; UCHAR key_length; UCHAR mic[LEN_KEY_DESC_MIC]; UCHAR rcv_mic[LEN_KEY_DESC_MIC]; UCHAR digest[80]; UCHAR temp[64]; PMAC_TABLE_ENTRY pDaEntry; /*Benson add for big-endian 20081016--> */ KEY_INFO peerKeyInfo; /*Benson add 20081016 <-- */ DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPHandleSTAKey\n")); if (!pEntry) return; if ((pEntry->WpaState != AS_PTKINITDONE)) { DBGPRINT(RT_DEBUG_ERROR, ("Not expect calling STAKey hand shaking here")); return; } pHeader = (PHEADER_802_11) Elem->Msg; /* QoS control field (2B) is took off */ /* if (pHeader->FC.SubType & 0x08) */ /* Offset += 2; */ pSTAKey = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H + Offset]; /*Benson add for big-endian 20081016--> */ NdisZeroMemory((PUCHAR)&peerKeyInfo, sizeof(peerKeyInfo)); NdisMoveMemory((PUCHAR)&peerKeyInfo, (PUCHAR)&pSTAKey->KeyDesc.KeyInfo, sizeof(KEY_INFO)); *((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo)); /*Benson add 20081016 <-- */ /* Check Replay Counter */ if (!RTMPEqualMemory(pSTAKey->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY)) { DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in STAKey handshake!! \n")); DBGPRINT(RT_DEBUG_ERROR, ("Receive : %d %d %d %d \n", pSTAKey->KeyDesc.ReplayCounter[0], pSTAKey->KeyDesc.ReplayCounter[1], pSTAKey->KeyDesc.ReplayCounter[2], pSTAKey->KeyDesc.ReplayCounter[3])); DBGPRINT(RT_DEBUG_ERROR, ("Current : %d %d %d %d \n", pEntry->R_Counter[4],pEntry->R_Counter[5], pEntry->R_Counter[6],pEntry->R_Counter[7])); return; } /* Check MIC, if not valid, discard silently */ NdisMoveMemory(DA, &pSTAKey->KeyDesc.KeyData[6], MAC_ADDR_LEN); if (peerKeyInfo.KeyMic && peerKeyInfo.Secure && peerKeyInfo.Request)/*Benson add for big-endian 20081016 --> */ { pEntry->bDlsInit = TRUE; DBGPRINT(RT_DEBUG_TRACE, ("STAKey Initiator: %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pEntry->Addr))); } MICMsgLen = pSTAKey->Body_Len[1] | ((pSTAKey->Body_Len[0]<<8) && 0xff00); MICMsgLen += LENGTH_EAPOL_H; if (MICMsgLen > (Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H)) { DBGPRINT(RT_DEBUG_ERROR, ("Receive wrong format EAPOL packets \n")); return; } /* This is proprietary DLS protocol, it will be adhered when spec. is finished. */ NdisZeroMemory(temp, 64); NdisZeroMemory(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, sizeof(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK)); NdisMoveMemory(temp, "IEEE802.11 WIRELESS ACCESS POINT", 32); WpaDerivePTK(pAd, temp, temp, pAd->ApCfg.MBSSID[pEntry->apidx].wdev.bssid, temp, pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK); DBGPRINT(RT_DEBUG_TRACE, ("PTK-%x %x %x %x %x %x %x %x \n", pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[0], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[1], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[2], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[3], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[4], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[5], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[6], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[7])); /* Record the received MIC for check later */ NdisMoveMemory(rcv_mic, pSTAKey->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); NdisZeroMemory(pSTAKey->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); if (pEntry->WepStatus == Ndis802_11TKIPEnable) { RT_HMAC_MD5(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, (PUCHAR)pSTAKey, MICMsgLen, mic, MD5_DIGEST_SIZE); } else { RT_HMAC_SHA1(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, (PUCHAR)pSTAKey, MICMsgLen, digest, SHA1_DIGEST_SIZE); NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC); } if (!RTMPEqualMemory(rcv_mic, mic, LEN_KEY_DESC_MIC)) { DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in STAKey handshake!! \n")); return; } else DBGPRINT(RT_DEBUG_TRACE, ("MIC VALID in STAKey handshake!! \n")); /* Receive init STA's STAKey Message-2, and terminate the handshake */ /*if (pEntry->bDlsInit && !pSTAKey->KeyDesc.KeyInfo.Request) */ if (pEntry->bDlsInit && !peerKeyInfo.Request) /*Benson add for big-endian 20081016 --> */ { pEntry->bDlsInit = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("Receive init STA's STAKey Message-2, STAKey handshake finished \n")); return; } /* Receive init STA's STAKey Message-2, and terminate the handshake */ if (RTMPEqualMemory(&pSTAKey->KeyDesc.KeyData[2], OUI_WPA2_WEP40, 3)) { DBGPRINT(RT_DEBUG_WARN, ("Receive a STAKey message which not support currently, just drop it \n")); return; } do { pDaEntry = MacTableLookup(pAd, DA); if (!pDaEntry) break; if ((pDaEntry->WpaState != AS_PTKINITDONE)) { DBGPRINT(RT_DEBUG_ERROR, ("Not expect calling STAKey hand shaking here \n")); break; } MlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer); /* allocate memory */ if(pOutBuffer == NULL) break; MAKE_802_3_HEADER(Header802_3, pDaEntry->Addr, pAd->ApCfg.MBSSID[pDaEntry->apidx].wdev.bssid, EAPOL); /* Increment replay counter by 1 */ ADD_ONE_To_64BIT_VAR(pDaEntry->R_Counter); /* Allocate memory for output */ os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); if (mpool == NULL) { MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer); DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); return; } pOutPacket = (PEAPOL_PACKET)mpool; NdisZeroMemory(pOutPacket, TX_EAPOL_BUFFER); /* 0. init Packet and Fill header */ pOutPacket->ProVer = EAPOL_VER; pOutPacket->ProType = EAPOLKey; pOutPacket->Body_Len[1] = 0x5f; /* 1. Fill replay counter */ /* NdisMoveMemory(pDaEntry->R_Counter, pAd->ApCfg.R_Counter, sizeof(pDaEntry->R_Counter)); */ NdisMoveMemory(pOutPacket->KeyDesc.ReplayCounter, pDaEntry->R_Counter, LEN_KEY_DESC_REPLAY); /* 2. Fill key version, keyinfo, key len */ pOutPacket->KeyDesc.KeyInfo.KeyDescVer= GROUP_KEY; pOutPacket->KeyDesc.KeyInfo.KeyType = GROUPKEY; pOutPacket->KeyDesc.KeyInfo.Install = 1; pOutPacket->KeyDesc.KeyInfo.KeyAck = 1; pOutPacket->KeyDesc.KeyInfo.KeyMic = 1; pOutPacket->KeyDesc.KeyInfo.Secure = 1; pOutPacket->KeyDesc.KeyInfo.EKD_DL = 1; DBGPRINT(RT_DEBUG_TRACE, ("STAKey handshake for peer STA %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(DA))); if ((pDaEntry->AuthMode == Ndis802_11AuthModeWPA) || (pDaEntry->AuthMode == Ndis802_11AuthModeWPAPSK)) { pOutPacket->KeyDesc.Type = WPA1_KEY_DESC; DBGPRINT(RT_DEBUG_TRACE, ("pDaEntry->AuthMode == Ndis802_11AuthModeWPA/WPAPSK\n")); } else if ((pDaEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pDaEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) { pOutPacket->KeyDesc.Type = WPA2_KEY_DESC; pOutPacket->KeyDesc.KeyDataLen[1] = 0; DBGPRINT(RT_DEBUG_TRACE, ("pDaEntry->AuthMode == Ndis802_11AuthModeWPA2/WPA2PSK\n")); } pOutPacket->KeyDesc.KeyLength[1] = LEN_TKIP_TK; pOutPacket->KeyDesc.KeyDataLen[1] = LEN_TKIP_TK; pOutPacket->KeyDesc.KeyInfo.KeyDescVer = KEY_DESC_TKIP; if (pDaEntry->WepStatus == Ndis802_11AESEnable) { pOutPacket->KeyDesc.KeyLength[1] = LEN_AES_TK; pOutPacket->KeyDesc.KeyDataLen[1] = LEN_AES_TK; pOutPacket->KeyDesc.KeyInfo.KeyDescVer = KEY_DESC_AES; } /* Key Data Encapsulation format, use Ralink OUI to distinguish proprietary and standard. */ Key_Data[0] = 0xDD; Key_Data[1] = 0x00; /* Length (This field will be filled later) */ Key_Data[2] = 0x00; /* OUI */ Key_Data[3] = 0x0C; /* OUI */ Key_Data[4] = 0x43; /* OUI */ Key_Data[5] = 0x02; /* Data Type (STAKey Key Data Encryption) */ /* STAKey Data Encapsulation format */ Key_Data[6] = 0x00; /*Reserved */ Key_Data[7] = 0x00; /*Reserved */ /* STAKey MAC address */ NdisMoveMemory(&Key_Data[8], pEntry->Addr, MAC_ADDR_LEN); /* initiator MAC address */ /* STAKey (Handle the difference between TKIP and AES-CCMP) */ if (pDaEntry->WepStatus == Ndis802_11AESEnable) { Key_Data[1] = 0x1E; /* 4+2+6+16(OUI+Reserved+STAKey_MAC_Addr+STAKey) */ NdisMoveMemory(&Key_Data[14], pEntry->PairwiseKey.Key, LEN_AES_TK); } else { Key_Data[1] = 0x2E; /* 4+2+6+32(OUI+Reserved+STAKey_MAC_Addr+STAKey) */ NdisMoveMemory(&Key_Data[14], pEntry->PairwiseKey.Key, LEN_TK); NdisMoveMemory(&Key_Data[14+LEN_TK], pEntry->PairwiseKey.TxMic, LEN_TKIP_MIC); NdisMoveMemory(&Key_Data[14+LEN_TK+LEN_TKIP_MIC], pEntry->PairwiseKey.RxMic, LEN_TKIP_MIC); } key_length = Key_Data[1]; pOutPacket->Body_Len[1] = key_length + 0x5f; /* This is proprietary DLS protocol, it will be adhered when spec. is finished. */ NdisZeroMemory(temp, 64); NdisMoveMemory(temp, "IEEE802.11 WIRELESS ACCESS POINT", 32); WpaDerivePTK(pAd, temp, temp, pAd->ApCfg.MBSSID[pEntry->apidx].wdev.bssid, temp, DA, pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK); DBGPRINT(RT_DEBUG_TRACE, ("PTK-0-%x %x %x %x %x %x %x %x \n", pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[0], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[1], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[2], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[3], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[4], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[5], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[6], pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[7])); NdisMoveMemory(pOutPacket->KeyDesc.KeyData, Key_Data, key_length); NdisZeroMemory(mic, sizeof(mic)); *(USHORT *)(&pOutPacket->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pOutPacket->KeyDesc.KeyInfo)); MakeOutgoingFrame(pOutBuffer, &FrameLen, pOutPacket->Body_Len[1] + 4, pOutPacket, END_OF_ARGS); /* Calculate MIC */ if (pDaEntry->WepStatus == Ndis802_11AESEnable) { RT_HMAC_SHA1(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); NdisMoveMemory(pOutPacket->KeyDesc.KeyMic, digest, LEN_KEY_DESC_MIC); } else { RT_HMAC_MD5(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, mic, MD5_DIGEST_SIZE); NdisMoveMemory(pOutPacket->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC); } RTMPToWirelessSta(pAd, pDaEntry, Header802_3, LENGTH_802_3, (PUCHAR)pOutPacket, pOutPacket->Body_Len[1] + 4, FALSE); MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer); os_free_mem(NULL, mpool); }while(FALSE); DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleSTAKey: FrameLen=%ld\n", FrameLen)); }
static void bond_port_init(struct rte_mempool *mbuf_pool) { int retval; uint8_t i; uint16_t nb_rxd = RTE_RX_DESC_DEFAULT; uint16_t nb_txd = RTE_TX_DESC_DEFAULT; struct rte_eth_dev_info dev_info; struct rte_eth_rxconf rxq_conf; struct rte_eth_txconf txq_conf; struct rte_eth_conf local_port_conf = port_conf; retval = rte_eth_bond_create("net_bonding0", BONDING_MODE_ALB, 0 /*SOCKET_ID_ANY*/); if (retval < 0) rte_exit(EXIT_FAILURE, "Faled to create bond port\n"); BOND_PORT = retval; rte_eth_dev_info_get(BOND_PORT, &dev_info); if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) local_port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE; retval = rte_eth_dev_configure(BOND_PORT, 1, 1, &local_port_conf); if (retval != 0) rte_exit(EXIT_FAILURE, "port %u: configuration failed (res=%d)\n", BOND_PORT, retval); retval = rte_eth_dev_adjust_nb_rx_tx_desc(BOND_PORT, &nb_rxd, &nb_txd); if (retval != 0) rte_exit(EXIT_FAILURE, "port %u: rte_eth_dev_adjust_nb_rx_tx_desc " "failed (res=%d)\n", BOND_PORT, retval); /* RX setup */ rxq_conf = dev_info.default_rxconf; rxq_conf.offloads = local_port_conf.rxmode.offloads; retval = rte_eth_rx_queue_setup(BOND_PORT, 0, nb_rxd, rte_eth_dev_socket_id(BOND_PORT), &rxq_conf, mbuf_pool); if (retval < 0) rte_exit(retval, " port %u: RX queue 0 setup failed (res=%d)", BOND_PORT, retval); /* TX setup */ txq_conf = dev_info.default_txconf; txq_conf.offloads = local_port_conf.txmode.offloads; retval = rte_eth_tx_queue_setup(BOND_PORT, 0, nb_txd, rte_eth_dev_socket_id(BOND_PORT), &txq_conf); if (retval < 0) rte_exit(retval, "port %u: TX queue 0 setup failed (res=%d)", BOND_PORT, retval); for (i = 0; i < slaves_count; i++) { if (rte_eth_bond_slave_add(BOND_PORT, slaves[i]) == -1) rte_exit(-1, "Oooops! adding slave (%u) to bond (%u) failed!\n", slaves[i], BOND_PORT); } retval = rte_eth_dev_start(BOND_PORT); if (retval < 0) rte_exit(retval, "Start port %d failed (res=%d)", BOND_PORT, retval); rte_eth_promiscuous_enable(BOND_PORT); struct ether_addr addr; rte_eth_macaddr_get(BOND_PORT, &addr); printf("Port %u MAC: ", (unsigned)BOND_PORT); PRINT_MAC(addr); printf("\n"); }
const CHAR* ether_sprintf(const UINT8 *mac) { static char etherbuf[18]; snprintf(etherbuf,sizeof(etherbuf),"%02x:%02x:%02x:%02x:%02x:%02x", PRINT_MAC(mac)); return etherbuf; }
static VOID APPeerAuthConfirmAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Seq, Alg, Status; UCHAR Addr2[MAC_ADDR_LEN]; PHEADER_802_11 pRcvHdr; CHAR Chtxt[CIPHER_TEXT_LEN]; MAC_TABLE_ENTRY *pEntry; UCHAR Addr1[MAC_ADDR_LEN]; UINT32 apidx; if (! APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, &Alg, &Seq, &Status, Chtxt )) return; for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { if (RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN)) break; } if (apidx >= pAd->ApCfg.BssidNum) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid not found\n")); return; } if ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev))) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Bssid IF didn't up yet.\n")); return; } /* End of if */ if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) { DBGPRINT(RT_DEBUG_ERROR, ("AUTH - Invalid wcid (%d).\n", Elem->Wcid)); return; } pEntry = &pAd->MacTab.Content[Elem->Wcid]; if (pEntry && IS_ENTRY_CLIENT(pEntry)) { if (!RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, MAC_ADDR_LEN)) { MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); pEntry = NULL; DBGPRINT(RT_DEBUG_WARN, ("AUTH - Bssid does not match\n")); } else { if (pEntry->bIAmBadAtheros == TRUE) { AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("Atheros Problem. Turn on RTS/CTS!!!\n")); pEntry->bIAmBadAtheros = FALSE; } #ifdef DOT11_N_SUPPORT BASessionTearDownALL(pAd, pEntry->Aid); #endif /* DOT11_N_SUPPORT */ ASSERT(pEntry->Aid == Elem->Wcid); } } pRcvHdr = (PHEADER_802_11)(Elem->Msg); DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from " "[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", apidx, Seq, Alg, Status, Elem->Wcid, PRINT_MAC(Addr2))); if (pEntry && MAC_ADDR_EQUAL(Addr2, pAd->ApMlmeAux.Addr)) { if ((pRcvHdr->FC.Wep == 1) && NdisEqualMemory(Chtxt, pAd->ApMlmeAux.Challenge, CIPHER_TEXT_LEN)) { /* Successful */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_SUCCESS); pEntry->AuthState = AS_AUTH_KEY; pEntry->Sst = SST_AUTH; } else { /* send wireless event - Authentication rejected because of challenge failure */ RTMPSendWirelessEvent(pAd, IW_AUTH_REJECT_CHALLENGE_FAILURE, pEntry->Addr, 0, 0); /* fail - wep bit is not set or challenge text is not equal */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_REJ_CHALLENGE_FAILURE); MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); /*Chtxt[127]='\0'; */ /*pAd->ApMlmeAux.Challenge[127]='\0'; */ DBGPRINT(RT_DEBUG_TRACE, ("%s\n", ((pRcvHdr->FC.Wep == 1) ? "challenge text is not equal" : "wep bit is not set"))); /*DBGPRINT(RT_DEBUG_TRACE, ("Sent Challenge = %s\n",&pAd->ApMlmeAux.Challenge[100])); */ /*DBGPRINT(RT_DEBUG_TRACE, ("Rcv Challenge = %s\n",&Chtxt[100])); */ } } else { /* fail for unknown reason. most likely is AuthRspAux machine be overwritten by another */ /* STA also using SHARED_KEY authentication */ APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_UNSPECIFY_FAIL); /* If this STA exists, delete it. */ if (pEntry) MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); } }
/* ========================================================================== Description: Timer execution function for periodically updating group key. Return: ========================================================================== */ VOID GREKEYPeriodicExec( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { UINT i, apidx; ULONG temp_counter = 0; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT) SystemSpecific3; MULTISSID_STRUCT *pMbss = NULL; struct wifi_dev *wdev; for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { if (&pAd->ApCfg.MBSSID[apidx].REKEYTimer == pTimer) break; } if (apidx == pAd->ApCfg.BssidNum) return; else pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; if (wdev->AuthMode < Ndis802_11AuthModeWPA || wdev->AuthMode > Ndis802_11AuthModeWPA1PSKWPA2PSK) return; if ((pMbss->WPAREKEY.ReKeyMethod == TIME_REKEY) && (pMbss->REKEYCOUNTER < 0xffffffff)) temp_counter = (++pMbss->REKEYCOUNTER); /* REKEYCOUNTER is incremented every MCAST packets transmitted, */ /* But the unit of Rekeyinterval is 1K packets */ else if (pMbss->WPAREKEY.ReKeyMethod == PKT_REKEY) temp_counter = pMbss->REKEYCOUNTER/1000; else { return; } if (temp_counter > (pMbss->WPAREKEY.ReKeyInterval)) { pMbss->REKEYCOUNTER = 0; pMbss->RekeyCountDown = 3; DBGPRINT(RT_DEBUG_TRACE, ("Rekey Interval Excess, GKeyDoneStations=%d\n", pMbss->StaCount)); /* take turn updating different groupkey index, */ if ((pMbss->StaCount) > 0) { /* change key index */ wdev->DefaultKeyId = (wdev->DefaultKeyId == 1) ? 2 : 1; /* Generate GNonce randomly */ GenRandom(pAd, wdev->bssid, pMbss->GNonce); /* Update GTK */ WpaDeriveGTK(pMbss->GMK, (UCHAR*)pMbss->GNonce, wdev->bssid, pMbss->GTK, LEN_TKIP_GTK); /* Process 2-way handshaking */ for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { MAC_TABLE_ENTRY *pEntry; pEntry = &pAd->MacTab.Content[i]; if (IS_ENTRY_CLIENT(pEntry) && (pEntry->WpaState == AS_PTKINITDONE) && (pEntry->apidx == apidx)) { pEntry->GTKState = REKEY_NEGOTIATING; #ifdef DROP_MASK_SUPPORT /* Disable Drop Mask */ set_drop_mask_per_client(pAd, pEntry, 1, 0); set_drop_mask_per_client(pAd, pEntry, 2, 0); #endif /* DROP_MASK_SUPPORT */ WPAStart2WayGroupHS(pAd, pEntry); DBGPRINT(RT_DEBUG_TRACE, ("Rekey interval excess, Update Group Key for %x %x %x %x %x %x , DefaultKeyId= %x \n",\ PRINT_MAC(pEntry->Addr), wdev->DefaultKeyId)); } } } } /* Use countdown to ensure the 2-way handshaking had completed */ if (pMbss->RekeyCountDown > 0) { pMbss->RekeyCountDown--; if (pMbss->RekeyCountDown == 0) { USHORT Wcid; /* Get a specific WCID to record this MBSS key attribute */ GET_GroupKey_WCID(pAd, Wcid, apidx); /* Install shared key table */ WPAInstallSharedKey(pAd, wdev->GroupKeyWepStatus, apidx, wdev->DefaultKeyId, Wcid, TRUE, pMbss->GTK, LEN_TKIP_GTK); } } }
INT Set_P2P_ProvisionByAddr_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { POS_COOKIE pObj; UCHAR p2pindex = 0; UCHAR ConnAddr[6] = {0}; pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->ioctl_if_type != INT_P2P) return 0; if (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE) return FALSE; DBGPRINT(RT_DEBUG_TRACE, ("%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, PRINT_MAC(ConnAddr))); p2pindex = P2pGroupTabSearch(pAd, ConnAddr); if (p2pindex < pAd->P2pTable.ClientNumber) { P2pConnectPrepare(pAd, ConnAddr, P2PSTATE_PROVISION_COMMAND); } else DBGPRINT(RT_DEBUG_ERROR, ("Table Idx out of range!\n")); return TRUE; }
UCHAR P2pPerstTabInsert( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN PWSC_CREDENTIAL pProfile) { PRT_P2P_TABLE Tab = &pAd->P2pTable; UCHAR i, j; UCHAR index; /*WSC_CREDENTIAL *pProfile; */ index = P2pPerstTabSearch(pAd, pAddr, NULL, NULL); /* Doesn't have this entry. Add a new one. */ if (index == P2P_NOT_FOUND) { for (i = 0; i < MAX_P2P_TABLE_SIZE; i++) { if (Tab->PerstEntry[i].bValid == FALSE) { Tab->PerstEntry[i].bValid = TRUE; Tab->PerstNumber++; if (P2P_GO_ON(pAd)) Tab->PerstEntry[i].MyRule = P2P_IS_GO; else Tab->PerstEntry[i].MyRule = P2P_IS_CLIENT; RTMPMoveMemory(Tab->PerstEntry[i].Addr, pAddr, MAC_ADDR_LEN); DBGPRINT(RT_DEBUG_ERROR, ("Perst::Registra MacAddr = %x %x %x %x %x %x \n",Tab->PerstEntry[i].Addr[0], Tab->PerstEntry[i].Addr[1], Tab->PerstEntry[i].Addr[2],Tab->PerstEntry[i].Addr[3],Tab->PerstEntry[i].Addr[4],Tab->PerstEntry[i].Addr[5])); RTMPMoveMemory(&Tab->PerstEntry[i].Profile, pProfile, sizeof(WSC_CREDENTIAL)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::SsidLen = %d\n",pProfile->SSID.SsidLength)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::Ssid = %s.\n", pProfile->SSID.Ssid)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::MacAddr = %02x:%02x:%02x:%02x:%02x:%02x.\n", PRINT_MAC(pProfile->MacAddr))); DBGPRINT(RT_DEBUG_ERROR, ("Perst::AuthType = 0x%x. EncrType = %d\n",pProfile->AuthType,pProfile->EncrType)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::KeyIndex = %d\n",pProfile->KeyIndex)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::KeyLength = %d\n",pProfile->KeyLength)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::Key ==>\n")); for (j=0;j<16;) { DBGPRINT(RT_DEBUG_ERROR, (" 0x%x 0x%x 0x%x 0x%x\n",pProfile->Key[j], pProfile->Key[j+1], pProfile->Key[j+2],pProfile->Key[j+3])); j = j+4; } DBGPRINT(RT_DEBUG_ERROR, ("Perst::<===Key =\n")); /*DBGPRINT(RT_DEBUG_ERROR, ("Perst::MacAddr = %x %x %x %x %x %x\n",pProfile->MacAddr[0], pProfile->MacAddr[1], pProfile->MacAddr[2],pProfile->MacAddr[3],pProfile->MacAddr[4],pProfile->MacAddr[5]));*/ DBGPRINT(RT_DEBUG_ERROR, (" P2P -P2pPerstTabInsert to index = %x. Rule = %s.\n", i, decodeMyRule(Tab->PerstEntry[i].MyRule))); return i; } } } else if (index < MAX_P2P_TABLE_SIZE) { i = index; Tab->PerstEntry[i].bValid = TRUE; if (P2P_GO_ON(pAd)) Tab->PerstEntry[i].MyRule = P2P_IS_GO; else Tab->PerstEntry[i].MyRule = P2P_IS_CLIENT; RTMPMoveMemory(Tab->PerstEntry[i].Addr, pAddr, MAC_ADDR_LEN); RTMPMoveMemory(&Tab->PerstEntry[i].Profile, &pAd->StaCfg.WscControl.WscProfile.Profile[0], sizeof(WSC_CREDENTIAL)); pProfile = &Tab->PerstEntry[i].Profile; DBGPRINT(RT_DEBUG_ERROR, ("Perst::SsidLen = %d\n",pProfile->SSID.SsidLength)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::Ssid = %c%c%c%c%c%c%c \n",pProfile->SSID.Ssid[0],pProfile->SSID.Ssid[1],pProfile->SSID.Ssid[2],pProfile->SSID.Ssid[3],pProfile->SSID.Ssid[4],pProfile->SSID.Ssid[5],pProfile->SSID.Ssid[6])); DBGPRINT(RT_DEBUG_ERROR, ("Perst::AuthType = 0x%x. EncrType = %d\n",pProfile->AuthType,pProfile->EncrType)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::KeyIndex = %d\n",pProfile->KeyIndex)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::KeyLength = %d\n",pProfile->KeyLength)); DBGPRINT(RT_DEBUG_ERROR, ("Perst::Key ==>\n")); for (j=0;j<16;) { DBGPRINT(RT_DEBUG_ERROR, (" 0x%x 0x%x 0x%x 0x%x\n",pProfile->Key[j], pProfile->Key[j+1], pProfile->Key[j+2],pProfile->Key[j+3])); j = j+4; } DBGPRINT(RT_DEBUG_ERROR, ("Perst::<===Key =\n")); DBGPRINT(RT_DEBUG_ERROR, ("Perst::MacAddr = %x %x %x %x %x %x\n",pProfile->MacAddr[0], pProfile->MacAddr[1], pProfile->MacAddr[2],pProfile->MacAddr[3],pProfile->MacAddr[4],pProfile->MacAddr[5])); DBGPRINT(RT_DEBUG_ERROR, (" P2P -P2pPerstTabInsert update to index = %x.\n", i)); return i; } DBGPRINT(RT_DEBUG_ERROR, ("P2P -P2pPerstTabInsert . PerstNumber = %d.\n", Tab->PerstNumber)); return index; }