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 |