如何在 NDIS 6 过滤器 driver 中确定 802.11 原始数据包是否具有 FCS(4 字节)?

How to determine whether a 802.11 raw packet has FCS (4bytes) in a NDIS 6 filter driver?

我有一个 NDIS 6 过滤器 driver 在 Windows Vista 和更高版本的系统上工作。

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

并且我已经在基于https://msdn.microsoft.com/en-us/library/windows/hardware/ff554833(v=vs.85).aspx的数据包过滤器中设置了NDIS_PACKET_TYPE_802_11_RAW_DATANDIS_PACKET_TYPE_802_11_RAW_MGMT,所以我可以从微型端口接收Raw 802.11 Packets指示。

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

现在我的过滤器 driver 可以接收所有 802.11 control and management 数据包。

我的问题是如何判断我的driver中的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 header 中的错误 Flags 将导致 Wireshark 为这些数据包显示 Malformed Packet。这就是为什么我需要在 driver.

中确定 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 at end" 标志时,我发现 LOT 帧以外的帧具有 Wireshark 报告为有效的 FCS。 NOT 假设仅仅因为帧没有显示 "Malformed frame" 错误,它就没有 FCS; "Malformed frame" 错误是由于 Wireshark 认为 FCS 是帧数据,并试图剖析大于 FCS 的 4 个字节的项目。对于数据帧,802.11 解析器不会解析有效载荷,如果有效载荷有自己的长度字段,就像 IPv4 和 IPv6 帧一样,将使用该长度,并且 FCS 将被视为额外数据负载,不会导致 "Malformed frame" 错误。

您应该尝试检查 uReceiveFlags 是否设置了 DOT11_RECV_FLAG_RAW_PACKET,如果设置了,则假设框架有 FCS,否则假设没有。

请记住,在监控模式下,无法完全接收的帧可能仍会提供给主机,因此监控模式下的一些 "Malformed frame" 错误可能是由于,例如,帧被收音机打断,所以不要假设 "Malformed frame" 错误意味着帧不应该设置 "FCS at end" 标志。