Удаление и добавление тега VLAN создает перенос буфера (промежуточный драйвер NDIS MUX)

Я использую драйвер «NDIS MUX Intermediate Driver and Notify Object» на WEC2013 для моделирования 3 разных сетей с одним адаптером Ethernet (3 VELAN).

На моей плате работает процессор Freescale iMX6, подключенный к коммутатору Marvell. Коммутатор запрограммирован на 3 VLAN, по одной на каждую сеть.

Этот драйвер NDIS ([https://code.msdn.microsoft.com/windowshardware/NDIS-MUX-Intermediate-3e97f538][1]) должен поддерживать такую ​​конфигурацию.

При запуске все работает нормально, но после 64 транзакций rx драйвер начинает получать те же заголовки, что и в начале. Если я проверю порядковый номер TCP, похоже, что заголовки транзакций зацикливаются.

Драйвер использует тег VLAN из транзакции приема, чтобы определить, в какую виртуальную локальную сеть Ethernet должна пройти эта транзакция. Затем снимает тег VLAN и отправляет транзакцию в ВЭЛАН.

// Код, используемый для удаления заголовка 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);

После того, как транзакция обработана вышестоящей статистикой протокола, драйвер повторно вставляет тег 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 для net_buffer_list, и не нашел четкого ответа (я думаю, что это было не до NDIS 6, но с NDIS 6 все в порядке).

Если я прокомментирую коды для удаления и повторной вставки тега VLAN, все работает нормально (конечно, транзакция не распознается на верхнем уровне из-за тега). Вот почему я не уверен, что законно изменять буфер напрямую. Но этот драйвер должен работать.

Есть идеи?


person Jocelyn    schedule 29.04.2015    source источник


Ответы (1)


Чтобы решить свою проблему, я создал временный буфер, скопировал полученный от драйвера минипорта, а затем удалил тег с копии и наморщил копию на верхний уровень протокола.

Таким образом, мне никогда не приходится изменять исходный буфер, и теперь все работает нормально.

Надеюсь, это поможет кому-то другому.

person Jocelyn    schedule 11.05.2015