Freigeben über


PD_BUFFER Struktur (ndis.h)

Diese Struktur stellt ein PacketDirect-Paket (PD) oder einen Teil eines PD-Pakets in einer Warteschlange dar.

Syntax

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;

Member

NextPDBuffer

Ein Zeiger auf die nächste PD_BUFFER Struktur in der Warteschlange.

NextPartialPDBuffer

Ein Zeiger auf die nächste teil PD_BUFFER Struktur in der Warteschlange.

PDClientReserved

Ist für das System reserviert. Nicht verwenden.

PDClientContext

Der Client und der Anbieter dürfen dieses Feld nicht ändern. Wenn ein Client die PD_BUFFER mit einem Wert ungleich Null für ClientContextSize zugewiesen hat, bezieht sich PDClientContext auf eine Puffergröße von ClientContextSize. Andernfalls ist dieses Feld NULL.

DataBufferVirtualAddress

Dieses Feld stellt die Adresse dar, die Hosts und Software verwenden können, um auf den Paketinhalt zuzugreifen bzw. diese zu ändern. Die tatsächlichen Paketdaten werden immer unter DataBufferVirtualAddress+DataStart angezeigt. Der Anbieter und die Plattform ändern den Wert dieses Felds nach der PD_BUFFER Initialisierung nie.

DataBufferDmaLogicalAddress

Dieses Feld stellt den logischen Speicherspeicherort dar, der zum Speichern der Paketdaten verwendet wird. Der Anbieter muss für DMA verwenden. Die tatsächlichen Paketdaten sind immer bei DataBufferDmaLogicalAddress+DataStart. Der Anbieter und die Plattform dürfen den Wert dieses Felds nach der PD_BUFFER Initialisierung nie ändern.

DataBufferSize

Dies ist die Gesamtgröße des zugeordneten Datenpuffers. Der Anbieter und die Plattform dürfen den Wert dieses Felds nach der PD_BUFFER Initialisierung nie ändern. Dieser Datentyp ist aufgrund einer großen Sendeabladung ULONG anstelle von USHORT .

PDClientContextSize

Wenn dieser Wert ungleich 0 ist, ist dies die Größe des Puffers, auf den PDClientContext verweist. Der Wert dieses Felds darf nur von der Plattform geändert werden. Die Plattform ändert den Wert dieses Felds nach der PD_BUFFER Zuordnung nicht.

Attributes

Die Attribute dürfen nie vom Anbieter geändert werden. In der folgenden Tabelle sind Attribute aufgeführt, die diese PD_BUFFER Struktur aufweisen kann.

attribute BESCHREIBUNG
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Für eine PD_BUFFER , die einem eigenen begleitenden Datenpuffer zugeordnet ist, ist dieses Attribut festgelegt. Die PD_BUFFER Attribute dürfen niemals von Clients oder Anbietern geändert werden.

Flags

In der folgenden Tabelle sind Flags aufgeführt, die diese PD_BUFFER-Struktur aufweisen kann.

Flag Beschreibung
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD Gibt an, dass dieser Puffer der Kopf von Teilpaketen ist.

DataStart

Dieses Feld gibt an, wo das Paket relativ zur ursprünglichen Startadresse des zugeordneten Datenpuffers beginnt. Der Anbieter darf dieses Feld niemals ändern. Der Anbieter fügt diesen Wert dem DataBufferDmaLogicalAddress-Wert hinzu, um die tatsächliche DMA-Zieladresse für den Paketempfang/die Paketübertragung abzuleiten. Beispielsweise muss der DMA-Zieladressenwert im Hardware-Deskriptor für Empfang/Übertragung auf DataBufferDmaLogicalAddress+DataStart festgelegt werden, wenn ein PD_BUFFER an eine Empfangs-/Übertragungswarteschlange gesendet wird.

DataLength

Die Länge dieses Pakets oder der Teilpaketdaten.

MetaDataV0

MetaDataV0.RxFilterContext

Der Anbieter legt dies auf den Filterkontextwert fest, der aus dem übereinstimmenden Filter abgerufen wurde, der das Paket zur Empfangswarteschlange gesteuert hat. Filterkontextwerte werden von den Clients beim Konfigurieren von Filtern angegeben.

MetaDataV0.GftFlowEntryId

Wenn eines der RxGftExceptionPacket- oder RxGftCopyPacket- oder RxGftSamplePacket-Bits festgelegt ist, wird der RxFilterContext-Wert mit einem GFT-Floweintrags-ID-Wert überschrieben.

MetaDataV0.RxHashValue

Der Hashwert, der für das eingehende Paket berechnet wird, das mithilfe von RSS in die Empfangswarteschlange gesteuert wird.

MetaDataV0.RxIPHeaderChecksumSucceeded

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob die PRÜFSUMME des IP-Headers erfolgreich war.

MetaDataV0.RxTCPChecksumSucceeded

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob die TCP-Prüfsumme erfolgreich war.

MetaDataV0.RxUDPChecksumSucceeded

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob die UDP-Prüfsumme erfolgreich war.

MetaDataV0.RxIPHeaderChecksumFailed

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob die PRÜFSUMME des IP-Headers fehlgeschlagen ist.

MetaDataV0.RxTCPChecksumFailed

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob bei der TCP-Prüfsumme ein Fehler aufgetreten ist.

MetaDataV0.RxUDPChecksumFailed

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob bei der UDP-Prüfsumme ein Fehler aufgetreten ist.

MetaDataV0.RxHashComputed

Ein allgemeines RX-Auslagerungsfeld, das angibt, ob der Hash berechnet wird.

MetaDataV0.RxHashWithL4PortNumbers

Ein allgemeines RX-Auslagerungsfeld, das angibt, dass der Hash mit L4-Portnummern berechnet wird.

MetaDataV0.RxGftDirectionIngress

MetaDataV0.RxGftExceptionPacket

Ein allgemeines RX-Auslagerungsfeld, das angibt, dass es sich um ein GFT-Ausnahmepaket handelt.

MetaDataV0.RxGftCopyPacket

Ein allgemeines RX-Auslagerungsfeld, das angibt, dass es sich um ein GFT-Kopierpaket handelt.

MetaDataV0.RxGftSamplePacket

Ein allgemeines RX-Auslagerungsfeld, das angibt, dass es sich um ein GFT-Beispielpaket handelt.

MetaDataV0.RxReserved1

Reserviert.

MetaDataV0.RxCoalescedSegCount

Ein allgemeines RX-Auslagerungsfeld, das die Menge der zusammengeknabelten Segmente enthält.

MetaDataV0.RxRscTcpTimestampDelta

Ein allgemeines RX-Auslagerungsfeld, das RSC- und TCP-Zeitstempelunterschiede enthält.

MetaDataV0.RxOffloads[2]

RX-Auslagerungen für diesen Puffer.

MetaDataV0.TxIsIPv4

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass dieses Paket IPv4 ist.

MetaDataV0.TxIsIPv6

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass dieses Paket IPv6 ist.

MetaDataV0.TxTransportHeaderOffset

Ein allgemeines TX-Auslagerungsfeld, das den Headeroffset des Pakets enthält.

MetaDataV0.TxMSS

Ein allgemeines TX-Auslagerungsfeld, das die maximale Segmentgröße dieses Pakets enthält.

MetaDataV0.TxComputeIPHeaderChecksum

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass die IP-Headerprüfsumme berechnet wird.

MetaDataV0.TxComputeTCPChecksum

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass die TCP-Prüfsumme berechnet wird.

MetaDataV0.TxComputeUDPChecksum

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass die UDP-Prüfsumme berechnet wird.

MetaDataV0.TxIsEncapsulatedPacket

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass das Paket gekapselt ist.

MetaDataV0.TxInnerPacketOffsetsValid

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass die inneren Paketoffsets gültig sind.

MetaDataV0.TxReserved1

Reserviert.

MetaDataV0.TxInnerFrameOffset

Ein allgemeines TX-Auslagerungsfeld, das den inneren Frameoffset enthält.

MetaDataV0.TxInnerIpHeaderRelativeOffset

Ein allgemeines TX-Auslagerungsfeld, das den relativen Offset des inneren IP-Headers enthält.

MetaDataV0.TxInnerIsIPv6

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass das innere Paket IPv6 ist.

MetaDataV0.TxInnerTcpOptionsPresent

Ein allgemeines TX-Auslagerungsfeld, das angibt, dass die inneren TCP-Optionen vorhanden sind.

MetaDataV0.TxOffloads[2]

TX-Auslagerungen für diesen Puffer.

MetaDataV0.VirtualSubnetInfo

Die Informationen zum virtuellen Subnetz.

MetaDataV0.Ieee8021qInfo

Die IEEE 802.1Q-Informationen.

MetaDataV0.GftSourceVPortId

Die ID des virtuellen GFT-Quellports.

MetaDataV0.Reserved

Ist für das System reserviert.

MetaDataV0.ProviderScratch

Ein Scratch-Feld, das der PD-Anbieter für eigene Zwecke verwenden kann, während sich die PD_BUFFER in der Anbieterwarteschlange befindet (mit anderen Worten, vom Client gepostet, aber noch nicht vom Client zurückgesendet). Sobald die PD_BUFFER vom Client entladen wurde, gibt es keine Garantie dafür, dass der Inhalt dieses Felds beibehalten wird.

Hinweise

Wenn ein L2-Paket durch mehrere PD_BUFFER-Strukturen dargestellt wird, muss für die erste PD_BUFFER das PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER-Flag festgelegt sein, und das Feld NextPartialPDBuffer muss auf die teiligen PD_BUFFER-Strukturen verweisen, die das gesamte Paket bilden. Jede partielle PD_BUFFER-Strukturen muss auf den nächsten teiliellen PD_BUFFER verweisen, indem sie den NextPartialPDBuffer anstelle des NextPDBuffer-Felds verwendet. Das NextPDBuffer-Feld muss in allen partiellen PD_BUFFER Strukturen mit Ausnahme des Hauptpuffers NULL sein. Für alle Teilstrukturen PD_BUFFER mit Ausnahme des Hauptpuffers muss das Flag PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER deaktiviert sein. Beim letzten teiligen PD_BUFFER muss das Feld NextPartialPDBuffer auf NULL festgelegt sein. Die Gesamtlänge des L2-Pakets ist die Summe der DataLength-Felder aus jedem teiligen PD_BUFFER. Der Kopf PD_BUFFER muss bis zu und einschließlich des IP-Transportheaders (TCP, UDP, SCTP usw.) enthalten. Bei der Kapselung oder doppelten Kapselung muss der innerste IP-Transportheader im Kopf PD_BUFFER enthalten sein.

Beim Posten PD_BUFFER Strukturen zum Empfangen von Warteschlangen wird DataLength vom Anbieter ignoriert (weitere Informationen finden Sie in der ReceiveDataLength-Beschreibung in der NDIS_PD_QUEUE_PARAMETERS-Struktur ). Wenn PD_BUFFER Strukturen aus Empfangswarteschlangen entladen werden, speichert der Anbieter die Länge des empfangenen Pakets im Feld DataLength. Die Länge enthält weder FCS noch striped 801Q-Header. Beim Posten PD_BUFFER Strukturen zum Übertragen von Warteschlangen gibt DataLength die Länge des zu sendenden Pakets an. Wenn das Entladen PD_BUFFER Strukturen aus Übertragungswarteschlangen abgeschlossen ist, lässt der Anbieter das DataLength-Feld unverändert.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10
Unterstützte Mindestversion (Server) Windows Server 2016
Kopfzeile ndis.h