Funciones de E/S asincrónicas y finalización en controladores de red
La latencia es inherente a algunas operaciones de red. Debido a esta latencia, muchas de las funciones de borde superior proporcionadas por un controlador de minipuerto y las funciones de borde inferior de un controlador de protocolo están diseñadas para admitir operaciones asincrónicas. En lugar de desperdiciar ciclos de CPU en espera en un bucle para que una tarea con mucho tiempo finalice o un evento de hardware para indicar, los controladores de red dependen de la capacidad de controlar la mayoría de las operaciones de forma asincrónica.
La E/S de red asincrónica se admite mediante una función de finalización . En el ejemplo siguiente se muestra el uso de una función de finalización para una operación de envío de red, pero este mismo mecanismo existe para muchas otras operaciones realizadas por un controlador de protocolo o minipuerto.
Cuando un controlador de protocolo llama a NDIS para enviar un paquete, lo que da lugar a una llamada a la función MiniportSendNetBufferLists del controlador de miniporte, el controlador de miniporte puede intentar completar esta solicitud inmediatamente y devolver un valor de estado adecuado como resultado. Para la operación sincrónica, las posibles respuestas se NDIS_STATUS_SUCCESS para completar correctamente el envío, NDIS_STATUS_RESOURCES y NDIS_STATUS_FAILURE que indican un error de algún tipo.
Pero una operación de envío puede tardar algún tiempo en completarse mientras el controlador de miniporte (o NDIS) pone en cola el paquete y espera a que la NIC indique el resultado de la operación de envío. La función Miniport Driver MiniportSendNetBufferLists puede controlar esta operación de forma asincrónica devolviendo un valor de estado de NDIS_STATUS_PENDING. Cuando el controlador de miniporte completa la operación de envío, llama a la función de finalización, NdisMSendNetBufferListsComplete, pasando un puntero al descriptor de paquete que se envió. Esta información se pasa al controlador de protocolo, que señala la finalización.
La mayoría de las operaciones de controlador que pueden requerir un tiempo prolongado para completar la compatibilidad con la operación asincrónica con una función de finalización similar. Estas funciones tienen nombres de la forma NdisMXxxComplete.
Las funciones de finalización también se proporcionan a:
Establecer y consultar la configuración.
Restablezca el hardware.
Indique el estado.
Indique los datos recibidos.
Transferir datos recibidos.