Partilhar via


Estados e operações da fila de espera

Para cada fila, um adaptador de rede deve suportar o seguinte conjunto de estados operacionais:

Indefinido
A fila não está alocada. Para alocar uma fila, um driver sobreposto envia um pedido de OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE.

Atribuído
O estado Alocado é o estado inicial de uma fila. Quando uma fila está no estado alocado, o driver sobreposto geralmente define filtros na fila com o OID_RECEIVE_FILTER_SET_FILTER OID ou conclui a alocação da fila com a solicitação OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE.

set
No estado Set, uma fila tem pelo menos um filtro alocado, mas o driver subjacente não enviou o OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID.

Corrida
No estado em execução , a fila tem filtros definidos, a alocação da fila está concluída e o adaptador de miniporta está indicando pacotes de recebimento para a fila.

Pausa
No estado Pausado , o adaptador de rede não indica dados de rede recebidos para a fila. Ou não havia filtros definidos na fila antes da solicitação OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE, ou todos os filtros que foram definidos na fila foram limpos com a solicitação OID_RECEIVE_FILTER_CLEAR_FILTER.

DMA parado
No estado DMA Parado, um driver de miniporta recebeu uma solicitação da OID_RECEIVE_FILTER_FREE_QUEUE. Quando o DMA é parado e o controlador emite a indicação de estado de DMA parado (com NDIS_STATUS_RECEIVE_QUEUE_STATE), o controlador entra no estado de libertação.

Libertação
No estado de liberação , um driver de miniporta conclui as operações necessárias para interromper as operações de envio e recebimento para a fila e libera os recursos associados. Depois que todas as indicações de recebimento pendentes forem concluídas, a fila é eliminada e passa a ser Indefinida.

Na tabela a seguir, os títulos são os estados da fila. Os principais eventos são listados na primeira coluna. As restantes entradas na tabela indicam o próximo estado para o qual a fila transita após a ocorrência de um evento dentro desse estado. As entradas em branco representam combinações de evento/estado inválidas.

Evento \ Estado Não definido Atribuído Conjunto Corrida Em pausa Parar DMA Libertação

OID_RECEIVE_FILTER_ALLOCATE_QUEUE - método (set)

Atribuído

OID_RECEIVE_FILTER_QUEUE_PARAMETERS - pedido de método (consulta)

Atribuído

Conjunto

Corrida

Em pausa

OID_RECEIVE_FILTER_QUEUE_PARAMETERS - definir pedido

Atribuído

Conjunto

Corrida

Em pausa

OID_RECEIVE_FILTER_SET_FILTER - pedido de método (definir)

Conjunto

Conjunto

Corrida

Corrida

OID_RECEIVE_FILTER_CLEAR_FILTER - definir solicitação (último filtro)

Atribuído

Em pausa

OID_RECEIVE_FILTER_CLEAR_FILTER - definir pedido (não último filtro)

Conjunto

Corrida

OID_RECEIVE_FILTER_ENUM_FILTERS - método (pedido de requisição)

Atribuído

Conjunto

Corrida

Em pausa

OID_RECEIVE_FILTER_PARAMETERS - requisição de método (consulta)

Conjunto

Corrida

OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE - pedido do método (definir)

Em pausa

Corrida

Receção de pacote

Corrida

OID_RECEIVE_FILTER_FREE_QUEUE solicitação de configuração

Parar DMA

Parar DMA

O DMA foi interrompido, e a indicação de estado NDIS_STATUS_RECEIVE_QUEUE_STATE foi enviada (Nota: o DMA provavelmente já se encontrava parado no estado Alocado ou Pausado).

Libertação

Todas as indicações recebidas estão completas e os recursos da fila são liberados

Não definido

Observação Os eventos listados na tabela anterior incluem alguns eventos secundários que não resultam em uma alteração de estado. Esses eventos secundários são incluídos na tabela para especificar os estados onde esses eventos são válidos.

Os eventos de fila primários são definidos da seguinte forma:

OID_RECEIVE_FILTER_ALLOCATE_QUEUE - pedido de método (definição)
Um driver superior alocou uma fila. Para obter mais informações sobre como alocar filas, consulte Alocando e liberando filas de VM.

OID_RECEIVE_FILTER_SET_FILTER - pedido de método (definir)
Um driver superior configurou um filtro numa fila. Se o driver sobreposto não tiver enviado o OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID, a fila estará no estado de Configuração. Caso contrário, a fila estará no estado em execução. Para obter mais informações sobre como definir filtros em filas, consulte Definindo e limpando filtros VMQ.

OID_RECEIVE_FILTER_CLEAR_FILTER - definir pedido
Um driver superior limpou um filtro numa fila. Se o último filtro foi limpo numa fila em execução, o DMA pode ser interrompido; as indicações de receção são paradas e a fila deve ser esvaziada dos dados recebidos, se houver. Para obter mais informações sobre a limpeza de filtros em filas, consulte Configuração e limpeza de filtros VMQ.

OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE - pedido de método (conjunto)
Um driver sobreposto completou a alocação da fila. Se houver filtros definidos na fila, ela está no estado 'Em Execução' e o recebimento de indicações pode começar. Para obter mais informações sobre como concluir a alocação de filas, consulte Alocação e Liberação de Filas de VMs.

Receber pacote
Um driver de miniporta só pode indicar pacotes de recebimento para uma fila que está no estado em execução. Para obter mais informações sobre como indicar dados recebidos para filas, consulte Operações de envio e recebimento do VMQ.

OID_RECEIVE_FILTER_FREE_QUEUE definir pedido.
Um motorista sobreposto liberou uma fila. O motorista emite a indicação de status DMA-stop (com NDIS_STATUS_RECEIVE_QUEUE_STATE), o driver entra no estado de liberação. Quando todas as indicações de recebimento pendentes estiverem concluídas e os recursos da fila forem liberados, a fila torna-se indefinida.