Partilhar via


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