estrutura PD_BUFFER (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 tiver alocado o PD_BUFFER com um valor diferente de zero para ClientContextSize, o PDClientContext se referirá a um tamanho de buffer de ClientContextSize. Caso contrário, esse campo será NULL.
DataBufferVirtualAddress
Esse campo representa o endereço que os hosts e o 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 ao descarregamento de envio grande.
PDClientContextSize
Quando esse valor é diferente de zero, ele é 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 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 que acompanha terá esse atributo definido. 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.
Sinalizador | 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 desse 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 for definido, o valor RxFilterContext será substituído por um valor de ID de entrada de fluxo GFT.
MetaDataV0.RxHashValue
O valor de hash calculado 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 é calculado.
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 de 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 de 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 diferença de carimbo de data/hora RSC e TCP.
MetaDataV0.RxOffloads[2]
Descarregamentos RX 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 desse pacote.
MetaDataV0.TxComputeIPHeaderChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação do cabeçalho IP é calculada.
MetaDataV0.TxComputeTCPChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação TCP é calculada.
MetaDataV0.TxComputeUDPChecksum
Um campo de descarregamento TX comum que indica que a soma de verificação UDP é calculada.
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 de 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 rascunho que o provedor de PD pode usar para suas próprias finalidades enquanto o PD_BUFFER está na fila do provedor (em outras palavras, postado pelo cliente, mas ainda não esvaziado pelo cliente). Depois que o PD_BUFFER for esvaziado pelo cliente, não haverá garantia de que o conteúdo desse campo será preservado.
Comentários
Se um pacote L2 for representado por várias estruturas 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 parciais PD_BUFFER que constituem o pacote inteiro. Cada uma das estruturas de PD_BUFFER parciais deve apontar para a próxima PD_BUFFER parcial usando o campo 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 de cabeçalho, 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_BUFFER parcial. O cabeçalho PD_BUFFER deve conter até e incluindo 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 no cabeçalho PD_BUFFER.
Ao postar PD_BUFFER estruturas para receber filas, o 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 cabeçalhos 801Q removidos. 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 inalterado.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 10 |
Servidor mínimo com suporte | Windows Server 2016 |
Cabeçalho | ndis.h |