删除和添加VLAN标记创建缓冲区环绕(NDIS MUX中间驱动程序)

时间:2015-04-29 04:13:10

标签: windows windows-ce ndis

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

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

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

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

驱动程序使用接收事务中的VLAN标记来确定此事务应该在哪个虚拟以太网域上运行。然后它删除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标记的代码,一切正常(当然,由于标记,事务在上层无法识别)。这就是为什么我不确定直接更改缓冲区是否合法的原因。但是这个驱动程序应该可以工作。

有什么想法吗?

0 个答案:

没有答案