Compartilhar via


Especificando um filtro de recebimento de agrupamento de pacotes

Um driver sobressociente pode definir um ou mais filtros de recebimento em um driver de miniporte que dá suporte à união de pacotes NDIS. O driver sobressalente pode especificar até o número máximo de filtros de recebimento especificados pelo driver de miniporto no membro MaxPacketCoalescingFilters da estrutura NDIS_RECEIVE_FILTER_CAPABILITIES .

Nota O driver de protocolo overlying obtém a estrutura NDIS_RECEIVE_FILTER_CAPABILITIES dentro da estrutura NDIS_BIND_PARAMETERS . O driver de filtro overlying obtém a estrutura de NDIS_RECEIVE_FILTER_CAPABILITIES dentro da estrutura NDIS_FILTER_ATTACH_PARAMETERS .

Os downloads do driver sobreposto recebem filtros para o driver de miniporte emitindo solicitações de método OID de OID_RECEIVE_FILTER_SET_FILTER. O membro InformationBuffer da estrutura NDIS_OID_REQUEST para essa solicitação OID contém um ponteiro para um buffer alocado pelo chamador. Esse buffer é formatado para conter o seguinte:

Especificando um filtro de recebimento

Um driver sobressociante especifica um filtro de recebimento de agrupamento de pacotes inicializando uma estrutura NDIS_RECEIVE_FILTER_PARAMETERS com os parâmetros de configuração do filtro. Quando inicializa a estrutura NDIS_RECEIVE_FILTER_PARAMETERS , o driver sobressocionado deve seguir estas regras:

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

  • O membro QueueId deve ser definido como NDIS_DEFAULT_RECEIVE_QUEUE_ID.

    Nota A partir do NDIS 6.30, o filtro de recebimento de agrupamento de pacotes só tem suporte na fila de recebimento padrão do adaptador de rede. Essa fila de recebimento tem um identificador de NDIS_DEFAULT_RECEIVE_QUEUE_ID.

  • Se o driver sobreposto estiver criando um novo filtro de recebimento, ele deverá definir o membro FilterId como NDIS_DEFAULT_RECEIVE_FILTER_ID.

    Nota O NDIS gerará uma ID (identificador de filtro) exclusivo para o filtro de recebimento antes de encaminhar a solicitação de método OID de OID_RECEIVE_FILTER_SET_FILTER para o driver de miniporto.  

  • Se o driver sobreposto estiver modificando um filtro de recebimento existente, ele deverá definir o membro FilterId como a ID de filtro diferente de zero do filtro de recebimento. O driver sobreposto obtém a ID do filtro para o filtro de recebimento quando emite uma solicitação de método OID de OID_RECEIVE_FILTER_ENUM_FILTERS. Para obter mais informações sobre como modificar um filtro de recebimento, consulte Modificando filtros de recebimento de agrupamento de pacotes.

  • Os membros FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize da estrutura NDIS_RECEIVE_FILTER_PARAMETERS devem ser definidos para definir a matriz de um parâmetro de campo. Cada elemento na matriz é uma estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS que especifica os parâmetros para um teste de campo de cabeçalho de um filtro de recebimento.

  • O membro RequestedFilterIdBitCount deve ser definido como zero.

  • O MaxCoalescingDelay deve ser definido como o tempo máximo, em unidades de milissegundos, que o primeiro pacote que corresponde ao filtro de recebimento seja salvo e unido no adaptador de rede. Assim que o primeiro pacote que corresponde ao filtro for recebido, o adaptador de rede unirá o pacote e iniciará um temporizador de hardware cujo tempo de expiração é definido como o valor do membro MaxCoalescingDelay .

O driver sobressociante deve ordenar que os testes de campo de cabeçalho na matriz de parâmetros de campo estejam na mesma ordem em que os cabeçalhos mac e protocolo associados existiriam em um pacote.

Por exemplo, antes que o driver sobreposto especifique os parâmetros de filtro para um campo de protocolo IP versão 4 (IPv4), ele deve primeiro especificar os parâmetros de filtro para um campo de protocolo de cabeçalho MAC (NdisMacHeaderFieldProtocol). Dessa forma, o driver especifica um teste de campo de cabeçalho que verifica se o campo está definido como o valor EtherType correto (0x0800) para pacotes IPv4. Se o teste falhar, o adaptador não precisará executar o teste do campo de protocolo IPV4.

Especificando testes de campo de cabeçalho

Cada filtro de recebimento pode especificar um ou mais critérios de teste (testes de campo de cabeçalho). O adaptador de rede executa esses testes para determinar se um pacote recebido deve ser agrupado em um buffer de união de hardware no adaptador. Além disso, o driver sobreposto pode especificar testes de filtro separados para vários campos de cabeçalho de controle de acesso de mídia (MAC), IP versão 4 (IPv4) e IP versão 6 (IPv6).

Para otimizar a filtragem no adaptador de rede, os testes de campo de cabeçalho são baseados em nomes de campo de cabeçalho padronizados em vez de especificações de deslocamento/comprimento de bytes dentro dos dados do pacote. Usando nomes de cabeçalho/campo, o hardware ou firmware do adaptador de rede pode otimizar como vários testes de campo de cabeçalho são executados em um pacote recebido.

Cada filtro de recebimento pode conter um ou mais testes de campo de cabeçalho especificados por uma estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Cada estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS é um elemento da matriz de parâmetros de campo referenciado pelos membros FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize da estrutura NDIS_RECEIVE_FILTER_PARAMETERS .

O driver de miniporto deve seguir estas diretrizes quando trata de uma solicitação de método OID de OID_RECEIVE_FILTER_SET_FILTER:

  • Se o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO estiver definido no membro Flags da estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , o adaptador de rede só deverá indicar pacotes recebidos com um endereço MAC correspondente e pacotes ou pacotes não registrados com um identificador de VLAN igual a zero. Ou seja, o adaptador de rede não deve indicar pacotes com um endereço MAC correspondente e um identificador de VLAN diferente de 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 miniporte deverá fazer um dos seguintes procedimentos:

    • Se o driver de miniporto 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 miniporto deve colocar a marca VLAN em um NDIS_NET_BUFFER_LIST_8021Q_INFO associado à estrutura NET_BUFFER_LIST do pacote.

  • Se o driver sobressalente definir um filtro de endereço MAC e um filtro de identificador de VLAN na estrutura NDIS_RECEIVE_FILTER_PARAMETERS , 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.