- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个在 Windows Vista 和更高版本系统上运行的 NDIS 6 过滤器驱动程序。
我已将它绑定(bind)在 NativeWiFi 过滤器
下方,因此我可以看到 802.11 数据包
而不是 假以太网数据包
。
我已经在数据包过滤器中设置了 NDIS_PACKET_TYPE_802_11_RAW_DATA
和 NDIS_PACKET_TYPE_802_11_RAW_MGMT
:https://msdn.microsoft.com/en-us/library/windows/hardware/ff554833(v=vs.85).aspx ,所以我可以从微型端口接收 Raw 802.11 Packets
指示。
然后我将我的无线适配器切换到监控模式
。
现在我的过滤器驱动程序可以接收所有的802.11控制和管理
数据包。
我的问题是如何在我的驱动程序中判断一个802.11原始数据包是否有FCS(帧校验序列,4字节)?
我问这个是因为我正在向数据包添加 Radiotap header
( http://radiotap.org/ ),并且 radiotap 有一个名为 Flags
的字段,该字段指定 802.11 数据包是否是否有 FCS。
我在笔记本电脑上使用无线适配器 Qualcomm Atheros AR9485WB-EG 无线网络适配器
进行的实验表明,Beacon
和Reassociation Response
数据包具有 FCS而所有其他 802.11 数据包都没有。 radiotap header 中错误的 Flags
将导致 Wireshark 为这些数据包显示 Malformed Packet。这就是为什么我需要确定 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);
}
有什么方法吗?谢谢!
最佳答案
My experiment with my laptop with a wireless adapter Qualcomm Atheros AR9485WB-EG Wireless Network Adapter shows that Beacon and Reassociation Response packets have FCS and all other 802.11 packets don't have one.
不,它没有。当我查看同一个捕获并强制打开“结束时的 FCS”标志时,我发现 LOT 这些帧以外的帧具有 Wireshark 报告为有效的 FCS。不要不要假设,仅仅因为帧没有显示“Malformed frame”错误,它就没有 FCS; “Malformed frame”错误是由于 Wireshark 认为 FCS 是帧数据,并试图剖析大于 FCS 的 4 个字节的项目。对于数据帧,802.11 解析器不会解析有效载荷,如果有效载荷有自己的长度字段,就像 IPv4 和 IPv6 帧一样,将使用该长度,并且 FCS 将被视为额外数据负载,不会导致“格式错误的帧”错误。
您应该尝试检查 uReceiveFlags
是否设置了 DOT11_RECV_FLAG_RAW_PACKET
,如果是,则假定该帧具有 FCS,否则假定它没有。
请记住,在监控模式下,可能仍会向主机提供无法完全接收的帧,因此监控模式下的一些“Malformed frame”错误可能是由于例如帧被截短造成的通过 radio ,所以不要假设“格式错误的帧”错误意味着该帧不应该设置“结束时的 FCS”标志。
关于c - 如何在 NDIS 6 过滤器驱动程序中确定 802.11 原始数据包是否具有 FCS(4 字节)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36566978/
我是一名优秀的程序员,十分优秀!