📄 rtmp_data.c
字号:
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 + -