Поиск заголовка транспорта для инкапсулированных пакетов в пути получения
При получении пакета сетевая карта, поддерживающая виртуализацию сети с использованием универсальной инкапсуляции маршрутизации (NVGRE), должна сначала определить, инкапсулирован ли пакет, и, если да, тип инкапсуляции.
Примечание В пути отправки пакет инкапсулируется, если NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. IsEncapsulatedPacket имеет значение TRUE.
В пути получения сетевой адаптер должен определить, инкапсулирован ли пакет, проверив номер протокола в поле Протокол заголовка туннеля IPv4 (внешний) или в поле NextHeader заголовка туннеля IPv6 (внешний). Список назначенных номеров протоколов можно найти по адресу https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml.
После определения пакета как инкапсулированного пакета сетевой адаптер должен определить смещение транспортного (внутреннего) IP-заголовка путем анализа протокола инкапсулированного пакета.
Для NDIS 6.30 (Windows Server 2012) и более поздних версий поддерживается только инкапсуляция GRE IP. Таким образом, сетевой адаптер должен иметь возможность анализировать следующее в зависимости от объявленных возможностей:
- Заголовки GRE (RFC 2784: универсальная инкапсуляция маршрутизации (GRE))
- RFC 2890: расширения ключей и порядковых номеров для GRE
- Заголовки IPv4 (RFC 791: Протокол Интернета)
- Заголовки IPv6 (RFC 2460: Протокол Интернета, версия 6 (IPv6))
Если сетевая карта обнаруживает неизвестный или неподдерживаемый протокол инкапсуляции, он должен передать пакет без изменений в стек узлов.
Таким образом, на пути получения минипорт должен проанализировать заголовок транспортного (внутреннего) IP-адреса, чтобы определить версию IP-адреса, а также получить доступ к заголовку TCP или UDP. Это новое требование для NDIS 6.30 (Windows Server 2012) и более поздних версий.