VOID HelperPortReceiveBeacon( __in PMP_HELPER_PORT HelperPort, __in PMP_RX_MPDU pFragment, __in ULONG TotalLength ) { NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; PUCHAR pPacketBuffer; PDOT11_BEACON_FRAME pDot11BeaconFrame; ULONG uOffsetOfInfoElemBlob = FIELD_OFFSET(DOT11_BEACON_FRAME, InfoElements) + sizeof(DOT11_MGMT_HEADER); ULONG uInfoElemBlobSize = 0; pPacketBuffer = MP_RX_MPDU_DATA(pFragment); do { // // Drop if its doesnt contain atleast the // fixed size portion (DOT11_BEACON_FRAME) // if (uOffsetOfInfoElemBlob > TotalLength) { break; } // Get/Validate beacon is okay pDot11BeaconFrame = (PDOT11_BEACON_FRAME)(pPacketBuffer + sizeof(DOT11_MGMT_HEADER)); ndisStatus = HelperPortValidateBeacon(pDot11BeaconFrame); if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } // Validate information elements blob ndisStatus = Dot11GetInfoBlobSize( pPacketBuffer, TotalLength, uOffsetOfInfoElemBlob, &uInfoElemBlobSize ); if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } // Save information from this beacon into our BSS list ndisStatus = HelperPortSaveBSSInformation( HelperPort, pFragment, pDot11BeaconFrame, (uInfoElemBlobSize + FIELD_OFFSET(DOT11_BEACON_FRAME, InfoElements)) // Info elements + header ); if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } } while (FALSE);
VOID StaReceiveBeacon( _In_ PMP_EXTSTA_PORT pStation, _In_ PMP_RX_MPDU pFragment, _In_ ULONG TotalLength ) { NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; PUCHAR pPacketBuffer; PDOT11_BEACON_FRAME pDot11BeaconFrame; ULONG uOffsetOfInfoElemBlob = FIELD_OFFSET(DOT11_BEACON_FRAME, InfoElements) + sizeof(DOT11_MGMT_HEADER); ULONG uInfoElemBlobSize = 0; pPacketBuffer = MP_RX_MPDU_DATA(pFragment); do { // // Drop if its doesnt contain atleast the // fixed size portion (DOT11_BEACON_FRAME) // if (uOffsetOfInfoElemBlob > TotalLength) { break; } pDot11BeaconFrame = (PDOT11_BEACON_FRAME)(pPacketBuffer + sizeof(DOT11_MGMT_HEADER)); // Validate information elements blob ndisStatus = Dot11GetInfoBlobSize( pPacketBuffer, TotalLength, uOffsetOfInfoElemBlob, &uInfoElemBlobSize ); if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } if (pDot11BeaconFrame->Capability.IBSS) { ndisStatus = StaSaveAdHocStaInfo( pStation, pFragment, pDot11BeaconFrame, uInfoElemBlobSize ); } ndisStatus = StaProcessBeaconForConfigInfo( pStation, pFragment, (PUCHAR)&pDot11BeaconFrame->InfoElements, TotalLength ); if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } } while (FALSE); }