Envío de datos desde un controlador de protocolo
En la ilustración siguiente se muestra una operación de envío de controladores de protocolo, que implica un controlador de protocolo, NDIS y controladores subyacentes en una pila de controladores.
Los controladores de protocolo llaman a la función NdisSendNetBufferLists para enviar los datos de red definidos en una lista de estructuras de NET_BUFFER_LIST .
Un controlador de protocolo debe establecer el miembro SourceHandle de cada estructura de NET_BUFFER_LIST en el mismo valor que pasa al parámetro NdisBindingHandle . El identificador de enlace proporciona la información que NDIS requiere para devolver la estructura NET_BUFFER_LIST al controlador de protocolo después de que el controlador de miniporte subyacente llame a NdisMSendNetBufferListsComplete.
Antes de llamar a NdisSendNetBufferLists, un controlador de protocolo puede establecer información que acompaña a la solicitud de envío con la macro NET_BUFFER_LIST_INFO . Los controladores subyacentes pueden recuperar esta información con la macro NET_BUFFER_LIST_INFO.
En cuanto un controlador de protocolo llama a NdisSendNetBufferLists, renuncia a la propiedad de las estructuras de NET_BUFFER_LIST y a todos los recursos asociados. NDIS llama a la función ProtocolSendNetBufferListsComplete para devolver las estructuras y los datos al controlador de protocolo. NDIS puede recopilar las estructuras y los datos de varias solicitudes de envío en una única lista vinculada de estructuras de NET_BUFFER_LIST antes de pasar la lista a ProtocolSendNetBufferListsComplete.
Hasta que NDIS llama a ProtocolSendNetBufferListsComplete, se desconoce el estado actual de un envío iniciado por el controlador de protocolo. Un controlador de protocolo libera temporalmente la propiedad de todos los recursos que asignó para una solicitud de envío cuando llama a NdisSendNetBufferLists. Un controlador de protocolo nunca debe intentar examinar las estructuras de NET_BUFFER_LIST o los datos asociados antes de que NDIS devuelva las estructuras a ProtocolSendNetBufferListsComplete.
ProtocolSendNetBufferListsComplete realiza cualquier postprocesamiento necesario para completar una operación de envío. Por ejemplo, el controlador de protocolo puede notificar a los clientes, que solicitaron al controlador de protocolo que enviara los datos de red, que la operación de envío está completa.
Cuando NDIS llama a ProtocolSendNetBufferListsComplete, el controlador de protocolo recupera la propiedad de todos los recursos asociados a las estructuras de NET_BUFFER_LIST especificadas por el parámetro NetBufferLists . ProtocolSendNetBufferListsComplete puede liberar estos recursos (por ejemplo, llamando a NdisFreeNetBuffer y NdisFreeNetBufferList) o prepararlos para su reutilización en una llamada posterior a NdisSendNetBufferLists.
Aunque NDIS siempre envía los datos de red proporcionados por el protocolo al controlador de miniport subyacente en el orden determinado por el protocolo tal y como se pasa a NdisSendNetBufferLists, el controlador subyacente puede completar las solicitudes de envío en orden aleatorio. Es decir, cada controlador de protocolo enlazado puede confiar en NDIS para enviar los datos de red que el controlador de protocolo pasa a NdisSendNetBufferLists en FIFO para el controlador subyacente. Sin embargo, ningún controlador de protocolo puede confiar en el controlador subyacente para llamar a NdisMSendNetBufferListsComplete en el mismo orden.