E/S assíncrona e funções de conclusão em drivers de rede
A latência é inerente a algumas operações de rede. Devido a essa latência, muitas das funções de borda superior fornecidas por um driver de miniporto e as funções de borda inferior de um driver de protocolo são projetadas para dar suporte à operação assíncrona. Em vez de desperdiçar ciclos de CPU aguardando um loop para que alguma tarefa demorada seja concluída ou um evento de hardware para sinalizar, os drivers de rede dependem da capacidade de lidar com a maioria das operações de forma assíncrona.
Há suporte para E/S de rede assíncrona usando uma função de conclusão . O exemplo a seguir ilustra o uso de uma função de conclusão para uma operação de envio de rede, mas esse mesmo mecanismo existe para muitas outras operações executadas por um driver de protocolo ou miniport.
Quando um driver de protocolo chama NDIS para enviar um pacote, resultando em uma chamada para a função MiniportSendNetBufferLists do driver de miniport, o driver de miniport pode tentar concluir essa solicitação imediatamente e retornar um valor status apropriado como resultado. Para a operação síncrona, as respostas possíveis são NDIS_STATUS_SUCCESS para a conclusão bem-sucedida do envio, NDIS_STATUS_RESOURCES e NDIS_STATUS_FAILURE indicando uma falha de algum tipo.
Mas uma operação de envio pode levar algum tempo para ser concluída enquanto o driver de miniporto (ou NDIS) enfileira o pacote e aguarda a NIC indicar o resultado da operação de envio. A função miniport driver MiniportSendNetBufferLists pode lidar com essa operação de forma assíncrona retornando um valor status de NDIS_STATUS_PENDING. Quando o driver de miniporto conclui a operação de envio, ele chama a função de conclusão , NdisMSendNetBufferListsComplete, passando um ponteiro para o descritor de pacote que foi enviado. Essas informações são passadas para o driver de protocolo, sinalizando a conclusão.
A maioria das operações de driver que podem exigir um tempo estendido para concluir a operação assíncrona de suporte com uma função de conclusão semelhante. Essas funções têm nomes do formulário NdisMXxxComplete.
As funções de conclusão também são fornecidas para:
Definir e consultar a configuração.
Redefinir hardware.
Indique status.
Indique os dados recebidos.
Transferir dados recebidos.