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