Manipulando filtros de recebimento de união de pacotes
Vários filtros de recebimento são baixados para um driver de miniporta por meio de solicitações de método OID de OID_RECEIVE_FILTER_SET_FILTER. Cada filtro pode especificar um ou mais testes (testes de campo de cabeçalho) que o adaptador de rede usa para determinar se um pacote recebido deve ser unido em um buffer de união de hardware no adaptador.
Antes que o driver de miniporta configure o adaptador de rede com os filtros de recebimento, o driver deve otimizar os filtros de recebimento com base nos recursos de hardware do adaptador. Por exemplo, todos os filtros de recebimento exigem um teste de campo de cabeçalho para o cabeçalho MAC. Portanto, o driver pode otimizar as regras de filtro com base nos resultados desse teste. Isso permite que o adaptador determine quais testes de campo de cabeçalho de OSI (Open Systems Interconnection) camada 3 (L3) e L4 (camada 4) executar a seguir.
Assim que o adaptador de rede tiver sido configurado com filtros de recebimento, ele deverá fazer o seguinte:
Todos os parâmetros de teste do campo de cabeçalho para um filtro específico devem corresponder ao pacote recebido para unir o pacote no buffer de união.
O adaptador de rede combina os resultados de todos os testes de campo de cabeçalho de um filtro de recebimento com uma operação AND lógica. Ou seja, se qualquer teste de campo de cabeçalho incluído na matriz de estruturas de NDIS_RECEIVE_FILTER_FIELD_PARAMETERS para um filtro de recebimento falhar, o pacote recebido não atenderá ao critério de filtro especificado e não deverá ser unido.
O adaptador de rede inspeciona apenas os dados do pacote com base nos parâmetros de teste de campo de cabeçalho especificados. O adaptador deve ignorar todos os campos de cabeçalho no pacote para o qual os testes de campo de cabeçalho não são especificados.
Se um pacote recebido corresponder a todos os testes de campo de cabeçalho para qualquer um dos filtros de recebimento, o adaptador de rede deverá unir o pacote dentro do buffer de união de hardware. Assim que o primeiro pacote é unido, o adaptador de rede deve iniciar um temporizador de hardware e deve definir o tempo de expiração para o valor do membro MaxCoalescingDelay da estrutura NDIS_RECEIVE_FILTER_PARAMETERS para o filtro de recebimento correspondente.
À medida que mais pacotes são recebidos que correspondem a um filtro de recebimento de união de pacotes, o adaptador de rede os coloca no buffer de união.
Se o temporizador de hardware já estiver em execução, o adaptador não deverá parar nem reiniciar o temporizador para o filtro de recebimento correspondente. No entanto, o adaptador pode configurar o temporizador de hardware com o menor valor de expiração dos filtros de recebimento correspondentes. Por exemplo, quando o driver recebe um pacote que corresponde ao filtro de recebimento X, o adaptador inicia o temporizador com o valor de expiração especificado para esse filtro de recebimento. Se o adaptador receber um pacote que corresponda ao filtro de recebimento Y, o adaptador poderá reconfigurar o temporizador de hardware com o valor de expiração especificado para esse filtro de recebimento.
Nota O adaptador de rede não deverá reconfigurar o temporizador de hardware se o tempo restante no temporizador for menor que o tempo de expiração de um filtro de recebimento.
Assim que os pacotes recebidos são agrupados, o adaptador de rede gera uma interrupção se qualquer um dos seguintes eventos ocorrer:
Se o espaço disponível dentro do buffer de união de hardware atingir uma marca de pouca água específica do hardware, o adaptador de rede deverá gerar uma interrupção de recebimento para que o driver de miniporta possa processar os pacotes de recebimento unidos.
Se o temporizador de hardware usado para o buffer de união de hardware expirar, o adaptador de rede deverá gerar uma interrupção de recebimento para que o driver de miniporta possa processar os pacotes de recebimento unidos.
Se um filtro de recebimento for limpo e os pacotes tiverem sido unidos que correspondam a esse filtro, o adaptador de rede deverá gerar uma interrupção de recebimento para que o driver de miniporto possa processar os pacotes de recebimento unidos.
Se um pacote recebido não corresponder a nenhum dos filtros de recebimento, o adaptador de rede deverá gerar uma interrupção de recebimento para que o driver de miniporto possa processar o pacote recebido. Se algum pacote tiver sido agrupado, o driver de miniporto também deverá processar esses pacotes.
Se o adaptador de rede gerar uma interrupção para qualquer outra interrupção status além de uma interrupção de recebimento, o adaptador de rede também deverá sinalizar uma interrupção de recebimento status para que o driver de miniporta possa processar os pacotes recebidos unidos.
Assim que a interrupção for gerada, o adaptador de rede deverá interromper o temporizador de hardware se ele não tiver expirado e deverá limpar o buffer de união de hardware.
O driver de miniporta deve manter um contador de pacotes unidos, que contém um valor para o número de pacotes recebidos que corresponderam a um filtro de união de pacotes. O NDIS consulta esse contador por meio de uma solicitação de consulta OID de OID_PACKET_COALESCING_FILTER_MATCH_COUNT.
O adaptador de rede só executa a união de pacotes enquanto o hardware está operando em um estado de energia total. Embora o hardware esteja em um estado de baixa potência, o adaptador deve filtrar apenas os pacotes recebidos com base em padrões de ativação que foram descarregados para o adaptador por meio de solicitações de conjunto de OID de OID_PNP_ENABLE_WAKE_UP.
Quando o adaptador de rede faz a transição para um estado de energia total, o driver de miniporta deve seguir estas etapas:
O driver de miniporta deve configurar o adaptador de rede para descartar quaisquer pacotes unidos dentro do buffer de união de hardware. O adaptador de rede pode ter unido esses pacotes quando ele foi transferido para um estado de baixa potência.
O driver de miniporta deve configurar o adaptador de rede com o conjunto de filtros de recebimento de união de pacotes que foram baixados para o driver antes da transição de baixa potência.
O driver de miniporta deve limpar o contador de pacotes unidos.