⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtmp_data.c

📁 Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
💻 C
📖 第 1 页 / 共 5 页
字号:
		                		break;

		                	if ((pEntry) && (pEntry->WpaState < AS_INITPMK) && 
		                		((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2) || pAd->PortCfg.MBSSID[apidx].IEEE8021X == TRUE))
		                	{
		                		UCHAR           LLC_Len[2];
		                		
		                		NdisMoveMemory(LLC_Len, EAPOL, 2);
		                		MAKE_802_3_HEADER(Header802_3, pDA, pSA, ((PUCHAR) LLC_Len));
#ifdef RTL865X_SOC
		                		REPORT_ETHERNET_FRAME_TO_LLC_RTL865X(pAd, Header802_3, pData, DataSize, net_dev);						
#else
		                		REPORT_ETHERNET_FRAME_TO_LLC(pAd, Header802_3, pData, DataSize, net_dev);
#endif
		                		DBGPRINT(RT_DEBUG_INFO, "Apidx=%d,pDA %x %x %x %x %x %x,pSA %x %x %x %x %x %x,pData %x %x %x %x %x \n",apidx,*pDA,*(pDA+1),*(pDA+2),*(pDA+3),*(pDA+4),*(pDA+5),
		                			*pSA,*(pSA+1),*(pSA+2),*(pSA+3),*(pSA+4),*(pSA+5),*pData,*(pData+1),*(pData+2),*(pData+3),*(pData+4));
		                	}
		                	else
		                	{
		                		REPORT_MGMT_FRAME_TO_MLME(pAd, pHeader, pRxD->DataByteCnt, pRxD->PlcpRssi, Offset);
		                	}

		                }
                    	else	//the first pkt of fragment, record it.
                    	{
                    		UCHAR           LLC_Len[2];
                    		
                    		DBGPRINT(RT_DEBUG_OFF, "Apidx=%d,Frag.0 (len:%d):pData %x %x %x %x %x \n",apidx,DataSize,*pData,*(pData+1),*(pData+2),*(pData+3),*(pData+4));
                    		NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                            NdisZeroMemory(Header802_3, LENGTH_802_3);
                    		
                    		// create 802.3 MAC header
                            NdisMoveMemory(LLC_Len, EAPOL, 2);
                            MAKE_802_3_HEADER(Header802_3, pDA, pSA, ((PUCHAR) LLC_Len));

                            NdisMoveMemory(&pAd->FragFrame.Buffer[LENGTH_802_3], pData, DataSize);
                            NdisMoveMemory(pAd->FragFrame.Header802_3, Header802_3, LENGTH_802_3);
                            NdisZeroMemory(Header802_3, LENGTH_802_3);
                            pAd->FragFrame.RxSize   = DataSize;
                            pAd->FragFrame.Sequence = pHeader->Sequence;
                            pAd->FragFrame.LastFrag = pHeader->Frag;       // Should be 0
						}
					}
					else	//Middle & End of fragment
                    {
                    	// Fragment is not the same sequence or out of fragment number order 
                    	if ((pHeader->Sequence != pAd->FragFrame.Sequence) ||
                        	(pHeader->Frag != (pAd->FragFrame.LastFrag + 1)))
                    	{
                        	// Fragment is not the same sequence or out of fragment number order
                        	// Clear Fragment frame contents
                        	NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                        	DBGPRINT(RT_DEBUG_ERROR, "Fragment is not the same sequence or out of fragment number order.\n");
                        	break; // give up this frame
                    	}   
                    	else if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE)
                    	{
                        	// Fragment frame is too large, it exeeds the maximum frame size.
                        	// Clear Fragment frame contents
                        	NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                        	DBGPRINT(RT_DEBUG_ERROR, "Fragment frame is too large, it exeeds the maximum frame size.\n");
                        	break; // give up this frame
                    	}
                    	// concatenate this fragment into the re-assembly buffer
                    	DBGPRINT(RT_DEBUG_OFF, "Apidx=%d,Frag.%d (len:%d):pData %x %x %x %x %x \n",apidx,pHeader->Frag,DataSize,*pData,*(pData+1),*(pData+2),*(pData+3),*(pData+4));
                        NdisMoveMemory(&pAd->FragFrame.Buffer[LENGTH_802_3 + pAd->FragFrame.RxSize], pData, DataSize);
                    	pAd->FragFrame.RxSize  += DataSize;
                    	pAd->FragFrame.LastFrag = pHeader->Frag;       // Update fragment number
                                
						// Last fragment
                    	if (pHeader->FC.MoreFrag == FALSE)                    	
                        {
                        	BOOLEAN CheckPktSanity = TRUE;
                        	
                        	if(pAd->FragFrame.RxSize < (LENGTH_802_1_H + LENGTH_EAPOL_H))
                        	{
                        		CheckPktSanity = FALSE;
                        		DBGPRINT(RT_DEBUG_ERROR, "Total pkts size is too small.\n");
							}	
                        	else if (!RTMPEqualMemory(SNAP_802_1H, (PUCHAR)&pAd->FragFrame.Buffer[LENGTH_802_3], 6))
                        	{
                        		CheckPktSanity = FALSE;	
                        		DBGPRINT(RT_DEBUG_ERROR, "Can't find SNAP_802_1H parameter.\n");
                        	}	 
                        	else if (!RTMPEqualMemory(EAPOL, (PUCHAR)&pAd->FragFrame.Buffer[LENGTH_802_3 + 6], 2))
                        	{
                        		CheckPktSanity = FALSE;	
                        		DBGPRINT(RT_DEBUG_ERROR, "Can't find EAPOL parameter.\n");	
                        	}	
                        	else if(pAd->FragFrame.Buffer[LENGTH_802_3 + 9] > EAPOLASFAlert)
                        	{
                        		CheckPktSanity = FALSE;	
                        		DBGPRINT(RT_DEBUG_ERROR, "Unknown EAP type(%d).\n",pAd->FragFrame.Buffer[LENGTH_802_3+9]);	
                        	}
                        	
                        	if(CheckPktSanity == FALSE)
                        	{
                        		NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                        		break;
                        	}	
                        	
                        	if ((pEntry) && (pEntry->WpaState < AS_INITPMK) && 
                				((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2) || pAd->PortCfg.MBSSID[apidx].IEEE8021X == TRUE))
                			{
                				UCHAR           LLC_Len[2];
                		
                				NdisMoveMemory(LLC_Len, EAPOL, 2);
                				MAKE_802_3_HEADER(Header802_3, pDA, pSA, ((PUCHAR) LLC_Len));
#ifdef RTL865X_SOC
		                		REPORT_ETHERNET_FRAME_TO_LLC_RTL865X(pAd, Header802_3, &pAd->FragFrame.Buffer[LENGTH_802_3], pAd->FragFrame.RxSize, net_dev);						
#else
                				REPORT_ETHERNET_FRAME_TO_LLC(pAd, Header802_3, &pAd->FragFrame.Buffer[LENGTH_802_3], pAd->FragFrame.RxSize, net_dev);
#endif
                				DBGPRINT(RT_DEBUG_OFF, "Apidx=%d,sned whole pkt: pDA %x %x %x %x %x %x,pSA %x %x %x %x %x %x\n",apidx,*pDA,*(pDA+1),*(pDA+2),*(pDA+3),*(pDA+4),*(pDA+5),
                										*pSA,*(pSA+1),*(pSA+2),*(pSA+3),*(pSA+4),*(pSA+5));
                			}
                        
                        	// Clear Fragment frame contents
                            NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                            DBGPRINT(RT_DEBUG_INFO, "!!! Frame with Fragment Indicated !!!\n");	
                        }	                                    
                    }
                	break; // end of processing this frame
                }

                if (RTMPCheckWPAframe(pAd, (PUCHAR)pHeader, pRxD->DataByteCnt, Offset))
                {
#ifdef APCLI_SUPPORT						
					// Special DATA frame that has to pass to MLME
					// EAPOL handshaking frames when driver supplicant enabled, pass to MLME for special process
					if (bApCliPacket)
					{
						if (pAd->ApCliTab.ApCliEntry[ApCliIdx].WpaState != SS_NOTUSE)
                			REPORT_MGMT_FRAME_TO_MLME(pAd, pHeader, pRxD->DataByteCnt, pRxD->PlcpRssi, Offset);
					}
					else
                	REPORT_MGMT_FRAME_TO_MLME(pAd, pHeader, pRxD->DataByteCnt, pRxD->PlcpRssi, Offset);
#else
                	REPORT_MGMT_FRAME_TO_MLME(pAd, pHeader, pRxD->DataByteCnt, pRxD->PlcpRssi, Offset);
#endif	
                	break;
                }
                
                // Security check, our ASIC will accept un-encrypt packets, although the security is enabled.
                // Driver needs to drop it.
                if (pRxD->CipherAlg == CIPHER_NONE)
                {
                	if ((pHeader->FC.FrDs == 1) && (pHeader->FC.ToDs == 1))
                	{
                		// WDS packets
                		if (pAd->WdsTab.WepStatus != Ndis802_11WEPDisabled)
                		{
                			DBGPRINT(RT_DEBUG_ERROR, "WDS has security enabled, but receive un-encrypt packet\n");
                			break;
                		}
                	}
                	else if (pEntry)
                	{
                		// BSS packets
                		if (pAd->PortCfg.MBSSID[pEntry->ApIdx].WepStatus != Ndis802_11WEPDisabled)
                		{
                			DBGPRINT(RT_DEBUG_ERROR, "AP has security enabled, but receive un-encrypt packet\n");
                			break;
                		}
                	}
                }

                // First or Only fragment
                if (pHeader->Frag == 0)     
                {
                    PUCHAR pRemovedLLCSNAP;
                           
                    CONVERT_TO_802_3(Header802_3, pDA, pSA, pData, DataSize, pRemovedLLCSNAP);
                                                                      
                    // One & The only fragment
                    if (pHeader->FC.MoreFrag == FALSE)
                    {
                        if ((pHeader->FC.Order == 1) && (Msdu2Size > 0)) // this is an aggregation
                        {
                            USHORT Payload1Size, Payload2Size;
                            PUCHAR pData2;
                           
                            pAd->RalinkCounters.OneSecRxAggregationCount ++;
                            Payload1Size = DataSize - Msdu2Size;
                            Payload2Size = Msdu2Size - LENGTH_802_3;
                                       
                            // check if DA is another associted WSTA reachable via wireless bridging,
                            // if it is, then no need to indicate to LLC
                            if (RTMPBridgeToWdsAndWirelessSta(pAd, Header802_3, LENGTH_802_3, pData, Payload1Size, apidx))
                            {
                                pData2 = pData + Payload1Size + LENGTH_802_3;
                                RTMPBridgeToWdsAndWirelessSta(pAd, Header802_3, LENGTH_802_3, pData2, Payload2Size, apidx);
                            }
                            else
                            {
#ifndef NONCOPY_RX
                                REPORT_ETHERNET_FRAME_TO_LLC(pAd, Header802_3, pData, Payload1Size, net_dev);
                                DBGPRINT(RT_DEBUG_INFO, "!!! report segregated MSDU1 to LLC (len=%d, proto=%02x:%02x) %02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",
                                    LENGTH_802_3+Payload1Size, Header802_3[12], Header802_3[13],
                                    *pData, *(pData+1),*(pData+2),*(pData+3),*(pData+4),*(pData+5),*(pData+6),*(pData+7));
                                    
                                pData2 = pData + Payload1Size + LENGTH_802_3;
                                REPORT_ETHERNET_FRAME_TO_LLC(pAd, pData + Payload1Size, pData2, Payload2Size, net_dev);
                                DBGPRINT(RT_DEBUG_INFO, "!!! report segregated MSDU2 to LLC (len=%d, proto=%02x:%02x) %02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",
                                    LENGTH_802_3+Payload2Size, *(pData2 -2), *(pData2 - 1),
                                    *pData2, *(pData2+1),*(pData2+2),*(pData2+3),*(pData2+4),*(pData2+5),*(pData2+6),*(pData2+7));
#else
#ifndef	RTL865X_SOC
								if (bQoS != TRUE) {
	                                REPORT_ETHERNET_FRAME_TO_LLC(pAd, Header802_3, pData, Payload1Size, net_dev);
	                                DBGPRINT(RT_DEBUG_INFO, "!!! report segregated MSDU1 to LLC (len=%d, proto=%02x:%02x) %02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",
	                                    LENGTH_802_3+Payload1Size, Header802_3[12], Header802_3[13],
    	                                *pData, *(pData+1),*(pData+2),*(pData+3),*(pData+4),*(pData+5),*(pData+6),*(pData+7));
                                    
        	                        pData2 = pData + Payload1Size + LENGTH_802_3;
            	                    REPORT_ETHERNET_FRAME_TO_LLC(pAd, pData + Payload1Size, pData2, Payload2Size, net_dev);
                	                DBGPRINT(RT_DEBUG_INFO, "!!! report segregated MSDU2 to LLC (len=%d, proto=%02x:%02x) %02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",
                    	                LENGTH_802_3+Payload2Size, *(pData2 -2), *(pData2 - 1),
                        	            *pData2, *(pData2+1),*(pData2+2),*(pData2+3),*(pData2+4),*(pData2+5),*(pData2+6),*(pData2+7));									
								} else 
#endif																		
								{
									REPORT_AGGREGATE_ETHERNET_FRAME_TO_LLC_WITH_NON_COPY(pAd, Header802_3, pData, Payload1Size, Payload2Size, net_dev);
		                            pRxD->BufPhyAddr = pAd->RxRing.Cell[pAd->RxRing.CurRxIndex].DmaBuf.AllocPa;									
								}
#endif
                            }
                        }
                        else
                        {
                            // check if DA is another associted WSTA reachable via wireless bridging,
                            // if it is, then no need to indicate to LLC
                            if (RTMPBridgeToWdsAndWirelessSta(pAd, Header802_3, LENGTH_802_3, pData, DataSize, apidx))
                                break;
                                   
                            if (bQoS == TRUE) {
	                            REPORT_ETHERNET_FRAME_TO_LLC(pAd, Header802_3, pData, DataSize, net_dev);                            	
                            } else {
	                            REPORT_ETHERNET_FRAME_TO_LLC_WITH_NON_COPY(pAd, Header802_3, pData, DataSize, net_dev);
#ifdef NONCOPY_RX
	                            pRxD->BufPhyAddr = pAd->RxRing.Cell[pAd->RxRing.CurRxIndex].DmaBuf.AllocPa;
#endif
							}
                            DBGPRINT(RT_DEBUG_INFO, "!!! report DATA (no frag) to LLC (len=%d, proto=%02x:%02x) %02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",
                                DataSize, Header802_3[12], Header802_3[13],
                                *pData, *(pData+1),*(pData+2),*(pData+3),*(pData+4),*(pData+5),*(pData+6),*(pData+7));
                        }
                    }
                                
                    // First fragment - record the 802.3 header and frame body
                    else
                    {
                    	pAd->FragFrame.Flags &= 0xFFFFFFFE;

                    	// Firt Fragment & LLC/SNAP been removed. Keep the removed LLC/SNAP for later on
	                    // TKIP MIC verification.
	                    if (pHeader->FC.MoreFrag && pRemovedLLCSNAP)
	                    {
	                        NdisMoveMemory(pAd->FragFrame.Header_LLC, pRemovedLLCSNAP, LENGTH_802_1_H);
	                        pAd->FragFrame.Flags |= 0x01;
	                    }
	                    
                        NdisMoveMemory(&pAd->FragFrame.Buffer[LENGTH_802_3], pData, DataSize);
                        NdisMoveMemory(pAd->FragFrame.Header802_3, Header802_3, LENGTH_802_3);
                        pAd->FragFrame.RxSize   = DataSize;
                        pAd->FragFrame.Sequence = pHeader->Sequence;
                        pAd->FragFrame.LastFrag = pHeader->Frag;       // Should be 0
                    }
                }

                // Middle & End of fragment burst
                else
                {
                    // No LLC-SNAP header in except the first fragment frame
                    if ((pHeader->Sequence != pAd->FragFrame.Sequence) ||
                        (pHeader->Frag != (pAd->FragFrame.LastFrag + 1)))
                    {
                        // Fragment is not the same sequence or out of fragment number order
                        // Clear Fragment frame contents
                        NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                        break; // give up this frame
                    }   
                    else if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE)
                    {
                        // Fragment frame is too large, it exeeds the maximum frame size.
                        // Clear Fragment frame contents
                        NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
                        break; // give up this frame
                    }
                                                    
                    // concatenate this fragment into the re-assembly buffer
                    NdisMoveMemory(&pAd->FragFrame.Buffer[LENGTH_802_3 + pAd->FragFrame.RxSize], pData, DataSize);
                    pAd->FragFrame.RxSize  += DataSize;
                    pAd->FragFrame.LastFrag = pHeader->Frag;       // Update fragment number
                                                            
                    // Last fragment
                    if (pHeader->FC.MoreFrag == FALSE)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -