Partilhar via


Alocando uma fila de VM

Para alocar uma fila com um conjunto inicial de parâmetros de configuração, um controlador superior emite uma solicitação de método OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE. O InformationBuffer membro da estrutura NDIS_OID_REQUEST inicialmente contém um ponteiro para uma estrutura NDIS_RECEIVE_QUEUE_PARAMETERS. Após um retorno bem-sucedido da solicitação do método OID, o membro InformationBuffer da estrutura NDIS_OID_REQUEST contém um ponteiro para a estrutura NDIS_RECEIVE_QUEUE_PARAMETERS, que inclui um novo identificador de fila e uma entrada na tabela MSI-X.

A estrutura NDIS_RECEIVE_QUEUE_PARAMETERS é utilizada no OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE e no OID OID_RECEIVE_FILTER_QUEUE_PARAMETERS. Para obter mais informações sobre parâmetros de fila de VM, consulte Obtendo e atualizando parâmetros de fila de VM.

O driver sobrejacente inicializa a estrutura NDIS_RECEIVE_QUEUE_PARAMETERS com os seguintes parâmetros de configuração para a fila:

  • O tipo de fila (NdisReceiveQueueTypeVMQueue da enumeração NDIS_RECEIVE_QUEUE_TYPE.)

  • A afinidade do processador para a fila.

  • O nome da fila e o nome da máquina virtual.

  • Os parâmetros lookahead-split.

    Nota A partir do NDIS 6.30, não há mais suporte para a divisão de dados de pacotes em buffers de previsão separados.

Nota O controlador sobreposto pode definir as flags NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION e NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED no membro Flags da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS. Os outros sinalizadores não são usados para alocação de filas.

Quando o NDIS recebe uma solicitação OID para alocar uma fila de recebimento, ele verifica os parâmetros da fila. Depois que o NDIS aloca os recursos necessários e o identificador de fila, ele envia a solicitação OID para o driver de miniporta subjacente. O identificador de fila é exclusivo para o adaptador de rede associado.

Se o driver de miniporta puder alocar com êxito os recursos de software e hardware necessários para a fila de recebimento, ele concluirá a solicitação OID com um status de sucesso.

Antes de enviar a solicitação OID para o driver de miniporta, o NDIS atribui um identificador de fila no membro QueueId da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS e passa o pedido do método para o driver de miniporta. O driver de miniporta fornece a entrada de tabela MSI-X no membro MSIXTableEntry.

O driver de miniporta deve manter os identificadores de fila para as filas de recebimento alocadas. O NDIS usa o identificador de fila de uma fila de recebimento para chamadas subsequentes ao driver de miniporta para definir um filtro de recebimento na fila de recebimento, alterar os parâmetros da fila de recebimento ou liberar a fila de recebimento.

Nota A fila padrão (identificador de fila zero) é sempre alocada e não pode ser liberada.

O driver superior deve usar o identificador de fila que o NDIS fornece em solicitações de OID subsequentes, por exemplo, para modificar os parâmetros da fila ou liberar a fila. O identificador de fila também é incluído nos dados OOB em todas as NET_BUFFER_LIST estruturas associadas à fila. Os drivers usam a macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID para recuperar o identificador de fila em uma estrutura NET_BUFFER_LIST.

Observação Um driver de protocolo pode definir filtros VMQ a qualquer momento depois de alocar com êxito uma fila e antes que a fila seja excluída.

O driver de protocolo emite uma solicitação OID de método OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE para concluir a alocação de fila. O driver de miniporta pode alocar memória compartilhada e outros recursos quando a alocação estiver concluída. Para obter mais informações sobre como alocar recursos de memória compartilhada, consulte Shared Memory Resource Allocation.

Depois de um driver de miniporta receber uma solicitação OID de OID_RECEIVE_FILTER_QUEUE_ALLOCATION e processá-la com êxito, a fila está no estado Alocado. Para obter mais informações sobre estados de fila, consulte Estados da fila e operações.

Depois que um driver sobreposto aloca uma ou mais filas de recebimento (e, opcionalmente, define os filtros iniciais), ele deve emitir OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE definir solicitações OID para notificar o driver de miniporta de que a alocação está concluída para o lote atual de filas de recebimento.

O driver de miniporta não deve reter nenhum pacote em uma fila de recebimento se não houver filtros definidos nessa fila. Se uma fila nunca teve nenhum filtro definido ou todos os filtros foram limpos, a fila deve estar vazia e todos os pacotes devem ser descartados. Ou seja, eles não são indicados na pilha de controladores ou retidos na fila.

Os drivers subjacentes usam o OID_RECEIVE_FILTER_FREE_QUEUE OID para liberar filas que alocam. Para obter mais informações sobre como liberar filas, consulte Liberando uma fila de VM.