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 に 0 以外の値を持つ PD_BUFFER を割り当てた場合、PDClientContext は ClientContextSize のバッファー サイズを参照します。 それ以外の場合、このフィールドは NULL です。

DataBufferVirtualAddress

このフィールドは、ホストとソフトウェアがパケットの内容にアクセスまたは変更するために使用できるアドレスを表します。 実際のパケット データは、常に DataBufferVirtualAddress+DataStart にあります。 プロバイダーとプラットフォームは、 PD_BUFFER 初期化後にこのフィールドの値を変更することはありません。

DataBufferDmaLogicalAddress

このフィールドは、パケット データの格納に使用される論理メモリの場所を表します。 プロバイダーは DMA に を使用する必要があります。 実際のパケット データは、常に DataBufferDmaLogicalAddress+DataStart にあります。 プロバイダーとプラットフォームは、 PD_BUFFER 初期化後にこのフィールドの値を変更しないでください。

DataBufferSize

これは、割り当てられたデータ バッファーの合計サイズです。 プロバイダーとプラットフォームは、 PD_BUFFER 初期化後にこのフィールドの値を変更しないでください。 このデータ型は、送信オフロードが大きいため、USHORT ではなく ULONG です。

PDClientContextSize

この値が 0 以外の場合は、PDClientContext が指すバッファーのサイズになります。 このフィールドの値は、プラットフォームによってのみ変更する必要があります。 プラットフォームは、PD_BUFFER割り当ての後にこのフィールドの値 変更しません。

Attributes

プロバイダーによって属性を変更することはできません。 次の表に、この PD_BUFFER 構造体に含めることができる属性を示します。

属性 説明
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 ビットのいずれかが設定されている場合、RxFilterContext 値は GFT フロー エントリ ID 値で上書きされます。

MetaDataV0.RxHashValue

RSS を使用して受信キューに誘導される受信パケットに対して計算されたハッシュ値。

MetaDataV0.RxIPHeaderChecksumSucceeded

IP ヘッダー チェックサムが成功したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxTCPChecksumSucceeded

TCP チェックサムが成功したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxUDPChecksumSucceeded

UDP チェックサムが成功したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxIPHeaderChecksumFailed

IP ヘッダー チェックサムが失敗したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxTCPChecksumFailed

TCP チェックサムが失敗したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxUDPChecksumFailed

UDP チェックサムが失敗したかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxHashComputed

ハッシュが計算されるかどうかを示す一般的な RX オフロード フィールド。

MetaDataV0.RxHashWithL4PortNumbers

ハッシュが L4 ポート番号で計算されることを示す一般的な RX オフロード フィールド。

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 ソース仮想ポート ID。

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 構造体は、NextPDBuffer フィールドではなく NextPartialPDBuffer を使用して、次の部分 PD_BUFFER を指す必要があります。 NextPDBuffer フィールドは、ヘッド バッファーを除くすべての部分 PD_BUFFER 構造体で 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
Header ndis.h