Как 8021q создает тегированные кадры в NDIS NET_BUFFER LIST поля Ethernet?

Я тестирую свой виртуальный драйвер, чтобы получить сертификат HLK. В HLK есть тест 2c_priority, который проверяет отправку пакета с тегом 802.1p.

Изначально я не поддерживаю 802.1p. Для поддержки 802.1p я добавил параметры NDIS_MAC_OPTION_8021P_PRIORITY и NDIS_MAC_OPTION_8021Q_VLAN в запрос OID_GEN_MAC_OPTIONSOID.

Во время теста 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 

так далее..

Я вижу, как значения NdisPacket8021qInfo.TagHeader.UserPriority меняются, например, 5, 1, 6, 4 и т. д.

Теперь я проверяю свою принимающую сторону, чтобы проверить, имеет ли Netbufferlist тот же приоритет. Но я не видел никаких значений.

Я сомневаюсь:

  • Я не вставлял этот тег 802.1p в поле Ethernet во время функции sendNetBufferList. Будет ли сам HLK добавлять этот тег в поле Ethernet? или я должен вручную добавить в поле Ethernet NetBufferList?

  • Это почему я не вижу пакеты 802.1p во время приема? Но почему я не вижу никаких значений NDIS_NET_BUFFER_LIST_8021Q_INFO NetBufferList во время процесса получения?


person user2986042    schedule 17.03.2017    source источник


Ответы (1)


Драйвер мини-порта должен вставить тег 802.1p в фактическую полезную нагрузку пакета во время Tx. Поскольку вы создаете виртуальный драйвер, у вас есть 2 варианта:

  • Ваш драйвер может редактировать сам кадр Ethernet, чтобы вручную вставить поле 802.1p. По сути, вы вставите 4 байта после 14-байтового заголовка Ethernet (однако остерегайтесь кадрирования SNAP).
  • Не редактируйте фрейм Ethernet. Вместо этого передайте информацию 802.1p внутри любых метаданных, которые вы предоставляете, на другой конец вашего виртуального соединения. Вероятно, вы уже передаете метаданные, включающие длину пакета. Если есть возможность добавить дополнительные метаданные, вы можете добавить еще одно поле для данных 802.1p.

После того, как вы сделаете одно из вышеперечисленного, вам нужно сделать противоположное на стороне Rx. Либо удалите заголовок 802.1p из полезной нагрузки пакета, либо прочитайте информацию 802.1p из ваших метаданных. Затем поместите информацию 802.1p в Rx NBL.

person Jeffrey Tippet    schedule 19.03.2017
comment
В моем случае HLK будет добавлять теги при отправке пакетов. Поэтому я не хочу добавлять какие-либо суффиксы в netbufferlist. Теперь я могу видеть, когда я запрашиваю NET_BUFFER_LIST_INFO(netbufferlist,Ieee8021QNetBufferListInfo), я вижу эти значения приоритета. Но когда я получаю пакеты, я просто проверяю тот же процесс, присутствует ли этот приоритет в пакете или нет. Но я получил нулевые значения, когда использую NET_BUFFER_LIST_INFO. Какие-либо предложения ? - person user2986042; 20.03.2017
comment
Ответственность вашего драйвера мини-порта состоит в том, чтобы каким-то образом обеспечить передачу тегов 802.1p вместе с каждым передаваемым пакетом. Когда ваш драйвер минипорта указывает на получение, он должен записать значение 802.1p в NBL. - person Jeffrey Tippet; 21.03.2017
comment
Но мой водитель минипорта ведет себя как манекен. У меня есть драйвер фильтра для каждого физического адаптера. Итак, могу ли я справиться с этим сценарием 802.1p с функцией отправки пакета драйвера фильтра? - person user2986042; 22.03.2017
comment
А у меня другое сомнение. Когда HLK NdisTester отправляет пакеты, будет ли он сам добавлять заголовок к пакету или только устанавливать Ieee8021QNetBufferListInf‌​o в NET_BUFFER_LIST_INFO? - person user2986042; 22.03.2017
comment
В конце концов, вы написали драйвер, который перемещает пакеты из одного места в другое. Наряду с этими пакетами вам необходимо включить метаданные 802.1p. Это всегда внутри IEee8021QNetBufferListInfo. - person Jeffrey Tippet; 24.03.2017
comment
Да . Спасибо за Вашу информацию . Наконец, я вставил заголовок 802.1p в кадр Ethernet и удалил этот заголовок на принимающей стороне. Используя заголовок, я обновил Ieee8021QNetBufferListInfo. теперь работает . - person user2986042; 25.03.2017