Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Depois que uma fila de receção é alocada, os drivers de nível superior podem definir filtros na fila de receção. Somente o driver que alocou uma fila de recebimento pode definir um filtro nessa fila.
Observação Como a fila de recebimento padrão (NDIS_DEFAULT_RECEIVE_QUEUE_ID) sempre existe, os drivers sobrepostos sempre podem definir um filtro de recebimento na fila padrão. Os drivers superiores não possuem a fila padrão. Portanto, todos os drivers de protocolo que estão vinculados a um adaptador de rede podem usar a fila padrão.
Definindo um filtro em uma fila de recebimento
Para definir um filtro numa fila de receção com um conjunto inicial de parâmetros de configuração, um driver sobreposto emite um pedido de identificador de objeto de método OID OID_RECEIVE_FILTER_SET_FILTER. O InformationBuffer membro da estrutura NDIS_OID_REQUEST inicialmente contém um ponteiro para uma estrutura NDIS_RECEIVE_FILTER_PARAMETERS. Após um resultado 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 superior inicializa a estrutura NDIS_RECEIVE_FILTER_PARAMETERS com os seguintes parâmetros de configuração de filtro para a fila de receção:
O tipo de filtro especificado através de um valor de enumeração NDIS_RECEIVE_FILTER_TYPE.
Observação A partir do NDIS 6.20, somente NdisReceiveFilterTypeVMQueue tipos de filtro são suportados para a interface de fila de máquina virtual (VMQ).
O identificador de fila.
Um ou mais parâmetros de teste de campo que são formatados como estruturas NDIS_RECEIVE_FILTER_FIELD_PARAMETERS. Para VMQ, 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 LAN virtual (VLAN) no pacote é igual ao identificador de VLAN especificado.
A estrutura NDIS_RECEIVE_FILTER_PARAMETERS é utilizada com o OID_RECEIVE_FILTER_PARAMETERS OID e o OID_RECEIVE_FILTER_SET_FILTER OID para definir os parâmetros de configuração de um filtro.
Os FieldParametersArrayOffset, FieldParametersArrayNumElementse FieldParametersArrayElementSize membros 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 num cabeçalho de rede.
O membro Flags da estrutura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS especifica as ações a serem executadas para o filtro de receção. Os seguintes pontos aplicam-se ao sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO:
Se o flag 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 deve 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 de zero.
Se o sinalizador NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO estiver definido, o adaptador de rede não deve indicar pacotes que tenham um endereço MAC correspondente e um identificador VLAN diferente de zero.
Nota Se o switch extensível Hyper-V definir o filtro de endereço MAC e nenhum filtro identificador de VLAN estiver configurado em OID_RECEIVE_FILTER_SET_FILTER, o switch 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 OID de OID_RECEIVE_FILTER_SET_FILTER, o driver de miniporta deve optar por uma das seguintes ações:
Se o driver de miniporta suportar NDIS 6.20, ele deve retornar um status de falha para a solicitação OID de OID_RECEIVE_FILTER_SET_FILTER.
Se o driver de miniporta suportar NDIS 6.30 ou versões posteriores do NDIS, ele deve configurar o adaptador de rede para inspecionar e filtrar os campos de endereço MAC especificados. Se uma tag VLAN estiver presente no pacote recebido, o adaptador de rede deverá removê-la dos dados do pacote. O driver de miniporta deve colocar a etiqueta VLAN em uma NDIS_NET_BUFFER_LIST_8021Q_INFO que está associada à estrutura NET_BUFFER_LIST do pacote.
Se um driver de protocolo define um filtro de endereço MAC e um filtro de identificador de VLAN com o OID_RECEIVE_FILTER_SET_FILTER OID, ele não define o sinalizador de NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO em nenhum dos campos de filtro. Nesse caso, o driver de miniporta deve indicar pacotes que correspondam ao endereço MAC especificado e ao identificador VLAN. Ou seja, o driver de miniporta 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 na estrutura NDIS_RECEIVE_FILTER_PARAMETERS no membro FilterId e passa a solicitação de método OID de OID_RECEIVE_FILTER_SET_FILTER para o driver de miniporta 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 do 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 do 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 miniporta 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 do 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 devem ser atribuídos à fila de receção se algum dos filtros passarem.
O adaptador de rede combina os resultados de todos os testes de campo numa operação lógica E. 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.
Receção de pacotes a partir de uma fila de receção
Após o driver de miniporta receber uma solicitação de OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE e ter filtros aplicados na fila, a fila está no estado Em Execução . Enquanto a fila estiver nesse estado, o driver de miniporta pode indicar pacotes na fila. Para obter mais informações sobre estados de fila, consulte Estados da fila e operações.
Se o driver de miniporta recebeu uma solicitação OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE para uma fila, mas não há filtros definidos na fila, o driver de miniporta não deve indicar nenhum pacote recebido nessa fila. Nesse caso, quando o driver de miniporta 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 miniporta indicar pacotes numa fila enquanto processa uma solicitação OID_RECEIVE_FILTER_SET_FILTER, o driver de miniporta deverá concluir a solicitação de OID_RECEIVE_FILTER_SET_FILTER que tenha um código de retorno NDIS_STATUS_SUCCESS.