Partilhar via


Caminho de Recebimento de VMQ

Um adaptador de rede indica um pacote recebido numa fila, somente se ele passar em todos os testes de campo de filtro para um filtro definido nessa fila. Para obter mais informações sobre testes de filtro, consulte VMQ Filter Operations.

Se o driver de protocolo sobreposto definir o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION no Flags membro da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS, o driver de miniporta não deve misturar as estruturas de NET_BUFFER_LIST para outras filas de recebimento com as estruturas NET_BUFFER_LIST desta fila numa única chamada da função NdisMIndicateReceiveNetBufferLists. Além disso, o driver deve definir o sinalizador NDIS_RECEIVE_FLAGS_SINGLE_QUEUE no parâmetro ReceiveFlags da função NdisMIndicateReceiveNetBufferLists.

Se NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION não foi definido, os drivers de miniporta podem vincular estruturas de NET_BUFFER_LIST para quadros de diferentes filas de VM e indicá-los em uma única chamada para NdisMIndicateReceiveNetBufferLists. Nesse caso, a lista vinculada indicada de estruturas NET_BUFFER_LIST não precisa ser classificada por número de fila. NET_BUFFER_LIST estruturas para filas diferentes não precisam ser agrupadas.

Quando um driver de protocolo define NDIS_RETURN_FLAGS_SINGLE_QUEUE e retorna buffers de receção, todas as estruturas NET_BUFFER_LIST no parâmetro NetBufferLists da função NdisReturnNetBufferLists devem pertencer à mesma fila de VM. No entanto, os drivers de protocolo não são obrigados a retornar todas as estruturas de NET_BUFFER_LIST que foram indicadas em uma única chamada para a funçãoProtocolReceiveNetBufferLists em uma única chamada para NdisReturnNetBufferLists. Além disso, a lista retornada pode incluir estruturas NET_BUFFER_LIST de várias indicações de recebimento se elas pertencerem à mesma fila de VM.

Os drivers de protocolo definem o bit do NDIS_RETURN_FLAGS_SINGLE_QUEUE no parâmetro ReturnFlags de NdisReturnNetBufferLists para indicar que todas as estruturas NET_BUFFER_LIST devolvidas pertencem à mesma fila de VM.

As indicações de recebimento do VMQ devem incluir as seguintes informações fora de banda (OOB) no membro NetBufferListInfo das estruturas NET_BUFFER_LIST.

  • Especifique o identificador de fila nas informações de NetBufferListFilteringInfo.

  • Defina o identificador de filtro nas informações de NetBufferListFilteringInfo como zero.

O informações de NetBufferListFilteringInfo é especificado em uma estrutura NDIS_NET_BUFFER_LIST_FILTERING_INFO. Para acessar a estrutura NDIS_NET_BUFFER_LIST_FILTERING_INFO nos dados OOB do NET_BUFFER_LIST, um driver NDIS chama a macro NET_BUFFER_LIST_INFO e especifica o tipo de informação NetBufferListFilteringInfo.

Para aceder ao identificador de filtro e ao identificador de fila diretamente, use as macros NET_BUFFER_LIST_RECEIVE_FILTER_ID e NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

As indicações de receção do VMQ devem definir as informações de memória partilhada no membro SharedMemoryInfo da estrutura NET_BUFFER.

Observação Quando um VMQ é excluído (por exemplo, durante a migração ao vivo da VM), é possível que o driver miniporta receba um NBL que contém um valor de QueueId inválido. Se isso acontecer, a miniporta deve ignorar o ID de fila inválido e usar 0 (a fila padrão) em vez disso. O QueueId é encontrado na parte NetBufferListFilteringInfo dos dados OOB da NBL e é recuperado usando a macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Para indicar que o ponteiro NET_BUFFER_SHARED_MEMORY em SharedMemoryInfo é válido, o controlador de miniporta deve definir o sinalizador NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID no parâmetro ReceiveFlags da função NdisMIndicateReceiveNetBufferLists. Para obter mais informações sobre o layout dos buffers de memória partilhada nos buffers de receção VMQ, consulte Memória Partilhada em Buffers de Recepção.

A indicação de receção deve incluir as seguintes informações na estrutura NET_BUFFER_SHARED_MEMORY.

NextSharedMemorySegment
Um ponteiro para a próxima estrutura NET_BUFFER_SHARED_MEMORY numa lista encadeada terminada em NULLde tais estruturas.

SharedMemoryHandle
Um identificador de memória compartilhada NDIS que NdisAllocateSharedMemory retornou.

OffsetMemóriaPartilhada
Um deslocamento, em bytes, até o início dos dados a partir do começo do buffer de memória compartilhada.

SharedMemoryLength
O comprimento, em bytes, do segmento de memória compartilhada.

Se o driver de protocolo sobreposto definiu o sinalizador de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED no elemento Flags da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS, cada NET_BUFFER incluirá:

  • Duas MDLs e correspondentes SharedMemoryInfo estruturas.

  • Um buffer pós-antecipação com espaço de preenchimento.

Se necessário, o driver de protocolo copia o conteúdo do buffer lookahead para a área de preenchimento. No entanto, o espaço de preenchimento deve existir mesmo se o pacote estiver inteiramente no buffer lookahead.

Se o driver sobrejacente não definir o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED, cada estrutura NET_BUFFER incluirá um único MDL e uma única estrutura SharedMemoryInfo.

A contagem de bytes e o deslocamento de bytes no MDL e no DataLength e membros do DataOffset na estrutura NET_BUFFER_DATA são definidos da mesma forma que são definidos para drivers que não usam VMQ. O membro SharedMemoryLength e o membro SharedMemoryOffset na estrutura SharedMemoryInfo podem ser definidos uma vez durante a inicialização. O driver de miniporta não é obrigado a atualizar os membros SharedMemoryLength e SharedMemoryOffset para cada pacote recebido, porque os drivers sobrepostos e o NDIS podem usar o membro NET_BUFFERDataLength e a contagem de bytes MDL para determinar o início e o tamanho do pacote.

Observação A partir do NDIS 6.30 e do Windows Server 2012, não há mais suporte para a divisão de dados de pacotes em buffers lookahead separados. O driver de protocolo sobreposto não definirá o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED.