📄 cmm_data.c
字号:
if (pClonePacket) { ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket)); } // A-MSDU has padding to multiple of 4 including subframe header. // align SubFrameSize up to multiple of 4 SubFrameSize = (SubFrameSize+3)&(~0x3); if (SubFrameSize > 1528 || SubFrameSize < 32) { break; } if (DataSize > SubFrameSize) { pData += SubFrameSize; DataSize -= SubFrameSize; } else { // end of A-MSDU DataSize = 0; } } // finally release original rx packet RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); return nMSDU;}UINT BA_Reorder_AMSDU_Annnounce( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ PUCHAR pData; USHORT DataSize; UINT nMSDU = 0; pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize); return nMSDU;}/* ========================================================================== Description: Look up the MAC address in the MAC table. Return NULL if not found. Return: pEntry - pointer to the MAC entry; NULL is not found ==========================================================================*/MAC_TABLE_ENTRY *MacTableLookup( IN PRTMP_ADAPTER pAd, PUCHAR pAddr) { ULONG HashIdx; MAC_TABLE_ENTRY *pEntry = NULL; HashIdx = MAC_ADDR_HASH_INDEX(pAddr); pEntry = pAd->MacTab.Hash[HashIdx]; while (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsWDS || pEntry->ValidAsApCli)) { if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { break; } else pEntry = pEntry->pNext; } return pEntry;}/* ========================================================================== Description: This routine reset the entire MAC table. All packets pending in the power-saving queues are freed here. ========================================================================== */VOID STAMacTableReset( IN PRTMP_ADAPTER pAd){ int i;// BOOLEAN Cancelled;// PCHAR pOutBuffer = NULL;// NDIS_STATUS NStatus;// ULONG FrameLen = 0;// HEADER_802_11 DisassocHdr; USHORT Reason; DBGPRINT(RT_DEBUG_TRACE, ("STAMacTableReset\n")); NdisAcquireSpinLock(&pAd->MacTabLock); for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) { Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE); RTMP_IO_WRITE32(pAd, Reason, 0xffffffff); RTMP_IO_WRITE32(pAd, Reason+4, 0xffff); if (pAd->MacTab.Content[i].ValidAsCLI == TRUE) { //RTMPCancelTimer(&pAd->MacTab.Content[i].RetryTimer, &Cancelled); // free resources of BA BASessionTearDownALL(pAd, i); pAd->MacTab.Content[i].ValidAsCLI = FALSE; Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE); RTMP_IO_WRITE32(pAd, Reason, 0xffffffff); RTMP_IO_WRITE32(pAd, Reason+4, 0xffff); } } NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE)); NdisReleaseSpinLock(&pAd->MacTabLock);}MAC_TABLE_ENTRY *MacTableInsertEntry( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN UCHAR apidx, IN BOOLEAN CleanAll) { UCHAR HashIdx; int i;//, j; MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;// USHORT offset;// ULONG addr; // if FULL, return if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) return NULL; // allocate one MAC entry NdisAcquireSpinLock(&pAd->MacTabLock); for (i = 1; i< MAX_LEN_OF_MAC_TABLE; i++) // skip entry#0 so that "entry index == AID" for fast lookup { // pick up the first available vacancy if ((pAd->MacTab.Content[i].ValidAsCLI == FALSE) && (pAd->MacTab.Content[i].ValidAsWDS == FALSE) && (pAd->MacTab.Content[i].ValidAsApCli== FALSE)) { pEntry = &pAd->MacTab.Content[i]; if (CleanAll == TRUE) { pEntry->MaxSupportedRate = RATE_11; pEntry->CurrTxRate = RATE_11; NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; }#ifdef CONFIG_STA_SUPPORT pEntry->ValidAsCLI = TRUE; pEntry->ValidAsWDS = FALSE; pEntry->ValidAsApCli = FALSE;#endif // CONFIG_STA_SUPPORT // pEntry->bIAmBadAtheros = FALSE; pEntry->pAd = pAd; pEntry->CMTimerRunning = FALSE; pEntry->EnqueueStartForPSKTimerRunning= FALSE; pEntry->RSNIE_Len = 0; NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter)); pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR; if (pEntry->ValidAsApCli) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI); else if (pEntry->ValidAsWDS) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS); else pEntry->apidx = apidx;#ifdef CONFIG_STA_SUPPORT pEntry->AuthMode = pAd->StaCfg.AuthMode; pEntry->WepStatus = pAd->StaCfg.WepStatus; pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; AsicRemovePairwiseKeyEntry(pAd, pEntry->apidx, (UCHAR)i);#endif // CONFIG_STA_SUPPORT // pEntry->GTKState = REKEY_NEGOTIATING; pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; 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; InitializeQueueHeader(&pEntry->PsQueue); pAd->MacTab.Size ++; // Add this entry into ASIC RX WCID search table AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr); // If legacy WEP is used, set pair-wise cipherAlg into WCID attribute table for this entry if (pEntry->ValidAsCLI && pEntry->WepStatus == Ndis802_11WEPEnabled) {#ifdef CONFIG_STA_SUPPORT UCHAR KeyIdx = pAd->StaCfg.DefaultKeyId;#endif // CONFIG_STA_SUPPORT // UCHAR CipherAlg = pAd->SharedKey[pEntry->apidx][KeyIdx].CipherAlg; RTMPAddWcidAttributeEntry( pAd, pEntry->apidx, KeyIdx, CipherAlg, 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: 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;}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; } }PNDIS_PACKET GetPacketFromRxRing( IN PRTMP_ADAPTER pAd, OUT PRXD_STRUC pSaveRxD, OUT BOOLEAN *pbReschedule, IN OUT UINT32 *pRxPending){ PRXD_STRUC pRxD;#ifdef BIG_ENDIAN PRXD_STRUC pDestRxD; RXD_STRUC RxD;#endif PNDIS_PACKET pRxPacket = NULL; PNDIS_PACKET pNewPacket; PVOID AllocVa; NDIS_PHYSICAL_ADDRESS AllocPa; BOOLEAN bReschedule = FALSE; RTMP_SEM_LOCK(&pAd->RxRingLock); if (*pRxPending == 0) { // Get how may packets had been received RTMP_IO_READ32(pAd, RX_DRX_IDX , &pAd->RxRing.RxDmaIdx); if (pAd->RxRing.RxSwReadIdx == pAd->RxRing.RxDmaIdx) { // no more rx packets bReschedule = FALSE; goto done; } // get rx pending count if (pAd->RxRing.RxDmaIdx > pAd->RxRing.RxSwReadIdx) *pRxPending = pAd->RxRing.RxDmaIdx - pAd->RxRing.RxSwReadIdx; else *pRxPending = pAd->RxRing.RxDmaIdx + RX_RING_SIZE - pAd->RxRing.RxSwReadIdx; }#ifndef BIG_ENDIAN // Point to Rx indexed rx ring descriptor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -