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