Partilhar via


Configurando um filtro de recebimento em uma porta virtual

Depois que uma porta virtual (VPort) é criada na opção NIC do adaptador de rede, os drivers overlying podem definir filtros de recebimento no VPort. Somente o driver que criou o VPort pode definir um filtro de recebimento nesse VPort

Este tópico inclui as informações a seguir:

Configurando um filtro de recebimento em um VPort

Usando o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO

Usando o identificador de filtro

Manipulando filtros de recebimento em um VPort

Para obter mais informações sobre como criar um VPort, consulte Criando uma porta virtual.

Nota Como o VPort padrão sempre existe e nunca é criado explicitamente, qualquer driver subjacente pode definir um filtro de recebimento no VPort padrão. Os drivers em excesso não possuem o VPort padrão. Portanto, todos os drivers de protocolo associados a um adaptador de rede podem usar o VPort padrão. O VPort padrão tem um valor de identificador de NDIS_DEFAULT_VPORT_ID.

Configurando um filtro de recebimento em um VPort

Para definir e configurar um filtro em um VPort, um driver sobreposto emite uma solicitação de método OID (identificador de objeto) de 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 .

Antes que o driver sobreposto emita essa solicitação de método OID, ele deve inicializar uma estrutura de NDIS_RECEIVE_FILTER_PARAMETERS . O driver deve definir os membros dessa estrutura da seguinte maneira:

  • O membro FilterType deve ser definido como um valor de enumeração NDIS_RECEIVE_FILTER_TYPE.

    Nota A partir do NDIS 6.30, somente os tipos de filtro NdisReceiveFilterTypeVMQueue têm suporte para a interface de virtualização de E/S raiz única (SR-IOV).

  • O membro QueueId deve ser definido como NDIS_DEFAULT_RECEIVE_QUEUE_ID.

  • O membro VPortId deve ser definido como o identificador associado ao VPort. O driver overlying obtém o identificador VPort por meio de uma das seguintes maneiras:

  • O membro FilterId deve ser definido como NDIS_DEFAULT_RECEIVE_FILTER_ID.

    Nota O NDIS atribui um identificador de filtro exclusivo neste membro antes de encaminhar a solicitação OID para o driver de miniporto para processamento.

  • Os membros FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize da estrutura NDIS_RECEIVE_FILTER_PARAMETERS devem ser definidos adequadamente para definir 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.

    Para a interface SR-IOV, os seguintes parâmetros de teste de campo 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.

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_FILTER_PARAMETERS com um novo identificador de filtro.

Usando o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO

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 estiver definido no membro Flags , 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 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 a pilha de virtualização definir o filtro de endereço MAC e nenhum filtro de identificador de VLAN for configurado pela solicitação de conjunto de OID_RECEIVE_FILTER_SET_FILTER , a opção também definirá o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .

  • A partir do NDIS 6.30, 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 pela solicitação de método OID_RECEIVE_FILTER_SET_FILTER , o driver de miniporte deverá fazer um dos seguintes procedimentos:

    • O driver de miniporte deve retornar uma status com falha para a solicitação do método OID_RECEIVE_FILTER_SET_FILTER.

    • O driver de miniporte deve 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 miniporto deve colocar a marca VLAN em um NDIS_NET_BUFFER_LIST_8021Q_INFO associado à estrutura 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 a solicitação de método OID_RECEIVE_FILTER_SET_FILTER , 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 miniporte não deve indicar pacotes com um endereço MAC correspondente que tenham um identificador VLAN zero ou que sejam pacotes não registrados.

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 um VPort 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 para alterar os parâmetros de filtro ou para liberar um filtro.

Quando o NDIS recebe uma solicitação OID para definir um filtro em um VPort, 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 manter 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 filtros de recebimento em um VPort

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 ao VPort.

  • Vários filtros podem ser definidos em um VPort.

  • Os pacotes devem ser atribuídos ao VPort se algum 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 de 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.