次の方法で共有


MINIPORT_SEND_NET_BUFFER_LISTS コールバック関数 (ndis.h)

NDIS は、ミニポートSendNetBufferLists 関数を呼び出して、NET_BUFFER_LIST 構造体のリンクされたリストに含まれているネットワーク データを送信します。

MINIPORT_SEND_NET_BUFFER_LISTS 型を使用して関数を宣言する必要があります。 詳細については、次の例のセクションを参照してください。
 

構文

MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;

void MiniportSendNetBufferLists(
  [in] NDIS_HANDLE MiniportAdapterContext,
  [in] PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG SendFlags
)
{...}

パラメーター

[in] MiniportAdapterContext

ミニポート ドライバーがその ミニポートInitializeEx 関数に割り当てられたコンテキスト領域へのハンドル。 ミニポート ドライバーは、アダプターに関する状態情報を維持するには、このコンテキスト領域を使用します。

[in] NetBufferList

NET_BUFFER_LIST構造体のリンクされたリスト内の最初の NET_BUFFER_LIST 構造体へのポインター。 リスト内の各NET_BUFFER_LIST構造体は、NET_BUFFER 構造体の一覧を記述します。 リスト内の各NET_BUFFER構造は、MDL のチェーンにマップされます。 MDL にはネットワーク データが含まれています。

[in] PortNumber

ミニポート アダプターのポートを識別するポート番号。 ミニポート アダプターのポート番号を割り当てるには、NdisMAllocatePort 関数 を呼び出します。 0 の値は、ミニポート アダプターの既定のポートを識別します。

[in] SendFlags

送信操作の属性を定義するフラグ。 フラグは OR 操作と組み合わせることができます。 すべてのフラグをクリアするには、このメンバーを 0 に設定します。 この関数は、次のフラグをサポートしています。

NDIS_SEND_FLAGS_DISPATCH_LEVEL

現在の IRQL がDISPATCH_LEVELされていることを指定します。 このフラグの詳細については、「ディスパッチ IRQL 追跡」を参照してください。

NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK

NDIS がループバックをチェックする必要があることを指定します。 既定では、NDIS は、送信要求を送信したドライバーにデータをループ バックしません。 基になるドライバーは、このフラグを設定することで、この動作をオーバーライドできます。 このフラグを設定すると、NDIS は、バインディングの受信条件に一致するデータを含むすべてのNET_BUFFER構造体を識別します。 NDIS は、基になるドライバーに条件に一致するNET_BUFFER構造体を示します。 このフラグは、他のバインディングでのループバックのチェックやループ バックには影響しません。

戻り値

何一つ

備考

ミニポート ドライバーに必要な関数 ミニポートSendNetBufferLists です。 上にあるドライバーが NdisSendNetBufferLists 関数を呼び出すと、NDIS は、バインドされたミニポート ドライバーの ミニポート ミニポートBufferLists 関数を呼び出します。

NetBufferLists パラメーターで NDIS が渡すネットワーク データを送信する場合、ミニポート ドライバーは、次のガイドラインを使用する必要があります。

  1. NET_BUFFER_LIST 構造体の NET_BUFFER 構造体の順序を保持する必要があります。
  2. 同じ接続で転送する場合は、NET_BUFFER_LIST 構造体の順序を保持する必要があります。
  3. NET_BUFFER_LIST 構造体を異なる接続で送信する場合、次の機能が使用されている場合は、複数の送信キューに分割できます。 この場合、各接続の NET_BUFFER_LIST 構造体の順序を保持する必要があります。
    • Receive Side Scaling (RSS) (NET_BUFFER_LIST 構造の RSS ハッシュ値は、RSS 間接参照テーブルのインデックスとして使用できます)。
    • 仮想マシン キュー (VMQ) (送信キューのキュー識別子は、NetBufferListFilteringInfo OOB 情報で設定されます。詳細については、「VMQ 送信パス」を参照してください。
    • IEEE 802.1 データ センター ブリッジング (DCB) (トラフィック クラス (TC) をキーオフできます)。
    • IEEE 802.1p (DCB なしで 802.1p タグをキーオフできます)。

ミニポート ドライバーは、ミニポートSendNetBufferLists 関数を呼び出すことによって NDIS が行うすべての送信要求を受け入れます。 ミニポート ドライバーがすぐに要求の送信を完了できない場合、ドライバーは要求を完了するまでキューに要求を保持する必要があります。 送信要求が保留中の間、ミニポート ドライバーは、NET_BUFFER_LIST構造体と、NET_BUFFER_LIST構造体に関連付けられているすべてのプロトコル割り当てリソースの所有権を保持します。

ミニポート ドライバーは、次を呼び出す必要があります。NdisMSendNetBufferListsComplete 関数を して、すべてのNET_BUFFER_LIST構造体の送信要求を完了します。 システムのパフォーマンスを向上させるために、ドライバーは、複数の送信要求からのNET_BUFFER_LIST構造を含むリンクリストを作成できます。 その後、ドライバーは、NdisMSendNetBufferListsComplete .NET_BUFFER_LIST 構造体1 回の呼び出しでこのようなリンクされたリストを渡すことができます。また、ドライバーが NdisMSendNetBufferListsComplete 呼び出すとすぐに、ミニポート ドライバーがアクセス不可として扱う必要があります。

ミニポートSendNetBufferLists 関数は、同じキューにアクセスするドライバーの他の ミニポートXxx 関数とネットワーク データの内部キューへのアクセスを同期する必要があります。 ミニポート ドライバーは、スピン ロックを使用して、キューへのアクセスを同期できます。

プロトコル ドライバーは、バインドされたミニポート ドライバーが選択したメディアの種類に基づいて、必要なネットワーク データを決定する役割を担います。 ただし、プロトコル ドライバーは、選択したメディアの最小パケット サイズよりも短いパケットを指定するネットワーク データを提供できます。 この場合、選択 メディアが送信パケット サイズに最小長要件を課す場合、 ミニポートSendNetBufferLists は、パケットをゼロで埋め込む必要があります。

NDIS が OID_GEN_MAC_OPTIONS OID を照会したときにミニポート ドライバーがNDIS_MAC_OPTION_NO_LOOPBACK フラグを設定する場合、ミニポート ドライバーは、ネットワーク データをループ バックしようとしないでください。 NDIS は、このようなドライバーのソフトウェア ループバック サポートを提供します。

NDIS は、IRQL<= DISPATCH_LEVEL で ミニポートSendNetBufferLists 呼び出します。

の例

ミニポートSendNetBufferLists 関数を定義するには、まず、定義する関数の型を識別する関数宣言を指定する必要があります。 Windows には、ドライバーの関数の種類のセットが用意されています。 関数の種類を使用して関数を宣言すると、ドライバー のコード分析、静的ドライバー検証ツール (SDV)、およびその他の検証ツールをすると、エラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、"MySendNetBufferLists" という名前の ミニポートSendNetBufferLists 関数を定義するには、次のコード例に示すように MINIPORT_SEND_NET_BUFFER_LISTS 型を使用します。

MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;

次に、次のように関数を実装します。

_Use_decl_annotations_
VOID
 MySendNetBufferLists(
    NDIS_HANDLE  MiniportAdapterContext,
    PNET_BUFFER_LIST  NetBufferList,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  SendFlags
    )
  {...}

MINIPORT_SEND_NET_BUFFER_LISTS 関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations 注釈により、ヘッダー ファイル内の MINIPORT_SEND_NET_BUFFER_LISTS 関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「ndis ドライバーの の関数の役割の種類を使用して関数を宣言するを参照してください。

Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント NDIS 6.0 以降でサポートされています。
ターゲット プラットフォーム ウィンドウズ
ヘッダー ndis.h (Ndis.h を含む)
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 する NdisTimedDataHang、NdisTimedDataSend

関連項目

ミニポートInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

NdisMSendNetBufferListsComplete

NdisSendNetBufferLists

OID_GEN_MAC_OPTIONS