Partilhar via


Entrada/Saída 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 miniporta e as funções de borda inferior de um driver de protocolo são projetadas para suportar operação assíncrona. Em vez de gastar ciclos de CPU a esperar num ciclo para que alguma tarefa demorada termine ou um evento de hardware seja sinalizado, os drivers de rede dependem da capacidade de lidar com a maioria das operações de forma assíncrona.

A E/S de rede assíncrona é suportada usando uma função de conclusão . O exemplo a seguir ilustra o uso de uma função de finalização numa operação de rede de envio, mas esse mesmo mecanismo existe para muitas outras operações que são realizadas por um driver de protocolo ou miniport.

Quando um driver de protocolo chama o NDIS para enviar um pacote, resultando em uma chamada para a função MiniportSendNetBufferLists do driver de miniporta, o driver de miniporta pode tentar concluir essa solicitação imediatamente e retornar um valor de status apropriado como resultado. Para 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 miniporta (ou NDIS) enfileira o pacote e aguarda que a NIC indique o resultado da operação de envio. O driver de miniporta função MiniportSendNetBufferLists pode lidar com essa operação de forma assíncrona, retornando um valor de status de NDIS_STATUS_PENDING. Quando o driver de miniporta 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 demorar um período prolongado para serem concluídas suportam a operação assíncrona com uma função de conclusão semelhante. Tais funções têm nomes do tipo NdisMXxxComplete.

As funções de conclusão também são fornecidas para:

  • Definir e consultar a configuração.

  • Redefina o hardware.

  • Indique o estado.

  • Indique os dados recebidos.

  • Transferir dados recebidos.