【问题标题】:Removing and adding VLAN tag create buffer wrap around (NDIS MUX Intermediate Driver)删除和添加 VLAN 标记创建缓冲区环绕(NDIS MUX 中间驱动程序)
【发布时间】:2015-07-08 04:18:03
【问题描述】:

我在 WEC2013 上使用“NDIS MUX 中间驱动程序和通知对象”驱动程序来模拟具有一个以太网适配器 (3 VELAN) 的 3 个不同网络。

我的主板正在运行连接到 Marvell 交换机的飞思卡尔 iMX6 处理器。交换机被编程为具有 3 个 VLAN,每个网络一个。

这个 NDIS 驱动程序 ([https://code.msdn.microsoft.com/windowshardware/NDIS-MUX-Intermediate-3e97f538][1]) 应该支持这种配置。

在启动时一切正常,但在 64 次 rx 事务之后,驱动程序开始接收与开始时相同的标头。如果我检查 TCP 序列号,看起来事务标头正在环绕。

驱动程序使用接收事务中的 VLAN 标记来确定该事务应该在哪个虚拟以太网 LAN 上进行。然后它会移除 VLAN 标签并将事务发送到 VELAN。

// 用于剥离 VLAN TAG 标头的代码

pDst = (PVOID)((PUCHAR)pFrame + VLAN_TAG_HEADER_SIZE);
RtlMoveMemory(pDst, pFrame, 2 * ETH_LENGTH_OF_ADDRESS);
NdisAdvanceNetBufferDataStart(NET_BUFFER_LIST_FIRST_NB(NetBufferList), VLAN_TAG_HEADER_SIZE, FALSE, NULL);*

// 用于重新发送交易的代码

NdisMIndicateReceiveNetBufferLists(pVElan->MiniportAdapterHandle, CurrentNetBufferList, PortNumber, 1, NewReceiveFlags);

事务被上层协议statck处理后,驱动在返回netbufferlist之前重新插入VLAN标签。

//重新插入标签的代码

Status = NdisRetreatNetBufferDataStart(NET_BUFFER_LIST_FIRST_NB(NetBufferList),VLAN_TAG_HEADER_SIZE,0,NULL);
NdisMoveMemory(pFrame, pFrame + VLAN_TAG_HEADER_SIZE, (2 * ETH_LENGTH_OF_ADDRESS));
NdisMoveMemory(pFrame + (2 * ETH_LENGTH_OF_ADDRESS), &Tpid, 2);
NdisMoveMemory(pFrame + (2 * ETH_LENGTH_OF_ADDRESS) + sizeof(Tpid), &ReceiveNblEntry->TagHeader, 2);

我在网上做了很多研究,想知道直接修改net_buffer_list的net_buffer是否合法,但没有找到明确的答案(我认为它不是在NDIS 6之前,但使用NDIS 6就可以了) .

如果我注释代码以删除并重新插入 VLAN 标记,一切正常(当然,由于标记,上层无法识别事务)。这就是为什么我不确定直接更改缓冲区是否合法的原因。但是这个驱动程序应该可以工作。

有什么想法吗?

【问题讨论】:

    标签: windows windows-ce ndis


    【解决方案1】:

    为了解决我的问题,我创建了一个临时缓冲区,复制从微型端口驱动程序接收到的缓冲区,然后我从副本中删除标签并将副本皱眉到上层协议层。

    这样,我不必修改原始缓冲区,现在一切正常。

    希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2015-07-20
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2016-03-10
      • 2010-10-26
      • 2012-02-02
      • 2015-01-01
      相关资源
      最近更新 更多