8021q如何在以太网字段的NDIS NET_BUFFER列表中标记帧?

时间:2017-03-17 11:05:22

标签: filter ethernet ndis 802.11 vlan

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

最初我不支持802.1p。为了支持802.1p,我在NDIS_MAC_OPTION_8021P_PRIORITY OID查询中添加了NDIS_MAC_OPTION_8021Q_VLANOID_GEN_MAC_OPTIONS个选项。

在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是否具有相同的优先级。但我没有看到任何价值观。

我的怀疑是:

  • 我没有在以太网领域内插入这个802.1p标签 sendNetBufferList函数。 HLK本身会在里面添加这个标签 以太网领域?或者我应该手动添加到NetBufferList的以太网字段?

  • 这就是为什么我在接收过程中看不到802.1p数据包的原因?但 为什么我在接收过程中看不到NetBufferList的任何NDIS_NET_BUFFER_LIST_8021Q_INFO值?

1 个答案:

答案 0 :(得分:1)

微型端口驱动程序必须在Tx期间在实际数据包有效负载内插入802.1p标记。由于您正在构建虚拟驱动程序,因此您有两个选项:

  • 您的驱动程序可以编辑以太网帧本身,手动插入802.1p字段。实际上,您将在14字节以太网标头之后插入4个字节(虽然要注意SNAP框架)。
  • 不要编辑以太网帧。而是将802.1p信息传递给您提供给虚拟连接另一端的任何元数据。您可能已经传递了包含数据包长度的元数据 - 如果可以添加其他元数据,则可以为802.1p数据添加另一个字段。

完成上述任何一项后,您需要在Rx端执行相反的操作。从数据包有效负载中剥离802.1p标头,或从元数据中读取802.1p信息。然后将802.1p信息放入Rx NBL。