Compartir a través de


Descarga de fusión de segmentos de recepción UDP (URO)

A partir de Windows 11, versión 24H2, la descarga de fusión de segmentos de recepción UDP (URO) habilita tarjetas de interfaz de red (NIC) para fusionar segmentos de recepción UDP. Las NIC pueden combinar datagramas UDP del mismo flujo que coinciden con un conjunto de reglas en un búfer lógico contiguo. Estos datagramas combinados se indican a continuación en la pila de redes de Windows como un único paquete grande.

La fusión de datagramas UDP reduce el coste de CPU para procesar paquetes en flujos de ancho de banda alto, lo que da lugar a un mayor rendimiento y menos ciclos por byte.

En las secciones siguientes se describen las reglas para fusionar paquetes UDP y cómo escribir un controlador de minipuerto URO.

Reglas para la fusión de paquetes UDP

La fusión de URO solo se puede intentar en paquetes que cumplan todos los criterios siguientes:

  • IpHeader.Version es idéntico para todos los paquetes.
  • IpHeader.SourceAddress y IpHeader.DestinationAddress son idénticos para todos los paquetes.
  • UdpHeader.SourcePort y UdpHeader.DestinationPort son idénticos para todos los paquetes.
  • UdpHeader.Length es idéntico para todos los paquetes, excepto el último paquete, que puede ser menor.
  • UdpHeader.Length debe ser distinto de cero.
  • UdpHeader.Checksum, si no es cero, debe ser correcto en todos los paquetes. Esto significa que la descarga de suma de comprobación de recepción debe validar el paquete.
  • Los encabezados de capa 2 deben ser idénticos para todos los paquetes.

Si los paquetes son IPv4, también deben cumplir los siguientes criterios:

  • IPv4Header.Protocol == 17 (UDP) para todos los paquetes.
  • EthernetHeader.EtherType == 0x0800 para todos los paquetes.
  • IPv4Header.HeaderChecksum en los paquetes recibidos debe ser correcto. Esto significa que la descarga de suma de comprobación de recepción debe validar el encabezado.
  • IPv4Header.HeaderLength == 5 (sin encabezados de opción IPv4) para todos los paquetes.
  • IPv4Header.ToS es idéntico para todos los paquetes.
  • IPv4Header.ECN es idéntico para todos los paquetes.
  • IPv4Header.DontFragment es idéntico para todos los paquetes.
  • IPv4Header.TTL es idéntico para todos los paquetes.
  • IPv4Header.TotalLength == UdpHeader.Length + length(IPv4Header) para todos los paquetes.

Si los paquetes son IPv6, también deben cumplir los siguientes criterios:

  • IPv6Header.NextHeader == 17 (UDP) para todos los paquetes (sin encabezados de extensión).
  • EthernetHeader.EtherType == 0x86dd (IPv6) para todos los paquetes.
  • IPv6Header.TrafficClass e IPv6Header.ECN son idénticos para todos los paquetes.
  • IPv6Header.FlowLabel es idéntico para todos los paquetes.
  • IPv6Header.HopLimit es idéntico para todos los paquetes.
  • IPv6Header.PayloadLength == UdpHeader.Length para todos los paquetes.

Estructura de paquetes URO

La unidad fusionada simple (SCU) resultante debe tener un único encabezado IP y un encabezado UDP, seguido de la carga de UDP para todos los datagramas fusionados concatenados.

Las indicaciones de URO deben establecer el campo IPv4Header.TotalLength con la longitud total de la SCU o el campo IPv6Header.PayloadLength con la longitud de la carga de UDP y el campo UdpHeader.Length con la longitud de las cargas fusionadas.

Si los encabezados de capa 2 (L2) están presentes en datagramas fusionados, la SCU debe contener un encabezado L2 válido. El encabezado L2 de la SCU debe ser similar al encabezado L2 de los datagramas fusionados.

Validación e indicación de suma de comprobación

Las indicaciones de URO deben establecer los campos IPv4Header.HeaderChecksum y UdpHeader.Checksum en cero y rellenar la información de descarga de suma de comprobación fuera de banda en la SCU que indica que la suma de comprobación de IPv4 y UDP se ha realizado correctamente.

Debe indicarse por separado un paquete que coincida con todas las condiciones para que se fusione, pero que produzca un error en la validación de suma de comprobación. Los paquetes recibidos después no deben fusionarse con paquetes recibidos antes.

Por ejemplo, supongamos que los paquetes 1, 2, 3, 4 y 5 se reciben del mismo flujo, pero el paquete 3 produce un error en la validación de suma de comprobación. Los paquetes 1 y 2 se pueden fusionar, y los paquetes 4 y 5 se pueden fusionar, pero el paquete 3 no debe fusionarse con ninguna SCU. Los paquetes 1 y 2 no deben fusionarse con los paquetes 4 y 5. El paquete 2 es el último paquete de una SCU y el paquete 4 inicia una nueva SCU. Además, la SCU que contiene los paquetes 1 y 2 debe indicarse antes de que se indique el paquete 3 y el paquete 3 debe indicarse antes de que la SCU contenga paquetes 4 y 5.

Fusión de paquetes y separación de flujo

Los paquetes de varios flujos se pueden fusionar en paralelo, ya que el hardware y la memoria lo permiten. Los paquetes de diferentes flujos no deben fusionarse.

Los paquetes de varias recepciones intercaladas se pueden separar y fusionar con sus respectivos flujos. Por ejemplo, dados los flujos A, B y C, si los paquetes llegan en el orden A, A, B, C, B, A, A, A, los paquetes del flujo A se pueden fusionar en AAA y los paquetes del flujo B se fusionan en BB, mientras que el paquete del flujo de C se puede indicar normalmente o fusionado con una SCU pendiente del flujo C.

Los paquetes dentro de un flujo determinado no se deben reordenar entre sí. Por ejemplo, los paquetes del flujo A deben fusionarse en el orden recibido, independientemente de los paquetes de los flujos B y C recibidos entre ellos.

Palabra clave INF para controlar URO

La siguiente palabra clave se puede usar para habilitar o deshabilitar URO con una configuración de clave del Registro.

*UdpRsc

Las palabras clave INF estandarizadas de enumeración tienen los atributos siguientes:

SubkeyName
Nombre de la palabra clave que debe especificar en el archivo INF y que aparece en el Registro.

ParamDesc
Texto para mostrar asociado a SubkeyName.

Valor
Valor entero de enumeración asociado a cada opción de la lista. Este valor se almacena en NDI\params\ SubkeyName\Value.

EnumDesc
Texto para mostrar asociado a cada valor que aparece en el menú.

Valor predeterminado
Valor predeterminado del menú.

SubkeyName ParamDesc Valor EnumDesc
*UdpRsc URO 0 Deshabilitado
1 (valor predeterminado) habilitado

Para obtener más información sobre el uso de palabras clave de enumeración, consulte Palabras clave de enumeración.

Escritura de un controlador de minipuerto URO

A partir de NDIS 6.89, la interfaz NDIS para URO facilita la comunicación entre TCP/IP y el controlador de minipuerto NDIS.

Notificación de la funcionalidad URO

Un controlador de minipuerto anuncia la compatibilidad con URO en el miembro UdpRsc de la estructura NDIS_OFFLOAD, que lo pasa a la función NdisMSetMiniportAttributes.

Consulta de la funcionalidad URO

Para comprobar si un controlador de minipuerto admite URO, los controladores NDIS y otras aplicaciones pueden consultar el OID OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES, que devuelve la estructura NDIS_OFFLOAD.

Consulta del estado de URO

Para determinar el estado actual de URO, los controladores NDIS y otras aplicaciones pueden consultar la solicitud de OID OID_TCP_OFFLOAD_CURRENT_CONFIG. NDIS controla este OID y no lo pasa al minipuerto.

Cambio del estado de URO

URO se puede habilitar o deshabilitar mediante la emisión de la solicitud de OID OID_TCP_OFFLOAD_PARAMETERS. Este OID usa una estructura NDIS_OFFLOAD_PARAMETERS. En esta estructura, el miembro UdpRsc.Enabled puede tener los siguientes valores:

Valor Significado
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE
0
El controlador de minipuerto no debe cambiar la configuración actual.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
1
URO se deshabilita.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_ENABLED
2
URO está habilitado.

Cuando un controlador procesa una solicitud de OID OID_TCP_OFFLOAD_PARAMETERS con la marca NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED establecida, la NIC debe esperar a completar la solicitud hasta que se indiquen todos los segmentos fusionados existentes y las indicaciones de URO pendientes. Esto garantiza la sincronización de eventos de habilitación o deshabilitación de URO en los componentes de NDIS.

Una vez que el controlador de minipuerto procesa la solicitud de OID OID_TCP_OFFLOAD_PARAMETERS, el controlador de minipuerto debe emitir una indicación de estado NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG con el estado de descarga actualizado.

La marca NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE de NDIS_OFFLOAD_PARAMETERS permite deshabilitar solo el tiempo de ejecución de URO. Los cambios realizados con esta marca no se guardan en el registro.

Exclusión de URO en NDIS 6.89 y versiones posteriores

Los controladores destinados a NDIS 6.89 y versiones posteriores deben comprender los paquetes URO y controlarlos correctamente. Para excluir URO:

Este enfoque garantiza que los componentes que no estén familiarizados con URO no reciban NBL de URO. NDIS deshabilita URO en el minipuerto durante el enlace si existe un controlador de protocolo o LWF que no admite URO.

Consideraciones de programación para controladores URO

Tenga en cuenta los siguientes problemas al implementar un controlador de minipuerto compatible con URO.

API de URO de Winsock

Para obtener información sobre la API de URO de Winsock, consulte Opciones de socket de IPPROTO_UDP. Consulte la información sobre UDP_RECV_MAX_COALESCED_SIZE y UDP_COALESCED_INFO.

Actualizaciones de la pila TCP/IP de Windows

El transporte TCP/IP de Microsoft habilita URO en tiempo de enlace con NDIS, a menos que la configuración impida que lo haga.

Las llamadas de WFP pueden usar FWP_CALLOUT_FLAG_ALLOW_URO en FWPS_CALLOUT2 para anunciar su compatibilidad con URO. Si una llamada de WFP incompatible se registra en una capa sensible a URO, el sistema operativo deshabilitará el URO mientras se registra la llamada.

Si un socket permite URO con un tamaño máximo fusionado mayor o igual que el tamaño de descarga de hardware, la pila entregará los NBL del hardware sin modificar al socket. Si un socket se admite con un tamaño máximo de fusión menor, la pila interrumpirá la recepción fusionada en el tamaño más pequeño del socket.

Si un socket excluye URO, la pila volverá a segmentar la recepciones para ese socket. En ausencia de hardware URO, la característica URO de software existente seguirá estando disponible.