共用方式為


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