【发布时间】: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