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;
Angehörige
NextPDBuffer
Ein Zeiger auf die nächste PD_BUFFER Struktur in der Warteschlange.
NextPartialPDBuffer
Ein Zeiger auf die nächste partielle PD_BUFFER Struktur in der Warteschlange.
PDClientReserved
Reserviert für die Systemverwendung. 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, verweist der PDClientContext auf eine Puffergröße von ClientContextSize. Andernfalls ist dieses Feld NULL.
DataBufferVirtualAddress
Dieses Feld stellt die Adresse dar, mit der Hosts und Software auf den Paketinhalt zugreifen/ändern können. Die tatsächlichen Paketdaten befinden sich immer bei DataBufferVirtualAddress+DataStart. Der Anbieter und die Plattform ändern niemals den Wert dieses Felds nach der PD_BUFFER Initialisierung.
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 befinden sich immer bei DataBufferDmaLogicalAddress+DataStart. Der Anbieter und die Plattform dürfen den Wert dieses Felds nach der PD_BUFFER Initialisierung niemals ä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 niemals ändern. Dieser Datentyp ist ULONG- anstelle von USHORT- aufgrund eines großen Sende offloads.
PDClientContextSize
Wenn dieser Wert ungleich Null ist, ist er 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 niemals vom Anbieter geändert werden. In der folgenden Tabelle sind Attribute aufgeführt, die diese PD_BUFFER Struktur aufweisen kann.
Attribut | Beschreibung |
---|---|
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER | Ein PD_BUFFER, das einem eigenen begleitenden Datenpuffer zugeordnet ist, hat diesen Attributsatz. 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.
Flagge | Beschreibung |
---|---|
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD | Gibt an, dass dieser Puffer der Kopf von Teilpaketen ist. |
DataStart
Dieses Feld zeigt 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 zum DataBufferDmaLogicalAddress-Wert hinzu, um die tatsächliche Ziel-DMA-Adresse für den Paketempfang/die Übertragung abzuleiten. Beispielsweise muss der DMA-Zieladressenwert im Hardware-Empfangs-/Übertragungsdeskriptor auf "DataBufferDmaLogicalAddress+DataStart" festgelegt werden, wenn ein PD_BUFFER in eine Empfangs-/Übertragungswarteschlange gepostet wird.
DataLength
Die Länge des Pakets oder partieller Paketdaten.
MetaDataV0
MetaDataV0.RxFilterContext
Der Anbieter legt dies auf den Filterkontextwert fest, der aus dem übereinstimmenden Filter abgerufen wird, der das Paket in die Empfangswarteschlange gesteuert hat. Filterkontextwerte werden von den Clients beim Konfigurieren von Filtern angegeben.
MetaDataV0.GftFlowEntryId
Wenn einer der RxGftExceptionPacket- oder RxGftCopyPacket- oder RxGftSamplePacket-Bits festgelegt ist, wird der RxFilterContext-Wert mit einem GFT-Flusseintrags-ID-Wert überschrieben.
MetaDataV0.RxHashValue
Der für das eingehende Paket berechnete Hashwert, der mithilfe von RSS in die Empfangswarteschlange gesteuert wird.
MetaDataV0.RxIPHeaderChecksumSucceeded
Ein allgemeines RX-Offloadfeld, das angibt, ob die IP-Header-Prüfsumme erfolgreich war.
MetaDataV0.RxTCPChecksumSucceeded
Ein allgemeines RX-Offloadfeld, das angibt, ob die TCP-Prüfsumme erfolgreich war.
MetaDataV0.RxUDPChecksumSucceeded
Ein allgemeines RX-Offloadfeld, das angibt, ob die UDP-Prüfsumme erfolgreich war.
MetaDataV0.RxIPHeaderChecksumFailed
Ein allgemeines RX-Offloadfeld, das angibt, ob die IP-Header-Prüfsumme fehlgeschlagen ist.
MetaDataV0.RxTCPChecksumFailed
Ein allgemeines RX-Offloadfeld, das angibt, ob die TCP-Prüfsumme fehlgeschlagen ist.
MetaDataV0.RxUDPChecksumFailed
Ein allgemeines RX-Offloadfeld, das angibt, ob die UDP-Prüfsumme fehlgeschlagen ist.
MetaDataV0.RxHashComputed
Ein allgemeines RX-Offload-Feld, das angibt, ob der Hash berechnet wird.
MetaDataV0.RxHashWithL4PortNumbers
Ein allgemeines RX-Offload-Feld, das angibt, dass der Hash mit L4-Portnummern berechnet wird.
MetaDataV0.RxGftDirectionIngress
MetaDataV0.RxGftExceptionPacket
Ein allgemeines RX-Offload-Feld, das angibt, dass es sich um ein GFT-Ausnahmepaket handelt.
MetaDataV0.RxGftCopyPacket
Ein allgemeines RX-Ausladefeld, das angibt, dass es sich um ein GFT-Kopierpaket handelt.
MetaDataV0.RxGftSamplePacket
Ein allgemeines RX-Offload-Feld, das angibt, dass es sich um ein GFT-Beispielpaket handelt.
MetaDataV0.RxReserved1
Reserviert.
MetaDataV0.RxCoalescedSegCount
Ein allgemeines RX-Ausladefeld, das die Menge der zusammengeklammerten Segmente enthält.
MetaDataV0.RxRscTcpTimestampDelta
Ein allgemeines RX-Offload-Feld, das RSC- und TCP-Zeitstempeldifferenz enthält.
MetaDataV0.RxOffloads[2]
RX-Offloads für diesen Puffer.
MetaDataV0.TxIsIPv4
Ein allgemeines TX-Offloadfeld, das angibt, dass dieses Paket IPv4 ist.
MetaDataV0.TxIsIPv6
Ein allgemeines TX-Offloadfeld, das angibt, dass dieses Paket IPv6 ist.
MetaDataV0.TxTransportHeaderOffset
Ein allgemeines TX-Offloadfeld, das den Header-Offset des Pakets enthält.
MetaDataV0.TxMSS
Ein allgemeines TX-Offloadfeld, das die maximale Segmentgröße dieses Pakets enthält.
MetaDataV0.TxComputeIPHeaderChecksum
Ein allgemeines TX-Offloadfeld, das angibt, dass die IP-Header-Prüfsumme berechnet wird.
MetaDataV0.TxComputeTCPChecksum
Ein allgemeines TX-Offloadfeld, das angibt, dass die TCP-Prüfsumme berechnet wird.
MetaDataV0.TxComputeUDPChecksum
Ein allgemeines TX-Offloadfeld, das angibt, dass die UDP-Prüfsumme berechnet wird.
MetaDataV0.TxIsEncapsulatedPacket
Ein allgemeines TX-Offloadfeld, das angibt, dass das Paket gekapselt ist.
MetaDataV0.TxInnerPacketOffsetsValid
Ein allgemeines TX-Offloadfeld, das angibt, dass die inneren Paketoffsets gültig sind.
MetaDataV0.TxReserved1
Reserviert.
MetaDataV0.TxInnerFrameOffset
Ein allgemeines TX-Offloadfeld, das den inneren Rahmenoffset enthält.
MetaDataV0.TxInnerIpHeaderRelativeOffset
Ein allgemeines TX-Offloadfeld, das den relativen Offset des inneren IP-Headers enthält.
MetaDataV0.TxInnerIsIPv6
Ein allgemeines TX-Offloadfeld, das angibt, dass das innere Paket IPv6 ist.
MetaDataV0.TxInnerTcpOptionsPresent
Ein allgemeines TX-Offloadfeld, das angibt, dass die inneren TCP-Optionen vorhanden sind.
MetaDataV0.TxOffloads[2]
TX-Offloads für diesen Puffer.
MetaDataV0.VirtualSubnetInfo
Die virtuellen Subnetzinformationen.
MetaDataV0.Ieee8021qInfo
Die IEEE 802.1Q-Informationen.
MetaDataV0.GftSourceVPortId
Die virtuelle GFT-Quellport-ID.
MetaDataV0.Reserved
Reserviert für die Systemverwendung.
MetaDataV0.ProviderScratch
Ein Kratzfeld, das der PD-Anbieter für eigene Zwecke verwenden kann, während die PD_BUFFER in der Anbieterwarteschlange sitzt (d. h. vom Client gepostet, aber noch nicht vom Client entwässert). Sobald der PD_BUFFER vom Client entwässert wird, besteht keine Garantie dafür, dass der Inhalt dieses Felds erhalten bleibt.
Bemerkungen
Wenn ein L2-Paket durch mehrere PD_BUFFER Strukturen dargestellt wird, muss die erste PD_BUFFER den PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Flagsatz aufweisen, und das Feld "NextPartialPDBuffer" muss auf die partiellen PD_BUFFER Strukturen verweisen, die das gesamte Paket bilden. Jedes teil PD_BUFFER Strukturen muss auf den nächsten teillichen PD_BUFFER zeigen, indem der NextPartialPDBuffer anstelle des Felds "NextPDBuffer" verwendet wird. Das Feld "NextPDBuffer" muss in allen partiellen PD_BUFFER Strukturen null sein, mit Ausnahme des Kopfpuffers. Alle partiellen PD_BUFFER Strukturen mit Ausnahme des Kopfpuffers müssen das PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Flag deaktiviert haben. Die letzte partielle PD_BUFFER muss das Feld NextPartialPDBuffer auf NULL festgelegt sein. Die Gesamtlänge des L2-Pakets ist die Summe der DataLength-Felder aus den einzelnen partiellen PD_BUFFER. Der Kopf PD_BUFFER muss bis zu und einschließlich des IP-Transportheaders (TCP, UDP, SCTP usw.) enthalten. Bei Kapselung oder Doppelkapselung muss der innerste IP-Transportheader im Kopf PD_BUFFERenthalten sein.
Beim Posten PD_BUFFER Strukturen zum Empfangen von Warteschlangen wird DataLength vom Anbieter ignoriert (Weitere Informationen finden Sie in der Beschreibung "ReceiveDataLength" in der NDIS_PD_QUEUE_PARAMETERS-Struktur). Beim Abwässern abgeschlossener PD_BUFFER Strukturen von Empfangswarteschlangen speichert der Anbieter die Länge des empfangenen Pakets im Feld "DataLength". Die Länge enthält keine FCS oder gestreifte 801Q-Header. Beim Veröffentlichen PD_BUFFER Strukturen zum Übertragen von Warteschlangen kennzeichnet DataLength die Länge des zu sendenden Pakets. Wenn der Abfluss abgeschlossen PD_BUFFER Strukturen von Übertragungswarteschlangen abgeschlossen ist, lässt der Anbieter das Feld "DataLength" unverändert.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10 |
mindestens unterstützte Server- | Windows Server 2016 |
Header- | ndis.h |