NDIS NET_BUFFER LIST of Ethernet 字段中的8021q tagged frame 如何制作?

How 8021q tagged frame making in NDIS NET_BUFFER LIST of Ethernet field?

我正在测试我的虚拟驱动程序以获得 HLK 认证。在 HLK 中,他们有 2c_priority 测试将检查 802.1 p 标记数据包的发送。

最初我不支持 802.1p。为了支持 802.1p ,我在 OID_GEN_MAC_OPTIONSOID 查询中添加了 NDIS_MAC_OPTION_8021P_PRIORITYNDIS_MAC_OPTION_8021Q_VLAN 选项。

在 HLK 测试期间,我跟踪了所有 NetBufferList 以找到具有

的 802.1p 标记帧
NDIS_NET_BUFFER_LIST_8021Q_INFO  NdisPacket8021qInfo;
NdisPacket8021qInfo.Value = NET_BUFFER_LIST_INFO(NetBufferList, Ieee8021QNetBufferListInfo);

使用这个,我可以看到

NdisPacket8021qInfo.TagHeader.VlanId = 0 ;
NdisPacket8021qInfo.TagHeader.UserPriority = 5 

等..

我可以看到 NdisPacket8021qInfo.TagHeader.UserPriority 值在变化,例如 5、1、6、4 等。

现在我检查我的接收端以检查 Netbufferlist 是否具有相同的优先级。但是我没有看到任何值。

我的疑惑是:

微型端口 driver 必须在 Tx 期间在实际数据包负载中插入 802.1p 标记。由于您正在构建虚拟 driver,您有 2 个选择:

  • 您的 driver 可以编辑以太网帧本身,以手动插入 802.1p 字段。实际上,您将在 14 字节以太网 header 之后插入 4 个字节(尽管要注意 SNAP-framing)。
  • 不要编辑以太网帧。相反,将 802.1p 信息传递给您提供给虚拟连接另一端的任何元数据。您可能已经传递了包含数据包长度的元数据——如果可以添加额外的元数据,您可以为 802.1p 数据添加另一个字段。

完成上述其中一项后,您需要在 Rx 端执行相反的操作。要么从数据包负载中去除 802.1p header,要么从元数据中读取 802.1p 信息。然后将 802.1p 信息放入 Rx NBL。