struttura PD_BUFFER (ndis.h)

Questa struttura rappresenta un pacchetto PacketDirect (PD) o una parte di un pacchetto PD in una coda.

Sintassi

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;

Members

NextPDBuffer

Puntatore alla struttura PD_BUFFER successiva nella coda.

NextPartialPDBuffer

Puntatore alla struttura PD_BUFFER parziale successiva nella coda.

PDClientReserved

Riservato per l'utilizzo nel sistema. Non usare.

PDClientContext

Il client e il provider non sono autorizzati a modificare questo campo. Se un client ha allocato il PD_BUFFER con un valore diverso da zero per ClientContextSize, PDClientContext fa riferimento a una dimensione del buffer di ClientContextSize. In caso contrario, questo campo è NULL.

DataBufferVirtualAddress

Questo campo rappresenta l'indirizzo che ospita e software può usare per accedere/modificare il contenuto del pacchetto. I dati effettivi dei pacchetti sono sempre in DataBufferVirtualAddress+DataStart. Il provider e la piattaforma non modificano mai il valore di questo campo dopo l'inizializzazione PD_BUFFER .

DataBufferDmaLogicalAddress

Questo campo rappresenta il percorso di memoria logica utilizzato per l'archiviazione dei dati del pacchetto. Il provider deve usare per DMA. I dati effettivi dei pacchetti si trova sempre in DataBufferDmaLogicalAddress+DataStart. Il provider e la piattaforma non devono mai modificare il valore di questo campo dopo l'inizializzazione PD_BUFFER .

DataBufferSize

Questa è la dimensione totale del buffer di dati allocato. Il provider e la piattaforma non devono mai modificare il valore di questo campo dopo l'inizializzazione PD_BUFFER . Questo tipo di dati è ULONG anziché USHORT a causa di un offload di invio di grandi dimensioni.

PDClientContextSize

Quando questo valore è diverso da zero, corrisponde alla dimensione del buffer a cui punta PDClientContext. Il valore di questo campo deve essere modificato solo dalla piattaforma. La piattaforma non modifica il valore di questo campo dopo l'allocazione PD_BUFFER .

Attributes

Gli attributi non devono mai essere modificati dal provider. La tabella seguente elenca gli attributi che questa struttura PD_BUFFER può avere.

Attributo Descrizione
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Un PD_BUFFER allocato con il proprio buffer di dati associato avrà questo attributo impostato. Gli attributi PD_BUFFER non devono mai essere modificati da client o provider.

Flags

Nella tabella seguente sono elencati i flag che questa struttura PD_BUFFER può avere.

Flag Descrizione
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD Indica che questo buffer è l'intestazione di pacchetti parziali.

DataStart

Questo campo indica dove il pacchetto inizia rispetto all'indirizzo iniziale originale del buffer di dati allocato. Il provider non deve mai modificare questo campo. Il provider aggiunge questo valore al valore DataBufferDmaLogicalAddress per derivare l'indirizzo DMA di destinazione effettivo per la ricezione/trasmissione dei pacchetti. Ad esempio, il valore dell'indirizzo DMA di destinazione nel descrittore di ricezione/trasmissione hardware deve essere impostato su DataBufferDmaLogicalAddress+DataStart quando viene pubblicato un PD_BUFFER in una coda di ricezione/trasmissione.

DataLength

Lunghezza del pacchetto o dei dati parziali del pacchetto.

MetaDataV0

MetaDataV0.RxFilterContext

Il provider imposta questo valore sul valore del contesto di filtro ottenuto dal filtro corrispondente che ha guidato il pacchetto alla coda di ricezione. I valori del contesto di filtro vengono specificati dai client durante la configurazione dei filtri.

MetaDataV0.GftFlowEntryId

Se viene impostato uno dei bit RxGftExceptionPacket o RxGftCopyPacket o RxGftSamplePacket, il valore RxFilterContext viene sovrascritto con un valore ID voce del flusso GFT.

MetaDataV0.RxHashValue

Valore hash calcolato per il pacchetto in ingresso che viene usata per la coda di ricezione tramite RSS.

MetaDataV0.RxIPHeaderChecksumSucceeded

Campo di offload RX comune che indica se il checksum dell'intestazione IP è riuscito.

MetaDataV0.RxTCPChecksumSucceeded

Campo di offload RX comune che indica se il checksum TCP è riuscito.

MetaDataV0.RxUDPChecksumSucceeded

Campo di offload RX comune che indica se il checksum UDP è riuscito.

MetaDataV0.RxIPHeaderChecksumFailed

Campo di offload RX comune che indica se il checksum dell'intestazione IP non è riuscito.

MetaDataV0.RxTCPChecksumFailed

Campo di offload RX comune che indica se il checksum TCP non è riuscito.

MetaDataV0.RxUDPChecksumFailed

Campo di offload RX comune che indica se il checksum UDP non è riuscito.

MetaDataV0.RxHashComputed

Un campo di offload RX comune che indica se viene calcolato l'hash.

MetaDataV0.RxHashWithL4PortNumbers

Un campo di offload RX comune che indica che l'hash viene calcolato con i numeri di porta L4.

MetaDataV0.RxGftDirectionIngress

MetaDataV0.RxGftExceptionPacket

Un campo di offload RX comune che indica che si tratta di un pacchetto di eccezione GFT.

MetaDataV0.RxGftCopyPacket

Un campo di offload RX comune che indica che si tratta di un pacchetto di copia GFT.

MetaDataV0.RxGftSamplePacket

Un campo di offload RX comune che indica che si tratta di un pacchetto di esempio GFT.

MetaDataV0.RxReserved1

Riservato.

MetaDataV0.RxCoalescedSegCount

Campo di offload RX comune che contiene la quantità di segmenti uniti.

MetaDataV0.RxRscTcpTimestampDelta

Campo di offload RX comune che contiene la differenza di timestamp RSC e TCP.

MetaDataV0.RxOffloads[2]

Offload RX per questo buffer.

MetaDataV0.TxIsIPv4

Un campo di offload TX comune che indica che questo pacchetto è IPv4.

MetaDataV0.TxIsIPv6

Un campo di offload TX comune che indica che questo pacchetto è IPv6.

MetaDataV0.TxTransportHeaderOffset

Un campo di offload TX comune che contiene l'offset di intestazione del pacchetto.

MetaDataV0.TxMSS

Un campo di offload TX comune che contiene la dimensione massima del segmento di questo pacchetto.

MetaDataV0.TxComputeIPHeaderChecksum

Un campo di offload TX comune che indica che viene calcolato il checksum dell'intestazione IP.

MetaDataV0.TxComputeTCPChecksum

Campo di offload TX comune che indica che viene calcolato il checksum TCP.

MetaDataV0.TxComputeUDPChecksum

Un campo di offload TX comune che indica che viene calcolato il checksum UDP.

MetaDataV0.TxIsEncapsulatedPacket

Campo di offload TX comune che indica che il pacchetto è incapsulato.

MetaDataV0.TxInnerPacketOffsetsValid

Un campo di offload TX comune che indica che gli offset dei pacchetti interni sono validi.

MetaDataV0.TxReserved1

Riservato.

MetaDataV0.TxInnerFrameOffset

Un campo di offload TX comune che contiene l'offset del frame interno.

MetaDataV0.TxInnerIpHeaderRelativeOffset

Un campo di offload TX comune che contiene l'offset relativo dell'intestazione IP interna.

MetaDataV0.TxInnerIsIPv6

Un campo di offload TX comune che indica che il pacchetto interno è IPv6.

MetaDataV0.TxInnerTcpOptionsPresent

Un campo di offload TX comune che indica che sono presenti le opzioni TCP interne.

MetaDataV0.TxOffloads[2]

Offload TX per questo buffer.

MetaDataV0.VirtualSubnetInfo

Informazioni sulla subnet virtuale.

MetaDataV0.Ieee8021qInfo

Informazioni IEEE 802.1Q.

MetaDataV0.GftSourceVPortId

ID porta virtuale di origine GFT.

MetaDataV0.Reserved

Riservato per l'utilizzo nel sistema.

MetaDataV0.ProviderScratch

Campo scratch che il provider PD può usare per scopi propri mentre il PD_BUFFER è seduto nella coda del provider (in altre parole, pubblicato dal client ma non ancora svuotato dal client). Una volta svuotata la PD_BUFFER dal client, non è garantito che il contenuto di questo campo venga mantenuto.

Commenti

Se un pacchetto L2 è rappresentato da più strutture PD_BUFFER , il primo PD_BUFFER deve avere il flag PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER impostato e il campo NextPartialPDBuffer deve puntare alle strutture parziali PD_BUFFER che costituiscono l'intero pacchetto. Ognuna delle strutture PD_BUFFER parziali deve puntare al PD_BUFFER parziale successivo usando NextPartialPDBuffer anziché il campo NextPDBuffer. Il campo NextPDBuffer deve essere NULL in tutte le strutture parziali PD_BUFFER ad eccezione del buffer head. Tutte le strutture PD_BUFFER parziali, ad eccezione del buffer head, devono avere il flag PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER deselezionato. L'ultimo PD_BUFFER parziale deve avere il campo NextPartialPDBuffer impostato su NULL. La lunghezza totale del pacchetto L2 è la somma dei campi DataLength di ogni PD_BUFFER parziale. Il PD_BUFFER head deve contenere fino all'intestazione del trasporto IP (TCP, UDP, SCTP e così via). Nel caso di incapsulamento o incapsulamento doppio, l'intestazione del trasporto IP più interno deve essere contenuta nella PD_BUFFER head.

Quando si pubblicano PD_BUFFER strutture per la ricezione delle code, DataLength viene ignorato dal provider . Per altre informazioni, vedere la descrizione receiveDataLength nella struttura NDIS_PD_QUEUE_PARAMETERS . Quando si svuotano le strutture PD_BUFFER dalle code di ricezione, il provider archivia la lunghezza del pacchetto ricevuto nel campo DataLength. La lunghezza non include fcs o intestazioni 801Q rimosse. Quando si pubblicano PD_BUFFER strutture per trasmettere le code, DataLength indica la lunghezza del pacchetto da inviare. Quando si svuotano le strutture completate PD_BUFFER dalle code di trasmissione, il provider lascia invariato il campo DataLength.

Requisiti

Requisito Valore
Client minimo supportato Windows 10
Server minimo supportato Windows Server 2016
Intestazione ndis.h