Compartir a través de


Descarga de segmentación genérica

La descarga de segmentación genérica (GSO) representa colectivamente la descarga de envío grande (LSO) y la descarga de envío UDP (USO).

Los controladores de cliente pueden descargar la segmentación de paquetes TCP/UDP que son mayores que la unidad de transmisión máxima (MTU) del medio de red. Los controladores deben indicar esta funcionalidad a NetAdapterCx mediante las API de GSO.

Palabras clave INF para controlar el inicio de sesión único

NetAdapterCx comprueba las palabras clave del Registro y las respeta al habilitar las funcionalidades de descarga activas. El controlador no necesita realizar ninguna otra acción.

Las palabras clave de LSO especificadas en Uso de valores del Registro para habilitar y deshabilitar la descarga de tareas se pueden usar para habilitar o deshabilitar la descarga de LSO con una configuración de clave del Registro.

Las palabras clave uso especificadas en la descarga de segmentación UDP (USO) se pueden usar para habilitar o deshabilitar la descarga uso con una configuración de clave del Registro.

Los valores de palabra clave deben ser de tipo REG_SZ.

Configuración del inicio de sesión único

Los controladores cliente anuncian primero las funcionalidades de GSO de su hardware durante la inicialización del adaptador neto. Esto puede ocurrir dentro de su devolución de llamada EvtDevicePrepareHardware antes de iniciar un adaptador neto.

Para configurar el GSO, el controlador de cliente:

  1. Asigna una estructura de NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES .

  2. Llama a NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT para inicializar la estructura.

  3. Llama a NetAdapterOffloadSetGsoCapabilities para registrar la estructura con NetAdapterCx.

Durante la llamada a NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT el controlador cliente proporciona un puntero a la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_GSO . El sistema invoca esta devolución de llamada más adelante si cambian las funcionalidades de descarga activas.

Reglas para indicar las funcionalidades de GSO de hardware

Las reglas siguientes se aplican a la estructura de NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES :

  1. El controlador debe establecer Layer3Flags y Layer4Flags.

  2. Si la NIC admite LSO, el controlador debe rellenar el campo Layer4Flags con la NetAdapterOffloadLayer4FlagTcpWithoutOptions marca TCP.

  3. Si la NIC admite USO, el controlador debe rellenar el campo Layer4Flags con la NetAdapterOffloadLayer4FlagUdp marca UDP.

  4. MaximumOffloadSize y MinimumSegmentCount son campos obligatorios.

  5. El campo Layer4OffsetLimit es opcional. Si el sistema operativo envía un paquete con un desplazamiento de encabezado mayor que el límite especificado, no solicitará que se realice el GSO.

  6. Los paquetes IP/TCP sin opciones o extensiones deben admitirse si se admiten opciones o extensiones.

En este ejemplo se muestra cómo un controlador cliente puede configurar sus funcionalidades de descarga de hardware.

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's GSO offload capabilities
    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions;
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT(
        &gsoOffloadCapabilities,
        layer3Flags,
        layer4Flags,
        MY_GSO_OFFLOAD_MAX_SIZE,
        MY_GSO_OFFLOAD_MIN_SEGMENT_COUNT,
        EvtAdapterOffloadSetGso);

    gsoOffloadCapabilities.Layer4OffsetLimit = 127;

    // Set the current GSO offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetGsoCapabilities(NetAdapter, &gsoOffloadCapabilities);
}

Actualización de descargas de hardware

Si la pila TCP/IP o un controlador de protocolo excesivo solicita un cambio en las funcionalidades activas del adaptador de red, NetAdapterCx invoca la devolución de llamada del controlador de cliente EVT_NET_ADAPTER_OFFLOAD_SET_GSO que se registró durante la inicialización del adaptador. En esta función, el sistema proporciona funcionalidades actualizadas en el objeto NETOFFLOAD que el controlador de cliente consulta para actualizar sus funcionalidades de descarga.

Los controladores de cliente pueden llamar a las siguientes funciones para determinar qué descargas están habilitadas:

En el ejemplo siguiente se muestra cómo un controlador de cliente podría actualizar sus funcionalidades de descarga de GSO:

VOID
MyEvtAdapterOffloadSetGso(
	NETADAPTER NetAdapter,
	NETOFFLOAD Offload
)
{
	PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

	// Store the updated information in the context
	adapterContext->LSOv4 = NetOffloadIsLsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->LSOv6 = NetOffloadIsLsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv4 = NetOffloadIsUsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv6 = NetOffloadIsUsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;

	// Enable hardware checksum if LSO/USO is enabled
	MyUpdateHardwareChecksum(adapterContext);
}