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

标签 c windows wifi driver ndis

我有一个在 Windows Vista 和更高版本系统上运行的 NDIS 6 过滤器驱动程序。

我已将它绑定(bind)在 NativeWiFi 过滤器 下方,因此我可以看到 802.11 数据包 而不是 假以太网数据包

我已经在数据包过滤器中设置了 NDIS_PACKET_TYPE_802_11_RAW_DATANDIS_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 无线网络适配器 进行的实验表明,BeaconReassociation 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/

相关文章:

c - 当 fprintf 遇到 a 时,它会使我的程序崩溃\n

mysql - 如何手动将.h文件导入系统库?

c - 对于相同的值,double 中的字节散列是否始终相同?

c - 使用 sigaction(), c

windows - Windows 应用程序的默认图标?

protocols - kindle 用什么协议(protocol)给家里打电话?

c++ - 头文件中定义的函数实现是否编译成静态库?

C++ Windows : Access same variable from main process and CallWndProc process

java - 尝试在空对象引用上调用虚拟方法 'android.os.Looper android.content.Context.getMainLooper()'

linux - 航空问题