0

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

最初我不支持 802.1p 。为了支持 802.1p ,我在OID 查询中添加了NDIS_MAC_OPTION_8021P_PRIORITYNDIS_MAC_OPTION_8021Q_VLAN选项。OID_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 

ETC..

我可以看到NdisPacket8021qInfo.TagHeader.UserPriority像 5 , 1, 6 , 4 等值的变化。

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

我的疑问是:

  • 在 sendNetBufferList 函数期间,我没有在以太网字段中插入这个 802.1p 标签。HLK 本身会在以太网字段中添加这个标签吗?还是我应该手动添加到 NetBufferList 的以太网字段?

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

4

1 回答 1

1

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

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

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

于 2017-03-19T08:29:10.443 回答