如何确定NDIS 6filter驱动程序中的802.11原始数据包是否具有FCS(4字节)?

我有一个NDIS 6filter驱动程序在Windows Vista和更高版本的系统上工作。

我把它绑定在NativeWiFi Filter下面,所以我可以看到802.11 packets而不是fake Ethernet packets

我已经在数据包filter中设置了NDIS_PACKET_TYPE_802_11_RAW_DATANDIS_PACKET_TYPE_802_11_RAW_MGMT : https : NDIS_PACKET_TYPE_802_11_RAW_DATA ( NDIS_PACKET_TYPE_802_11_RAW_MGMT ,所以我可以接收来自微型端口的Raw 802.11 Packets指示。

然后,我将无线适配器切换到Monitor Mode

现在我的filter驱动程序可以接收所有的802.11 control and management数据包。

我的问题是如何确定一个802.11原始数据包是否在我的驱动程序中有FCS(帧检查序列,4字节)

我这样问,因为我将Radiotap header ( http://radiotap.org/ )添加到数据包,radiotap有一个Flags字段,指定802.11数据包是否有FCS。

我的带有无线适配器Qualcomm Atheros AR9485WB-EG Wireless Network Adapter笔记本电脑的实验显示BeaconReassociation Response数据包含有FCS,而其他所有802.11数据包都没有。 而radiotap头文件中的错误Flags将导致Wireshark显示这些数据包的格式错误的数据包。 这就是为什么我需要确定我的驱动程序中FCS的可用性。

我的代码就像下面,我想知道如何写if条件。

  // [Radiotap] "Flags" field. if (TRUE) // The packet doesn't have FCS. We always have no FCS for all packets currently. { pRadiotapHeader->it_present |= BIT(IEEE80211_RADIOTAP_FLAGS); *((UCHAR*)Dot11RadiotapHeader + cur) = 0x0; // 0x0: none cur += sizeof(UCHAR) / sizeof(UCHAR); } else // The packet has FCS. { pRadiotapHeader->it_present |= BIT(IEEE80211_RADIOTAP_FLAGS); *((UCHAR*)Dot11RadiotapHeader + cur) = IEEE80211_RADIOTAP_F_FCS; // 0x10: frame includes FCS // FCS check fails. if ((pwInfo->uReceiveFlags & DOT11_RECV_FLAG_RAW_PACKET_FCS_FAILURE) == DOT11_RECV_FLAG_RAW_PACKET_FCS_FAILURE) { *((UCHAR*)Dot11RadiotapHeader + cur) |= IEEE80211_RADIOTAP_F_BADFCS; // 0x40: frame failed FCS check } cur += sizeof(UCHAR) / sizeof(UCHAR); } 

任何方法? 谢谢!

Solutions Collecting From Web of "如何确定NDIS 6filter驱动程序中的802.11原始数据包是否具有FCS(4字节)?"

我的带有无线适配器Qualcomm Atheros AR9485WB-EG无线网络适配器的笔记本电脑的实验显示Beacon和Reassociation Response数据包含有FCS,而其他所有802.11数据包都没有。

不,不。 当我查看相同的捕获,并强制“终止FCS”标志,我发现除了这些帧以外的很多帧都有Wireshark报告为有效的FCS。 不要认为,只是因为一个帧没有显示“格式错误的帧”错误,它没有一个FCS; “格式错误的帧”错误是由于Wireshark认为FCS是帧数据,并试图剖析大于FCS的4个字节的项目。 对于数据帧,802.11解剖器不解析有效载荷,如果有效载荷具有自己的长度字段,如IPv4和IPv6帧所做的那样,则将使用该长度,并且FCS将被视为额外的数据有效载荷,并且不会导致“格式错误的帧”错误。

你应该尝试的是检查uReceiveFlags是否uReceiveFlagsDOT11_RECV_FLAG_RAW_PACKET ,如果是,假设该帧有一个FCS,否则假设它没有。

并且记住,在监视模式下,不能完全接收的帧可能仍然被提供给主机,所以监视模式中的一些“格式错误的帧”错误可能是由于例如该帧被无线电,所以不要认为“格式错误的帧”错误意味着该帧不应该有“FCS在结束”标志设置。