MINIPORT_SEND_NET_BUFFER_LISTS función de devolución de llamada (ndis.h)
NDIS llama a la función MiniportSendNetBufferLists para transmitir datos de red contenidos en una lista vinculada de estructuras de NET_BUFFER_LIST .
Sintaxis
MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;
void MiniportSendNetBufferLists(
[in] NDIS_HANDLE MiniportAdapterContext,
[in] PNET_BUFFER_LIST NetBufferList,
[in] NDIS_PORT_NUMBER PortNumber,
[in] ULONG SendFlags
)
{...}
Parámetros
[in] MiniportAdapterContext
Identificador de un área de contexto que el controlador de minipuerto asignó en su función MiniportInitializeEx . El controlador de minipuerto usa este área de contexto para mantener información de estado sobre un adaptador.
[in] NetBufferList
Puntero a la primera estructura NET_BUFFER_LIST de una lista vinculada de estructuras de NET_BUFFER_LIST. Cada estructura NET_BUFFER_LIST de la lista describe una lista de estructuras de NET_BUFFER . Cada NET_BUFFER estructura de la lista se asigna a una cadena de MDL. Las MDL contienen los datos de red.
[in] PortNumber
Número de puerto que identifica un puerto de adaptador de minipuerto. Para asignar un número de puerto del adaptador de miniporte, llame a la función NdisMAllocatePort . Un valor cero identifica el puerto predeterminado de un adaptador de minipuerto.
[in] SendFlags
Marcas que definen atributos para la operación de envío. Las marcas se pueden combinar con una operación OR. Para borrar todas las marcas, establezca este miembro en cero. Esta función admite las marcas siguientes:
NDIS_SEND_FLAGS_DISPATCH_LEVEL
Especifica que el IRQL actual está DISPATCH_LEVEL. Para obtener más información sobre esta marca, vea Dispatch IRQL Tracking.
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
Especifica que NDIS debe comprobar si hay bucle invertido. De forma predeterminada, NDIS no devuelve datos al controlador que envió la solicitud de envío. Un controlador que sobrescribe este comportamiento puede invalidar este comportamiento estableciendo esta marca. Cuando se establece esta marca, NDIS identifica todas las estructuras de NET_BUFFER que contienen datos que coinciden con los criterios de recepción del enlace. NDIS indica NET_BUFFER estructuras que coinciden con los criterios para el controlador de sobreaprovisionamiento. Esta marca no tiene ningún efecto en la comprobación de bucle invertido o bucle invertido, en otros enlaces.
Valor devuelto
None
Observaciones
MiniportSendNetBufferLists es una función necesaria para los controladores de minipuerto. Cuando un controlador que sobrescribe llama a la función NdisSendNetBufferLists , NDIS llama a la función MiniportSendNetBufferLists del controlador de miniport enlazado.
Al transmitir los datos de red que NDIS pasa en el parámetro NetBufferLists , el controlador de minipuerto debe usar las instrucciones siguientes:
- Se debe conservar el orden de las estructuras de NET_BUFFER en cada estructura de NET_BUFFER_LIST .
- El orden de las estructuras de NET_BUFFER_LIST debe conservarse si se van a transmitir en la misma conexión.
-
Si las estructuras de NET_BUFFER_LIST se van a transmitir en diferentes conexiones, se pueden dividir en varias colas de transmisión si están en uso las siguientes características. En este caso, se debe conservar el orden de las estructuras de NET_BUFFER_LIST para cada conexión.
- Escalado lateral de recepción (RSS) (el valor hash RSS de la estructura NET_BUFFER_LIST se puede usar como índice en la tabla de direccionamiento indirecto RSS).
- Cola de máquinas virtuales (VMQ) (el identificador de cola de la cola saliente se establece en la información de OOB de NetBufferListFilteringInfo . Para más información, consulte Ruta de acceso de transmisión de VMQ).
- Puente del centro de datos IEEE 802.1 (DCB) (Puede desactivar la clase de tráfico (TC).)
- IEEE 802.1p (puede desactivar las etiquetas 802.1p sin DCB).
Los controladores de Miniport aceptan todas las solicitudes de envío que realiza NDIS mediante una llamada a la función MiniportSendNetBufferLists . Si un controlador de miniporte no puede completar inmediatamente una solicitud de envío, el controlador debe contener la solicitud en una cola hasta que pueda completar la solicitud. Mientras una solicitud de envío está pendiente, el controlador de minipuerto conserva la propiedad de las estructuras de NET_BUFFER_LIST y todos los recursos asignados por protocolo asociados a las estructuras de NET_BUFFER_LIST.
El controlador de minipuerto debe llamar al Función NdisMSendNetBufferListsComplete para completar las solicitudes de envío de todas las estructuras de NET_BUFFER_LIST. Para mejorar el rendimiento del sistema, el controlador puede crear una lista vinculada que contenga las estructuras de NET_BUFFER_LIST de varias solicitudes de envío. A continuación, el controlador puede pasar una lista vinculada de este tipo en una sola llamada a NdisMSendNetBufferListsComplete.NET_BUFFER_LIST estructuras y otros recursos asociados deben ser tratados como inaccesibles por el controlador de miniporte en cuanto el controlador llama a NdisMSendNetBufferListsComplete.
La función MiniportSendNetBufferLists debe sincronizar el acceso a sus colas internas de datos de red con las demás funciones MiniportXxx del controlador que acceden a las mismas colas. Un controlador de minipuerto puede usar bloqueos de número para sincronizar el acceso a las colas.
Los controladores de protocolo son responsables de determinar qué datos de red son necesarios, en función del tipo medio seleccionado por el controlador de miniporte enlazado. Sin embargo, un controlador de protocolo puede proporcionar datos de red que especifican paquetes más cortos que el tamaño mínimo del paquete para el medio seleccionado. En este caso, MiniportSendNetBufferLists debe rellenar los paquetes con ceros si el medio seleccionado impone un requisito de longitud mínima en el tamaño del paquete de transmisión.
Si el controlador de minipuerto establece la marca de NDIS_MAC_OPTION_NO_LOOPBACK cuando NDIS consulta el OID de OID_GEN_MAC_OPTIONS , el controlador de miniporte no debe intentar devolver los datos de red. NDIS proporciona compatibilidad con bucle invertido de software para dicho controlador.
NDIS llama a MiniportSendNetBufferLists en IRQL<= DISPATCH_LEVEL.
Ejemplos
Para definir una función MiniportSendNetBufferLists , primero debe proporcionar una declaración de función que identifique el tipo de función que va a definir. Windows proporciona un conjunto de tipos de función para controladores. Declarar una función mediante los tipos de función ayuda a Code Analysis for Drivers, Static Driver Verifier (SDV) y otras herramientas de comprobación a encontrar errores y es un requisito para escribir controladores para el sistema operativo Windows.Por ejemplo, para definir una función MiniportSendNetBufferLists denominada "MySendNetBufferLists", use el tipo de MINIPORT_SEND_NET_BUFFER_LISTS como se muestra en este ejemplo de código:
MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;
A continuación, implemente la función de la siguiente manera:
_Use_decl_annotations_
VOID
MySendNetBufferLists(
NDIS_HANDLE MiniportAdapterContext,
PNET_BUFFER_LIST NetBufferList,
NDIS_PORT_NUMBER PortNumber,
ULONG SendFlags
)
{...}
El tipo de función MINIPORT_SEND_NET_BUFFER_LISTS se define en el archivo de encabezado Ndis.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations a la definición de función. La anotación Use_decl_annotations garantiza que se usen las anotaciones que se aplican al tipo de función MINIPORT_SEND_NET_BUFFER_LISTS en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de roles de función para controladores NDIS.
Para obtener información sobre Use_decl_annotations, consulte Anotación del comportamiento de la función.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Compatible con NDIS 6.0 y versiones posteriores. |
Plataforma de destino | Windows |
Encabezado | ndis.h (incluya Ndis.h) |
IRQL | <= DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | NdisTimedDataHang, NdisTimedDataSend |