MINIPORT_SEND_NET_BUFFER_LISTS コールバック関数 (ndis.h)
NDIS は 、ミニポートSendNetBufferLists 関数を呼び出して、 NET_BUFFER_LIST 構造体のリンクされたリストに含まれているネットワーク データを送信します。
構文
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
ミニポート ドライバーがその MiniportInitializeEx 関数で割り当てたコンテキスト領域へのハンドル。 ミニポート ドライバーは、アダプターに関する状態情報を維持するために、このコンテキスト領域を使用します。
[in] NetBufferList
NET_BUFFER_LIST構造体のリンクされたリスト内の最初のNET_BUFFER_LIST構造体へのポインター。 リスト内の各NET_BUFFER_LIST構造体には、 NET_BUFFER 構造体の一覧が記述されています。 リスト内の各NET_BUFFER構造は、MLS のチェーンにマップされます。 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条件に一致する構造体を示します。 このフラグは、ループバックのチェックや、他のバインディングでのループ バックには影響しません。
戻り値
なし
解説
MiniportSendNetBufferLists は、ミニポート ドライバーに必要な関数です。 上にあるドライバーが NdisSendNetBufferLists 関数を呼び出すと、NDIS はバインドされたミニポート ドライバーの MiniportSendNetBufferLists 関数を呼び出します。
NetBufferLists パラメーターで NDIS が渡すネットワーク データを送信する場合、ミニポート ドライバーは次のガイドラインを使用する必要があります。
- 各 NET_BUFFER_LIST 構造体内の NET_BUFFER 構造体の順序を保持する必要があります。
- 同じ接続で送信する場合は、 NET_BUFFER_LIST 構造体の順序を保持する必要があります。
-
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 タグをオフにキーを設定できます)。
ミニポート ドライバーは、 NDIS が MiniportSendNetBufferLists 関数を呼び出すことによって行うすべての送信要求を受け入れます。 ミニポート ドライバーが送信要求をすぐに完了できない場合、ドライバーは要求を完了できるまでキューに要求を保持する必要があります。 送信要求が保留中の間、ミニポート ドライバーは、NET_BUFFER_LIST構造体と、NET_BUFFER_LIST構造体に関連付けられているすべてのプロトコル割り当てリソースの所有権を保持します。
ミニポート ドライバーは、 を呼び出す必要があります。すべてのNET_BUFFER_LIST構造体の送信要求を完了するための NdisMSendNetBufferListsComplete 関数。 システムのパフォーマンスを向上させるために、ドライバーは、複数の送信要求からのNET_BUFFER_LIST構造を含むリンクリストを作成できます。 その後、ドライバーは、このようなリンクされたリストを NdisMSendNetBufferListsComplete.NET_BUFFER_LIST 構造体への 1 回の呼び出しで渡すことができます。その他の関連リソースは、ドライバーが NdisMSendNetBufferListsComplete を呼び出すとすぐに、ミニポート ドライバーがアクセス不可として扱う必要があります。
MiniportSendNetBufferLists 関数は、ネットワーク データの内部キューへのアクセスを、同じキューにアクセスするドライバーの他の MiniportXxx 関数と同期する必要があります。 ミニポート ドライバーは、スピン ロックを使用して、キューへのアクセスを同期できます。
プロトコル ドライバーは、バインドされたミニポート ドライバーが選択したメディアの種類に基づいて、必要なネットワーク データを決定します。 ただし、プロトコル ドライバーは、選択したメディアの最小パケット サイズよりも短いパケットを指定するネットワーク データを提供できます。 この場合、選択したメディアが送信パケット サイズに最小長の要件を課している場合、 MiniportSendNetBufferLists はパケットをゼロで埋め込む必要があります。
NDIS がOID_GEN_MAC_OPTIONS OID に対してクエリを実行したときにミニポート ドライバーが NDIS_MAC_OPTION_NO_LOOPBACK フラグを設定した場合、ミニポート ドライバーはネットワーク データをループ バックしないようにする必要があります。 NDIS は、このようなドライバーのソフトウェア ループバック サポートを提供します。
NDIS は、IRQL<= DISPATCH_LEVELで MiniportSendNetBufferLists を呼び出します。
例
MiniportSendNetBufferLists 関数を定義するには、まず、定義する関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバー用の一連の関数型が用意されています。 関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。たとえば、" MySendNetBufferLists" という名前の MiniportSendNetBufferLists 関数を定義するには、次のコード例に示すように 、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 以降でサポートされています。 |
対象プラットフォーム | Windows |
ヘッダー | ndis.h (Ndis.h を含む) |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | NdisTimedDataHang、NdisTimedDataSend |