我有一个NDIS 6filter驱动程序在Windows Vista和更高版本的系统上工作。
我把它绑定在NativeWiFi Filter
下面,所以我可以看到802.11 packets
而不是fake Ethernet packets
。
我已经在数据包filter中设置了NDIS_PACKET_TYPE_802_11_RAW_DATA
和NDIS_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
笔记本电脑的实验显示Beacon
和Reassociation 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); }
任何方法? 谢谢!
我的带有无线适配器Qualcomm Atheros AR9485WB-EG无线网络适配器的笔记本电脑的实验显示Beacon和Reassociation Response数据包含有FCS,而其他所有802.11数据包都没有。
不,不。 当我查看相同的捕获,并强制“终止FCS”标志,我发现除了这些帧以外的很多帧都有Wireshark报告为有效的FCS。 不要认为,只是因为一个帧没有显示“格式错误的帧”错误,它没有一个FCS; “格式错误的帧”错误是由于Wireshark认为FCS是帧数据,并试图剖析大于FCS的4个字节的项目。 对于数据帧,802.11解剖器不解析有效载荷,如果有效载荷具有自己的长度字段,如IPv4和IPv6帧所做的那样,则将使用该长度,并且FCS将被视为额外的数据有效载荷,并且不会导致“格式错误的帧”错误。
你应该尝试的是检查uReceiveFlags
是否uReceiveFlags
了DOT11_RECV_FLAG_RAW_PACKET
,如果是,假设该帧有一个FCS,否则假设它没有。
并且记住,在监视模式下,不能完全接收的帧可能仍然被提供给主机,所以监视模式中的一些“格式错误的帧”错误可能是由于例如该帧被无线电,所以不要认为“格式错误的帧”错误意味着该帧不应该有“FCS在结束”标志设置。