Compartir a través de


EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES función de devolución de llamada (netreceivescaling.h)

El controlador de cliente implementa la función de devolución de llamada EvtNetAdapterReceiveScalingSetIndirectionEntries para realizar movimientos de entradas de tabla de direccionamiento indirecto de escalado lateral de recepción (RSS) a nuevas colas de recepción.

Sintaxis

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
  [_In_]    NETADAPTER Adapter,
  [_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}

Parámetros

[_In_] Adapter

Objeto NETADAPTER que obtuvo el controlador de cliente en una llamada anterior a NetAdapterCreate.

[_Inout_] IndirectionEntries

Puntero a una estructura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES que representa la tabla de direccionamiento indirecto.

Valor devuelto

Devuelve STATUS_SUCCESS si las operaciones de movimiento se realizaron correctamente. De lo contrario, devuelve un código de error NTSTATUS adecuado.

Comentarios

Registre la implementación de esta función de devolución de llamada estableciendo el miembro adecuado de la estructura NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES y, a continuación, llamando a NetAdapterSetReceiveScalingCapabilities. Los controladores de cliente suelen llamar a NetAdapterSetReceiveScalingCapabilities al iniciar un adaptador net antes de llamar a NetAdapterStart.

Cuando un controlador de protocolo necesita reequilibrar la carga de trabajo del procesador en RSS, primero calcula una nueva asignación para cada entrada de tabla de direccionamiento indirecto a un nuevo procesador. A continuación, el protocolo pasa esta información a NetAdapterCx, que asigna internamente números de procesador a identificadores de cola de recepción de NIC. NetAdapterCx almacena la nueva tabla de direccionamiento indirecto, con entradas asignadas para recibir identificadores de cola, en una estructura de NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES y pasa esta estructura al controlador de cliente NIC cuando invoca la función de devolución de llamada EvtNetAdapterReceiveScalingSetIndirectionEntries del controlador.

En esta devolución de llamada, los controladores de cliente mueven cada entrada de la tabla de direccionamiento indirecto de la NIC a la cola de recepción especificada. Cada estructura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY de la matriz NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contiene el índice hash de esa entrada en la tabla, la nueva cola de recepción a la que se va a asignar la entrada y un campo de estado que indica si ese movimiento individual se ha realizado correctamente o no.

La función de asignar entradas de índice a colas de recepción de hardware depende del diseño de cada NIC. Por ejemplo, algunos controladores de cliente NIC pueden asignar sus propios identificadores a cada cola de recepción que son diferentes de los identificadores asignados por NetAdapterCx, por lo que tendrían que traducir primero los identificadores de cola proporcionados a sus propios identificadores de cola antes de reasignar entradas de tabla de direccionamiento indirecto. Otras NIC podrían tener una tabla de direccionamiento indirecto comprimida que difiere en tamaño de la tabla de direccionamiento indirecto mantenida por el sistema, por lo que los controladores de cliente de esas NIC necesitarían calcular el índice correcto en la tabla de direccionamiento indirecto de su hardware al asignar entradas. Para obtener un ejemplo de código de este segundo ejemplo, consulte el controlador de ejemplo de Github Realtek.

Ejemplo

En este ejemplo sencillo se supone una relación de 1:1 de colas de recepción a procesadores, por lo que la tabla de direccionamiento indirecto de la NIC es el mismo tamaño que la tabla de direccionamiento indirecto del sistema.

NTSTATUS
MyEvtNetAdapterReceiveScalingSetIndirectionEntries(
	_In_ 	NETADAPTER   										Adapter,
    _Inout_ PNET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 	IndirectionEntries
)
{

	// Get the adapter's context to retrieve the address of the hardware indirection table
	PMY_NET_ADAPTER_CONTEXT adapterContext = GetMyAdapterContext(Adapter);

	// Assign each indirection table entry to the specified receive queue
	for(size_t i = 0; i < IndirectionEntries->Count; i++)
	{
		// Get the queue ID from its context
		const ULONG queueId = GetMyRxQueueContext(IndirectionEntries->Entries[i].Queue)->QueueId;
		
		// Get the hash index for this entry
		const UINT32 index = IndirectionEntries->Entries[i].Index;

		// Assign the new queue ID for this index in the indirection table and record success
		IndirectionEntries->Entries[i].Status = MySetIndirectionTableEntry(adapterContext->HardwareInfo->RssIndirectionTable[index], 
	queueId
	);
	}

	return STATUS_SUCCESS;
}

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1,25
Versión mínima de UMDF 2,33
Encabezado netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Consulte también

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

Escalado lateral de recepción de NetAdapterCx