cmm_data.c
来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 2,434 行 · 第 1/5 页
C
2,434 行
pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT else if (pEntry->ValidAsDls) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_DLS);#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // else pEntry->apidx = apidx; {#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { pEntry->AuthMode = pAd->StaCfg.AuthMode; pEntry->WepStatus = pAd->StaCfg.WepStatus; pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; }#endif // CONFIG_STA_SUPPORT // } pEntry->GTKState = REKEY_NEGOTIATING; pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT if (pEntry->ValidAsDls == TRUE) pEntry->PortSecured = WPA_802_1X_PORT_SECURED; else#endif //QOS_DLS_SUPPORT#endif // CONFIG_STA_SUPPORT // pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND; COPY_MAC_ADDR(pEntry->Addr, pAddr); pEntry->Sst = SST_NOT_AUTH; pEntry->AuthState = AS_NOT_AUTH; pEntry->Aid = (USHORT)i; //0; pEntry->CapabilityInfo = 0; pEntry->PsMode = PWR_ACTIVE; pEntry->PsQIdleCount = 0; pEntry->NoDataIdleCount = 0; pEntry->ContinueTxFailCnt = 0; InitializeQueueHeader(&pEntry->PsQueue); pAd->MacTab.Size ++; // Add this entry into ASIC RX WCID search table RT28XX_STA_ENTRY_ADD(pAd, pEntry); DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",i, pAd->MacTab.Size)); break; } } // add this MAC entry into HASH table if (pEntry) { HashIdx = MAC_ADDR_HASH_INDEX(pAddr); if (pAd->MacTab.Hash[HashIdx] == NULL) { pAd->MacTab.Hash[HashIdx] = pEntry; } else { pCurrEntry = pAd->MacTab.Hash[HashIdx]; while (pCurrEntry->pNext != NULL) pCurrEntry = pCurrEntry->pNext; pCurrEntry->pNext = pEntry; } } NdisReleaseSpinLock(&pAd->MacTabLock); return pEntry;}/* ========================================================================== Description: Delete a specified client from MAC table ========================================================================== */BOOLEAN MacTableDeleteEntry( IN PRTMP_ADAPTER pAd, IN USHORT wcid, IN PUCHAR pAddr) { USHORT HashIdx; MAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry; BOOLEAN Cancelled; //USHORT offset; // unused variable //UCHAR j; // unused variable if (wcid >= MAX_LEN_OF_MAC_TABLE) return FALSE; NdisAcquireSpinLock(&pAd->MacTabLock); HashIdx = MAC_ADDR_HASH_INDEX(pAddr); //pEntry = pAd->MacTab.Hash[HashIdx]; pEntry = &pAd->MacTab.Content[wcid]; if (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsApCli || pEntry->ValidAsWDS || pEntry->ValidAsMesh#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT || pEntry->ValidAsDls#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // )) { if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { // Delete this entry from ASIC on-chip WCID Table RT28XX_STA_ENTRY_MAC_RESET(pAd, wcid);#ifdef DOT11_N_SUPPORT // free resources of BA BASessionTearDownALL(pAd, pEntry->Aid);#endif // DOT11_N_SUPPORT // pPrevEntry = NULL; pProbeEntry = pAd->MacTab.Hash[HashIdx]; ASSERT(pProbeEntry); // update Hash list do { if (pProbeEntry == pEntry) { if (pPrevEntry == NULL) { pAd->MacTab.Hash[HashIdx] = pEntry->pNext; } else { pPrevEntry->pNext = pEntry->pNext; } break; } pPrevEntry = pProbeEntry; pProbeEntry = pProbeEntry->pNext; } while (pProbeEntry); // not found !!! ASSERT(pProbeEntry != NULL); RT28XX_STA_ENTRY_KEY_DEL(pAd, BSS0, wcid); if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE) { RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled); pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; } NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); pAd->MacTab.Size --; DBGPRINT(RT_DEBUG_TRACE, ("MacTableDeleteEntry1 - Total= %d\n", pAd->MacTab.Size)); } else { printk("\n%s: Impossible Wcid = %d !!!!!\n", __FUNCTION__, wcid); } } NdisReleaseSpinLock(&pAd->MacTabLock); //Reset operating mode when no Sta. if (pAd->MacTab.Size == 0) {#ifdef DOT11_N_SUPPORT pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;#endif // DOT11_N_SUPPORT // //AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/); RT28XX_UPDATE_PROTECT(pAd); // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet } return TRUE;}/* ========================================================================== Description: This routine reset the entire MAC table. All packets pending in the power-saving queues are freed here. ========================================================================== */VOID MacTableReset( IN PRTMP_ADAPTER pAd){ int i; DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n")); //NdisAcquireSpinLock(&pAd->MacTabLock); for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) { if (pAd->MacTab.Content[i].ValidAsCLI == TRUE) {#ifdef DOT11_N_SUPPORT // free resources of BA BASessionTearDownALL(pAd, i);#endif // DOT11_N_SUPPORT // pAd->MacTab.Content[i].ValidAsCLI = FALSE;#ifdef RT2870 NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6); RT28XX_STA_ENTRY_MAC_RESET(pAd, i);#endif // RT2870 // //AsicDelWcidTab(pAd, i); } } return;}/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ==========================================================================*/VOID AssocParmFill( IN PRTMP_ADAPTER pAd, IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, IN PUCHAR pAddr, IN USHORT CapabilityInfo, IN ULONG Timeout, IN USHORT ListenIntv) { COPY_MAC_ADDR(AssocReq->Addr, pAddr); // Add mask to support 802.11b mode only AssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; // not cf-pollable, not cf-poll-request AssocReq->Timeout = Timeout; AssocReq->ListenIntv = ListenIntv;}/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ==========================================================================*/VOID DisassocParmFill( IN PRTMP_ADAPTER pAd, IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, IN PUCHAR pAddr, IN USHORT Reason) { COPY_MAC_ADDR(DisassocReq->Addr, pAddr); DisassocReq->Reason = Reason;}/* ======================================================================== Routine Description: Check the out going frame, if this is an DHCP or ARP datagram will be duplicate another frame at low data rate transmit. Arguments: pAd Pointer to our adapter pPacket Pointer to outgoing Ndis frame Return Value: TRUE To be duplicate at Low data rate transmit. (1mb) FALSE Do nothing. IRQL = DISPATCH_LEVEL Note: MAC header + IP Header + UDP Header 14 Bytes 20 Bytes UDP Header 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15| Source Port 16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31| Destination Port port 0x43 means Bootstrap Protocol, server. Port 0x44 means Bootstrap Protocol, client. ========================================================================*/BOOLEAN RTMPCheckDHCPFrame( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ PACKET_INFO PacketInfo; ULONG NumberOfBytesRead = 0; ULONG CurrentOffset = 0; PVOID pVirtualAddress = NULL; UINT NdisBufferLength; PUCHAR pSrc; USHORT Protocol; UCHAR ByteOffset36 = 0; UCHAR ByteOffset38 = 0; BOOLEAN ReadFirstParm = TRUE; RTMP_QueryPacketInfo(pPacket, &PacketInfo, (PUCHAR *)&pVirtualAddress, &NdisBufferLength); NumberOfBytesRead += NdisBufferLength; pSrc = (PUCHAR) pVirtualAddress; Protocol = *(pSrc + 12) * 256 + *(pSrc + 13); // // Check DHCP & BOOTP protocol // while (NumberOfBytesRead <= PacketInfo.TotalPacketLength) { if ((NumberOfBytesRead >= 35) && (ReadFirstParm == TRUE)) { CurrentOffset = 35 - (NumberOfBytesRead - NdisBufferLength); ByteOffset36 = *(pSrc + CurrentOffset); ReadFirstParm = FALSE; } if (NumberOfBytesRead >= 37) { CurrentOffset = 37 - (NumberOfBytesRead - NdisBufferLength); ByteOffset38 = *(pSrc + CurrentOffset); //End of Read break; } return FALSE; } // Check for DHCP & BOOTP protocol if ((ByteOffset36 != 0x44) || (ByteOffset38 != 0x43)) { // // 2054 (hex 0806) for ARP datagrams // if this packet is not ARP datagrams, then do nothing // ARP datagrams will also be duplicate at 1mb broadcast frames // if (Protocol != 0x0806 ) return FALSE; } return TRUE;}BOOLEAN RTMPCheckEtherType( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ USHORT TypeLen; UCHAR Byte0, Byte1; PUCHAR pSrcBuf; UINT32 pktLen; UINT16 srcPort, dstPort; BOOLEAN status = TRUE; pSrcBuf = GET_OS_PKT_DATAPTR(pPacket); pktLen = GET_OS_PKT_LEN(pPacket); ASSERT(pSrcBuf); RTMP_SET_PACKET_SPECIFIC(pPacket, 0); // get Ethernet protocol field TypeLen = (pSrcBuf[12] << 8) + pSrcBuf[13]; pSrcBuf += LENGTH_802_3; // Skip the Ethernet Header. if (TypeLen <= 1500) { // 802.3, 802.3 LLC /* DestMAC(6) + SrcMAC(6) + Lenght(2) + DSAP(1) + SSAP(1) + Control(1) + if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header. => + SNAP (5, OriginationID(3) + etherType(2)) */ if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03) { Sniff2BytesFromNdisBuffer(pSrcBuf, 6, &Byte0, &Byte1); RTMP_SET_PACKET_LLCSNAP(pPacket, 1); TypeLen = (USHORT)((Byte0 << 8) + Byte1); pSrcBuf += 8; // Skip this LLC/SNAP header } else { //It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it. } } // If it's a VLAN packet, get the real Type/Length field. if (TypeLen == 0x8100) { /* 0x8100 means VLAN packets */ /* Dest. MAC Address (6-bytes) + Source MAC Address (6-bytes) + Length/Type = 802.1Q Tag Type (2-byte) + Tag Control Information (2-bytes) + Length / Type (2-bytes) + data payload (0-n bytes) + Pad (0-p bytes) + Frame Check Sequence (4-bytes) */ RTMP_SET_PACKET_VLAN(pPacket, 1); Sniff2BytesFromNdisBuffer(pSrcBuf, 2, &Byte0, &Byte1); TypeLen = (USHORT)((Byte0 << 8) + Byte1); pSrcBuf += 4; // Skip the VLAN Header. } switch (TypeLen) { case 0x0800: { ASSERT((pktLen > 34)); if (*(pSrcBuf + 9) == 0x11) { // udp packet ASSERT((pktLen > 34)); // 14 for ethernet header, 20 for IP header pSrcBuf += 20; // Skip the IP header srcPort = OS_NTOHS(*((UINT16 *)pSrcBuf)); dstPort = OS_NTOHS(*((UINT16 *)(pSrcBuf +2))); if ((srcPort==0x44 && dstPort==0x43) || (srcPort==0x43 && dstPort==0x44)) { //It's a BOOTP/DHCP packet RTMP_SET_PACKET_DHCP(pPacket, 1); } } } break; case 0x0806: { //ARP Packet. RTMP_SET_PACKET_DHCP(pPacket, 1); } break; case 0x888e: { // EAPOL Packet. RTMP_SET_PACKET_EAPOL(pPacket, 1); } break; default: status = FALSE; break; } return status; }VOID Update_Rssi_Sample( IN PRTMP_ADAPTER pAd, IN RSSI_SAMPLE *pRssi, IN PRXWI_STRUC pRxWI) { CHAR rssi0 = pRxWI->RSSI0; CHAR rssi1 = pRxWI->RSSI1; CHAR rssi2 = pRxWI->RSSI2; if (rssi0 != 0) { pRssi->LastRssi0 = ConvertToRssi
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?