Поиск заголовка транспорта для инкапсулированных пакетов в траектории получения
При получении пакета сетевой интерфейс, поддерживающий виртуализацию сети с помощью универсальной инкапсуляции маршрутизации (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) и более поздних версий поддерживается только инкапсуляция IP-адресов GRE. Таким образом, сетевой адаптер должен иметь возможность анализировать следующее в зависимости от заявленных возможностей.
- 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) и более поздних версий.