Compartilhar via


Alocando uma fila de VMs

Para alocar uma fila com um conjunto inicial de parâmetros de configuração, um driver sobreposto emite uma solicitação OID do método OID_RECEIVE_FILTER_ALLOCATE_QUEUE . O membro InformationBuffer 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 de método OID, o membro InformationBuffer da estrutura NDIS_OID_REQUEST contém um ponteiro para uma estrutura NDIS_RECEIVE_QUEUE_PARAMETERS que tem um novo identificador de fila e uma entrada de tabela MSI-X.

A estrutura de NDIS_RECEIVE_QUEUE_PARAMETERS é usada 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 sobressoante inicializa a estrutura NDIS_RECEIVE_QUEUE_PARAMETERS com os seguintes parâmetros de configuração de 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 lookahead separados.

Nota O driver overlying pode definir os sinalizadores 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 fila.

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 miniporto subjacente. O identificador de fila é exclusivo para o adaptador de rede associado.

Se o driver de miniporte 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 êxito.

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

O driver de miniporto deve reter 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 miniporto 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 sobreposto deve usar o identificador de fila que o NDIS fornece em solicitações OID subsequentes, por exemplo, para modificar os parâmetros de fila ou liberar a fila. O identificador de fila também está incluído nos dados do OOB em todas as estruturas de NET_BUFFER_LIST 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.

Nota 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 do método OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE para concluir a alocação da fila. O driver de miniporte pode alocar memória compartilhada e outros recursos quando a alocação for concluída. Para obter mais informações sobre como alocar recursos de memória compartilhada, consulte Alocação de recursos de memória compartilhada.

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

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 de OID para notificar o driver de miniporto de que a alocação está concluída para o lote atual de filas de recebimento.

O driver de miniporte não deve reter nenhum pacote em uma fila de recebimento se não houver filtros definidos nessa fila. Se uma fila nunca tiver nenhum filtro definido ou todos os filtros tiverem sido limpos, a fila deverá estar vazia e todos os pacotes deverão ser descartados. Ou seja, eles não são indicados na pilha do driver ou retidos na fila.

Os drivers em excesso usam o OID OID_RECEIVE_FILTER_FREE_QUEUE para liberar filas alocadas. Para obter mais informações sobre como liberar filas, consulte Liberando uma fila de VMs.