Указание объединенных сегментов
Одна объединенная единица (SCU) — это последовательность сегментов TCP, объединенных в один сегмент TCP в соответствии с правилами, определенными в разделе Правила объединения сегментов TCP/IP. В этом разделе описывается, как указать итоговые объединенные сегменты.
SCU должен:
На это указывает вызов NdisMIndicateReceiveNetBufferLists.
Выглядеть как обычный сегмент TCP, который получается по проводу.
Значение не должно превышать максимальную длину допустимой ip-датаграммы, как определено в разделе 3.1 RFC 791.
Примечание Так как сегменты с заголовками расширения IPv6 не могут быть объединены (см . раздел Условия исключения, которые завершают объединение), размер SCU для датаграмм IPv6 также ограничен максимальной законной длиной датаграмм.
Сетевой адаптер или драйвер мини-порта должен повторно вычислить контрольные суммы TCP и IPv4, если это применимо, прежде чем указывать объединенный сегмент. Если сетевой адаптер или драйвер мини-порта проверяет контрольные суммы TCP и IPv4, но не пересылает их для объединенного сегмента, он должен установить флаги TcpChecksumValueInvalid и IpChecksumValueInvalid в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO . Кроме того, в этом случае сетевой адаптер или драйвер мини-порта может при необходимости обнулять значения контрольной суммы заголовков TCP и IPv4 в сегменте.
Сетевой адаптер и драйвер мини-порта всегда должны устанавливать флаги IpChecksumSucceededed и TcpChecksumSucceededed в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO , прежде чем указывать объединенный сегмент.
Дополнительные сведения о правилах объединения см. в статье Правила объединения сегментов TCP/IP.
Дополнительные сведения об исключениях см. в разделе Условия исключений, которые завершают объединение.
Ожидается, что объединение будет выполняться на основе наилучших усилий. В некоторых случаях оборудование может быть не в состоянии выполнить объединение, например из-за нехватки ресурсов. Требования, изложенные здесь, прежде всего, указывают, когда не следует объединять и как это сделать.
На высоком уровне сетевой адаптер и драйвер мини-порта должны обрабатывать получение сегмента TCP по проводу следующим образом:
Проверьте входящий сегмент на наличие исключения следующим образом:
Если исключение не было обнаружено, проверка, можно ли объединить сегмент с последним сегментом, полученным для того же TCP-подключения в зависимости от правил.
Если сегмент вызвал исключение или его объединение с ранее полученным сегментом невозможно, укажите сегмент по отдельности.
Сетевой адаптер и драйвер мини-порта не должны указывать объединенные сегменты, пока драйвер протокола не включит RSC, как описано в разделе Запросы и изменение состояния RSC.
Для заданного TCP-подключения указание данных от адаптера мини-порта к стеку TCP/IP узла может состоять из одного или нескольких объединенных сегментов, разделенных одним или несколькими отдельными сегментами, которые не могут быть объединены.
Сетевой адаптер и драйвер мини-порта не должны задерживать указание сегментов TCP, независимо от того, слились они или нет. В частности, сетевой адаптер и драйвер мини-порта не должны откладывать указание сегментов от одного отложенного вызова процедуры (DPC) к следующему, чтобы попытаться сцепление сегментов.
Сетевой адаптер и драйвер мини-порта могут использовать таймеры для определения окончания объединения. Однако обработка рабочих нагрузок с учетом задержки должна быть столь же эффективной, как и требование границ DPC.