W_TCP_OFFLOAD_RECEIVE_HANDLER função de retorno de chamada (ndischimney.h)

[O recurso de descarregamento de chaminé TCP foi preterido e não deve ser usado.]

O NDIS chama a função MiniportTcpOffloadReceive para postar solicitações de recebimento (buffers de recebimento) em uma conexão TCP descarregada.

Sintaxe

W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;

NDIS_STATUS WTcpOffloadReceiveHandler(
  [in] IN NDIS_HANDLE MiniportAdapterContext,
  [in] IN PVOID MiniportOffloadContext,
  [in] IN PNET_BUFFER_LIST NetBufferList
)
{...}

Parâmetros

[in] MiniportAdapterContext

O identificador para uma área de contexto alocada de destino de descarregamento na qual o destino de descarregamento mantém informações de estado sobre essa instância do adaptador. O driver de miniporto forneceu esse identificador ao NDIS quando ele chamou NdisMSetMiniportAttributes de sua Função MiniportInitializeEx .

[in] MiniportOffloadContext

Um ponteiro para um local de memória que contém um valor PVOID. Esse valor PVOID faz referência ao contexto de descarregamento de miniporto que contém o objeto de estado para a conexão TCP na qual as solicitações de recebimento estão sendo postadas. O destino de descarregamento forneceu esse valor PVOID quando ele descarregou o objeto de estado de conexão TCP.

[in] NetBufferList

Um ponteiro para uma estrutura NET_BUFFER_LIST . Essa estrutura pode ser uma estrutura autônoma ou a primeira estrutura em uma lista vinculada de estruturas de NET_BUFFER_LIST. Cada estrutura NET_BUFFER_LIST na lista descreve uma estrutura NET_BUFFER . A estrutura NET_BUFFER é mapeada para uma cadeia de MDLs (listas de descritores de memória). Os NET_BUFFER_LIST e as estruturas associadas são bloqueados para que permaneçam residentes na memória física. No entanto, eles não são mapeados na memória do sistema.

Retornar valor

NDIS_STATUS_PENDING é o único valor retornado permitido. Um destino de descarregamento sempre é concluído (retorna) solicitações de recebimento postadas de forma assíncrona chamando NdisTcpOffloadReceiveComplete.

Comentários

Um aplicativo cliente pode postar solicitações de recebimento em uma conexão TCP descarregada. O destino de descarregamento usa essas solicitações para transferir dados recebidos na conexão com o aplicativo cliente. Se as solicitações de recebimento forem postadas em uma conexão, o destino de descarregamento sempre deverá usá-las para transferir dados recebidos na conexão. Para obter mais informações, consulte Algoritmo de entrega.

O destino de descarregamento enfileira as estruturas de NET_BUFFER_LIST postadas na ordem FIFO (first in, first out). O destino de descarregamento usa o membro MiniportReserved de cada estrutura NET_BUFFER_LIST para enfileirar a estrutura.

Cada estrutura NET_BUFFER_LIST passada para a função MiniportTcpOffloadReceive tem apenas uma estrutura NET_BUFFER associada a ela.

O destino de descarregamento deve colocar dados de recebimento nas solicitações de recebimento postadas na ordem FIFO. Ou seja, os dados recebidos primeiro devem ser colocados na primeira solicitação de recebimento postada e assim por diante.

A pilha de host serializa chamadas para a função MiniportTcpOffloadReceive por conexão. A pilha de host não chamará a função MiniportTcpOffloadReceive em uma conexão enquanto uma chamada para a função MiniportTcpOffloadReceive nessa conexão estiver em andamento. Isso garante que as solicitações de recebimento sejam sempre postadas na ordem correta para a função MiniportTcpOffloadReceive de um destino de descarregamento.

Observe, no entanto, que a pilha de host pode chamar a função MiniportTcpOffloadReceive em uma conexão antes que o destino de descarregamento tenha concluído uma ou mais chamadas anteriores para a função MiniportTcpOffloadReceive nessa mesma conexão. Observe também que a pilha de host pode chamar a função MiniportTcpOffloadReceive de um destino de descarregamento em uma conexão, enquanto uma ou mais chamadas para a função MiniportTcpOffloadReceive estão em andamento em outra conexão.

Opcionalmente, uma solicitação de recebimento postada pode estar em qualquer um dos dois modos:

  • Modo de envio por push
  • Modo nonpush
Observe que um destino de descarregamento deve dar suporte ao modo de push e ao modo nonpush. .

Para determinar em qual modo um buffer está, um destino de descarregamento chama a macro NET_BUFFER_LIST_INFO para obter o valor de TcpReceiveNoPush. Se o valor for TRUE, a solicitação de recebimento estará no modo nonpush.

Se a solicitação de recebimento estiver no modo push, o destino de descarregamento recuperará o valor de TcpReceiveBytesTransferred chamando a macro NET_BUFFER_LIST_INFO. Se esse valor não for zero, o destino de descarregamento iniciará imediatamente o temporizador de push para a conexão. Se esse valor for zero, o destino de descarregamento iniciará o temporizador de push para a conexão assim que o destino de descarregamento colocar o primeiro byte de dados de recebimento na solicitação de recebimento. O destino de descarregamento sempre conclui as solicitações de recebimento preenchidas imediatamente. O destino de descarregamento conclui uma solicitação de recebimento parcialmente preenchida que está no modo push se ocorrer um dos seguintes procedimentos:

  • O temporizador de push expira.
  • O destino de descarregamento recebe um segmento TCP na conexão que tem o bit PSH definido.
Se a solicitação de recebimento estiver no modo nonpush, o destino de descarregamento não iniciará um temporizador de push. O destino de descarregamento conclui a solicitação de recebimento somente quando a solicitação de recebimento é preenchida. O destino de descarregamento ignora o bit PSH em segmentos TCP que ele recebe na conexão.

Se os dados forem recebidos em uma conexão descarregada enquanto o temporizador de push estiver em execução, o destino de descarregamento deverá reiniciar o temporizador de push para essa conexão.

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho ndischimney.h (inclua Ndischimney.h)
IRQL Qualquer nível

Confira também

MiniportInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMSetMiniportAttributes

NdisTcpOffloadReceiveComplete