PD_BUFFER estrutura (ndis.h)
Essa estrutura representa um pacote PD (PacketDirect) ou uma parte de um pacote PD em uma fila.
Sintaxe
typedef struct _PD_BUFFER {
struct _PD_BUFFER *NextPDBuffer;
struct _PD_BUFFER *NextPartialPDBuffer;
PVOID PDClientReserved;
PVOID PDClientContext;
PUCHAR DataBufferVirtualAddress;
DMA_LOGICAL_ADDRESS DataBufferDmaLogicalAddress;
ULONG DataBufferSize;
USHORT PDClientContextSize;
USHORT Attributes;
USHORT Flags;
USHORT DataStart;
ULONG DataLength;
union {
struct {
union {
ULONG64 RxFilterContext;
ULONG64 GftFlowEntryId;
};
ULONG RxHashValue;
union {
struct {
ULONG RxIPHeaderChecksumSucceeded : 1;
ULONG RxTCPChecksumSucceeded : 1;
ULONG RxUDPChecksumSucceeded : 1;
ULONG RxIPHeaderChecksumFailed : 1;
ULONG RxTCPChecksumFailed : 1;
ULONG RxUDPChecksumFailed : 1;
ULONG RxHashComputed : 1;
ULONG RxHashWithL4PortNumbers : 1;
ULONG RxGftDirectionIngress : 1;
ULONG RxGftExceptionPacket : 1;
ULONG RxGftCopyPacket : 1;
ULONG RxGftSamplePacket : 1;
ULONG RxReserved1 : 4;
ULONG RxCoalescedSegCount : 16;
ULONG RxRscTcpTimestampDelta;
};
ULONG RxOffloads[2];
};
union {
struct {
ULONG TxIsIPv4 : 1;
ULONG TxIsIPv6 : 1;
ULONG TxTransportHeaderOffset : 10;
ULONG TxMSS : 20;
ULONG TxComputeIPHeaderChecksum : 1;
ULONG TxComputeTCPChecksum : 1;
ULONG TxComputeUDPChecksum : 1;
ULONG TxIsEncapsulatedPacket : 1;
ULONG TxInnerPacketOffsetsValid : 1;
ULONG TxReserved1 : 11;
ULONG TxInnerFrameOffset : 8;
ULONG TxInnerIpHeaderRelativeOffset : 6;
ULONG TxInnerIsIPv6 : 1;
ULONG TxInnerTcpOptionsPresent : 1;
};
ULONG TxOffloads[2];
};
PD_BUFFER_VIRTUAL_SUBNET_INFO VirtualSubnetInfo;
PD_BUFFER_8021Q_INFO Ieee8021qInfo;
USHORT GftSourceVPortId;
ULONG Reserved;
UINT64 ProviderScratch;
} MetaDataV0;
};
} PD_BUFFER;
Membros
NextPDBuffer
Um ponteiro para a próxima estrutura PD_BUFFER na fila.
NextPartialPDBuffer
Um ponteiro para a próxima estrutura de PD_BUFFER parcial na fila.
PDClientReserved
Reservado para uso do sistema. Não use.
PDClientContext
O cliente e o provedor não têm permissão para modificar esse campo. Se um cliente alocou o PD_BUFFER com um valor diferente de zero para ClientContextSize, o PDClientContext refere-se a um tamanho de buffer de ClientContextSize. Caso contrário, esse campo será NULL.
DataBufferVirtualAddress
Esse campo representa o endereço que hosts e software podem usar para acessar/modificar o conteúdo do pacote. Os dados reais do pacote estão sempre em DataBufferVirtualAddress+DataStart. O provedor e a plataforma nunca modificam o valor desse campo após a inicialização do PD_BUFFER.
DataBufferDmaLogicalAddress
Esse campo representa o local de memória lógica usado para armazenar os dados do pacote. O provedor deve usar para DMA. Os dados reais do pacote estão sempre em DataBufferDmaLogicalAddress+DataStart. O provedor e a plataforma nunca devem modificar o valor desse campo após a inicialização do PD_BUFFER.
DataBufferSize
Esse é o tamanho total do buffer de dados alocado. O provedor e a plataforma nunca devem modificar o valor desse campo após a inicialização do PD_BUFFER. Esse tipo de dados é ULONG em vez de USHORT devido a um descarregamento de envio grande.
PDClientContextSize
Quando esse valor não é zero, é o tamanho do buffer apontado por PDClientContext. O valor desse campo só deve ser modificado pela plataforma. A plataforma não altera o valor desse campo após a alocação de PD_BUFFER.
Attributes
Os atributos nunca devem ser modificados pelo provedor. A tabela a seguir lista os atributos que essa estrutura PD_BUFFER pode ter.
Atributo | Descrição |
---|---|
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER | Um PD_BUFFER alocado com seu próprio buffer de dados de acompanhamento terá esse conjunto de atributos. Os atributos PD_BUFFER nunca devem ser modificados por clientes ou provedores. |
Flags
A tabela a seguir lista os sinalizadores que essa estrutura PD_BUFFER pode ter.
Bandeira | Descrição |
---|---|
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD | Indica que esse buffer é o cabeçalho de pacotes parciais. |
DataStart
Esse campo indica onde o pacote começa em relação ao endereço inicial original do buffer de dados alocado. O provedor nunca deve modificar esse campo. O provedor adiciona esse valor ao valor DataBufferDmaLogicalAddress para derivar o endereço DMA de destino real para recepção/transmissão de pacotes. Por exemplo, o valor de endereço DMA de destino no descritor de recebimento/transmissão de hardware deve ser definido como DataBufferDmaLogicalAddress+DataStart quando um PD_BUFFER é postado em uma fila de recebimento/transmissão.
DataLength
O comprimento do pacote ou dos dados parciais do pacote.
MetaDataV0
MetaDataV0.RxFilterContext
O provedor define isso como o valor de contexto de filtro obtido do filtro correspondente que guiou o pacote para a fila de recebimento. Os valores de contexto de filtro são especificados pelos clientes ao configurar filtros.
MetaDataV0.GftFlowEntryId
Se um dos bits RxGftExceptionPacket ou RxGftCopyPacket ou RxGftSamplePacket estiver definido, o valor RxFilterContext será substituído com um valor de ID de entrada de fluxo GFT.
MetaDataV0.RxHashValue
O valor de hash computado para o pacote de entrada que é direcionado para a fila de recebimento usando RSS.
MetaDataV0.RxIPHeaderChecksumSucceeded
Um campo de descarregamento RX comum que indica se a soma de verificação do cabeçalho IP foi bem-sucedida.
MetaDataV0.RxTCPChecksumSucceeded
Um campo de descarregamento RX comum que indica se a soma de verificação TCP foi bem-sucedida.
MetaDataV0.RxUDPChecksumSucceeded
Um campo de descarregamento RX comum que indica se a soma de verificação UDP foi bem-sucedida.
MetaDataV0.RxIPHeaderChecksumFailed
Um campo de descarregamento RX comum que indica se a soma de verificação do cabeçalho IP falhou.
MetaDataV0.RxTCPChecksumFailed
Um campo de descarregamento RX comum que indica se a soma de verificação TCP falhou.
MetaDataV0.RxUDPChecksumFailed
Um campo de descarregamento RX comum que indica se a soma de verificação UDP falhou.
MetaDataV0.RxHashComputed
Um campo de descarregamento RX comum que indica se o hash é computado.
MetaDataV0.RxHashWithL4PortNumbers
Um campo de descarregamento RX comum que indica que o hash é calculado com números de porta L4.
MetaDataV0.RxGftDirectionIngress
MetaDataV0.RxGftExceptionPacket
Um campo de descarregamento RX comum que indica que se trata de um pacote de exceção GFT.
MetaDataV0.RxGftCopyPacket
Um campo de descarregamento RX comum que indica que se trata de um pacote de cópia GFT.
MetaDataV0.RxGftSamplePacket
Um campo de descarregamento RX comum que indica que se trata de um pacote de exemplo GFT.
MetaDataV0.RxReserved1
Reservado.
MetaDataV0.RxCoalescedSegCount
Um campo de descarregamento RX comum que contém a quantidade de segmentos unidos.
MetaDataV0.RxRscTcpTimestampDelta
Um campo de descarregamento RX comum que contém a diferença de carimbo de data/hora RSC e TCP.
MetaDataV0.RxOffloads[2]
O RX descarrega para esse buffer.
MetaDataV0.TxIsIPv4
Um campo de descarregamento TX comum que indica que esse pacote é IPv4.
MetaDataV0.TxIsIPv6
Um campo de descarregamento TX comum que indica que esse pacote é IPv6.
MetaDataV0.TxTransportHeaderOffset
Um campo de descarregamento TX comum que contém o deslocamento de cabeçalho do pacote.
MetaDataV0.TxMSS
Um campo de descarregamento TX comum que contém o tamanho máximo do segmento deste pacote.
MetaDataV0.TxComputeIPHeaderChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação do cabeçalho IP é computada.
MetaDataV0.TxComputeTCPChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação TCP é computada.
MetaDataV0.TxComputeUDPChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação UDP é computada.
MetaDataV0.TxIsEncapsulatedPacket
Um campo de descarregamento TX comum que indica que o pacote está encapsulado.
MetaDataV0.TxInnerPacketOffsetsValid
Um campo de descarregamento TX comum que indica que os deslocamentos de pacote interno são válidos.
MetaDataV0.TxReserved1
Reservado.
MetaDataV0.TxInnerFrameOffset
Um campo de descarregamento TX comum que contém o deslocamento de quadro interno.
MetaDataV0.TxInnerIpHeaderRelativeOffset
Um campo de descarregamento TX comum que contém o deslocamento relativo do cabeçalho IP interno.
MetaDataV0.TxInnerIsIPv6
Um campo de descarregamento TX comum que indica que o pacote interno é IPv6.
MetaDataV0.TxInnerTcpOptionsPresent
Um campo de descarregamento TX comum que indica que as opções internas do TCP estão presentes.
MetaDataV0.TxOffloads[2]
Descarregamentos TX para esse buffer.
MetaDataV0.VirtualSubnetInfo
As informações da sub-rede virtual.
MetaDataV0.Ieee8021qInfo
As informações do IEEE 802.1Q.
MetaDataV0.GftSourceVPortId
A ID da porta virtual de origem GFT.
MetaDataV0.Reserved
Reservado para uso do sistema.
MetaDataV0.ProviderScratch
Um campo de zero que o provedor de PD pode usar para suas próprias finalidades enquanto o PD_BUFFER está sentado na fila do provedor (em outras palavras, postado pelo cliente, mas ainda não drenado pelo cliente). Depois que o PD_BUFFER for esvaziado pelo cliente, não haverá garantia de que o conteúdo desse campo será preservado.
Observações
Se um pacote L2 for representado por várias estruturas de PD_BUFFER, o primeiro PD_BUFFER deverá ter o sinalizador PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER definido e o campo NextPartialPDBuffer deverá apontar para as estruturas de PD_BUFFER parciais que constituem todo o pacote. Cada uma das estruturas de PD_BUFFER parciais deve apontar para a próxima PD_BUFFER parcial usando o NextPartialPDBuffer em vez do campo NextPDBuffer. O campo NextPDBuffer deve ser NULL em todas as estruturas de PD_BUFFER parciais, exceto no buffer principal. Todas as estruturas de PD_BUFFER parciais, exceto o buffer principal, devem ter o sinalizador PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER limpo. A última PD_BUFFER parcial deve ter seu campo NextPartialPDBuffer definido como NULL. O comprimento total do pacote L2 é a soma dos campos DataLength de cada PD_BUFFERparcial. O cabeçalho PD_BUFFER deve conter até e incluir o cabeçalho de transporte IP (TCP, UDP, SCTP etc). No caso de encapsulamento ou encapsulamento duplo, o cabeçalho de transporte IP mais interno deve estar contido na cabeça PD_BUFFER.
Ao postar PD_BUFFER estruturas para receber filas, DataLength é ignorado pelo provedor (para obter mais informações, consulte a descrição ReceiveDataLength na estrutura NDIS_PD_QUEUE_PARAMETERS). Ao esvaziar estruturas PD_BUFFER concluídas de filas de recebimento, o provedor armazena o comprimento do pacote recebido no campo DataLength. O comprimento não inclui FCS ou quaisquer cabeçalhos 801Q despojados. Ao postar PD_BUFFER estruturas para transmitir filas, o DataLength indica o comprimento do pacote a ser enviado. Ao esvaziar estruturas PD_BUFFER concluídas de filas de transmissão, o provedor deixa o campo DataLength sem modificação.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 10 |
servidor com suporte mínimo | Windows Server 2016 |
cabeçalho | ndis.h |