Definindo um filtro VMQ

Depois que uma fila de recebimento é alocada, os drivers de sobreposição podem definir filtros na fila de recebimento. Somente o driver que alocou uma fila de recebimento pode definir um filtro nessa fila.

Nota Como a fila de recebimento padrão (NDIS_DEFAULT_RECEIVE_QUEUE_ID) sempre existe, os drivers em excesso sempre podem definir um filtro de recebimento na fila padrão. Os drivers em excesso não possuem a fila padrão. Portanto, todos os drivers de protocolo associados a um adaptador de rede podem usar a fila padrão.

Definindo um filtro em uma fila de recebimento

Para definir um filtro em uma fila de recebimento com um conjunto inicial de parâmetros de configuração, um driver sobreposto emite uma solicitação OID (identificador de objeto de método) OID_RECEIVE_FILTER_SET_FILTER . O membro InformationBuffer da estrutura NDIS_OID_REQUEST inicialmente contém um ponteiro para uma estrutura NDIS_RECEIVE_FILTER_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 uma estrutura NDIS_RECEIVE_FILTER_PARAMETERS com um novo identificador de filtro.

O driver de sobreposição inicializa a estrutura NDIS_RECEIVE_FILTER_PARAMETERS com os seguintes parâmetros de configuração de filtro para a fila de recebimento:

  • O tipo de filtro especificado por meio de um valor de enumeração NDIS_RECEIVE_FILTER_TYPE .

    Nota A partir do NDIS 6.20, somente os tipos de filtro NdisReceiveFilterTypeVMQueue têm suporte para a interface VMQ (fila de máquina virtual).

  • O identificador da fila.

  • Um ou mais parâmetros de teste de campo formatados como estruturas de NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Para VMQ, os parâmetros de teste de campo a seguir são definidos.

    • O endereço MAC (controle de acesso à mídia de destino) no pacote é igual ao endereço MAC especificado.

    • O identificador de VLAN (LAN virtual) no pacote é igual ao identificador de VLAN especificado.

A estrutura NDIS_RECEIVE_FILTER_PARAMETERS é usada com o OID do OID_RECEIVE_FILTER_PARAMETERS e o OID do OID_RECEIVE_FILTER_SET_FILTER para especificar os parâmetros de configuração de um filtro.

Os membros FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize da estrutura NDIS_RECEIVE_FILTER_PARAMETERS definem uma matriz de estruturas NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Cada estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS na matriz define o critério de teste de filtro para um campo em um cabeçalho de rede.

O membro Flags da estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS especifica ações a serem executadas para o filtro de recebimento. Os seguintes pontos se aplicam ao sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO :

  • Se o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO for definido no membro Flags da estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , o adaptador de rede deverá indicar apenas os pacotes recebidos que correspondam a todos os seguintes critérios de teste:

    • Um pacote com um endereço MAC correspondente.

    • Um pacote que não tem nenhuma marca VLAN ou tem um identificador de VLAN igual a zero.

    Se o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO estiver definido, o adaptador de rede não deverá indicar pacotes que tenham um endereço MAC correspondente e um identificador de VLAN diferente de zero.

    Nota Se o comutador extensível do Hyper-V definir o filtro de endereço MAC e nenhum filtro de identificador de VLAN estiver configurado no OID_RECEIVE_FILTER_SET_FILTER, a opção também definirá o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .

  • Se o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO não estiver definido e não houver nenhum filtro de identificador de VLAN configurado por uma solicitação de conjunto de OID de OID_RECEIVE_FILTER_SET_FILTER, o driver de miniporto deverá fazer um dos seguintes procedimentos:

    • Se o driver de miniporta der suporte ao NDIS 6.20, ele deverá retornar um status com falha para a solicitação OID de OID_RECEIVE_FILTER_SET_FILTER.

    • Se o driver de miniporto der suporte ao NDIS 6.30 ou versões posteriores do NDIS, ele deverá configurar o adaptador de rede para inspecionar e filtrar os campos de endereço MAC especificados. Se uma marca VLAN estiver presente no pacote recebido, o adaptador de rede deverá removê-la dos dados do pacote. O driver de miniporta deve colocar a marca VLAN em um NDIS_NET_BUFFER_LIST_8021Q_INFO associado à estrutura de NET_BUFFER_LIST do pacote.

  • Se um driver de protocolo definir um filtro de endereço MAC e um filtro de identificador de VLAN com o OID_RECEIVE_FILTER_SET_FILTER OID, ele não definirá o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO em nenhum dos campos de filtro. Nesse caso, o driver de miniporto deve indicar pacotes que correspondam ao endereço MAC especificado e ao identificador de VLAN. Ou seja, o driver de miniporto não deve indicar pacotes com um endereço MAC correspondente que tenham um identificador de VLAN zero ou sejam pacotes não marcados.

Usando o identificador de filtro

O NDIS atribui um identificador de filtro no membro FilterId da estrutura NDIS_RECEIVE_FILTER_PARAMETERS e passa a solicitação de método OID de OID_RECEIVE_FILTER_SET_FILTER para o driver de miniporto subjacente. Cada filtro definido em uma fila de recebimento tem um identificador de filtro exclusivo para um adaptador de rede. Ou seja, os identificadores de filtro não são duplicados em filas diferentes gerenciadas pelo adaptador de rede.

O driver sobreposto deve usar o identificador de filtro que o NDIS fornece em solicitações OID posteriores; por exemplo, para modificar os parâmetros de filtro ou para liberar um filtro.

Quando o NDIS recebe uma solicitação OID para definir um filtro em uma fila de recebimento, ele verifica os parâmetros de filtro. Depois que o NDIS aloca os recursos necessários e o identificador de filtro, ele envia a solicitação OID para o adaptador de rede subjacente. Se o adaptador de rede puder alocar com êxito os recursos de software e hardware necessários para o filtro, ele concluirá a solicitação OID com NDIS_STATUS_SUCCESS.

O driver de miniporto deve reter os identificadores de filtro para os filtros de recebimento alocados. O NDIS usa o identificador de filtro de um filtro com solicitações OID posteriores para alterar os parâmetros de filtro de recebimento ou limpar o filtro de recebimento. Para obter mais informações sobre como alterar parâmetros e limpar filtros, consulte Obtendo e atualizando parâmetros de fila de VM e Limpando um filtro VMQ.

Manipulando o filtro em uma fila de recebimento

O driver de miniporta programa o adaptador de rede com base nos filtros da seguinte maneira:

  • Todos os parâmetros de teste de campo para um filtro específico devem corresponder para atribuir um pacote à fila.

  • Vários filtros podem ser definidos em uma fila.

  • Os pacotes deverão ser atribuídos à fila de recebimento se qualquer um dos filtros passar.

O adaptador de rede combina os resultados de todos os testes de campo com uma operação AND lógica. Ou seja, se qualquer teste de campo incluído na matriz de estruturas NDIS_RECEIVE_FILTER_FIELD_PARAMETERS falhar, o pacote de rede não atenderá ao critério de filtro especificado.

Quando um adaptador de rede testa um pacote recebido em relação a esses critérios de filtro, ele deve ignorar todos os campos no pacote que não têm critérios de teste especificados.

Recebendo pacotes de uma fila de recebimento

Depois que um driver de miniporto recebe uma solicitação OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE e tem filtros definidos na fila, a fila está no estado Em execução . Enquanto a fila está nesse estado, o driver de miniporta pode indicar pacotes na fila. Para obter mais informações sobre estados de fila, consulte Estados e operações de fila.

Se o driver de miniporto tiver recebido uma solicitação OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE para uma fila, mas não houver filtros definidos na fila, o driver de miniporto não deverá indicar nenhum pacote de recebimento nessa fila. Nesse caso, quando o driver de miniporto recebe uma solicitação OID OID_RECEIVE_FILTER_SET_FILTER para a fila e, possivelmente, antes de concluir a solicitação OID, ele pode indicar pacotes nessa fila. Se o driver de miniporto indicar pacotes em uma fila enquanto estiver processando uma solicitação OID OID_RECEIVE_FILTER_SET_FILTER, o driver de miniporto deverá concluir a solicitação de OID_RECEIVE_FILTER_SET_FILTER que tenha um código de retorno NDIS_STATUS_SUCCESS .