📄 cmm_data.c
字号:
#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); RTMP_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 { DBGPRINT(RT_DEBUG_OFF, ("\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*/); RTMP_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 RTMP_MAC_USB NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6); RTMP_STA_ENTRY_MAC_RESET(pAd, i);#endif // RTMP_MAC_USB // //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((PNDIS_BUFFER)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((PNDIS_BUFFER)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(get_unaligned((PUINT16)(pSrcBuf))); dstPort = OS_NTOHS(get_unaligned((PUINT16)(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(pAd, (CHAR)rssi0, RSSI_0); pRssi->AvgRssi0X8 = (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0; pRssi->AvgRssi0 = pRssi->AvgRssi0X8 >> 3; } if (rssi1 != 0) { pRssi->LastRssi1 = ConvertToRssi(pAd, (CHAR)rssi1, RSSI_1); pRssi->AvgRssi1X8 = (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1; pRssi->AvgRssi1 = pRssi->AvgRssi1X8 >> 3; } if (rssi2 != 0) { pRssi->LastRssi2 = ConvertToRssi(pAd, (CHAR)rssi2, RSSI_2); pRssi->AvgRssi2X8 = (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2; pRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3; }}// Normal legacy Rx packet indicationVOID Indicate_Legacy_Packet( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk, IN UCHAR FromWhichBSSID){ PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; UCHAR Header802_3[LENGTH_802_3]; // 1. get 802.3 Header // 2. remove LLC // a. pointer pRxBlk->pData to payload // b. modify pRxBlk->DataSize#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);#endif // CONFIG_STA_SUPPORT // if (pRxBlk->DataSize > MAX_RX_PKT_LEN) { // release packet RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); return; } STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);#ifdef RTMP_MAC_USB#ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.bDisableReordering == 0) { PBA_REC_ENTRY pBAEntry; ULONG Now32; UCHAR Wcid = pRxBlk->pRxWI->WirelessCliID; UCHAR TID = pRxBlk->pRxWI->TID; USHORT Idx; #define REORDERING_PACKET_TIMEOUT ((100 * OS_HZ)/1000) // system ticks -- 100 ms if (Wcid < MAX_LEN_OF_MAC_TABLE) { Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID]; if (Idx != 0) { pBAEntry = &pAd->BATable.BARecEntry[Idx]; // update last rx time NdisGetSystemUpTime(&Now32); if ((pBAEntry->list.qlen > 0) && RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT))) ) { DBGPRINT(RT_DEBUG_OFF, ("Indicate_Legacy_Packet():flush reordering_timeout_mpdus! RxWI->Flags=%d, pRxWI.TID=%d, RxD->AMPDU=%d!\n", pRxBlk->Flags, pRxBlk->pRxWI->TID, pRxBlk->RxD.AMPDU)); hex_dump("Dump the legacy Packet:", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), 64); ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32); } } } }#endif // DOT11_N_SUPPORT //#endif // RTMP_MAC_USB // wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID); // // pass this 802.3 packet to upper layer or forward this packet to WM directly //#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);#endif // CONFIG_STA_SUPPORT //}// Normal, AMPDU or AMSDUVOID CmmRxnonRalinkFrameIndicate( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk, IN UCHAR FromWhichBSSID){#ifdef DOT11_N_SUPPORT if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) { Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID); } else#endif // DOT11_N_SUPPORT // {#ifdef DOT11_N_SUPPORT if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)) { // handle A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -