PD_BUFFER 結構 (ndis.h)
此結構代表PacketDirect (PD) 封包,或佇列中 PD 封包的一部分。
語法
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;
成員
NextPDBuffer
佇列中下一 個PD_BUFFER 結構的指標。
NextPartialPDBuffer
佇列中下一個部分 PD_BUFFER 結構的指標。
PDClientReserved
保留供系統使用。 請勿使用。
PDClientContext
不允許用戶端和提供者修改此欄位。 如果用戶端已為 ClientContextSize 配置非零值的 PD_BUFFER ,則 PDClientContext 會參考 ClientContextSize 的緩衝區大小。 否則,此欄位為 NULL。
DataBufferVirtualAddress
此欄位代表主機和軟體可用來存取/修改封包內容的位址。 實際的封包數據一律位於 DataBufferVirtualAddress+DataStart。 提供者和平台永遠不會在 初始化PD_BUFFER 之後修改此欄位的值。
DataBufferDmaLogicalAddress
此欄位代表用來儲存封包數據的邏輯記憶體位置。 提供者必須用於 DMA。 實際的封包數據一律位於 DataBufferDmaLogicalAddress+DataStart。 提供者和平台絕對不能在 初始化PD_BUFFER 之後修改此欄位的值。
DataBufferSize
這是已配置之數據緩衝區的總大小。 提供者和平台絕對不能在 初始化PD_BUFFER 之後修改此欄位的值。 此數據類型是 ULONG ,而不是 USHORT ,因為傳送卸除很大。
PDClientContextSize
當此值為非零時,它是 PDClientContext 所指向的緩衝區大小。 此欄位的值只能由平臺修改。 平臺不會在 PD_BUFFER 配置之後變更此欄位的值。
Attributes
提供者絕對不能修改屬性。 下表列出這個 PD_BUFFER 結構可以擁有的屬性。
屬性 | Description |
---|---|
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER | 搭配其隨附數據緩衝區所配置的 PD_BUFFER 將設定此屬性。 用戶端或提供者絕對不能修改 PD_BUFFER 屬性。 |
Flags
下表列出這個 PD_BUFFER 結構可以擁有的旗標。
旗標 | 描述 |
---|---|
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD | 表示此緩衝區是部分封包的前端。 |
DataStart
此欄位表示封包相對於所配置數據緩衝區的原始起始地址開始的位置。 提供者絕對不能修改此欄位。 提供者會將此值新增至 DataBufferDmaLogicalAddress 值,以衍生封包接收/傳輸的實際目標 DMA 位址。 例如,當 PD_BUFFER 張貼到接收/傳輸佇列時,硬體接收/傳輸描述元中的目標 DMA 位址值必須設定為 DataBufferDmaLogicalAddress+DataStart。
DataLength
這個封包或部分封包數據的長度。
MetaDataV0
MetaDataV0.RxFilterContext
提供者會將此值設定為從將封包引導至接收佇列的相符篩選條件取得的篩選內容值。 設定篩選時,用戶端會指定篩選內容值。
MetaDataV0.GftFlowEntryId
如果已設定其中一個 RxGftExceptionPacket 或 RxGftCopyPacket 或 RxGftSamplePacket 位,則會以 GFT 流程專案標識符值覆寫 RxFilterContext 值。
MetaDataV0.RxHashValue
針對使用 RSS 傳送至接收佇列的傳入封包所計算的哈希值。
MetaDataV0.RxIPHeaderChecksumSucceeded
常見的 RX 卸除欄位,指出 IP 標頭總和檢查碼是否成功。
MetaDataV0.RxTCPChecksumSucceeded
常見的 RX 卸除欄位,指出 TCP 總和檢查碼是否成功。
MetaDataV0.RxUDPChecksumSucceeded
一般 RX 卸除欄位,指出 UDP 總和檢查碼是否成功。
MetaDataV0.RxIPHeaderChecksumFailed
常見的 RX 卸除欄位,指出 IP 標頭總和檢查碼是否失敗。
MetaDataV0.RxTCPChecksumFailed
常見的 RX 卸除欄位,指出 TCP 總和檢查碼是否失敗。
MetaDataV0.RxUDPChecksumFailed
常見的 RX 卸除欄位,指出 UDP 總和檢查碼是否失敗。
MetaDataV0.RxHashComputed
常見的 RX 卸除欄位,指出哈希是否已計算。
MetaDataV0.RxHashWithL4PortNumbers
常見的 RX 卸除欄位,表示哈希是以 L4 埠號碼計算。
MetaDataV0.RxGftDirectionIngress
MetaDataV0.RxGftExceptionPacket
指出這是 GFT 例外狀況封包的常見 RX 卸除欄位。
MetaDataV0.RxGftCopyPacket
指出這是 GFT 複製封包的常見 RX 卸除欄位。
MetaDataV0.RxGftSamplePacket
指出這是 GFT 範例封包的常見 RX 卸除欄位。
MetaDataV0.RxReserved1
保留的。
MetaDataV0.RxCoalescedSegCount
包含聯合區段數量的一般 RX 卸除欄位。
MetaDataV0.RxRscTcpTimestampDelta
包含 RSC 和 TCP 時間戳差異的常見 RX 卸除欄位。
MetaDataV0.RxOffloads[2]
此緩衝區的 RX 卸除。
MetaDataV0.TxIsIPv4
表示此封包為 IPv4 的常見 TX 卸除欄位。
MetaDataV0.TxIsIPv6
表示此封包為 IPv6 的常見 TX 卸除欄位。
MetaDataV0.TxTransportHeaderOffset
包含封包標頭位移的常見 TX 卸除欄位。
MetaDataV0.TxMSS
包含此封包區段大小上限的常見 TX 卸除欄位。
MetaDataV0.TxComputeIPHeaderChecksum
表示會計算IP標頭總和檢查碼的常見TX卸除欄位。
MetaDataV0.TxComputeTCPChecksum
表示會計算 TCP 總和檢查碼的常見 TX 卸除欄位。
MetaDataV0.TxComputeUDPChecksum
表示已計算 UDP 總和檢查碼的常見 TX 卸除欄位。
MetaDataV0.TxIsEncapsulatedPacket
表示封包已封裝的常見 TX 卸除欄位。
MetaDataV0.TxInnerPacketOffsetsValid
表示內部封包位移的常見 TX 卸除欄位有效。
MetaDataV0.TxReserved1
保留的。
MetaDataV0.TxInnerFrameOffset
包含內部框架位移的常見 TX 卸除欄位。
MetaDataV0.TxInnerIpHeaderRelativeOffset
包含內部IP標頭相對位移的常見 TX 卸除欄位。
MetaDataV0.TxInnerIsIPv6
表示內部封包為 IPv6 的常見 TX 卸除欄位。
MetaDataV0.TxInnerTcpOptionsPresent
指出內部 TCP 選項的常見 TX 卸除欄位存在。
MetaDataV0.TxOffloads[2]
此緩衝區的 TX 卸除。
MetaDataV0.VirtualSubnetInfo
虛擬子網資訊。
MetaDataV0.Ieee8021qInfo
IEEE 802.1Q 資訊。
MetaDataV0.GftSourceVPortId
GFT 來源虛擬埠識別碼。
MetaDataV0.Reserved
保留供系統使用。
MetaDataV0.ProviderScratch
PD 提供者可用於自己的用途的臨時字段,而PD_BUFFER位於提供者佇列 (,換句話說,用戶端會張貼,但用戶端尚未清空) 。 一旦用戶端清空PD_BUFFER,就不保證會保留此欄位的內容。
備註
如果 L2 封包是由多個 PD_BUFFER 結構表示,則第一個 PD_BUFFER 必須設定PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER旗標,而 NextPartialPDBuffer 欄位必須指向構成整個封包的部分 PD_BUFFER 結構。 每個部分 PD_BUFFER 結構都必須使用 NextPartialPDBuffer 而非 NextPDBuffer 字段指向下一個部分 PD_BUFFER 。 除了前端緩衝區以外,所有部分 PD_BUFFER 結構中的 NextPDBuffer 欄位都必須是 NULL。 除了前端緩衝區以外,所有部分PD_BUFFER結構都必須清除PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER旗標。 最後一個部分 PD_BUFFER 必須將其 NextPartialPDBuffer 字段設定為 NULL。 L2 封包的總長度是每個部分 PD_BUFFER的 DataLength 字段總和。 前端 PD_BUFFER 必須包含IP傳輸 (TCP、UDP、SCTP等) 標頭。 在封裝或雙封裝的情況下,最內部的IP傳輸標頭必須包含在前端 PD_BUFFER中。
張貼 PD_BUFFER 結構以接收佇列時,提供者會忽略 DataLength (如需詳細資訊,請參閱 NDIS_PD_QUEUE_PARAMETERS 結構) 中的 ReceiveDataLength 描述。 從接收佇列清空完成 PD_BUFFER 結構時,提供者會將收到的封包長度儲存在 DataLength 字段中。 長度不包含FCS或任何等量801Q標頭。 張貼 PD_BUFFER 結構以傳輸佇列時,DataLength 表示要傳送的封包長度。 從傳輸佇列清空完成 PD_BUFFER 結構時,提供者會將 DataLength 字段保留為未修改。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 10 |
最低支援的伺服器 | Windows Server 2016 |
標頭 | ndis.h |