Caminho de recebimento de VMQ
Um adaptador de rede indica um pacote recebido em uma 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 Operações de filtro VMQ.
Se o driver de protocolo subjacente definir o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION no membro Flags da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS, o driver de miniporto não deverá misturar estruturas NET_BUFFER_LIST para outras filas de recebimento com as estruturas NET_BUFFER_LIST para essa fila em uma única chamada para a 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 tiver sido definido, os drivers de miniporto poderão vincular estruturas NET_BUFFER_LIST para quadros de diferentes filas de VM e indicá-las 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 recebimento, 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 necessários para retornar todas as estruturas NET_BUFFER_LIST que foram indicadas em uma única chamada para a função ProtocolReceiveNetBufferLists 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 NDIS_RETURN_FLAGS_SINGLE_QUEUE no parâmetro ReturnFlags de NdisReturnNetBufferLists para indicar que todas as estruturas de NET_BUFFER_LIST retornadas pertencem à mesma fila de VM.
As indicações de recebimento de 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 NetBufferListFilteringInfo.
Defina o identificador de filtro nas informações NetBufferListFilteringInfo como zero.
As informações de NetBufferListFilteringInfo são especificadas em uma estrutura NDIS_NET_BUFFER_LIST_FILTERING_INFO . Para acessar a estrutura NDIS_NET_BUFFER_LIST_FILTERING_INFO nos dados OOB NET_BUFFER_LIST, um driver NDIS chama a macro NET_BUFFER_LIST_INFO e especifica o tipo de informação NetBufferListFilteringInfo.
Para acessar o identificador de filtro e o identificador de fila diretamente, use as macros NET_BUFFER_LIST_RECEIVE_FILTER_ID e NET_BUFFER_LIST_RECEIVE_QUEUE_ID.
As indicações de recebimento de VMQ devem definir informações de memória compartilhada no membro SharedMemoryInfo da estrutura NET_BUFFER .
Observação Quando uma VMQ é excluída (por exemplo, durante a migração dinâmica da VM), é possível que o driver de miniporto receba um NBL que contém um valor QueueId inválido. Se isso acontecer, o miniporto deverá ignorar a ID de fila inválida e usar 0 (a fila padrão). 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 driver de miniporto 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 de buffers de memória compartilhada em buffers de recebimento de VMQ, consulte Memória compartilhada em buffers de recebimento.
A indicação de recepção deve incluir as seguintes informações na estrutura NET_BUFFER_SHARED_MEMORY .
PróximoSegmento de Memória Compartilhada
Um ponteiro para a próxima estrutura NET_BUFFER_SHARED_MEMORY em uma lista vinculada terminada em NULL de tais estruturas.
Identificador de memória compartilhada
Um identificador de memória compartilhada NDIS que NdisAllocateSharedMemory retornou.
Deslocamento de memória compartilhada
Um deslocamento, em bytes, para o início dos dados desde o início do buffer de memória compartilhada.
SharedMemoryLength
O comprimento, em bytes, do segmento de memória compartilhada.
Se o driver de protocolo subjacente definir o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED no membro Flags da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS, cada NET_BUFFER incluirá:
Dois MDLs e estruturas SharedMemoryInfo correspondentes.
Um buffer pós-lookahead com espaço de aterramento.
Se necessário, o driver de protocolo copia o conteúdo do buffer lookahead para a área de aterramento. No entanto, o espaço de preenchimento deve existir mesmo que o pacote esteja inteiramente no buffer lookahead.
Se o driver subjacente 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 os membros DataLength e DataOffset na estrutura NET_BUFFER_DATA são definidos da mesma forma que são definidos para drivers que não usam VMQ. Os membros SharedMemoryLength e SharedMemoryOffset na estrutura SharedMemoryInfo podem ser definidos uma vez durante a inicialização. O driver de miniporto não é necessário para atualizar os membros SharedMemoryLength e SharedMemoryOffset para cada pacote recebido porque os drivers subjacentes e o NDIS podem usar o membro DataLength NET_BUFFER 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 subjacente não definirá o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED .