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 |