(57)【要約】【課題】ホストと、ホストＣＰＵおよびＮＩＣの中のプロセッサなどの、コンピュータ化されたシステムの目標処理デバイスの間で、ＩＰＳｅｃ（セキュアなインターネットプロトコル）ＳＡ（セキュリティ関連付け）機能のプロセッサ制御を移転するための機構を提供すること。【解決手段】本発明の一態様では、認証および／または暗号化に関連する計算が、オフロードされる一方で、ホストは、ＳＡ機能のオフロード、アップロード、無効化、およびキー更新がいつ行われるかの制御を保持する。デバイス（複数）は、協調して、ＳＡ有効期限に関するソフト限度とハード限度の両方のサポートを含む、ＳＡに関するメトリックを保持する。目標に関して、タイマ要件は最小限に抑えられる。オフロードされたＳＡ機能は、ネットワークスタックの中間ソフトウェアレイヤ９０８、９１０、９１２の他のオフロードされた状態オブジェクトに埋め込まれることができる。【選択図】図９
2006191537.tif 000002
【特許請求の範囲】
【請求項１】
状態オブジェクトを有するセキュアなインターネットプロトコルレイヤと、ネットワークプロトコル状態オブジェクトをそれぞれが有する、ネットワークプロトコルスタックの１つまたは複数の中間ソフトウェアレイヤのシーケンスとを含むコンピュータ化システムにおいて使用するためのコンピュータ実行可能命令を有するコンピュータ可読媒体であって、該命令により、ＳＡ（セキュリティ関連付け）オフロードブロック中の少なくとも１つのセキュリティ関連付けに関する少なくとも１つのセキュリティ関連付け機能と複数の状態オブジェクトを、確立されたネットワーク通信の完全性を維持しながら処理するために必要とされる制御を、１つまたは複数の宛先処理デバイスと１つまたは複数の送信元処理コンポーネントの間で移転するステップを実行するコンピュータ可読媒体において、該命令により、
前記ＳＡオフロードブロックに関する前記状態オブジェクトをパッケージアップし、および、前記セキュアなインターネットプロトコルレイヤの下位に存在する前記中間ソフトウェアレイヤを介して前記ＳＡオフロードブロックに関する前記状態オブジェクトを送るステップであって、該レイヤのそれぞれが前記セキュアなインターネットプロトコルレイヤの下位に存在して、そのネットワークプロトコル状態オブジェクトを前記ＳＡオフロードブロックに関する前記状態オブジェクトに追加するステップ、
前記ＳＡオフロードブロックに関する前記状態オブジェクトおよび前記セキュアなインターネットプロトコルレイヤの下位に存在する前記中間ソフトウェアレイヤの前記ネットワークプロトコル状態オブジェクトを含むオフロードブロックデータ構造を生成するステップ、
前記送信元処理コンポーネントから前記宛先処理コンポーネントに前記オフロードデータ構造を転送するステップ、並びに、
該コンポーネントが前記オフロードブロックデータ構造を受け取っておりおよび前記少なくとも１つのセキュリティ関連付け機能を処理する準備ができていること、を示す完了メッセージを受信するステップ
を実行することを特徴とするコンピュータ可読媒体。
【請求項２】
前記下位に存在する前記中間ソフトウェアレイヤを介して前記ＳＡオフロードブロックに関するＳＡリソース要件を前記宛先処理コンポーネントに送信するステップであって、前記下位に存在する前記中間ソフトウェアレイヤがそれぞれ、前記ＳＡオフロードブロックに関する前記ＳＡリソース要件に、該レイヤのリソース要件を追加するステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項３】
前記送信するステップは、前記ＳＡリソース要件をパッケージして前記オフロードブロックデータ構造にすることを含むことを特徴とする請求項２のコンピュータ可読媒体。
【請求項４】
前記宛先処理コンポーネントと前記送信元処理コンポーネントのどちらかは周辺デバイスであることを特徴とする請求項１のコンピュータ可読媒体。
【請求項５】
前記ＳＡオフロードブロックに関する前記状態オブジェクトは、キャッシュ状態変数を含む複数の状態変数を有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項６】
前記キャッシュ状態変数は、操作符号変数、暗号化バイト数に対するソフトおよびハード限度、ソフト有効期限までのパケット数に対するソフト限度、ハード有効期限までのパケット数に対するハード限度、並びにフラグの少なくとも１つを含むことを特徴とする請求項４のコンピュータ可読媒体。
【請求項７】
前記キャッシュ状態変数はＯＬＤＳＰＩフラグをさらに含むことを特徴とする請求項６のコンピュータ可読媒体。
【請求項８】
前記ＳＡオフロードブロックに関する前記状態オブジェクトは、定数状態変数を含む複数の状態変数を有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項９】
前記定数状態変数は、ローカルおよびリモートポート、ローカルおよびリモートＩＰアドレス、プロトコルタイプ、並びにセキュリティ関連付けフラグを含むことを特徴とする請求項８のコンピュータ可読媒体。
【請求項１０】
前記セキュリティ関連付けフラグは、ＤｙｎａｍｉｃＳＡフラグ、ＩｎｆｉｎｉｔｅＬｉｆｅフラグ、並びにフラグまたはセキュリティ関連付けを含むことを特徴とする請求項９のコンピュータ可読媒体。
【請求項１１】
前記ＳＡオフロードブロックに関する前記状態オブジェクトは、委任状態変数を含む複数の状態変数を有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項１２】
前記委任状態変数は、フラグ、前記ＳＡを介して転送されたバイト数のカウント、前記ＳＡがアイドルであったティック（tick）数、前記ＳＡを介して転送された機密バイト数、前記ＳＡを介して転送された認証済みバイト数、および送信または受信パラメータのどちらかを含むことを特徴とする請求項１１のコンピュータ可読媒体。
【請求項１３】
前記移転するステップ中に、受信されているデータグラムを前記宛先処理コンポーネントに転送することを含むステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項１４】
前記移転するステップ中に、キャッシュ変数が変わった場合、該変数を更新することを含むステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項１５】
前記キャッシュ変数は、操作符号変数、暗号化バイト数に対するソフトおよびハード限度、ソフト有効期限までのパケット数に対するソフト限度、ソフトハード有効期限までのパケット数に対するハード限度、並びにフラグの少なくとも１つを含むことを特徴とする請求項１４のコンピュータ可読媒体。
【請求項１６】
前記操作符号は、ＳＡが追加されるべきか、削除されるべきか、または置き換えられるべきかを示すことを特徴とする請求項１５のコンピュータ可読媒体。
【請求項１７】
前記オフロードブロックデータ構造は、状態オブジェクトとネットワークプロトコル状態オブジェクトをｎｅｘｔｂｌｏｃｋポインタおよび依存ブロックポインタでリンクし、前記ＳＡオフロードブロックに関する前記依存ブロックポインタは、前記セキュアなインターネットプロトコルレイヤの上位に存在するプロトコルスタックレイヤが、前記送信元処理コンポーネントから前記宛先処理コンポーネントへの制御の前記移転を開始している場合、非ＮＵＬＬであることを特徴とする請求項１のコンピュータ可読媒体。
【請求項１８】
前記ＳＡオフロードブロックに、前記送信元処理コンポーネントと前記宛先処理コンポーネント間における前記制御の移転が完了した後でセキュリティ関連付けを追加することを含むステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項１９】
前記ＳＡオフロードブロック中のセキュリティ関連付けを、前記送信元処理コンポーネントと前記宛先処理コンポーネント間における前記制御の移転が完了した後で削除することを含むステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【請求項２０】
前記ＳＡオフロードブロック中のセキュリティ関連付けを、前記送信元処理コンポーネントと前記宛先処理コンポーネント間における前記制御の移転が完了した後で別のセキュリティ関連付けで置き換えることを含むステップを実行するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項１のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、全体としてはコンピュータネットワーキング技術に関する。より詳細には、本発明は、ネットワークコンピューティングタスクのオフロード（offload）を最適化するための機構に関する。
【背景技術】
【０００２】
オペレーティングシステム、アプリケーションソフトウェア、ネットワーキング技術などの複雑さおよび精巧さは、劇的な速度で高まり続け、より高いコンピュータ機能をもたらしている。このより高い機能は、そのより高い機能を実施するのにＣＰＵによって実行されなければならないさらなるデューティに起因して、しばしば、より高い中央処理装置（ＣＰＵ）負荷（以降、「ＣＰＵオーバーヘッド」とも呼ぶ）をもたらす。
【０００３】
ＣＰＵオーバーヘッドの増加が直ちに明らかな１つの分野は、ネットワーク速度が、高い帯域幅の媒体の成長に起因して増加している、ネットワーク化されたアプリケーションの分野においてである。ネットワーク速度は、ＣＰＵプロセッサ速度、並びにホストコンピュータにおけるローカルメモリに関するアクセス速度に匹敵しさえする可能性がある。それらのネットワーク化されたアプリケーションは、７レイヤのＯＳＩ（Open System Interconnect）モデル、またはＷｉｎｄｏｗｓ（登録商標）オペレーティングシステムによって使用される階層モデルなどの、ほとんどのオペレーティングシステムによって使用される階層アーキテクチャに起因して、ホストプロセッサにさらに負担をかける。
【０００４】
周知の通り、そのようなモデルは、ネットワークに対する物理的接続とエンドユーザアプリケーションの間におけるデータの流れを記述するのに使用される。ネットワークケーブル上にデータビットを送ることなどの最も基本的な諸機能は、低位のレイヤにおいて実行され、他方、アプリケーションの詳細に応対する（attend to）諸機能は、上位レイヤに位置する。基本的に、各レイヤの目的は、より高位のレイヤにサービスを提供して、どのようにサービスが実際に実施されるかの詳細から、より高位のレイヤを遮蔽することである。レイヤは、各レイヤが、他方のコンピュータ上の同一のレイヤと通信していると信じるような形で抽象化される。
【０００５】
データパケットがレイヤ間を進むにつれて、データパケットに対して実行される様々な機能は、ソフトウェアを多用することが可能であり、このため、しばしば、相当な量のＣＰＵプロセッサリソースおよびメモリリソースを要する。例えば、パケットチェックサムの計算および検証、メッセージダイジェスト計算、ＴＣＰセグメント化、ＴＣＰ再伝送−ＡＣＫ（肯定応答）処理、ＤｏＳ攻撃から保護するパケットフィルタリング、ＵＤＰ（ユーザデータグラムプロトコル）パケット断片化などの、様々なレイヤにおいてパケットに対して実行される一部の機能は、ＣＰＵを極めて多用する。これらの機能のそれぞれが実行されると、ＣＰＵに対する結果のデマンドにより、コンピュータシステム全体のスループットおよびパフォーマンスが大きく影響を受ける可能性がある。
【０００６】
オンライン販売および在宅勤務使用が増加するにつれ、データ伝送のセキュリティは、ますます重要になっている。これにより、データパケットに対して、さらなるセキュリティ機能が実行されるべきことが要求されている。それらのセキュリティ機能には、異なる通信ネットワークを横断するデータの伝送中にデータのプライバシーを確実にすること、データパケットが、認証されたエンドホスト、エンドアプリケーション、またはエンドユーザから来ていることを確実にすること、並びに異なる通信ネットワークを横断するデータの伝送中に、データが変更されていないことを確実にすることが含まれる。本出願では、セキュアなデータ伝送は、プライバシー、認証、またはデータ完全性の１つまたは複数の任意の組み合わせを終端間で想定することができるデータ伝送として定義される。データネットワークを介した、セキュアなデータ伝送を円滑にする、いくつかの標準が開発されている。それらの標準は、リモートシステムが、メッセージ交換および計算を介して、セキュアなセッションを確立して、異なる通信ネットワークを横断して伝送される細心の注意を払うべきデータが、セキュリティで保護され、改ざんを免れた（すなわち、改ざんされていない）ままであることを可能にする方法を提供する。例えば、「ＩＰＳｅｃ」（インターネットセキュリティプロトコル）を使用して、セキュアなホスト−ホストパイプ、ユーザレベルセキュリティ、アプリケーションレベルセキュリティ、接続レベルセキュリティ、およびインターネットを介した仮想プライベートネットワークを確立することができる。ＩＰＳｅｃは、暗号法暗号化（cryptographic encryption）および認証に関する一組の仕様を定義する。また、ＩＰｓｅｃは、アプリケーション間で確立されるセキュアなセッションに関するキーを確立するための「ＩＫＥ」（インターネットキー交換）アルゴリズムを含む、キー交換のためのいくつかのアルゴリズムもサポートする。データの暗号化および復号化（例えば、ＳＳＬ暗号化およびＩＰセキュリティ暗号化）は、ＣＰＵを多用する。例えば、ＴＣＰ送信処理に関する現在の推定値は、転送される１バイトのデータ当たり、およそ２サイクルである。ＩＰＳｅｃ認証の場合、ＣＰＵオーバーヘッドは、様々であるが、概数で、１バイト当たり、およそ１５サイクルである。暗号化の場合、ＣＰＵオーバーヘッドは、１バイト当たり、およそ２５サイクルからおよそ１４５サイクルの間にまで上昇する。
【０００７】
以上の数値から、セキュリティセッションを確立するタスクを実行することは、ＣＰＵを多用することを見て取ることができる。ホストプロセッサが以上のタスクのすべてを実行することは、それらのタスクのためにリソースが消費されるため、システムパフォーマンスが低下することをもたらす可能性がある。システムパフォーマンスの低下は、ネットワーク要素の機能（例えば、ルーティング、交換、サーバ機能（serving）、ネットワーク化されたストレージを管理することなど）に依存して、様々な形でネットワークおよびユーザに影響を与える。
【０００８】
ＣＰＵリソースに対するデマンドが増大するにつれ、ＮＩＣ（ネットワークインタフェースカード）などのコンピュータハードウェア周辺デバイスの能力およびスループットも増加している。これら周辺デバイスは、しばしば、他の場合はＣＰＵによって実行されるタスクおよび機能の多くを実行することができる専用プロセッサおよびメモリを備える。
【０００９】
ホストプロセッサから、それらのタスクの一部をオフロードするコプロセッサが開発されている。ホストプロセッサのために特定のプリミティブタスク（例えば、ハッシュデータ）を実行する、いくつかのコプロセッサが開発されている。しかし、タスク専用コプロセッサの追加は、ホストプロセッサから、相当な量のセキュアなセッション確立タスクをオフロードすることはない。１つの代替は、複数のコプロセッサをシステムに追加し、各プロセッサが、異なるタスクを実行することである。そのような代替は、物理的制約（例えば、カードが接続されるコンピュータ上のスロットの数）によって制限され、ホストプロセッサと複数のコプロセッサの間における複数の通信の問題を持ち込む。
【００１０】
セキュアなセッションを確立するのに要求されるタスクの複数を実行する、他のプロセッサが開発されている。その実施例として、プロセッサが、暗号化操作（すなわち、暗号化または復号化）、キー生成操作、およびハッシュ操作を実行することができるものと想定されたい。サーバが、セキュアなセッションを確立する要求を受信している場合、サーバは、プロセッサを呼び出して、クライアントから受信されたプリマスタシークレット（pre-master secret）を復号化しなければならない。マスタシークレットおよびキー材料を生成するのに、ホストプロセッサは、プロセッサに対して約２０の呼び出し（各ハッシュ操作につき１つ）を行わなければならない。この実施例で示される通り、複数のタスクを実行することができるプロセッサは、ホストプロセッサとコプロセッサの間における複数の通信からのリソース消費の問題を解決しない。
【００１１】
したがって、プロセッサから周辺デバイスなどのプロセッサにＩＰＳｅｃ機能をオフロードすることに関連するオーバーヘッドを小さくする必要性が、当技術分野において存在する。詳細には、ＩＰＳｅｃ機能をオフロードすることを個々の接続に関する処理要件を同時に維持しながら行うための問題解決法の必要性が存在する。
【発明の開示】
【発明が解決しようとする課題】
【００１２】
本発明は、ＩＰＳｅｃ認証および／または復号化に関連する、パケット生成を含む計算をオフロードすること、およびアップロードすることを信頼できる形で行う方法を提供し、上記先行技術が抱える以上の諸問題を克服する。
【課題を解決するための手段】
【００１３】
ネットワークスタックにおいて、２つ以上のＩＰＳｅｃセキュリティ関連付けが、同一の中間ソフトウェアレイヤ（複数）の１つまたは複数を横断することが可能である。ソフトウェアレイヤのそれぞれは状態オブジェクトを有し、状態オブジェクトは、一定状態変数、キャッシュ状態変数、および委任状態変数の１つまたは複数を含むことが可能である。任意のソフトウェアレイヤに関して、ホストは、レイヤの委任された状態変数に関して、処理制御を周辺デバイスにオフロードして、周辺デバイスが独立にデータを転送することを可能にする。キャッシュ状態変数に関して、ホストはキャッシュ状態変数の制御を保持し、キャッシュ状態変数が変化した場合に周辺デバイスを更新する。一定状態変数に関して、変数値はオフロードの存続期間にわたって変化しない。このため、ホストは状態オブジェクトを周辺デバイスにオフロードすることができるが、システムの状態は、イベントがキャッシュ状態変数または委任状態変数を変化させた場合でも整合性を保つ（remain consistent）。
【００１４】
２つのホスト間でデータ転送が辿るパスは、パス状態オブジェクトによって表される。２つの接続が同一のパスを介してデータを転送する場合、両接続は同一のパス状態オブジェクトを共有する。このため、逆転したツリーデータ構造の形態を一般的に採る状態オブジェクトの結果の階層が存在する。ホストは逆転したツリーデータ構造全体を周辺デバイスにオフロードすることができ、ホストが複数の接続の周辺デバイスに処理制御を一度にオフロードすることが可能になる。ＳＡ（セキュリティ関連付け）機能のオフロード、アップロード、無効化、およびキー更新がいつ行われるかの制御をホストが保持しながら、認証および／または暗号化に関連する計算などの複数の特定のネットワーク機能をクリーンな形でオフロードする上記能力により、ホストは、所望のネットワーク機能、ネットワーク管理、完全性、フォールトトレランス、およびセキュリティを損なうことなくＣＰＵサイクルを保つことが可能になり、本発明が多種多様な環境で実施されることが更に可能になる。デバイス（複数）が協調して、ＳＡ有効期限に関するソフト限度とハード限度の両方のサポートを含む、ＳＡに関するメトリック（metric）を保持する。目標に関して、タイマ要件は最小限に抑えられる。オフロードされたＳＡ機能は、ネットワークスタックの中間ソフトウェアレイヤ（複数）の他のオフロードされた状態オブジェクト中に埋め込まれることが可能である。
【００１５】
本発明のさらなる特徴および利点は、以下の説明で提示し、一部は、その説明から明白となるか、または本発明の実施によって知ることができる。本発明の特徴および利点は、添付の特許請求の範囲で特に指摘する手段（instrument）および組み合わせを使用して実現し、獲得することができる。本発明による以上、およびその他の特徴は、以下の説明、および添付の特許請求の範囲からより十分に明白となるか、または以下に提示する本発明の実施によって知ることができる。
【００１６】
本発明の前述した利点および特徴、並びにその他の利点および特徴を説明するため、以上に簡単に述べた本発明のより詳細な説明を、添付の図面に示す本発明の特定の諸実施形態を参照して行う。それらの図面は、本発明の代表的な諸実施形態だけを示し、したがって、本発明の範囲を限定していると見なされるべきではないものと理解して、本発明を、添付の図面の使用を介して、さらに具体的に、さらに詳細に示し、説明する。
【発明を実施するための最良の形態】
【００１７】
本発明は、全体としてはコンピュータネットワーキング技術に関する。より詳細には、本発明は、全体として、ホストプロセッサによって通常、実行されるＩＰＳｅｃ認証および／または暗号化（「ＩＰＳｅｃ操作」と呼ぶ）に関連する計算タスクの処理モジュールへのオフロードを最適化するため、並びに制御を適宜、ホストプロセッサに戻すための機構に関する。処理モジュールは、ソフトウェア、ハードウェア、またはソフトウェアとハードウェアの混合で以下に説明する通り、オフロードされたＩＰＳｅｃ操作を処理する。処理モジュールは、別個のインタフェースカード内部にあること、マザーボードの一部であること、内部カードまたは外部カードの中にあること、多重プロセッサユニットの別のプロセッサであることなどが可能である。別の形は、処理モジュールの機能を、ソフトウェア、ハードウェア、またはソフトウェアとハードウェアの混合で以下に説明する通り、オフロードされたネットワークスタック操作を処理する、例えば、ネットワークインタフェースカードなどの、周辺デバイスに埋め込むことである。周辺デバイスは、１つまたは複数のプロセッサを有することが可能である。
【００１８】
説明として、限定としてではなく、本明細書および特許請求の範囲を読んだ後、「周辺デバイス」には、ネットワークインタフェースカードのようなコンポーネントだけでなく、ネットワークアダプタを有する汎用ＣＰＵ、専用ＣＰＵを有するネットワーク処理エンジン、オフロードＮＩＣを有する従来のミニポート、またはハードウェア状態マシンインプリメンテーションなども含まれることが可能であることが理解されよう。したがって、以下の説明は、ＣＰＵサイクルの点で費用対効果の大きい発明の方法について述べる。
【００１９】
本発明のさらなる特徴および利点は、以下の説明で提示され、その一部は、その説明から明白となるか、または本発明の実施によって知ることができる。本発明の特徴および利点は、添付の特許請求の範囲で特に指摘する手段および組み合わせを使用して実現し、獲得することができる。本発明による以上、およびその他の特徴は、以下の説明、および添付の特許請求の範囲からより十分に明白となるか、または以下に提示する本発明の実施によって知ることができる。
【００２０】
また、本発明による範囲内の諸実施形態は、コンピュータ実行可能命令またはデータ構造を担持している、または格納しているコンピュータ可読媒体も含む。そのようなコンピュータ可読媒体は、汎用または専用のコンピュータがアクセスすることができる任意の利用可能な媒体であることが可能である。例として、限定としてではなく、そのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気記憶装置、あるいはコンピュータ実行可能命令またはデータ構造の形態で、所望のプログラムコード手段を担持する、または格納するのに使用することができ、汎用または専用のコンピュータがアクセスすることができる他の任意の媒体を含むことが可能である。
【００２１】
情報が、ネットワーク、または別の通信接続（ハードワイヤード、無線、あるいはハードワイヤードと無線の組み合わせ）を介してコンピュータに転送される、または提供される場合、コンピュータは、その接続をコンピュータ可読媒体と適切に見なす。このため、任意のそのような接続が、コンピュータ可読媒体と適切に呼ばれる。また、以上の媒体の組み合わせも、コンピュータ可読媒体の範囲内に含められなければならない。コンピュータ実行可能命令は、例えば、汎用コンピュータ、専用コンピュータ、または専用処理デバイスが、ある機能、またはある一群の機能を実行するようにさせる命令およびデータを含む。
【００２２】
同様の符号が同様の要素を指す図面を参照すると、本発明が、適切なコンピューティング環境で実施されているのが示されている。必須ではないが、本発明は、パーソナルコンピュータによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的な文脈で説明する。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。さらに、本発明は、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースの家庭用電化製品またはプログラマブル家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、ネットワーク化された周辺デバイス（例えば、ネットワーク化されたプリンタ）などを含む、他のコンピュータシステム構成で実施してもよいことが、当業者には理解されよう。また、本発明は、通信ネットワークを介してリンクされたリモート処理装置（複数）によってタスクが実行される、分散コンピューティング環境において実施してもよい。分散コンピューティング環境では、プログラムモジュール（複数）は、ローカルメモリ記憶装置とリモートメモリ記憶装置の両方の中に配置されることが可能である。
【００２３】
次に、図１を参照すると、本発明を実施することができる適切なコンピューティング環境の簡単な一般的説明が示されている。図１は、本発明を実施することができる適切なコンピューティングシステム環境１００の実施例を示す。コンピューティングシステム環境１００は、適切なコンピューティング環境の一実施例に過ぎず、本発明の用法または機能の範囲について何ら限定を示唆するものではない。また、コンピューティング環境１００が、例示の動作環境１００に示したコンポーネントのいずれか１つ、または組み合わせに関連する依存関係または要件も有すると解釈してはならない。
【００２４】
本発明は、他の多数の汎用または専用のコンピューティングシステム環境またはコンピューティングシステム構成で動作する。本発明で使用するのに適する可能性がある周知のコンピューティングシステム、コンピューティング環境、および／またはコンピューティング構成の実施例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラマブル家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、ネットワーク化された周辺デバイス（例えば、ネットワーク化されたプリンタ）、以上のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれるが、以上には限定されない。
【００２５】
本発明は、コンピュータによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的な文脈において説明することができる。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。また、本発明は、通信ネットワークを介してリンクされたリモート処理装置（複数）によってタスクが実行される、分散コンピューティング環境で実施してもよい。分散コンピューティング環境では、プログラムモジュール（複数）は、メモリ記憶装置を含むローカルコンピュータ記憶媒体とリモートコンピュータ記憶媒体の両方の中に配置されることが可能である。
【００２６】
図１を参照すると、本発明を実施するための例示的なシステムが、コンピュータ１１０の形態で汎用コンピューティングデバイスを含む。コンピュータ１１０のコンポーネントには、処理装置１２０、システムメモリ１３０、並びにシステムメモリから処理装置１２０までを含む様々なシステムコンポーネントを結合するシステムバス１２１が含まれることが可能である。処理装置１２０は、単一のプロセッサ、または複数のプロセッサを有することが可能である。システムバス１２１は、様々なバスアーキテクチャのいずれかを使用する、メモリバスまたはメモリコントローラ、周辺バス、クロスバー（cross-bar）、交換バスファブリック（switched bus fabric）、およびローカルバスを含め、いくつかのタイプのバス構造のいずれであってもよい。また、システムバス１２１は、バスの階層であることも可能である。例として、限定としてではなく、そのようなアーキテクチャには、ＩＳＡ（Industry Standard Architecture）バス、ＭＣＡ（Micro Channel Architecture）バス、ＥＩＳＡ（EnhancedISA）バス、ＶＥＳＡ（Video Electronics Standards Associate）ローカルバス、ＮＣ−ＮＵＭＡ（No Cache Non-Uniform Memory Access）アーキテクチャバス、ＣＣ−ＮＵＭＡ（Cache-Coherent Non-Uniform Memory Access）アーキテクチャバス、ＧＩＧＡＲＩＮＧネットワークバス、ＦＩＣＯＮバス、およびメザニン（Mezzanine）バスとしても知られるＰＣＩ（Peripheral Component Interconnect）バスが含まれる。
【００２７】
コンピュータ１１０は、通常、様々なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ１１０がアクセスすることができる任意の利用可能な媒体であることが可能であり、揮発性媒体と不揮発性媒体、リムーバブルな媒体とリムーバブルでない媒体をともに含まれる。例として、限定としてではなく、コンピュータ可読媒体は、コンピュータ記憶媒体および通信媒体を含む。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報の格納のために任意の方法または技術で実装された、揮発性媒体と不揮発性媒体、リムーバブルな媒体とリムーバブルでない媒体がともに含まれる。コンピュータ記憶媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ＤＶＤ（デジタルバーサタイルディスク）または他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気記憶装置、あるいは所望の情報を格納するのに使用することができ、コンピュータ１１０がアクセスすることができる他の任意の媒体が含まれるが、以上には限定されない。通信媒体は、通常、搬送波などの変調されたデータ信号、または他のトランスポート機構で、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを実現し、あらゆる情報配信媒体が含まれる。「変調されたデータ信号」という用語は、信号内に情報を符号化するような形で特性の１つまたは複数が設定または変更されている信号を意味する。例として、限定としてではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、並びに音響媒体、ＲＦ媒体、赤外線媒体、およびその他の無線媒体などの無線媒体が含まれる。また、以上の媒体のいずれかの媒体の組み合わせも、コンピュータ可読媒体の範囲内に含められなければならない。
【００２８】
システムメモリ１３０は、ＲＯＭ（読み取り専用メモリ）１３１やＲＡＭ（ランダムアクセスメモリ）１３２などの不揮発性メモリおよび／または揮発性メモリの形態で、コンピュータ記憶媒体を含む。起動中などに、コンピュータ１１０内部の要素間で情報を転送するのを助ける基本ルーチンを含むＢＩＯＳ（基本入出力システム）１３３が、通常、ＲＯＭ１３１に格納される。ＲＡＭ１３２は、通常、処理装置１２０が、即時にアクセスすることができ、かつ／または現在、処理しているデータおよび／またはプログラムモジュール（複数）を含む。例として、限定としてではなく、図１は、オペレーティングシステム１３４、アプリケーションプログラム（複数）１３５、その他のプログラムモジュール（複数）１３６、およびプログラムデータ１３７を示す。
【００２９】
また、コンピュータ１１０は、他のリムーバブルな／リムーバブルでない、揮発性／不揮発性のコンピュータ記憶媒体も含むことが可能である。単に例として、図１は、リムーバブルでない不揮発性の磁気媒体に対して読み取りまたは書き込みを行うハードディスクドライブ１４１、リムーバブルな不揮発性の磁気ディスク１５２に対して読み取りまたは書き込みを行う磁気ディスクドライブ１５１、およびＣＤ−ＲＯＭまたは他の光媒体などのリムーバブルな不揮発性の光ディスク１５６に対して読み取りまたは書き込みを行う光ディスクドライブ１５５を示す。例示的な動作環境において使用することができる、他のリムーバブルな／リムーバブルでない、揮発性／不揮発性のコンピュータ記憶媒体には、磁気テープカセット、フラッシュメモリカード、デジタルバーサタイルディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれるが、以上には限定されない。ハードディスクドライブ１４１は、通常、インタフェース１４０のようなリムーバブルでないメモリインタフェースを介してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は、通常、インタフェース１５０のようなリムーバブルなメモリインタフェースでシステムバス１２１に接続される。
【００３０】
前述し、図１に示すドライブ（複数）、および関連するコンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、および他のデータのストレージをコンピュータ１１０に提供する。図１では、例えば、ハードディスクドライブ１４１は、オペレーティングシステム１４４、アプリケーションプログラム（複数）１４５、その他のプログラムモジュール（複数）１４６、およびプログラムデータ１４７を格納しているのが示されている。以上のコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム（複数）１３５、その他のプログラムモジュール（複数）１３６、およびプログラムデータ１３７と同一であることも、異なることも可能であることに留意されたい。オペレーティングシステム１４４、アプリケーションプログラム（複数）１４５、他のプログラムモジュール（複数）１４６、およびプログラムデータ１４７に、ここでは、少なくともそれらが異なるコピーであることを示すように、異なる符号を与えている。
【００３１】
ユーザは、キーボード１６２や、マウス、トラックボール、またはタッチパッドと一般に呼ばれるポインティングデバイス１６１などの入力デバイス（複数）を介して、コマンドおよび情報をコンピュータ１１０に入力することができる。他の入力デバイス（複数）（図示せず）には、マイク、ジョイスティック、ゲームパッド、衛星放送アンテナ、スキャナ、ビデオ入力などが含まれることが可能である。以上、およびその他の入力デバイスは、しばしば、システムバスに結合されたユーザ入力インタフェース１６０を介して処理装置１２０に接続されるが、パラレルポート、ゲームポート、またはＵＳＢ（ユニバーサルシリアルバス）などの、他のインタフェースおよびバス構造で接続してもよい。また、モニタ１９１、または他のタイプのディスプレイデバイスも、ビデオインタフェース１９０のようなインタフェースを介して、システムバス１２１に接続される。モニタに加え、コンピュータは、出力周辺インタフェース１９５を介して接続することができる、スピーカ１９７、プリンタ１９６、およびビデオ出力などの、他の周辺出力デバイス（複数）も含むことが可能である。
【００３２】
コンピュータ１１０は、リモートコンピュータ１８０のような１つまたは複数のリモートコンピュータに対する論理接続を使用する、ネットワーク化された環境で動作することができる。リモートコンピュータ１８０は、別のパーソナルコンピュータ、サーバ、ルータ、ネットワーク周辺デバイス（例えば、プリンタ）、ネットワークＰＣ、ピアデバイス、または他の一般的なネットワークノードであることが可能であり、通常、パーソナルコンピュータ１１０に関連して前述した要素の多く、またはすべてを含むが、メモリ記憶装置１８１だけを図１に示している。図１に示す論理接続には、ＬＡＮ（ローカルエリアネットワーク）１７１およびＷＡＮ（ワイドエリアネットワーク）１７３が含まれるが、他のネットワークも含まれることが可能である。そのようなネットワーキング環境は、オフィス、企業全体のコンピュータ網、イントラネット、およびインターネットで一般的である。
【００３３】
ＬＡＮネットワーキング環境で使用される場合、パーソナルコンピュータ１１０は、ネットワークインタフェースまたはネットワークアダプタ（例えば、ＮＩＣ（ネットワークインタフェースカード））１７０を介してＬＡＮ１７１に接続される。単一のボックスとして示すが、ネットワークインタフェース１７０は、複数のインスタンス化（instantiation）を有し、様々な形で実装されることが可能である。１つの形は、システムバスに直接に接続された１つまたは複数のプロセッサを有する処理モジュールが存在して、ネットワークインタフェースカードが、システムバスに直接に接続されて、処理装置とネットワークインタフェースカードが、システムバスを介して互いに通信することである。処理モジュールは、ソフトウェア、ハードウェア、またはソフトウェアとハードウェアの混合で以下に説明する通り、オフロードされたネットワークスタック操作を処理する。処理モジュールは、別個のインタフェースカード内部にあること、マザーボードの一部であること、内部カードまたは外部カードの中にあること、多重プロセッサユニットの別のプロセッサであることなどが可能である。別の形は、処理モジュールの機能を、ソフトウェア、ハードウェア、またはソフトウェアとハードウェアの混合で以下に説明する通り、オフロードされたネットワークスタック操作を処理する、例えば、ネットワークインタフェースカードなどの、周辺デバイスに埋め込むことである。周辺デバイスは、１つまたは複数のプロセッサを有することが可能である。ＷＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、通常、インターネットなどのＷＡＮ１７３を介して通信を確立するためのモデム１７２、または他の手段を含む。内部にあることも、外部にあることも可能なモデム１７２は、ユーザ入力インタフェース１６０、または他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク化された環境では、パーソナルコンピュータ１１０に関連して示したプログラムモジュール（複数）、またはプログラムモジュール（複数）の諸部分は、リモートメモリ記憶装置に格納することができる。例として、限定としてではなく、図１は、リモートアプリケーションプログラム（複数）１８５がメモリデバイス１８１上に存在するのを示す。図示したネットワーク接続は例示であり、コンピュータ間で通信リンクを確立する他の手段も使用できることを理解されたい。
【００３４】
以下の説明では、特に明記しないかぎり、本発明を、１つまたは複数のコンピュータによって実行される動作、および操作の記号表現に関連して説明する。このため、コンピュータによって実行されるものとして、ときとして述べられるそのような動作および操作には、構造化された形態のデータを表す電気信号の、コンピュータの処理装置による操作が含まれるものと理解されたい。この操作は、データを変換するか、またはコンピュータのメモリシステム内のロケーションにおいてデータを保持し、それにより、当業者がよく理解している形で、コンピュータの動作が再構成されるか、またはそれ以外で変更される。データが保持されるデータ構造は、データのフォーマットによって定義された特定のプロパティを有するメモリの物理的ロケーションである。しかし、本発明を以上の文脈で説明するが、以下に説明する様々な動作および操作をハードウェアで実施することもできることが当業者には理解される通り、限定的であることは意図していない。
【００３５】
以下の説明では、ネットワークスタック操作を実行する機能を有する周辺デバイスを使用して、本発明を説明する。以下で使用する周辺デバイス２０４は、周辺デバイスだけでなく、周辺デバイスがオフロードされたＩＰＳｅｃ操作を処理することに関して説明される（すなわち、周辺デバイスが、オフロードされたＩＰＳｅｃ操作をソフトウェア、ハードウェア、またはソフトウェアとハードウェアの混合で処理する）場合に、前述した処理モジュールの他の諸実施形態のいずれも指す。図２ａは、ネットワーキングモデルを構成するコンポーネントのいくつかと、本発明のコンポーネントの相互関係を示す。図２ｂは、本発明のコンポーネントが、別のチムニに埋め込まれている場合の、ネットワーキングモデルを構成するコンポーネントのいくつかと、本発明のコンポーネントの相互関係を示す。通常の動作中、ネットワーク化されたメッセージが、アプリケーション２００によって、ネットワークスタック２０２を介して周辺デバイス２０４に送られ、デバイス２０４において、メッセージがネットワーク上の他のデバイス（複数）およびアプリケーション（複数）に送信される。さらに、ネットワーク化されたメッセージが、他のデバイス（複数）およびアプリケーション（複数）から、周辺デバイスを使用して受信されることが可能であり、周辺デバイスは、次に、そのネットワーク化されたメッセージを、ネットワークスタック２０２を介してアプリケーション２００に送る。ネットワークスタック２０２は、１つまたは複数の中間ソフトウェアレイヤ２０６を含む。アプリケーション２００から送られたデータは、中間ソフトウェアレイヤ２０６を介して伝送され、レイヤ２０６において、データをパッケージすること、信頼できるデータ伝送およびメッセージダイジェストの計算などの、特定の操作がデータに対して行われることが可能である。
【００３６】
ＩＰＳｅｃスイッチ２０８は、中間ソフトウェアレイヤ２０６に関するＩＰＳｅｃ操作を実行することから処理装置１２０をオフロードするのに使用される（すなわち、中間レイヤの少なくとも１つがＩＰＳｅｃ操作を要するか、またはＩＰＳｅｃレイヤを有する）。ＩＰＳｅｃスイッチ２０８は、別個に示しているが、ＩＰＳｅｃスイッチ２０８は、ネットワークスタック２０２の中間レイヤに組み込むこともできることに留意されたい。他の中間レイヤが、ＩＰＳｅｃスイッチより上位にあることが可能である（図示せず）。ＩＰＳｅｃ操作がオフロードされた後、周辺デバイス２０４がＩＰＳｅｃ操作を実行するように、データがチムニ２１０を介して周辺デバイス２０４に送られる。この階層では、ＩＰＳｅｃスイッチおよびＩＰＳｅｃ操作より上位の中間ソフトウェアレイヤは、ホストまたは周辺デバイスの中に限って存在する必要はなく、中間レイヤのいずれも、完全にオフロードされること、ホストの中に留まること、または両方の組み合わせ（例えば、１つまたは複数の特定の接続をオフロードする）が可能である。
【００３７】
次に、図２ｂを参照すると、ＩＰＳｅｃチムニ２１０が、他のチムニの下に、または上に階層化されていることが可能である。例えば、ＩＰＳＥＣチムニ２１０が、ＴＣＰチムニ２２０の上または下に階層化されることが可能である。スイッチ２２２は、中間ソフトウェアレイヤ２０６に関するネットワークスタック操作を実行することから処理装置１２０をオフロードするのに使用される。スイッチ２２２を別個に示しているが、スイッチ２２２はネットワークスタック２０２の最上位の中間レイヤに組み込んでもよいことに留意されたい。ネットワークスタック操作がオフロードされた後、周辺デバイス２０４が、ネットワークスタック操作を実行するように、使用されるネットワークスタック２０２のタイプに依存して、データが、チムニ２１０または２２０を介して、周辺デバイス２０４に送られる。例えば、ＴＣＰ接続がオフロードされない場合、または別のトランスポートプロトコル（ＵＤＰなどの）が使用されている場合、ＩＰＳｅｃ操作は、チムニ２１０を介して周辺デバイス２０４に送られて、ＩＰＳｅｃ操作が実行される。同様に、ＴＣＰ接続がオフロードされる場合、ＴＣＰ操作が、チムニ２２０を介して周辺デバイス２０４に送られる。ＴＣＰ接続が、ＩＰＳｅｃカプセル化／カプセル化解除を要する場合、オフロード目標（例えば、周辺デバイス）は、ＩＰＳｅｃ  ＳＡオフロードオブジェクトをパケットに適用する。この階層では、中間ソフトウェアレイヤおよびＩＰＳｅｃ操作は、ホストまたは周辺デバイス中だけに限って存在する必要はなく、中間ソフトウェアレイヤのいずれも、完全にオフロードされること、ホストの中に留まること、または両方の組み合わせ（例えば、１つまたは複数の特定の接続をオフロードする）のいずれかが可能である。
【００３８】
接続は、信頼できるデータ転送および信頼できないデータ転送、並びにユニキャストデータ転送またはマルチキャストデータ転送の任意の組み合わせであることが可能である。中間レイヤがホストの中に留まる場合、ホストは周辺デバイス２０４の中のキャッシュされた変数（以下に説明する）を更新する。例えば、ネットワークレイヤに関するＲＣＥ（ルートキャッシュエントリ）が、周辺デバイス２０４にオフロードされて、接続に関するＴＣＢ（トランスポート制御ブロック）状態エントリが、トランスポートレイヤに関してオフロードされることが可能である。スイッチ２２２は、異なるＴＣＢに関するトラフィックを、同一のＲＣＥを共有するネットワークスタック２０２を介して送り続ける一方で、オフロードされたＴＣＢに関して、チムニ２２０を介してトラフィックを送る。ＩＰＳｅｃスイッチ２０８は、チムニ２１０を介して、オフロードされたＳＡ（セキュリティ関連付け）に関するオフロードされたＩＰＳｅｃ機能に関するトラフィックを送り、ＩＰＳｅｃ認証および／または暗号化／復号化を要するトラフィックに関して、チムニ２２０からトラフィックを送信／受信することができる。
【００３９】
スイッチ２０８（または２２２）は、中間レイヤ２０６にオフロード要求を送ることにより、オフロードを開始する。各中間レイヤ２０６は、オフロード要求を拒否するか、またはリソース情報をオフロード要求に追加して、そのオフロード要求を、ネットワークスタック２０２における隣接するソフトウェアレイヤに送る。オフロード要求は、周辺デバイス２０４が接続をうまくオフロードすることができるかどうかを、デバイス２０４が判定するのに役立つリソース情報（場合により、各ネットワークレイヤに関する）を含む。周辺デバイス２０４は、オフロード要求を受け取ると、接続および／またはＩＰＳｅｃ操作をオフロードするのに利用できるリソースをデバイス２０４が有するかどうかを計算する。周辺デバイス２０４は、オフロードが可能でない場合、オフロード要求を拒否する。可能である場合、周辺デバイス２０４は、オフロード要求を承諾し、接続にリソースを割り当てる。周辺デバイス２０４は、パラメータのリストを有する完了メッセージを中間ソフトウェアレイヤ２０６に送ることにより、オフロード要求を完了させる。パラメータのリストは、中間ソフトウェアレイヤ２０６およびスイッチ２０８（または２２２）に情報を与えて、中間ソフトウェアレイヤ２０６およびスイッチ２０８（または２２２）が周辺デバイスと通信できるようにする。各中間ソフトウェアレイヤ２０６は、完了メッセージを受け取ると、パラメータのリストから、そのレイヤ向けの情報を取り除き、完了メッセージの残りの部分を次の中間レイヤ２０６に転送するか、またはさらなる中間レイヤ２０６が全く存在しない場合、スイッチ２０８（または２２２）に転送する。
【００４０】
中間レイヤ２０６は、オフロードに関する完了メッセージを受け取った場合、または最初のオフロード要求中、レイヤ２０６の状態を周辺デバイス２０４に送る。各状態は、次の３つのタイプの変数（「状態変数」とも呼ぶ）を有することが可能である。すなわち、ＣＯＮＳＴ、ＣＡＣＨＥＤ、およびＤＥＬＥＧＡＴＥＤである。任意の所与の中間レイヤ２０６に対応する状態オブジェクトは、３つすべてのタイプの状態を有することも、３つのタイプの状態のサブセットを有することも可能である。ＣＯＮＳＴ状態変数は、オフロードされた接続の存続期間中に決して変化しない定数である。
【００４１】
ＣＯＮＳＴ状態変数は、ネットワークスタック操作および／またはＩＰＳｅｃ操作の処理制御をオフロードしている際（以降、単に「オフロード中」とも呼ぶ）に周辺デバイス２０４に与えられるが、状態オブジェクトがホストプロトコルスタックにアップロードされる際（以降、単に「アップロード中」とも呼ぶ）、周辺デバイス２０４によって、適切な中間レイヤ２０６に戻されることはない。これは、中間レイヤ２０６がＣＯＳＮＴ状態変数の値を保持するからであり、アップロード中に転送されるデータ構造が、はるかに小さいことが可能になる。
【００４２】
ホストプロセッサは、ＣＡＣＨＥＤ状態変数の所有権を保持し、ホストプロセッサの中のＣＡＣＨＥＤ状態変数に対するあらゆる変更が周辺デバイス２０４の中で更新されることを確実にする。ＣＡＣＨＥＤ状態変数を変更する制御メッセージは、ネットワークスタック２０２によって扱われる。その結果、ホストは、オフロード中、ＣＡＣＨＥＤ状態変数を周辺デバイスに書き込むが、アップロード中、アップロード中の周辺デバイスからＣＡＣＨＥＤ状態変数を読み取る必要はない。これにより、アップロードに関連するオーバーヘッドはさらに小さくなる。
【００４３】
ホストプロセッサは、ＤＥＬＥＧＡＴＥＤ状態変数の所有権を周辺デバイス２０４に移転する。ＤＥＬＥＧＡＴＥＤ状態変数は、オフロード中、１回、書き込まれ、アップロード中、読み取られる。ＤＥＬＥＧＡＴＥＤ状態変数の制御だけを返すことにより、ホストに接続をアップロードして戻すことに関連するオーバーヘッドが最小限に抑えられる。
【００４４】
したがって、オフロード中、状態オブジェクトの制御は、所与の状態オブジェクトの状態変数のいくつかの変数の制御がホストプロセッサ内部に保持される一方で、所与の状態オブジェクトの他の状態変数の制御は周辺デバイス２０４に渡されるという点で、ホストプロセッサと周辺デバイス２０４の間で共有される。したがって、各中間レイヤに関連する状態の処理に関する制御は、ホストプロセッサと周辺デバイスの間で、それぞれが、状態の独占的な部分を所有するようにクリーンな形で分割される。
【００４５】
ホストプロセッサは、必要とされる場合、ＤＥＬＥＧＡＴＥＤ状態変数に関して、周辺デバイス２０４にクエリを行うことができる。また、ホストプロセッサは、診断のためにＣＯＮＳＴ状態変数またはＣＡＣＨＥＤ状態変数のクエリも行うことができる。状態を３つのカテゴリ（つまり、「変数」）に分けることにより、ネットワークスタック２０２がクリーンな形でチムニ２１０、２２０と並存することが可能になる。周辺デバイスに与えられるべきあらゆる状態変数が（そのような状態変数に対する制御も、周辺デバイスに渡されるか否かに関わらず）初期オフロード要求の中に含められて、周辺デバイスとホストスタックの間における対話の数が最適化されることが可能である。これは、状態オブジェクトが、委任状態を含まないか、または委任状態変数が、初期オフロード要求から、そのオフロード要求の完了までの間に変化しないことをホストスタックが確実にすることができる場合、行われることが可能である。
【００４６】
アップロードは、周辺デバイス２０４またはホストスタック２０２によって開始されることが可能である。ＩＰＳｅｃ操作のホストスタックによる開始は、ＩＰＳｅｃレイヤ２１４より上位のレイヤによって、またはＩＰＳｅｃレイヤ２１４自体によって始められることが可能である。また、ネットワークスタック操作に関するアップロードも、例えば、中間レイヤ２０６が、パスエントリまたは近隣エントリを無効にしているために、中間レイヤ２０６によって間接的に開始されることも可能である。アップロードが開始されると、周辺デバイス２０４は、すべての未処理の要求を完了させ、状態オブジェクトをホストスタックに返す。スイッチ２２２は、さらなる送信要求をキューに入れ、周辺デバイス２０４に対する受信バッファにポストすることを止める。アップロード中、ホストスタックの中間レイヤは、状態オブジェクトの制御を取り戻し、アップロード要求を終了する。アップロード要求が完了した後、周辺デバイス２０４は、アップロードのためにもはや使用されていないリソースを解放する。
【００４７】
一部の状況下では、特定の接続または状態オブジェクトに関するデータは、別の周辺デバイスを介して着信すること、またはホストプロトコルスタックによって処理されることが要求されることが可能である（例えば、ＩＰフラグメント、ＩＰオプションまたはＩＰ拡張ヘッダの処理、あるいはＴＣＰセグメントが、異なるネットワークインタフェース上に着信することを生じさせるルートフラップ）。これが生じた場合、中間レイヤ２０６は、受信されたデータを周辺デバイス２０４に転送する転送インタフェースも有することが可能である。中間レイヤ２０６は、周辺デバイスが関連する接続または状態オブジェクトをアップロードしている最中に、データを周辺デバイス２０４に転送しようと試みることが可能である。このため、周辺デバイス２０４は、データパケットを処理するのに必要な状態オブジェクトの制御をもはや有さない可能性がある。これが生じた場合、周辺デバイス２０４は、アップロードが進行中であることを示すエラーメッセージを中間レイヤ２０６に戻す。エラーメッセージは、着信データを転送するのを止め、中間レイヤが状態オブジェクトを受け取るまで、さらなるデータをバッファリングするよう、中間レイヤ２０６に通知する。代替として、周辺デバイス２０４上のさらなるバッファメモリを犠牲にして、周辺デバイス２０４が、データをバッファリングし、状態オブジェクトのアップロードが完了した際、そのデータを提供するように、着信データを周辺デバイス２０４に転送することも可能である。代替として、中間レイヤ２０６が、アップロードが行われていることに気付いている場合、中間レイヤは、アップロードが完了するまで、要求をバッファリングして、次に、データを処理することを選択してもよい。
【００４８】
複数の接続が、中間ソフトウェアレイヤ２０６によって周辺デバイス２０４にオフロードされることが可能である。オフロードに関して、中間ソフトウェアレイヤの状態オブジェクトを参照する、上位レイヤ状態オブジェクト（すなわち、中間ソフトウェアレイヤ２０６より上位のレイヤの状態オブジェクト）の数の参照カウンタが、中間ソフトウェアレイヤ２０６によって保持される。本明細書で使用する状態オブジェクトは、特定のレイヤに関する状態変数（「状態」とも呼ぶ）の集合である。前述した通り、そのような状態変数は、ＣＯＮＳＴ、ＣＡＣＨＥＤ、またはＤＥＬＥＧＡＴＥＤとして分類されることが可能である。特定の中間レイヤのオフロードされた状態オブジェクトへの参照の数が、０にまで下がった場合（例えば、アップロード要求中）、中間レイヤ２０６は、その中間レイヤに関する状態オブジェクトをアップロードし、対応する委任状態変数を中間レイヤ２０６に送り、中間レイヤ２０６に関する状態オブジェクトを削除するよう、周辺デバイス２０４にメッセージを送る。アップロード要求は、参照カウントが０にまで下がることを生じさせた、最初のアップロード要求中に行われることも、後の時点で行われることも可能であることに留意されたい。
【００４９】
図３ａは、ハードウェアレイヤ３１４が、例えば、ＮＩＣ（ネットワークインタフェースカード）であることが可能な周辺デバイスを含む、本発明による実施形態を示す。図３ｂは、ハードウェアレイヤ３１４が、例えば、ＮＩＣ（ネットワークインタフェースカード）であることが可能な周辺デバイスを含み、ＩＰＳｅｃチムニ３０８が、ＴＣＰチムニなどの別のチムニ３２０に埋め込まれた、本発明による実施形態を示す。さらに、図３ｂは、ＩＰＳｅｃスイッチ３２２、並びにトランスポートレイヤ３００と、ネットワークレイヤ３０２と、フレーミングレイヤ３０４とを含むネットワークスタック３１８を含むソフトウェアレイヤを示す。ネットワークレイヤ３０２は、「パスレイヤ」としても知られ、フレーミングレイヤ３０４は、「近隣レイヤ」としても知られる。
【００５０】
一般に、アプリケーション２００は、動作中、ネットワーク化されたメッセージを、ネットワークスタック３１８を介して周辺デバイス（例えば、ハードウェア３１４）に送る。アプリケーション２００から送られたデータは、トランスポートレイヤ３００を経由してＩＰＳｅｃスイッチ３０６に伝送され、スイッチ３０６は、データがホストベースのネットワークスタック３１８を下に行くか、ＩＰＳｅｃチムニ３０８を下に行くかを制御する。トランスポートレイヤ３００は、ＴＣＰレイヤ、ＵＤＰレイヤ、ＩＣＭＰレイヤなどであることが可能である。スイッチ３０６は、ネットワークスタック３１８のレイヤの中に組み込むことができることに留意されたい。ネットワークスタック３１８におけるソフトウェアレイヤは、アプリケーション３００からデータを受け取り、データをパケット形態にパッケージし、結果のパケットを、ＮＤＩＳミニドライバ３１０を介して周辺デバイスハードウェア３１４に送る。また、ソフトウェアレイヤは、ネットワークパケットを受け取ると、ペイロードをアプリケーションに渡す際、逆の機能も提供する。データパケットがネットワークスタック３１８を通過する際に、ネットワークスタック３１８が実行することができる他のタスクには、オフロードされていないセキュリティ関連付けに関するデータ暗号化およびデータ復号化、信頼できるデータ伝送、およびメッセージダイジェスト（例えば、データパケットに関するチェックサムまたはＣＲＣ）の計算および検査が含まれる。以上のタスクの多くは、オフロードされない場合、ホストプロセッサによって実行され、プロセッサを多用する。
【００５１】
図３ｂを参照すると、アプリケーション２００は、動作中、ネットワーク化されたメッセージをネットワークスタック３１８を介して周辺デバイス（例えば、ハードウェア３１４）に送る。アプリケーション２００から送られたデータは、データがホストベースのネットワークスタック３１８を下に行くか、またはチムニ３２０を下に行くかを制御するＴＬＩ（トランスポートレイヤインタフェース）スイッチ３２２の中を通る。ＴＬＩスイッチ３２２は、ネットワークスタック３１８の最上位レイヤの中に組み込むことができることに留意されたい。ネットワークスタック３１８におけるソフトウェアレイヤは、アプリケーション２００からデータを受け取り、そのデータをパケット形態にパッケージし、結果のパケットをＮＤＩＳミニドライバ３１０を介して周辺デバイスハードウェア３１４に送る。ソフトウェアレイヤおよびネットワークスタック３１８は、前述したのと同一の機能を実行する。
【００５２】
ＴＬＩスイッチ３２２は、チムニ３２０およびチムニドライバ３１２を介して、オフロードされる接続に関するデータを周辺デバイスに送ることにより、ＣＰＵから周辺デバイスにスタック操作をオフロードするのに使用される。本明細書および特許請求の範囲を読んだ後、ＮＤＩＳドライバ３１０とチムニドライバ３１２は、同一の実際のドライバであってもよいことが当業者には理解されよう。また、ＮＤＩＳミニドライバ３１０およびチムニドライバ３１２の上端（upper edge）は、ＭＩＣＲＯＳＯＦＴ（登録商標）ＷＩＮＤＯＷＳ（登録商標）オペレーティングシステムにおけるＮＤＩＳ  ＡＰＩであることも当業者には認識されよう。説明のため、ＴＣＰ（伝送制御プロトコル）ベースのプロトコルスタックの下のＳｅｃｕｒｅ  Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌを使用して、本発明を説明する。しかし、この説明を検討した後、多くのタイプの周辺デバイスを使用することができ、他のネットワークスタックも、本発明による諸原理を使用してオフロードすることができることが、当業者には理解されよう。さらに、本発明は、ｉＳＣＳＩ（internet Small Computer System Interface）、ＮＦＳ（Network File System）、またはＣＩＦＳ（Common Interface File System）などの、より高位の機能プロトコルをオフロードするのにも使用することができる。オフロードされるプロトコルは、接続指向（例えば、ＴＣＰ）であることも、コネクションレス（例えば、ＩＰＳＥＣまたはＵＤＰ）であることも可能である。
【００５３】
ネットワーク接続オフロードを実行する多くの理由が存在する。例として、限定としてではなく、その理由のいくつかを以下に示す。システム管理者が、オフロードされるべき特定のサービスを選択することができる。特定の接続は、トラフィックが（バイト数またはパケット数の点で）、相当な量のリソースを消費している場合、オフロードされることが可能である。さらに、ＩＰＳｅｃサービスに加えて、あるタイプのサービスもオフロードすることができる。さらに、管理ポリシーが、処理オフロードを駆動することができる。例えば、管理者は、組織内部からのすべての接続が、まずオフロードされる、または特定のアプリケーションに関するすべての接続がまずオフロードされるというポリシーを有することが可能である。使用されているシステムリソース（例えば、ＣＰＵ使用量、データキャッシュ使用量、ページテーブルキャッシュ使用量、メモリ帯域幅）により、ホストプロセッサが、接続をオフロードするように導かれることが可能である。
【００５４】
ＩＰＳｅｃ機能をオフロードするステップを説明するのに先立って、ＴＣＰ接続をオフロードするステップをまず、説明する。図４は、ＴＣＰ接続をオフロードするのに行われる３つのステッププロセスを示し、この図では、図３ｂのアプリケーションレイヤ２００は示されていないが、ＴＬＩスイッチ３２２の左側にある。さらに、周辺デバイス３７０が、図４では、単に例示のためにＮＩＣとして示されているが、ネットワークアダプタを有する汎用ＣＰＵを含め、他のタイプの周辺デバイスも、本発明に従って、同一の機能、または同様の機能を実行することができる。全体として、図４は、プロセスが、ＴＣＰ接続をオフロードするのに要求されるリソースを割り当て、レイヤのそれぞれ（すなわち、トランスポートレイヤ３００、ネットワークレイヤ３０２、フレーミングレイヤ３０４）、およびスイッチ３０６、３２２に対するハンドルを提供し、レイヤ３００、３０２、３０４のそれぞれに関する状態を周辺デバイス３７０にオフロードすることを示す。オフロード遷移中、ＴＬＩスイッチ３２２は、アプリケーションから受け取られた／アプリケーションに送られたすべてのメッセージをバッファリングする。代替として、トランスポートレイヤ３００が、データをバッファリングする。オフロードが完了すると、バッファリングされたデータが、周辺デバイス３７０に転送される。着信パケットが、オフロード遷移中に受け取られると、周辺デバイス３７０は、トランスポートレイヤ委任状態が、周辺デバイス３７０に渡されるまで、レイヤ３００、３０２、３０４、およびスイッチ３０６、３２２の中でデータを上に送ることを続ける。トランスポートレイヤ３００が、オフロード遷移中に着信パケットを受け取った場合、トランスポートレイヤ３００は、トランスポート状態オブジェクト委任状態の一部として、または別個に、データをＮＩＣ３７０に転送する。
【００５５】
ＴＬＩスイッチ３２２が、トランスポートレイヤ３００にオフロード要求４００を送ることにより、オフロードを開始する。オフロード要求は、次のレイヤのローカル状態（例えば、トランスポートレイヤ３００に関するＴＣＰポインタ、ネットワークレイヤ３０２に関するＲＣＥポインタ、フレーミングレイヤ３０４に関するＡＲＰエントリポインタ、またはＮＤＩＳミニドライバ３１０に関するＮＤＩＳミニポートポインタ）に対するポインタを含む。また、オフロード要求は、オフロードタイプ（例えば、ＴＬＩスイッチ３２２に関するＴＣＰ、ネットワークレイヤ３０２に関するＩＰｖ６など）、並びに周辺デバイス３７０がＴＣＰ接続をうまくオフロードすることができるかどうかを、デバイス３７０が判定するのに役立つリソース情報も含む。また、ＴＬＩスイッチ３２２は、周辺デバイス３７０にオフロードハンドルを提供することもできる。ＴＬＩスイッチ３２２は、アプリケーション送信バッファまたはアプリケーション受信バッファをトランスポートレイヤ３００に送ることも止め、それらのバッファをキューに入れて、トランスポートレイヤ３００が、完了メッセージ４２０を送信するのを待つ。
【００５６】
トランスポートレイヤ３００は、オフロード要求を拒否するか、またはＴＬＩスイッチリソース情報にＴＣＰリソース情報が追加されたオフロード要求４０２を、ネットワークレイヤ３０２に送る。また、トランスポートレイヤ３００は、周辺デバイス３７０にオフロードハンドルを提供することもできる。保留中である未処理のアプリケーション送信バッファまたはアプリケーション受信バッファが存在する場合、トランスポートレイヤ３００は、それらのバッファをＴＬＩスイッチ３２２に戻す。
【００５７】
ネットワークレイヤ３０２が、オフロード要求４０２を受け取り、接続をオフロードすることを拒否するか、またはネットワークリソース要件が、ＴＣＰリソース情報およびＴＬＩスイッチリソース情報に追加されたオフロード要求４０４を、フレーミングレイヤ３０４に送る。また、ネットワークレイヤ３０２は、周辺デバイス３７０にオフロードハンドルを提供することもできる。
【００５８】
フレーミングレイヤ３０４は、接続をオフロードすることを拒否するか、またはフレーミングリソース要件が、ネットワークリソース要件、ＴＣＰリソース情報、およびＴＬＩスイッチリソース情報に追加されたオフロード要求４０６を、周辺デバイス３７０に送る。また、フレーミングレイヤ３０４は、周辺デバイス３７０にオフロードハンドルを提供することもできる。
【００５９】
周辺デバイス３７０は、オフロード要求を受け取り、ＴＣＰ接続をオフロードするのに利用できるリソースをデバイス３７０が有するかどうかを計算する。ＮＩＣは、オフロードが可能でないと判定した場合、オフロード要求を拒否する。ＮＩＣは、オフロードが可能であると判定した場合、オフロード要求を承諾し、接続にリソース（例えば、ＴＣＢ、ＲＣＥ（ルートキャッシュエントリ）、ＡＴＥ（アドレス解決プロトコル（ＡＰＲ）テーブルエントリ））を割り当てる。周辺デバイス３７０は、レイヤ３００、３０２、および３０４に渡すパラメータおよびディスパッチテーブルのリンクリストを作成し、パラメータのリンクリストを有する完了メッセージ４０８をフレーミングレイヤ３０４に送ることにより、オフロード要求を完了させる。パラメータは、レイヤ３００、３０２、３０４のそれぞれに関するオフロードハンドルおよびディスパッチテーブルを含む。
【００６０】
本明細書で使用するオフロードハンドルとは、ソフトウェアレイヤが、周辺デバイスと通信する、または周辺デバイスが、ソフトウェアレイヤと通信することを可能にする機構を意味する。例として、限定としてではなく、オフロードハンドルは、ポインタベースのハンドル、アレイへのルックアップとして使用される整数値、ハッシュテーブル（例えば、ハッシュ関数）、ソフトウェアレイヤ（またはネットワークスタック）と周辺デバイスの間の通信チャネル、あるいは周辺デバイスが、状態オブジェクトを参照する（look up）のに使用する、ソフトウェアレイヤによって渡されるパラメータのセットであることが可能である。
【００６１】
例として、限定としてではなく、ディスパッチテーブルと呼ばれる、中間ソフトウェアレイヤ（３００、３０２、および３０４）と周辺デバイス３７０の間で通信する機構は、アレイへのルックアップとして使用される関数呼び出しポインタ、ハッシュテーブル（例えば、ハッシュ関数）、ソフトウェアレイヤ（またはネットワークスタック）と周辺デバイスの間の通信チャネル、あるいは周辺デバイスが、状態オブジェクトを参照するのに使用する、ソフトウェアレイヤによって渡されるパラメータのセットであることが可能である。ディスパッチテーブルは、周辺デバイス初期設定中に、または後の時点で交換されることが可能である。
【００６２】
ディスパッチテーブルは、周辺デバイス３７０に直接にデータを送る、または周辺デバイス３７０から直接にデータを受け取るのに使用される。ディスパッチテーブルは、診断を提供するのにも使用することができる。例えば、ソフトウェアレイヤを、２つの中間レイヤの間に、または最も低位の中間レイヤと周辺デバイスの間に挿入して、システムを監視し、違反（fault）を注入して、システムが適切に機能していることを確認することができる。さらに、必要な場合、さらなる機能を追加することができるディスパッチテーブルが、ソフトウェアレイヤによってパッチされることが可能である。例えば、ソフトウェアレイヤが、フィルタドライバまたは仮想周辺デバイスの機能を提供するように追加されることが可能である。パッチは、通常、挿入された中間レイヤに関する関数ポインタでディスパッチテーブルを上書きすることによって行われる。次に、挿入された中間レイヤに関する関数ポインタが呼び出され、挿入された中間レイヤが作業を終えると、挿入された中間レイヤは、元のディスパッチテーブルからの元の関数ポインタを呼び出す。
【００６３】
フレーミングレイヤ３０４は、完了メッセージを受け取ると、フレーミングレイヤに関するオフロードハンドルおよびディスパッチテーブルを、容易な更新（例えば、宛先ＭＡＣアドレス変更またはカプセル化タイプ変更）のためにＡＰＲテーブルエントリに格納する。次に、フレーミングレイヤ３０４は、ＡＴＥに関連する状態で、周辺デバイス３７０を更新する３１０。フレーミングレイヤ３０４は、リンクリストから状態を取り除き、リンクリストの中の残りの情報をネットワークレイヤ３０２に転送する（矢印４１２で示す）。
【００６４】
ネットワークレイヤ３０２は、ネットワークレイヤ３０２に関するオフロードハンドルおよびディスパッチテーブルを格納する。次に、ネットワークレイヤ３０２は、ＲＣＥに関連する状態で、周辺デバイス３７０を更新する（矢印４１４で示す）。ネットワークレイヤ３０２は、リンクリストからネットワークレイヤ情報を取り除き、パラメータおよびディスパッチテーブルのリンクリストを有する完了メッセージをトランスポートレイヤ３００に送る（矢印４１６で示す）。ネットワークレイヤ３０２は、オフロード中にレイヤ３０２が受け取った、バッファリングされたＩＰフラグメントを処理のために周辺デバイス３７０に転送すること、またはネットワークレイヤの中でＩＰフラグメントを処理して、トランスポートレイヤ３００に転送することができる。
【００６５】
トランスポートレイヤ３００は、トランスポートレイヤに関するオフロードハンドルを格納し、レイヤ３００の状態を周辺デバイス３７０に送る（矢印４１８で示す）。次に、トランスポートレイヤは、完了メッセージ４２０を送る。代替の実施形態では、トランスポートレイヤおよびＴＬＩスイッチは、同一のレイヤであり、メッセージ４２０は、必要とされない。
【００６６】
代替の実施形態では、レイヤの状態オブジェクトは、オフロード要求とともに送られる。例えば、フレーミングレイヤ状態オブジェクト、ネットワークレイヤ状態オブジェクト、およびトランスポートレイヤ状態オブジェクトは、オフロード要求とともに送られ、オフロード要求から完了イベントまでの間にキャッシュ状態が変化した場合だけ、更新される。レイヤ状態オブジェクト全体は、委任状態が存在しないか、オフロード要求から、オフロード要求の完了までの間に変化することが可能でない場合にだけ、オフロード要求とともに送られることが可能である。オフロードシーケンス中にＤＥＬＥＧＡＴＥＤ状態を変更するメッセージが受け取られた場合、そのメッセージは、一般に、処理されず（バッファリングされるべきであり）、オフロードが完了すると、そのメッセージは、処理のためにオフロード周辺デバイスに転送されなければならない。しかし、ＣＡＣＨＥＤとして分類された状態変数は、オフロード要求とともに送られることが可能であり、オフロード要求から、オフロード要求の完了までの間に変化することが可能である。これが生じた場合、ＣＡＣＨＥＤ状態の変化が記録されなければならず、オフロードが完了すると、ＣＡＣＨＥＤ状態は周辺デバイスにおいて更新されなければならない。
【００６７】
ＴＬＩスイッチ３２２が、完了メッセージ４２０を受け取ると、ＴＬＩスイッチ３２２は、アプリケーション送信バッファおよびアプリケーション受信バッファを周辺デバイス３７０に転送する（矢印４２２で示す）。ＴＬＩスイッチ３２２は、ディスパッチテーブルを使用して、すべての未処理の受信バッファおよび将来の受信バッファをポストし、処理のためにＮＩＣ３７０に送る。オフロード要求が完了するのにかかる時間中に、各レイヤ３００、３０２、および３０４は、オフロードされた状態オブジェクト（すなわち、レイヤに関連する状態オブジェクト）を求める新たなオフロード要求を拒否するか、またはオフロードが完了するまで、それらの要求をキューに入れる。代替の実施形態では、アプリケーションバッファは、初期オフロード要求の中で渡される。
【００６８】
トランスポートレイヤ３００は、トランスポート状態オブジェクトが、初期オフロード要求４０２の中で周辺デバイス３７０にオフロードされていない場合、着信ＴＣＰデータを処理し、ＴＣＰペイロードをＴＬＩスイッチ３２２に渡す能力を依然として有することが可能である。着信ＴＣＰデータが、その時点の後にネットワークスタック３１８を介して到達した場合、着信データは、周辺デバイス３７０に転送されて、周辺デバイスによって処理される。
【００６９】
前のオフロードされた状態を参照する後のオフロード要求時に、ネットワークレイヤ３０２およびフレーミングレイヤ３０４は、前のオフロードから、周辺デバイス３７０からレイヤ３０２および３０４が受け取ったオフロードハンドルを周辺デバイス３７０に送る。これにより、周辺デバイス３７０が、ネットワークレイヤ３０２およびフレーミングレイヤ３０４にリソースを既に割り当てていることがシグナルされ、これにより、周辺デバイス３７０リソースが節約され、オフロードが迅速化される。
【００７０】
前に示した通り、レイヤ３００、３０２、３０４は、自らの状態を周辺デバイス３７０に送る。各状態は、次の３つのタイプの状態変数を有する。すなわち、ＣＯＮＳＴ、ＣＡＣＨＥＤ、およびＤＥＬＥＧＡＴＥＤである。ＣＯＮＳＴ状態変数は、名前によって暗示される通り、オフロードされた接続の存続期間中、決して変化しない定数である。このため、ホストは、接続が終了されると、ＣＯＮＳＴ状態変数を読み戻す（read back）必要がない。同様に、ホストプロセッサは、ＣＡＣＨＥＤ状態変数の所有権を保持し、ホストプロセッサにおけるＣＡＣＨＥＤ変数に対するあらゆる変更が、周辺デバイス３７０において更新されることを確実にする。その結果、ホストは、ＣＡＣＨＥＤ状態変数を書き込むが、決して読み戻すことはない（システム診断がそうすることを要求しない限り）。したがって、ホストＣＰＵは、ＤＥＬＥＧＡＴＥＤ状態変数の所有権だけを周辺デバイス３７０に移転する。ＤＥＬＥＧＡＴＥＤ状態変数は、オフロードが行われる際に、１回、書き込まれ、オフロードが終了されると、読み戻される。周辺デバイス（例えば、ＮＩＣ）は、ＤＥＬＥＧＡＴＥＤ状態変数を送り返すだけでよいので、接続をホストに送り返すことのオーバーヘッドが、最小限に抑えられる。さらに、ホストＣＰＵは、必要とされる場合だけ（例えば、統計のために）、ＤＥＬＥＧＡＴＥＤ状態変数に関して周辺デバイス３７０にクエリを行う。
【００７１】
トランスポートレイヤ３００に関するＣＯＮＳＴ状態変数には、宛先ポート、送信元ポート、トランスポートレイヤ動作（例えば、ウインドウ拡大縮小が有効にされるかどうか、またはＳＡＣＫが有効にされるかどうか）を制御する１つまたは複数のフラグ、ＳＥＮＤウインドウ拡大縮小率およびＲＥＣＶウインドウ拡大縮小率、リモートエンドポイント（Ｒｅｍｏｔｅ  ＭＳＳ）によって通知される（advertised）初期最大セグメントサイズ、並びに、場合により、その他のパラメータが含まれることが可能である。本明細書で既に説明した通り、それぞれのそのような前述したＴＣＰ  ＣＯＮＳＴ変数の値は、一定であり、つまり、変数の値は、ＴＣＰ接続の存続期間中に変化しない。
【００７２】
トランスポートレイヤ３００に関するＣＡＣＨＥＤ状態変数は、ＴＣＰ状態変数およびＩＰ状態変数であることが可能である。ＩＰ状態変数は、ネットワークレイヤ値が、接続ごとに上書きされることをインプリメンテーションが可能にする場合、トランスポート構造の中で要求される可能性がある。ＣＡＣＨＥＤ状態変数には、１つまたは複数のフラグ（例えば、「ネーグル（Ｎａｇｌｅ）」アルゴリズムが有効にされるかどうか、またはＴＣＰ「キープアライブ（Ｋｅｅｐ−Ａｌｉｖｅ）」が有効にされるかどうか）ばかりではなく、「キープアライブ」設定（すなわち、間隔、プローブ数、およびデルタ）、有効最大セグメントサイズ（または有効ＭＳＳ）、初期の既定の受信ウインドウ（ＩｎｉｔｉａｌＲｃＷｎｄ）、周辺デバイス３７０によって受信指示の中にコピーされるべきバイト数、ＩＰｖ４に関するトラフィックタイプに応じてパケットに優先順位をつけるＴＯＳ（サービスタイプ）、並びに、最後に、ネットワークにおいてＩＰｖ６パケットが優先されることを可能にするトラフィッククラスおよびフローラベルも含まれることが可能である。
【００７３】
ＤＥＬＥＧＡＴＥＤ状態変数には、ＩＥＴＦ（Internet Engineering Task Force）ＲＦＣ７９３で指定される現在のＴＣＰ状態、１つまたは複数のフラグ（例えば、接続は、リモートピアによって異常終了の形で（ａｂｏｒｔｉｖｅｌｙ）に閉じられたか）、次の予期されるＴＣＰ受信セグメント（すなわち、ＲＣＶ．ＮＥＸＴ）に関するシーケンス番号、受信ウインドウサイズ（ＲＣＶ．ＷＮＤ）、第１の受信確認されていないデータに関するシーケンス番号（ＳＮＤ．ＵＮＡ）、送信されるべき次のＴＣＰセグメントに関するシーケンス番号（ＳＮＤ．ＮＥＸＴ）、送信ウインドウサイズ（ＳＮＤ．ＷＮＤ）、前回のウインドウ更新に関して使用されたセグメントシーケンス番号（ＳｎｄＷＬ１）、前回のウインドウ更新に関して使用されたセグメント受信確認番号（ＳｎｄＷＬ２）、これまでに送信された最大シーケンス番号（ＳＮＤ．ＭＡＸ）、最大送信ウインドウ（ＭＡＸ＿ＷＩＮ）、および現在の輻輳ウインドウ（ＣＷｎｄ）が含まれることが可能である。
【００７４】
ＤＥＬＥＧＡＴＥＤ状態変数には、スロースタート閾値（ＳＳＴＨＲＥＳＨ）、平滑化されたラウンドトリップ（round trip）時間（ＳＲＴＴ）、ラウンドトリップ変動（ＲｔｔＶａｒ）、次のＴＣＰ  ＡＣＫの中で送るべきタイムスタンプ値（ＴｓＲｅｃｅｎｔ）、最新のタイムスタンプが受け取られたのはどれだけ前か（ＴｓＲｅｃｅｎｔＡｇｅ）、同一のシーケンス番号に関して、いくつかのＡＣＫが受け入れられているか（ＤｕｐＡｃｋＣｏｎｔ）、送信済みのキープアライブプローブの回数（ＫｅｅｐＡｌｉｖｅ  ＰｒｏｂｅＣｏｕｎｔ）、次のキープアライブタイムアウトまでに残っている時間（ＫｅｅｐＡｌｉｖｅ  ＴｉｍｅｏｕｔＤｅｌｔａ）、送信済みの再送信の回数（ＫｅｅｐＡｌｉｖｅ  Ｃｏｕｎｔ）、次の再送信タイムアウトまでに残っている時間（Ｒｅｔｒａｎｓｍｉｔ  ＴｉｍｅｏｕｔＤｅｌｔａ）、およびバッファリングされた受信データに対するポインタ（ＢｕｆｆｅｒｅｄＤａｔａ、つまり、オフロードまたはアップロードの進行中に受信されたＴＣＰデータ）がさらに含まれることが可能である。
【００７５】
ネットワークレイヤ３０２に関するＣＯＮＳＴ状態変数には、宛先ＩＰアドレス（ＩＰｖ４またはＩＰｖ６に関する）および送信元ＩＰアドレス（ＩＰｖ４またはＩＰｖ６に関する）が含まれることが可能である。ネットワークレイヤ３０２に関するＣＡＣＨＥＤ状態変数には、パス最大伝送ユニット（ＰａｔｈＭＴＵ）が含まれることが可能である。ネットワークレイヤ３０２に関するＤＥＬＥＧＡＴＥＤ状態変数には、ＩＰパケットＩＤ開始値が含まれることが可能である。フレーミングレイヤ３０４に関するＣＡＣＨＥＤ状態変数には、宛先ＭＡＣ（メディアアクセス制御）アドレス、送信元ＭＡＣアドレス、ＩＥＴＦ  ＲＦＣ２４６１近隣探索（Neighbor Discovery）のためのパラメータ（ホスト到達可能性デルタおよびＮＩＣ到達可能性デルタ）、ヘッダのフォーマット（例えば、ＬＬＣ／ＳＮＡＰ（論理リンク制御／サブネットワークアクセスプロトコル）フォーマットまたはＤＩＸ（Digial、Intel、Xerox）フォーマット）を示すフラグが含まれることが可能である。
【００７６】
トランスポートレイヤ状態は、ネットワークレイヤ状態オブジェクトに関するハンドルを含むことが可能であり、ネットワークレイヤ状態は、フレーミングレイヤ状態オブジェクトに関するハンドルを含むことが可能である。というのは、ネットワークレイヤ（「パス」とも呼ばれる）状態は、複数の接続の間で共有されることが可能であり、フレーミングレイヤ（「近隣」とも呼ばれる）状態は、複数のパス（１つのルータを通過するすべてのトラフィック）の間で共有されることが可能だからである。この階層は、いくつかの理由で保持される。ＩＰ  ＩＤ名前空間は、すべてのオフロードされた接続にわたって、パスごとに管理されることが可能であるため、または各ＴＣＰ接続に関してパスＭＴＵを個々にセットアップするのではなく、パスＭＴＵの更新が、ネットワークレイヤにおいて一度に行われ、すべてのＴＣＰ接続がもたらされることが可能であるため、接続は、ネットワークレイヤに関するＮＩＣハンドルを要する可能性がある。パスは、フレーミングレイヤ状態オブジェクトに関するＮＩＣハンドルを要する。というのは、ルート更新により、次のホップアドレスが変わり、新たなＭＡＣアドレスがポイントされる可能性があるからである。また、階層は、ＮＩＣによって保持されることが要求される状態の量を圧縮する（condense）。例えば、ＩＰｖ４に関するＡＲＰ更新により、マッピングがＩＰアドレスからＭＡＣアドレスに変更される可能性がある（例えば、サーバ上でフェイルオーバされた（failed over）インタフェース）。ホストは、ＭＡＣアドレスをキャッシュされた変数として保持し、このため、ホストは、キャッシュ状態の１回だけの更新を行えばよく、すべての接続の新たなインタフェースへのフェイルオーバが行われる。
【００７７】
ホストが、ＴＣＰ接続をオフロードすると、周辺デバイス３７０は、デバイス３７０が送信するパケットにパケット識別子（例えば、ＩＰ  ＩＤ）を割り当てることを担う。ＩＰ  ＩＤは、インタフェースごとに、またはレイヤ状態オブジェクトごとにオフロードされる。いずれの場合も、周辺デバイス３７０には、ＩＰ  ＩＤ名前空間の一部分が割り当てられる。一実施形態では、周辺デバイス３７０には、デバイスが初期設定される際に、全体のＩＰ  ＩＤ名前空間の半分が割り当てられ、ホストプロトコルスタックが、周辺デバイスごとに、ＩＰ＿ＩＤ名前空間のその部分を保持する。別の実施形態は、ホストプロトコルスタックが、ＩＰ＿ＩＤ名前空間をパスごとに保持することを可能にする。周辺デバイスには、ネットワーク状態オブジェクトが周辺デバイス３７０に送られる際に使用する、ＩＰパケットＩＤ開始値が与えられる。周辺デバイス３７０は、以下の数式を使用して、デバイス３７０が送信するＩＰパケット上のＩＰ  ＩＤを生成することができる。
【００７８】
【表１】
2006191537.tif 000003
【００７９】
代替として、周辺デバイスには、統計的に、名前空間の半分を割り当てることができる。
【００８０】
ＩＰＩＤ開始アドレスを周辺デバイス３７０に動的に転送する実施形態が使用される場合、オフロードされた接続が、アップロードされるか、または無効にされると、周辺デバイス３７０は、デバイス３７０が使用する次のＩＰＩＤ値をネットワークレイヤに転送して、行われる次のオフロードのために格納し、ホスト処理装置は、その処理装置に割り当てられたＩＰ  ＩＤ名前空間の部分を使用することを続ける。ホスト処理装置は、完全なＩＰ  ＩＤ名前空間を使用することができるが、好ましくは、ネットワーク上のＩＰパケットの最大存続期間を超えて初めて、そうすることができる。
【００８１】
周辺デバイス３７０が、システムから取り除かれた場合、周辺デバイス３７０が、最大パケット存続期間内にシステムに再挿入された場合に備えて、周辺デバイスによって使用された最後の値が保持される必要がある。周辺デバイス３７０が、最大パケット存続期間後に挿入される場合、最後の値は、保持される必要がない。
【００８２】
周辺デバイス３７０は、データが受信された順序で、データを受信バッファの中に入れ、アプリケーションバッファが、オフロードされた接続のためにポストされる順序で、アプリケーションバッファを埋める。多くのアプリケーションは、受信指示を待ってから、受信バッファをポストする。一実施形態では、周辺デバイス３７０は、接続に関するデータが到着し、アプリケーション受信バッファが全くポストされていない場合、使用すべきバッファのグローバルプールを有する。バッファのグローバルプールは、オフロードされた接続全部にわたって使用され、１）順序の狂ったＴＣＰ伝送を扱うこと、２）ＩＰデータグラムをデフラグする（de-fragment）こと、３）アプリケーションが、ゼロコピーアルゴリズムには小さ過ぎるバッファをポストしている場合、ゼロコピーアルゴリズムではなく、バッファコピーアルゴリズム、および４）アプリケーションが、バッファをあらかじめポストしていない場合、データをアプリケーションに示す指示機構を実施するのに使用されることが可能である。代替として、バッファリソースの効率的な使用が問題ではない場合、接続プールごとのバッファを使用してもよい。その場合、バッファのグローバルプールは、アプリケーションが、バッファをあらかじめポストしていない場合、またはシステムリソースの不足（例えば、メモリの中にアプリケーションバッファをピンする（pin）のに十分なリソースがない）のためにだけ、使用される。
【００８３】
次に、図５Ａ〜図５Ｄを参照すると、オフロードを受信している代表的な周辺デバイス（例えば、ＮＩＣ）が、オフロードを表す、逆転したツリーデータ構造５００を有することが可能である。図では、破線は、周辺デバイスによって割り当てられた新たな状態を表す。図５Ａでは、周辺デバイスは、ルートキャッシュエントリ５０４に結合されたＡＲＰエントリ５０２を有し、エントリ５０４は、ＴＣＰエントリ５０６としてのネットワーク接続に結合されている。例えば、すべてのネットワーク接続（例えば、ＴＣＰ）トラフィックが、ルータに向かう場合、次のホップは、常に、同一のＡＲＰエントリ５０２である。ルートキャッシュエントリ５０４が、次のネットワーク接続オフロードのために使用されるべき場合、唯一の新たなリソースは、新たなオフロードされたＴＣＰ状態オブジェクトである。このため、ホストＣＰＵが、ネットワークプロトコルスタックを下に行くようにオフロードを開始すると、自らの状態を既にオフロードしている中間ソフトウェアレイヤ（例えば、ネットワークレイヤ３０２およびフレーミングレイヤ３０４）は、前のオフロード要求時に割り当てられている周辺デバイスによって生成されたオフロードハンドルを単に挿入する。周辺デバイス１７０は、新たなリソース（例えば、ＴＣＰエントリ５０８）を割り当て、その新たなリソースに関するオフロードハンドルを、ネットワークプロトコルスタックを再び上に送るだけでよい。
【００８４】
逆転したツリー５００は、この時点で、ルートキャッシュエントリ５０４（図５ｂ参照）に結合されたＴＣＰエントリ５０８を有する。このアプローチは、周辺デバイスリソースを節約し、オフロードを迅速化する。さらに、キャッシュされた変数状態が変化した場合、単一の構造だけが、更新される必要がある。チムニの中の様々なソフトウェアレイヤに関するすべての状態が、単一のエントリとしてオフロードされた場合、最上位のソフトウェアレイヤの下のいずれの状態更新も、複数の更新を要する。
【００８５】
図５Ｃは、より複雑な構成を有する逆転したツリー５００を示す。ＡＲＰテーブルエントリ５０２を通過する２つのルートキャッシュエントリ５０４および５１０が存在する。ＴＣＰネットワーク接続５０６および５０８が、ルートキャッシュエントリ５０４を利用する。ＴＣＰネットワーク接続５１２および５１４が、ルートキャッシュエントリ５１０を参照する。何らかのＡＲＰ更新が行われた（例えば、マルチホーム（multi-homed）サーバのインタフェースが、無償の（gratuitous）ＡＲＰ更新を使用してフェイルオーバを行う）場合、エントリ５０２だけが更新されなければならない。これにより、場合により、数千、または数十万の接続が、要求される周辺デバイスへの単一の更新で、新たなインタフェースにフェイルオーバさせられることが可能になる。図５Ｄは、ルート更新が行われた後に、マージされて単一の逆転したツリー４００になった、２つの独立の逆転したツリー（エントリ５０２〜５０８およびエントリ５１０〜５１６）を示す。ルート更新前、ルートキャッシュエントリ５１０に関する次のホップＡＲＰエントリは、ＡＲＰテーブルエントリ５１６である。ルート更新後、次のホップＡＲＰテーブルエントリは、ＡＲＰテーブルエントリ５０２である。このため、逆転したツリーの使用は、フレーミングレイヤ、ネットワークレイヤ、およびトランスポートレイヤに関する状態が単一のエントリとしてオフロードされた場合、数千、または数万の更新ではなく、ルート更新が、はるかに効率的に処理されることを可能にする。重要なこととして、逆転したツリーの概念を拡張して、複数の接続を一度にオフロードすることができる。
【００８６】
図６Ａおよび図６Ｂは、ブロックリストハンドル（または「ブロックリスト」）への特定の参照を伴う、本発明によるさらなる特徴を示す。一般に、ブロックリストは、チムニオフロード中またはチムニ終了中にオフロード目標（例えば、周辺デバイス）に与えられるデータ構造である。このため、ネットワーク接続を処理しているコンポーネントは、「アップロード」の場合は、初期参照ポイントが任意になるようにブロックリストをホストに送り返し、「オフロード」の場合は、ブロックリストを周辺デバイスまで下に送る。ブロックリストデータ構造は、特定の次のレイヤ状態オブジェクト（依存ブロック）、または同一のレイヤにおける状態オブジェクト（次のブロック）をポイントする一連のポインタを含む。
【００８７】
詳細には、依存ブロックポインタは、階層における１つ上のレベルをポイントし、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の既存の依存関係をオフロード目標に知らせるのに使用される。例えば、近隣（またはフレーミングレイヤ）状態オブジェクトは、パス（またはネットワークレイヤ）状態オブジェクトに依存し、パス状態オブジェクトは、同一の階層のＴＣＰ接続に依存することが可能である。しかし、次のブロックポインタは、異なる階層において同一のレベルにあるデータ構造をポイントする。例えば、第１のＴＣＰ接続におけるパス（またはネットワークレイヤ）状態オブジェクトは、異なるＴＣＰ接続におけるパス状態オブジェクトをポイントすることが可能である。
【００８８】
図６Ａは、図５Ａ〜図５Ｄに示したのと同様な、逆転したツリーデータ構造を示す。図６Ａの逆転したツリーは、異なるＴＣＰレイヤ状態エントリを有するが、共通のパス（ネットワークレイヤ）状態エントリ６０２、および共通の近隣状態エントリ６００を有する２つのＴＣＰ接続６０４および６０６（すなわち、ＴＣＰ  Ｃｏｎｎ１およびＴＣＰ  Ｃｏｎｎ２）を示す。しかし、異なるネットワーク接続６０８（すなわち、ＴＣＰ  Ｃｏｎｎ３）は、別個のパス状態エントリ６１０を有するが、共通の近隣状態エントリ６００を有する。シーケンス階層全体は、接続を次のソフトウェアレイヤに導く一連のパスハンドルによって、各ソフトウェアレイヤ間で定義されることが可能である。例えば、パスハンドル６１２および６１４は、それぞれ、ＴＣＰ状態エントリ６０４および６０６をパス状態エントリ６０２に導き、エントリ６０２は、エントリ６０２を近隣状態エントリ６００に導くハンドル６１６を有する。同様に、ＴＣＰ状態エントリ６０８は、パス状態エントリ６１０をポイントするハンドル６１８を有し、エントリ６１０は、ハンドル６２０を介して、共通の近隣状態エントリ６００に導かれる。本発明によれば、図６Ａは、次のブロックポインタに関して表現して、複数のネットワーク接続チムニを一度に含むようにすることもできる。
【００８９】
図６Ｂは、ブロックリストハンドル（様々な次のブロックポインタおよび依存ブロックポインタの集合）が、同時のオフロードのために異なるネットワーク接続の間で、いくつかのネットワーク接続ブロックをどのように関係付けるかを示す。図６Ａの場合と同様に、図６Ｂは、様々なソフトウェア状態ハンドルを含むソフトウェアレイヤブロックに関して、逆転したツリーを表す。図示しているのは、共通のパスブロック６４４、および共通の近隣ブロック６４６を有するＴＣＰブロック６４０および６４２である。第３のＴＣＰブロック６４８は、パスブロック６５０、および同一の近隣ブロック６４６を有する。ブロックリストハンドルは、近隣ブロック６４６が、パスブロック６４４をポイントする依存ブロックポインタ６６０を含むことを表明する。しかし、図５Ａの前の逆転したツリーとは異なり、近隣ブロック６４６は、次のブロックポインタ６６２を介して、別の逆転したツリーデータ構造もポイントすることが可能である。次のブロックポインタ６６２が欠落している（例えば、ＮＵＬＬ値）場合、これは、逆転したツリーのそのレイヤにおいて、他に逆転したツリーが全く存在しないことをブロックリストの中で示すことが可能である。同様に、パスブロック６４４は、逆転したツリーの完全に異なる接続「ブランチ」である、パスブロック６５０をポイントする次のブロックポインタ６６４を有する。
【００９０】
近隣ブロック６４６の場合と同様に、パスブロック６４４とパスブロック６５０はともにそれぞれ、依存ブロックポインタ６６６と次のブロックポインタ６６４、および依存ブロックポインタ６６８と次のブロックポインタ６７０をそれぞれ有して、パスブロック６５０が、完全に異なる逆転したツリー（例えば、６７２）の異なる接続パスをポイントすることも可能であるようになっている。さらに、ＴＣＰブロック６４０、６４２、および６４８のそれぞれが、同一の逆転したツリーにおける別のＴＣＰブロックをポイントすること（例えば、６７４）、またはそのツリーにおいてさらなるブロックが全く存在しないことを示すこと（例えば、６７２および６７６）が可能な次のブロックポインタ６７２、６７４、および６７６を有する。しかし、それらのポインタは、静的ではない。つまり、リンクは、パスに関するルートが変わると次の近隣を異なるルートに変更することができるように変わることが可能である。その場合、例えば、パスブロック６５０は、ブロック６５０が使用する近隣状態を、近隣エントリ１  ６４６から他の何らかの近隣（例えば、近隣エントリ２（図示せず））に変更することが可能である。したがって、ブロックリストの使用により、複数の接続、パス、および近隣エントリが、単一のプログラム呼び出しにおいてオフロードされる、または終了されることが可能になる。
【００９１】
単に例として、限定としてではなく、第１のオフロード要求は、データ構造（例えば、６４０、６４２、６４４、６４６など）のそれぞれに状態およびハンドルを割り当て、オフロード目標のハンドルをホストネットワークプロトコルスタックに戻すよう、オフロード目標（例えば、ＮＩＣ）に要求することが可能である。代替の実施形態は、オフロード目標が、ＴＣＰ接続ごとに状態を割り当て、依存パスおよび近隣状態のすべてをＴＣＰ接続状態の中にレプリケートする（replicate）ことである。次に、オフロード目標は、パスエントリに状態構造を割り当てるが、パス状態のコピーを含む各ＴＣＰ状態へのポインタで、その状態を初期設定する。同様のルーチンが、近隣状態に適用されることが可能である。これにより、データ転送のために使用されるすべての状態が、単一のデータ構造の中に含まれることが可能になり、データを送ることに関する状態ルックアップの回数が減らされる。例えば、ＴＣＰブロック６４０パケット送信処理に関して、状態ルックアップの回数は、３回から１回に減らされる。特定のエントリの中でオフロード目標によって割り当てられたハンドルが無効であった場合、状態オブジェクトは、新たなオフロード要求である。ホストスタックによる後のオフロード要求は、既存のパス状態エントリまたは近隣状態エントリを再使用することが可能である。ブロックリストは、各レイヤにつき１つだけの状態オブジェクト（例えば、単一の近隣状態オブジェクト、単一のパス状態オブジェクト、および単一のＴＣＰ状態オブジェクト）を含むことも、図６Ａ〜図６Ｂで定義されるより複雑な構造であることも可能である。このより複雑な構造は、前述した通り、複数の接続、パス、および近隣エントリが、単一のプログラム呼び出しでオフロードされる、または終了されることを可能にする。
【００９２】
ホストが、示される通り、接続をオフロードすると、１つまたは複数のソフトウェアレイヤが、それぞれの状態オブジェクトの中で変更を更新する必要がある可能性がある。図７は、本発明において、状態オブジェクトのキャッシュ状態部分を更新することに関する、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す。既に述べた通り、これは、ソフトウェアレイヤが、そのレイヤのＣＡＣＨＥＤ状態変数の変更で、周辺デバイスを更新する場合に行われる。状態オブジェクトのＣＡＣＨＥＤ状態変数を更新することにより、中間ソフトウェアレイヤと周辺デバイスの状態に整合性があることが可能になる。
【００９３】
したがって、図７は、各ソフトウェアレイヤが、周辺デバイスに対して、そのレイヤのＣＡＣＨＥＤ状態変数を更新する際、各ソフトウェアレイヤが、更新シグナルが、ミニポートドライバ７３０に到達するまで、ネットワークプロトコルスタックを下に行くように更新シグナルを送ることを示す。例えば、ＴＣＰレイヤ７２０が、周辺デバイスに対して、レイヤ７２０のＣＡＣＨＥＤ状態変数を更新する必要がある場合、ＴＣＰレイヤ７２０は、シグナル７０２をネットワークレイヤ（パス）７２２に送り、レイヤ７２２は、更新シグナル７０４をフレーミングレイヤ（近隣）７２４に送り、レイヤ７２４は、更新シグナル７０６をＮＤＩＳ（ネットワークドライバインタフェース仕様）７２６に送り、ＮＤＩＳ７２６は、シグナル７０８をミニポートドライバ７３０に送る。ＣＡＣＨＥＤ状態変数が、周辺デバイスに対して更新されると、ミニポートドライバ７３０は、シグナル７１０をＮＤＩＳ７２６にリレーし、ＮＤＩＳ７２６は、ＴＣＰレイヤに対するリレーのセット７１２、７１４、および７１６を続け、ＴＣＰ  ＣＡＣＨＥＤ状態変数が、周辺デバイスに対して更新されたことをシグナルする。代替の実施形態は、ＣＡＣＨＥＤ状態更新が、中間レイヤを介してではなく、オフロード目標に直接に向かうことである。
【００９４】
本発明は、ブロックリストデータ構造を使用するので、更新ステップおよび確認ステップのそれらのシリーズは、ＣＡＣＨＥＤ状態変数を最初に更新したソフトウェアレイヤにおいて行われるだけでよい。つまり、例えば、フレーミングレイヤ（近隣）７２４が、ＮＩＣに対して、レイヤ７２４の状態オブジェクトのＣＡＣＨＥＤ状態変数部分を更新する必要があった場合、ステップ７０６、７０８、７１０、および７１２が行われるだけでよい。したがって、ネットワークプロトコルスタックの上位のソフトウェアレイヤは、フレーミングレイヤのＣＡＣＨＥＤ状態を更新するためのシグナルリレーに参加する必要がない。ブロックリストを使用して、複数の接続状態変化を更新することができるこの能力は、オフロードされたネットワーク接続のそれぞれに関する、高い度合いの接続完全性も可能にする。代替の実施形態では、更新通信は、更新を実行するソフトウェアレイヤとミニポートドライバ７３０の間で直接に行われることが許されることが可能である。しかし、これは、ミニポートドライバ７３０に対する多数の呼び出しインタフェースを要求し、追加のネットワークプロトコルレイヤがオフロードに追加されるのと同様に容易に拡張可能ではない。
【００９５】
ホストＣＰＵまたは周辺デバイスが、オフロードされた接続または状態オブジェクトを終了する必要がある場合、本発明は、類似した一連のシグナルステップを提案する。予備的な事項として、ホストまたはオフロード目標は、オフロードを終了することができる。また、中間プロトコルレイヤが、ＴＣＰ接続が依存していたパス状態オブジェクトまたは近隣状態オブジェクトを終了すること、および／または無効にすることにより、オフロードされたＴＣＰ接続を間接的に終了することもできる。これは、最終的に、ＴＣＰ接続タイムアウトを生じさせるか、あるいは無効にされたパス状態オブジェクトまたは近隣状態オブジェクトに起因して、オフロード目標が伝送することができないという、オフロード目標からの通知をもたらし、これにより、ＴＣＰ接続オフロードが終了されるよう、オフロード目標が要求するようにさせられる。接続オフロードは、様々な理由で終了されることが可能である。一般に、特定の接続をオフロードするようにプロトコルスタックに告げる管理機構が存在する。オフロード目標が、オフロードされるように管理者が導いた接続に関するオフロードの終了を要求した場合、ホストは、その終了を許可し、イベントが、管理者のためにログ記録される。
【００９６】
代替として、ネットワークインタフェースが停止した（例えば、媒体切断イベント）場合、オフロード目標は、オフロードされた状態オブジェクトの終了を要求すべきではない。ホストは、通常のシグナルイベントを介して、そのイベントのことを通知され、最良の方針を決める。同様に、接続がリセットされた場合（これは、ＴＣＰ  ＲＳＴセグメントが受け取られた場合に行われる）、オフロード目標は、接続オフロードが終了されるべきことをホストに示す。次のホップのアドレスが変わり、近隣状態オブジェクトが変更されることを生じさせた場合、ホストスタックは、古い状態オブジェクトが無効にされる前に、新たな状態オブジェクトが作成されることを確実にする。これにより、近隣状態オブジェクトまたはパス状態オブジェクトがもはや有効でない場合、それは、ホストスタックからのパス状態オブジェクト更新および／または近隣状態オブジェクト更新における一時的な競合状態（race condition）のためでないことに、オフロード目標が確信をもつことが可能になる。代替の実施形態は、古い状態オブジェクトが無効にされる前に、新たな状態オブジェクトが作成されることを確実にせず、オフロード目標が、競合状態を扱うことができること（すなわち、オフロード目標が、アップロードを要求する可能性があるが、アップロードは、許可されない）を頼りにすることである。
【００９７】
図８は、周辺デバイスが、オフロードされたＴＣＰ接続の終了を要求する、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す。周辺デバイスは、オフロードを終了することを決めた場合、周辺デバイスは、「指示」関数（ホストスタックによって通知される）を呼び出すことによって、オフロードを終了するよう、ホストスタックに要求し、オフロードを終了することを周辺デバイスが所望する理由を含める。その理由は、周辺デバイスが、緊急のデータを受け取り、そのデータをサポートしないなどの、周辺デバイスが、特定のネットワークプロトコルレイヤ特徴をサポートしない状況を含め、様々な理由であることが可能である。周辺デバイス終了要求は、例えば、ミニポートドライバ８３０からＮＤＩＳ８２６への呼び出し８０２で始まる、プロトコルレイヤを通る一連のシグナル（８０２、８０４）の後に続き、ＮＤＩＳ８２６は、終了要求シグナル８０４をＴＣＰレイヤ８２０に送る。ホストが、周辺デバイスの終了要求を処理すると、ホストは、要求をミニポートドライバ８３０に対して完了させることにより、要求を確認する。一部のアップロード要求は必須であり（すなわち、ホストは、常にアップロードする）、一部のアップロード要求は、オプションである（すなわち、ホストは、アップロードしてもよい）。
【００９８】
ホストスタックが、オフロードを終了することを決めると、図８は、ホストスタックが、中間ソフトウェアレイヤのそれぞれを通してシグナルを送り、その終了を中間レイヤに知らせることを示す。例えば、ＴＣＰ８２０は、終了のシグナルをネットワークレイヤ８２２に送り８１０、ネットワークレイヤは、終了のシグナルをフレーミングレイヤ８２４に送り８１２、シグナル８１４および８１６で、ネットワークプロトコルスタックを下に進む（on down through）。中間ソフトウェアレイヤのより高位のレイヤ（例えば、ＴＣＰ）のケースでは、ＴＣＰトランスポートレイヤ８２０（すなわち、トランスポートレイヤ３００）が、終了を要求すると、ＴＣＰ（またはトランスポート）レイヤは、新たなアプリケーション送信バッファまたはアプリケーション受信バッファをオフロード目標にポストすることを止め、周辺デバイスが、ネットワーク接続をアップロードすることに成功するまで、受信されたＴＣＰセグメントをバッファリングすることを開始する。これに対して、ネットワークプロトコルスタックにおけるそれぞれのより低位のソフトウェアレイヤは、それぞれのレイヤが、その状態オブジェクトに関する最後の依存ブロックリストデータ構造であるかどうかを確認する。それぞれの中間レイヤが、さらなる依存ブロックを全く有さない場合、それぞれのレイヤも、追加のブロックリストデータ構造をリストに追加することによって、それぞれの状態オブジェクトの終了を要求し、その中間レイヤのそれぞれの状態オブジェクトに関するオフロード目標ハンドルを含める。それぞれの中間レイヤが、さらなる依存ブロックを有する場合、その中間レイヤは、そのレイヤの状態オブジェクトのアップロードを要求することなしに、単に、アップロード要求を次のレイヤに転送する。シグナル８１４および８１６を参照されたい。
【００９９】
オフロード目標（例えば、周辺デバイス）は、ネットワークプロトコルスタックを通る、要求された終了を確認すると、着信ネットワーク接続データを処理することを止め、送信ネットワーク接続データの処理を整合性のある状態にする。未処理の要求に関して（すなわち、アプリケーションレイヤは、オフロード終了を確認する前に、ネットワーク接続データバッファをポストしている）、オフロード目標は、接続「アップロード」が「進行中」であることを表明するステータスシグナル（８４０、８４２）で、ネットワークプロトコルスタックを上に向かうように応答し、バッファの所有権をＴＣＰレイヤ８２０に戻す。周辺デバイスが、リモートコンピュータ（すなわち、ＷＡＮ上のリモートピアコンピュータ）に対して、受信を既に確認している、受信されたネットワーク接続データが存在するが、ホストのアプリケーションは、そのデータを消費するように（最終的な処理のために）バッファをまだ、ポストしていない場合、周辺デバイスは、中間ソフトウェアレイヤに周辺デバイスが戻すＴＣＰ  ＤＥＬＥＧＡＴＥＤ状態変数の一部として、そのポストされたバッファをパッケージする。
【０１００】
いずれにしても、周辺デバイスは、各中間ソフトウェアレベルに関する各ＤＥＬＥＧＡＴＥＤ状態変数（例えば、ＮＤＩＳ８２６を介する）の制御（例えば、シグナル８５２、８５４、８５６）を戻して、ホストＣＰＵが、ＤＥＬＥＧＡＴＥＤ状態の制御を取り戻すようにする。このため、オフロード目標は、様々なレイヤからの要求されたＤＥＬＥＧＡＴＥＤ状態の整合性のあるスナップショットが作成されることを確実にし、ＯｆｆｌｏａｄＢｌｏｃｋＬｉｓｔ構造に関連する状態構造の中に状態を埋め込み、オフロード終了完了関数を呼び出す（８５０）。この場合も、オフロードされたブロックリストデータ構造のため、接続終了呼び出しは、１つの接続に関して、またはいくつかの接続に関して一度に行うことができる。
【０１０１】
また、１つまたは複数のＮＩＣドライバなどの、１つまたは複数の物理的周辺デバイスドライバを管理する、１つまたは複数の仮想デバイスドライバも提供されることが可能である。仮想デバイスドライバは、単一のＭＡＣ（メディアアクセス制御）アドレスをホストスタックに公開することができ、ホストスタックと、仮想ドライバが管理する１つまたは複数の周辺デバイスドライバの間のマッピングを提供する。あるいは、仮想デバイスドライバは、実質的に、１つ（または複数の）物理的周辺デバイスに関して、複数の論理的インタフェースをホストスタックに提供して、ホストスタックが、あたかも、物理的周辺デバイスの数よりも多くのネットワークが存在するかのように、ネットワークトラフィックを管理できるようにすることも可能である。したがって、周辺デバイスドライバは、ホストスタックが、１つまたは複数の仮想デバイスドライバを見て、基礎にある１つまたは複数の周辺デバイスドライバの知識を全く有さないようにする形で、抽象化される。仮想デバイスドライバは、物理的デバイスドライバと別個であっても、物理的デバイスドライバに埋め込まれてもよいことに留意されたい。代替の実施形態では、仮想デバイスドライバは、使用されず、単一の物理的周辺デバイスが、複数の送信元ＭＡＣアドレスを有効にすることができる。
【０１０２】
仮想周辺デバイスは、仮想周辺デバイスが、周辺初期設定プロセスに参加することを許して、仮想周辺デバイスが、仮想周辺デバイスを介する物理的デバイスに対するすべての呼び出しをリダイレクトすることができ、場合により、システム内に存在する物理的周辺デバイスの数よりも多い、または少ない仮想周辺デバイスをホストスタックに通知するようにすることにより、有効にされる。
【０１０３】
データ転送中、周辺デバイスのチーム内のフェイルオーバサポートのため、仮想周辺デバイスは、特定の物理的デバイスに障害が生じたかどうかを判定することができる。メディアセンス（media sense）が失われたかどうかを検出すること、または固定の間隔にわたって繰り返されるシグナルの形態の、オフロードされた周辺デバイスからネットワークスイッチへの絶え間ないハートビートによることを含め、これをサポートする様々な機構が存在する。ハートビートが失われたことを周辺デバイスが検出した場合（例えば、シグナルをもはや検出しないことにより）、周辺デバイスドライバは、そのイベントを仮想周辺デバイスにシグナルする。
【０１０４】
本発明は、仮想周辺デバイスが、オフロードされた状態オブジェクトを回復し、ネットワークトラフィックをチーム内の別の周辺デバイスに移そうと試みることを可能にする。仮想周辺デバイスは、ホストネットワークスタックを利用して、別の物理的周辺デバイスへのフェイルオーバが行われる間に、スタックを管理することによるか、または新たなプロトコルオフロード要求を停止させ、状態オブジェクトを新たな物理的周辺デバイス自体に移すことにより、様々な形でこれを行うことができる。
【０１０５】
仮想周辺デバイスは、オフロードされた状態オブジェクトまたは接続（ＴＣＰの場合）を遷移中に、ホストプロトコルスタックが管理することを許すように選択した場合、周辺デバイスに接続をオフロードすることを止め、ホストが、周辺デバイスに既にオフロードしている既存の状態オブジェクトをアップロードするよう、ホストプロトコルスタックに要求する。仮想周辺デバイスが、オフロードを再び有効にするまで、ホストは、リンクまたは接続をホストの中間ソフトウェアレイヤの中で処理する。
【０１０６】
仮想デバイスドライバは、１つまたは複数の周辺デバイスのチーム内のすべての利用可能な周辺デバイスの知識を有する。周辺デバイスに障害が生じると、仮想デバイスドライバは、接続または状態オブジェクトのオフロードを受け取ることができる新たな周辺デバイスを選択する。仮想デバイスドライバは、新たな周辺デバイスが、どのようなリソースを有する可能性があるかを検出し、周辺デバイスの中で要求される状態を初期設定する。周辺デバイスが初期設定されると、仮想デバイスは、状態オブジェクトのオフロードを再び有効にする。
【０１０７】
ホストスタックは、特定の仮想周辺デバイスにオフロードするように再び有効にされると、仮想周辺デバイスのオフロード能力について、仮想周辺デバイスに再びクエリを行う。ホストは、能力の新たなリストを使用して、いずれの状態オブジェクトまたは接続をオフロードすることができるかを選択する。これは、通知された新たな周辺デバイス能力に応じて、逆転したツリーの制御を移すことにより（すなわち、委任状態変数、キャッシュ状態変数、ｃｏｎｓｔ状態変数を移すことにより）、仮想周辺デバイスに（したがって、新たな周辺デバイスに）接続が再びオフロードされることがもたらされる。代替として、新たな物理的周辺デバイスが、オフロードをサポートしない場合、ホストは、接続をオフロードしようと試みるのではなく、単に、中間ソフトウェアレイヤを介して、自ら接続を処理することを続ける。
【０１０８】
代替として、仮想周辺デバイスは、周辺デバイスの間におけるオフロードされた状態オブジェクトの遷移を自ら管理することを選択することもできる。これが行われる場合、仮想周辺デバイスは、依然、前述したイベントシーケンスを使用して、状態を直接に移す間に、オフロード要求を引き延ばして（stall）（オフロードされた状態オブジェクトをホストプロトコルスタックに戻すのではなく）、フェイルオーバが完了した際に、能力の変化を通知することができる。
【０１０９】
ホストは、特定の状態オブジェクトまたは接続がオフロードされる可能性があっても、整合性のある状態をオフロード能力として保持し、ホストは、最初の周辺デバイスのフェイルオーバが生じた場合に、新たな周辺デバイスとパラメータを再ネゴシエートすることができるので、本発明は、周辺デバイスの障害に関わらず、１つまたは複数の状態オブジェクトまたは接続のオフロードおよびアップロードを行う斬新で堅牢な方法を提供する。
【０１１０】
仮想周辺デバイスが１つまたは複数の物理的周辺デバイス上で複数の仮想ＬＡＮをサポートするように構成されている場合、仮想周辺デバイスは、やはり、物理的デバイス初期設定を傍受し、１つまたは複数の仮想周辺デバイスをホストスタックに代わりに通知し、特定の仮想アダプタに対して行われたすべての呼び出しが適切な仮想ＬＡＮタグおよび物理的周辺デバイスにマップされることを確実にする。オフロード中、仮想ＩＤは、フレーミングレイヤ状態オブジェクトに追加すること、または仮想周辺デバイスに関する新たな状態オブジェクトを作成することにより、初期オフロード要求の中で転送される。具体的には、本発明は、仮想デバイスが、ＢｌｏｃｋＬｉｓｔの中のフレーミングレイヤ構造の直下で、ＢｌｏｃｋＬｉｓｔ構造の中に構造を挿入すること、またはフレーミングレイヤＢｌｏｃｋＬｉｓｔ状態オブジェクトにＶＩＤを追加することを可能にする。また、ＢｌｏｃｋＬｉｓｔ構造の中に構造を挿入するアプローチは、仮想周辺デバイスが、物理的周辺デバイスに対して不透明なデータ（場合により、ベンダ固有のデータ）を指定することもできるようにする。接続がアップロードされると、オフロード中に、追加の状態オブジェクトが仮想周辺デバイスによって追加されている場合、仮想周辺デバイスは、その構造を取り除き、Ｂｌｏｃｋ  Ｌｉｓｔの残りの部分をホストプロトコルスタックに渡す。
【０１１１】
ＴＣＰ接続のオフロードおよびアップロードを行う方法を説明したので、ＩＰＳｅｃ認証および／またはＩＰＳｅｃ暗号化に関連する計算をオフロードする方法を説明する。ＳＡ（セキュリティ関連付け）は、ＳＡによって伝送されるトラフィックにセキュリティサービスをもたらす、シンプレックス「接続」である。２つのホスト間の通常の双方向通信をセキュリティで保護するのに、２つのセキュリティ関連付け（各方向で１つ）が要求される。セキュリティ関連付けは、ＳＰＩ（セキュリティパラメータインデックス）、ＩＰ宛先アドレス、およびセキュリティプロトコル（例えば、ＡＨ［認証ヘッダ］またはＥＳＰ［カプセル化セキュリティペイロード］）識別子から成るトリプル（triple）で一意に識別される。技術上、ＡＨ保護とＥＳＰ保護の両方がトラフィックストリームに適用される場合、２つの（またはさらに多くの）ＳＡが、単一の方向におけるトラフィックストリームに保護を与えるように作成される。保護が、両方向で要求される場合（それが通常である）、ＡＨとＥＳＰがともに有効にされる場合、４つのＳＡが必要である可能性がある。説明のため、ＡＨ、ＥＳＰ、またはＡＨカプセル化内のＥＳＰ用のセキュリティ関連付けを、単一のＳＡオフロードブロックとして述べる。ＳＡオフロードブロックは、ネットワークトラフィックの単一の方向、または双方向通信に必要なＳＡ状態を含むことが可能である。さらに、ＳＡオフロードブロックは、複数のＳＡを含むことが可能である。以下の説明では、様々なコマンドについて述べる。それらのコマンドについては、以下に説明する。
【０１１２】
一般に、ホストスタックは、オフロードブロック内の特定のＳＡのオフロード、アップロード、無効化、またはキー更新がいつ行われるか対して、完全な制御を保持する。ホストスタックとオフロード目標は、ＳＡ有効期限に関するソフト限度とハード限度の両方に関するサポートを含め、ＳＡがいつ無効にされるかに関するメトリック（metric）のすべてを保持するように協調する。一般に、使用されるアプローチは、ＩＰＳｅｃオフロード目標に関するタイマ要件を最小限に抑えるためである。ソフト有効期限時間制限は、ホストスタックによって行われる。ハード有効期限は、ホストスタックとオフロードの両方によって行われる。つまり、ホストスタックが、ＳＡを削除するタイマを保持し、オフロード目標が、送信された、または受信された各パケット上で時間比較を行って、ハード時間制限を超えないことを確実にする。ソフトバイトカウント制限およびハードバイトカウント制限、並びにパケット限度（シーケンス番号のラップ（wrapping）に対する保護）は、オフロード目標によって行われる。
【０１１３】
図９は、ネットワーキングモデルを構成するコンポーネントのいくつかと、本発明のコンポーネントの相互関係を示す。通常の動作中、ネットワーク化されたメッセージが、アプリケーション９００によって、ネットワークスタック９０２を介して周辺デバイス９０４に送られ、装置９０４において、メッセージは、ネットワーク上の他のデバイスおよびアプリケーションに送られる。さらに、ネットワーク化されたメッセージが、周辺デバイスを使用する他のデバイスおよびアプリケーションから受信されることが可能であり、周辺デバイスは、ネットワーク化されたメッセージを、ネットワークスタック９０２を介してアプリケーション９００に送る。ネットワークスタック９０２は、１つまたは複数の中間ソフトウェアレイヤを含む。アプリケーション９００から送られたデータは、中間ソフトウェアレイヤを通過し、この中間ソフトウェアレイヤレイヤにおいて、データをパッケージすること、信頼できるデータ伝送、およびメッセージダイジェストの計算などの、特定の操作がデータに対して実行されることが可能である。この中間ソフトウェアレイヤは、トランスポートレイヤ９０８、パスレイヤ９１０（「ネットワークレイヤ」としても知られる）、および近隣レイヤ９１２（「フレーミングレイヤ」としても知られる）を含む。パスレイヤ９１０は、オフロードされていないＳＡに関するＩＰＳｅｃ操作を提供することに留意されたい。
【０１１４】
スイッチ９１４が、上記中間ソフトウェアレイヤに関するネットワークスタック操作を実行することから、処理装置１２０をオフロードするのに使用される。ＩＰＳｅｃスイッチ９２２が、上記中間ソフトウェアレイヤに関するＩＰＳｅｃ操作を実行すること、および／またはチムニ９１６、９１８から、処理装置１２０をオフロードするのに使用される。スイッチ９１４は、別個に示しているが、ネットワークスタック９０２の最上位のレイヤに組み込んでもよいことに留意されたい。同様に、ＩＰＳｅｃスイッチ９２２を、ネットワークスタック９０２の中間レイヤに組み込んでもよい。ネットワークスタック操作をオフロードした後、データは、周辺デバイス９０４がネットワークスタック操作を実行するように、チムニ９１６または９１８を介して周辺デバイス９０４に送られる。ＩＰＳｅｃ操作は、ＩＰＳｅｃスイッチ９２２およびチムニ９２０を介して周辺デバイス９０４に送られて、ＩＰＳｅｃ操作が実行される。すべてのネットワークトラフィックが、ＩＰＳｅｃスイッチ９２０より上位のチムニ（例えば、チムニ９１６または９１８）を介してオフロードされる場合、実際のデータ転送は、ＩＰＳｅｃスイッチ９２２を介して行われない可能性がある。その場合、ＩＰＳｅｃ  ＣＡＣＨＥＤ状態が、チムニ９２０を介して保持され、オフロード目標が、チムニ９１６（または９１８）トラフィックに関するＩＰＳｅｃのカプセル化／カプセル化解除を行う。この階層では、中間ソフトウェアレイヤおよびＩＰＳｅｃ操作は、ホストまたは処理装置の中に限って存在する必要はなく、中間レイヤのいずれも、完全にオフロードされること、ホストの中に留まること、またはその両方の組み合わせ（例えば、１つまたは複数の特定の接続をオフロードすること）が許される。さらに、チムニは、チムニの上に階層化されても、チムニの下に階層化されてもよい（例えば、ＩＰＳＥＣチムニは、ＴＣＰチムニの上に階層化されても、ＴＣＰチムニの下に階層化されてもよく、ＴＣＰチムニは、ＲＤＭＡチムニより低位であること、またはＩＰＳｅｃチムニより上位であることが可能である）。各チムニ９１６、９１８、９２０は、最上位のレイヤのプロトコル、および基礎にある、要求されるプロトコルをオフロードする能力を提供する。例えば、ＩＰＳｅｃチムニ９２０は、ＩＰＳｅｃ機能のオフロードをサポートするとともに、パスレイヤ（例えば、ＩＰｖ４機能またはＩＰｖ６機能）およびフレーミングレイヤ（例えば、ＭＡＣレイヤカプセル化）のオフロードもサポートする。
【０１１５】
次に、図１０を参照すると、ＩＰＳｅｃチムニへのデータ転送が、２つのモードのいずれかで行われることが可能である。第１のモードは、唯一のデータ転送が、オフロードされたＴＣＰ接続に対してである場合である。この第１のモードでは、通常のデータ転送中、ＩＰＳｅｃチムニインタフェースは、制御機能（例えば、キー更新）に関してだけ使用される。データ転送は、インタフェース１０００で表す通り、最上位のレベルのチムニ（例えば、ＴＣＰチムニ９１６）に対して、またはそのようなチムニから直接に行われる。第２のモードは、データ転送が、オフロードされた状態とオフロードされていない状態の混合の上で行われる場合である。データ転送が、オフロードされた接続、およびオフロードされていない接続を介して（または、ＵＤＰなどの他のプロトコルに関して）行われる場合、オフロード目標は、次の２つの送信元から、暗号化／復号化すべきデータを受け入れることができなければならない。すなわち、ＩＰＳｅｃチムニ９２０（インタフェース１００２で表す）、並びにＴＣＰチムニとＩＰＳｅｃ機能の間におけるオフロード目標内部の内部インタフェース１０００である。具体的には、送信トラフィックの場合、暗号化されていない／認証されていないデータが、オフロード目標に与えられて、ＩＰＳｅｃチムニ９２０を介して、またはＴＣＰモジュールに対するオフロード目標内部インタフェース１０００を介して、暗号化／認証されることが可能である。受信トラフィックの場合、オフロード目標は、オフロードされたＳＡに関してパケットを復号化／認証し、それらのパケットが、ＩＰＳｅｃチムニインタフェース１００２に渡されるべきか、ＴＣＰオフロードエンジンに対する内部インタフェース１０００に渡されるべきかを判定しなければならない。
【０１１６】
逆転したツリーデータ構造は、図６Ａの逆転したツリーと同様である。ＩＰＳｅｃチムニ９２０は、パス状態オブジェクトより上位のオフロード状態の新たなレイヤを作成して、セキュリティ関連付けオフロードブロック状態をカプセル化する。ＴＣＰ接続がオフロードされている場合、状態オブジェクトは、逆転したツリーにおいてＴＣＰ状態オブジェクトとパス状態オブジェクトの間に挿入される。これは、次の問題に起因する。１つの問題は、複数のＴＣＰ状態オブジェクトが、同一のセキュリティ関連付けにマップされる可能性があることである。例えば、単一のセキュリティ関連付けが、２つのホストコンピュータ間におけるすべてのポート８０トラフィックを保護することが可能である。別の問題は、複数のセキュリティ関連付けが、同一のパスエントリにマップされる可能性があることである。例えば、２つのホストコンピュータ間に２つの異なるセキュリティ関連付けが存在する場合、例えば、１つが、Ｗｅｂトラフィックを保護することを目的とし、１つが、ＳＭＴＰトラフィックを保護することを目的としている場合、それらの両方が、同一のパスエントリにマップされる。別の問題は、ＴＣＰ状態オブジェクトに、セキュアなポリシーが関連付けられていない可能性があることである。ＴＣＰ状態オブジェクトは、パスエントリに直接にマップされる可能性がある。つまり、マシンに適用されたセキュリティポリシーは、特定のサブネットまたはホストに対するセキュリティを要求しない可能性がある。そのサブネット／ホストを宛先とする、またはそのサブネット／ホストを送信元とするすべてのトラフィックは、ＩＰＳｅｃセキュリティ要件を免れる。
【０１１７】
図１１は、ＩＰＳｅｃ状態オブジェクトを有する、逆転したツリーデータ構造を示す。図６Ａに示す通り、異なるＴＣＰレイヤ状態エントリを有するが、異なるＩＰＳｅｃ状態エントリ１１００、１１０２を有する、２つのＴＣＰ接続６０４および６０６（すなわち、ＴＣＰ  Ｃｏｎｎ１およびＴＣＰ  Ｃｏｎｎ２）が存在する。ＩＰＳＥＣ状態エントリは、共通のパス（またはネットワークレイヤ）状態エントリ６０２、および共通の近隣状態エントリ６００を有する。異なるネットワーク接続６０８（すなわち、ＴＣＰ  Ｃｏｎｎ３）は、ＩＰＳｅｃエントリを有さず、別個のパス状態エントリ６１０を有するが、共通の近隣状態エントリ６００を有する。シーケンス階層全体は、次のソフトウェアレイヤに接続を導く、一連のパスハンドルによって、各ソフトウェアレイヤ間で定義されることが可能である。例えば、パスハンドル１１０４は、ＴＣＰ状態エントリ６０４をＩＰＳｅｃ状態エントリ１１００に導き、パスハンドル１１０６は、ＴＣＰ状態エントリ６０６をＩＰＳｅｃ状態エントリ１１０２に導く。パスハンドル６１２および６１４は、それぞれ、ＩＰＳｅｃ状態エントリ１１００および１１０２をパス状態エントリ６０２に導き、エントリ６０２は、エントリ６０２を近隣状態エントリ６００に導くハンドル６１６を有する。同様に、ＴＣＰ状態エントリ６０８は、パス状態エントリ６１０をポイントするハンドル６１８を有し、エントリ６１０は、ハンドル６２０を介して、共通の近隣状態エントリ６００に導かれる。本発明によれば、図１１は、次のブロックポインタに関して表現して、複数のネットワーク接続チムニを一度に含めることもできる。
【０１１８】
図１２は、ブロックリストハンドル（パス依存関係を表す様々な次のブロックポインタおよび依存ブロックポインタの集合）が、同時のオフロードのために、異なるネットワーク接続の間で、いくつかのネットワーク接続ブロックをどのように関係付けるかを示す。図１１の場合と同様に、図１２は、様々なソフトウェア状態ハンドルを含むソフトウェアレイヤブロックに関して、逆転したツリーを表す。図示されているのは、ＩＰＳｅｃブロック１２００および１２０２をそれぞれ有し、共通のパスブロック６４４、および共通の近隣ブロック６４６を有するＴＣＰブロック６４０および６４２である。ブロックリストハンドルは、近隣ブロック６４６が、パスブロック６４４をポイントする依存ブロックポインタ６６０を含むことを表明する。パスブロック６４４は、ＩＰＳｅｃブロック１２００をポイントする依存ブロックポインタ６６６を含む。また、ＩＰＳｅｃブロック１２００も、次のブロックポインタ１２０４を介して、別の逆転したツリーデータ構造をポイントすることも可能である。次のブロックポインタ６２２が欠如している場合（例えば、ＮＵＬＬ値）、これは、ブロックリストの中で、その逆転したツリーのそのレイヤにおいて、他の逆転したツリーが全く存在しないことを示すことが可能である。
【０１１９】
パスブロック６４４の場合と同様に、ＩＰＳｅｃブロック１２００とＩＰＳｅｃブロック１２０２はともにそれぞれ、依存ブロックポインタ１２０６と次のブロックポインタ１２０４、および依存ブロックポインタ１２０８と次のブロックポインタ１２１０をそれぞれ有して、ＩＰＳｅｃブロック１２０２が、完全に異なる逆転したツリーの異なる接続パスをポイントすることも可能であるようになっている。さらに、ＴＣＰブロック６４０、６４２のそれぞれが、同一の逆転したツリーにおける別のＴＣＰブロックをポイントすること、またはツリーにおいてさらなるブロックが全く存在しないことを示すことが可能な次のブロックポインタ６７４、６７６を有する。しかし、それらのポインタは、静的ではない。つまり、リンクは、パスに関するルートが変わった場合、次の近隣を異なるルートに変更することができるように変わることが可能である。その場合、例えば、パスブロック６４４は、ブロック６４４が使用する近隣状態エントリを近隣エントリ１  ６４６から、他の何らかの近隣（例えば、近隣エントリ２（図示せず））に変更することが可能である。したがって、ブロックリストの使用により、複数の接続、パス、および近隣エントリが、単一のプログラム呼び出しにおいてオフロードされる、または終了されることが可能になる。
【０１２０】
図１２に関して、動作中、ＴＣＰレイヤは、最初、２つのＴＣＰ状態オブジェクト６４０、６４２（すなわち、ブロック）、Ｃｏｎｎ１およびＣｏｎｎ２を含むオフロード要求を作成し、ＢｌｏｃｋＬｉｓｔＨａｎｄｌがＴＣＰＣｏｎｎ１をポイントし、ＮｅｘｔＢｌｏｃｋがＴＣＰＣｏｎｎ２をポイントしている。ミニポートハンドルは、ＮＵＬＬである（すなわち、ＴＣＰＨｄｎｌ１およびＴＣＰＨｎｄｌ２は、ＮＵＬＬである）。というのは、状態は、前にオフロードされていないからである。両方の状態オブジェクトは、ＩＰＳｅｃを要するポリシーを有するものとして識別され、オフロード要求が、ＩＰＳｅｃレイヤに渡されることが生じさせられる。ＩＰＳｅｃレイヤは、以下に説明する通り、関連するＦｉｌｔｅｒＩＤ、および関連するＳＡを見出す。ＩＰＳｅｃレイヤは、ＳＡオフロードブロック状態をパッケージアップし（package up）、ＴＣＰ状態オブジェクト６４０、６４２、およびＩＰＳｅｃ状態オブジェクト１２００、１２０２の中のＤｅｐｅｎｄｅｎｔＢｌｏｃｋポインタおよびＮｅｘｔＢｌｏｃｋポインタをフィックスアップする（fix up）。次に、ＩＰＳｅｃレイヤは、オフロード要求をパスレイヤに渡し、ＢｌｏｃｋＬｉｓｔＨｎｄｌが、ＩＰＳｅｃ  ＳＡＢｌｏｃｋ１をポイントする。パスレイヤは、両方のＩＰＳｅｃ状態オブジェクトが、同一のパスエントリ１に依存していると判定する。パスレイヤは、状態を適切な形で割り当て、ポインタをフィックスアップし、ＰａｔｈＥｎｔｒｙ１をポイントするＢｌｏｃｋＬｉｓｔＨｎｄｌを近隣レイヤに渡す。類似したイベントシーケンスが、近隣レイヤにおいても行われ、状態構造全体が、ＮｅｉｇｈｂｏｒＥｎｔｒｙ１状態オブジェクトとともに、オフロードされた目標に渡されることが生じさせられる。
【０１２１】
オフロード目標が、状態をオフロードすることに合意するものと想定すると、オフロード目標は、各状態オブジェクトに関する不透明なオフロードハンドルを作成し、状態オブジェクト（例えば、ＴＣＰＨｎｄｌ、ＳＡＢｌｏｃｋＨｎｄｌなど）の中のその値を設定する。各レイヤに関して完了ルーチンが呼び出されると、ミニポートオフロードハンドルが、各状態オブジェクトに関して、ホストスタック内部に格納されて、あらゆる将来の要求が、そのハンドルを含むことが可能であるようにする。追加のオフロード要求が、同一の状態に関して行われた場合、状態オブジェクトが割り当てられ、ツリーの中に挿入されるが、ミニポートオフロードブロックハンドル以外に初期設定される状態は、全く存在しない。
【０１２２】
ＩＰＳｅｃ状態オブジェクトのコンテンツは、以下の設計原理に基づく。１つの原理は、ポールベースのアルゴリズムは、費用がかかり過ぎることである（例えば、ホストが、バイトおよびパケットに関するソフト時間制限またはハード時間制限、送信アイドル間隔を管理することができるようにするのに）。別の原理は、高速リンク上で、ソフトウェアで、一次キープアライブＳＡ（以下に説明する）を扱うことは、受け入れられない高いパーセントの受信ＩＰＳｅｃパケットが、ソフトウェアによって扱われることを生じさせることである。このため、一実施形態におけるオフロード目標は、単一のキープアライブＳＡ（すなわち、合計で２つの受信ＳＡ）を扱う。しかし、複数のキープアライブＳＡを有することは、理論上、可能であるが、その確立は、極めて低く、要求されるオフロード目標状態を大幅に増加させ、本発明は、他の任意のキープアライブＳＡが、ホストスタックにおいて表示されることも可能にする。別の原理は、オフロード目標におけるタイマの数が、最小限に抑えられるべきであることである。具体的には、ＳＡに関する存続期間タイマ、およびキープアライブＳＡを削除するタイマは、オフロードされない。
【０１２３】
別の原理は、ＩＰｖ４オプションおよびＩＰｖ６拡張ヘッダのオフロード処理が、使用の頻度の低さ、複雑さの増大、定義されるべき新たなオプション／拡張の可能性、およびセキュリティ攻撃の可能性のために、望ましくないと見なされることである。このため、ホストスタックが、受け取られたＩＰオプション／拡張ヘッダを処理し、要求されるＩＰオプション／拡張ヘッダを生成する。このことの例外は、ＩＰフラグメンテーション（fragmentation）およびデフラグ（de-fragmentation）である。ＩＰデータグラムのデフラグは、ＵＤＰトラフィックのために、望ましいと見なされる。
【０１２４】
前に示した通り、ソフトウェアレイヤは、１つまたは複数の定数状態変数、キャッシュ状態変数、および委任状態変数を含むことが可能な状態オブジェクトを有する。ＩＰＳｅｃオフロードオブジェクトは、定数状態変数、キャッシュ状態変数、および委任状態変数をやはり有する、データ構造を有する。ＩＰＳｅｃオフロードオブジェクトには、任意の数のＳＡが存在していることが可能である。一実施形態では、存在するＳＡの数は、周辺デバイスにオフロードされる状態の量を制限するために、３に制限される。
【０１２５】
ＩＰＳＥＣオブジェクトに関するＣＯＮＳＴ状態変数は、特定のセキュリティ関連付けにパケットを分類するのに要求される情報、並びに受信セキュリティ関連付けおよび送信セキュリティ関連付けに固有の情報から成る。ＣＯＮＳＴ変数は、ローカルポートおよびリモートポート、ローカルＩＰアドレスおよびリモートＩＰアドレス、プロトコルタイプ、並びにセキュリティ関連付けフラグを含む。ローカルポート（またはリモートポート）設定における０の設定は、ローカルポート（またはリモートポート）がワイルドカードであることを示し、これは、任意のポートを使用できることを意味する。同様に、プロトコルタイプが０である場合、任意のプロトコルを使用することができる。
【０１２６】
セキュリティ関連付けフラグは、受信ＳＡに関するＤｙｎａｍｉｃＳＡ、ＩｎｆｉｎｉｔｅＬｉｆｅ、およびフラグを含む。ＤｙｎａｍｉｃＳＡフラグは、ＳＡがキー更新するか、または手動ＳＡであるかの指示を提供する。ＩｎｆｉｎｉｔｅＬｉｆｅフラグは、ＳＡが、無限の存続期間を有するかどうかを示す。ＩｎｆｉｎｉｔｅＬｉｆｅフラグが設定されていない場合、これは、ソフト有効期限（以下に説明する）に達すると、キー更新を行う、ＳＡに関するキー更新が実行されることを示す。手動ＳＡの場合、設定されたＩｎｆｉｎｉｔｅＬｉｆｅフラグは、ＳＡが永遠に存続しつづけることを示す。ＩｎｆｉｎｉｔｅＬｉｆｅフラグが設定されない場合、ＳＡは、ハード有効期限に達すると、無効になる。受信ＳＡに関するフラグは、ＩｎＢｏｕｎｄＡＨＲｅｐｌｙおよびＩｎＢｏｕｎｄＥＳＰＲｅｐｌａｙを含み、これらは、それぞれ、ＡＨまたはＥＳＰに関して、リプレー検査が有効にされるかどうかを示す。
【０１２７】
ＣＡＣＨＥＤ状態変数は、ＳＡを追加する、削除する、または上書きする（すなわち、置き換える）ための変数、ＳＡの存続期間を決めるための変数、および受信ＳＡおよび送信ＳＡに固有の情報を含む。ＣＡＣＨＥＤ変数には、操作符号（opcode）、暗号化されたバイトに基づくソフト限度およびハード限度、ソフト有効期限およびハード有効期限までのパケット数のソフト限度およびハード限度、フラグ、ＡＨおよび／またはＥＳＰが有効にされる場合、ＡＨパラメータおよび／またはＥＳＰパラメータ、送信アイドル間隔、およびその他の変数が含まれる。ＮＩＣは、ソフト限度およびハード限度を遵守することに留意されたい。ソフト限度に達すると、ＮＩＣは、ＳＡをキー更新するよう、ホスト処理装置に関するネットワークスタックに知らせる。ハード限度に達すると、ＮＩＣはセキュリティ関連付けを破棄する。
【０１２８】
操作符号変数は、ＳＡが、追加されるべきか、削除されるべきか、または置き換えられるべきかを示す。ＳＡが置き換えられる場合、ＯＬＤＳＰＩフラグが設定される。ＯＬＤＳＰＩフラグは、置き換えられるＳＡが、ＡＨを有効にしている場合、ＡＨ  ＳＰＩに設定される。ＯＬＤＳＰＩフラグは、置き換えられるＳＡが、ＡＨを有効にしていない場合、ＥＳＰ  ＳＰＩに設定される。ＳＰＩは、ＳＡを識別するのに使用される、ＩＰアドレスごとの一意識別子である。ＳＰＩは、いずれのＳＡが、変数に関連して操作されているかを示す。
【０１２９】
ソフト限度は、暗号化されたキロバイト数が、いつ特定の限度に達するかを含め、いくつかの要因に基づいて達せられることが可能である。その数に達すると、オフロード目標は、ホストスタックに知らせ、その時点で、ＳＡは、通常、キー更新される。受信ＳＡ（すなわち、送信接続に関する送信ＳＡと対比される、受信接続に関するＳＡ）は、キー更新時に即時に無効にはされない。というのは、ネットワークは、長い期間にわたってパケットを格納することが可能だからである。古いＳＡ上で暗号化され、かつ／または認証されたすべてのパケットが、ネットワークから流れ出るように、ＳＡは、ある期間にわたってキープアライブ状態（すなわち、キープアライブＳＡ）に移されて、パケットが、ネットワークから流れ出るのを可能にする。通常、ソフト限度は、ハード限度のおよそ５０パーセントに設定されて、ＳＡが、新たなＳＡで置き換えられる（例えば、キー更新される）のを可能にする。ソフト限度で、キー更新プロセスが開始される。ＳＡがいつ破棄されるかを示すハード限度は、暗号化されたキロバイト数が、特定の限度にいつ達するかを含め、いくつかの要因に基づいて達せられることが可能である。
【０１３０】
暗号化されたバイト数の限度と同様に、ソフト有効期限までのパケット数のソフト限度は、キー更新のプロセスを始めるようにネットワークスタックが通知されるまでに送られるパケットの数である。送られたパケットの数のハード限度に達すると、ＳＡは、破棄される。
【０１３１】
フラグは、ＳＡが、受信ＳＡであるか、または送信ＳＡであるか、ＡＨが有効にされているか、ＥＳＰ機密性が有効にされているか、並びにＥＳＰ完全性が有効にされているかを示すのに使用される。送信アイドル間隔は、キー更新を開始するのに使用される。送信パケットが、前回、ＳＡ上で見られたのが、少なくとも送信アイドル間隔ぐらいの時間であった場合、キー更新が開始される。ＡＨフラグが設定されている場合、有効であるＡＨパラメータには、ＡＨＳＰＩ、ＡＨＡｌｇｏｒｉｔｈｍ（ＡＨ完全性アルゴリズム、すなわち、｛ＭＤ５、ＳＨＡ１、ＳＨＡ−２５６、ＳＨＡ−３８４、ＳＨＡ−５１２、ｐｒｏｐｒｉｅｔａｒｙ１（独自のアルゴリズム）｝）、ＡＨＫｅｙＬｅｎｇｔｈ（ＡＨ完全性キー長）、およびＡＨＫｅｙ（ＡＨ完全性キー）が含まれる。ｃｏｎｆ／完全性フラグが、どのように設定されているかに依存して有効であるＥＳＰパラメータには、ＥＳＰＳＰＩ、ＥＳＰＩｎｔＡｌｇｏｒｉｔｈｍ（ＥＳＰ完全性アルゴリズム、すなわち、｛ＭＤ５、ＳＨＡ１、ＳＨＡ−２５６、ＳＨＡ−３８４、ＳＨＡ−５１２、ｐｒｏｐｒｉｅｔａｒｙ１｝）、ＥＳＰＩｎｔＫｅｙＬｅｎｇｔｈ（ＥＳＰ完全性キー長）、ＥＳＰＩｎｔＫｅｙ（ＥＳＰ完全性キー）、ＥＳＰＣｏｎｆＡｌｇｏｒｉｔｈｍ（ＥＳＰ機密性アルゴリズム、すなわち、｛ＤＥＳ、３ＤＥＳ、ＡＥＳ−１２８、ＡＥＳ−１９２、ＡＥＳ−２５６、ｐｒｏｐｒｉｅｔａｒｙ１｝）、ＥＳＰＢｌｏｃｋＬｅｎｇｔｈ、ＥＳＰＣｏｎｆＫｅｙＬｅｎｇｔｈ（ＥＳＰ機密性キー長）、およびＥＳＰＣｏｎｆＫｅｙ（ＥＳＰ機密性キー）が含まれる。
【０１３２】
ＤＥＬＥＧＡＴＥＤ変数は、実用（runnig）情報、並びに受信セキュリティ関連付けおよび送信セキュリティ関連付けに固有の情報を含む。ＤＥＬＥＧＡＴＥＤ変数には、フラグ、ＳＡを介して転送されたバイトのカウント、ＳＡがアイドルであったティック（tick）数、ＳＡを介して転送された機密バイトの数、ＳＡを介して転送された認証済みバイトの数、並びに送信パラメータまたは受信パラメータが含まれる。
【０１３３】
フラグには、ＳＡが、現在、有効であるかどうかを示す有効フラグが含まれる。送信パラメータおよび受信パラメータには、ＡＨが有効にされている場合に、ＡＨパラメータが含まれ、ｃｏｎｆ／完全性フラグが、どのように設定されているかに応じて有効な、ＥＳＰパラメータが含まれる。送信ＡＨパラメータには、ＬａｓｔＰａｃｋｅｔＮｕｍ（ＳＡを介して送信された最後のＡＨパケットのシーケンス番号）が含まれる。送信ＥＳＰパラメータには、ＣｕｒｒｅｎｔＩＶ（現在の初期設定ベクトル）およびＬａｓｔＰａｃｋｅｔＮｕｍ（そのＳＡを介して送信された最後のＥＳＰパケットのシーケンス番号）が含まれる。受信ＡＨパラメータには、ＣｕｒｒｅｎｔＲｅｐｌａｙＭａｐ（現在のＡＨリプレービットマップ）およびＣｕｒｒｅｎｔＲｅｐｌａｙＳｅｑ（現在のＡＨリプレー最終シーケンス番号）が含まれる。受信ＥＳＰパラメータには、ＣｕｒｒｅｎｔＲｅｐｌａｙＭａｐ（現在のＥＳＰリプレービットマップ）およびＣｕｒｒｅｎｔＲｅｐｌａｙＳｅｑ（現在のＥＳＰリプレー最終シーケンス番号）が含まれる。
【０１３４】
全体的なアーキテクチャのコンポーネントおよび変数を説明したので、ＩＰＳｅｃ状態オブジェクトをオフロードするステップを説明する。周辺デバイス９０４（例えば、ＮＩＣ）などのオフロード目標は、周辺デバイスの能力と、スタック９０２によって設定された初期構成パラメータを組み合わせるデータ構造を使用する。周辺デバイスが指定する能力には、ＮＩＣにオフロードすることができる送信セキュリティ関連付けの数、ＮＩＣにオフロードすることができる受信セキュリティ関連付けの数、およびフラグが含まれる。オフロードされることが可能な受信ＳＡの数は、ＮＩＣにオフロードされることが可能な送信ＳＡの数と少なくとも同じだけ多くなければならない。この数は、キープアライブＳＡを見越すように、送信ＳＡの数の２倍であることが推奨される（例えば、各ＳＡオフロードブロックが、１つの送信ＳＡと、２つの受信ＳＡとを有することが可能である）。代替の実施形態では、オフロード目標は、オフロード目標がサポートする、ＳＡオフロードブロックの数およびフラグを通知する。ＳＡオフロードブロックパラメータの値には、各ＳＡオフロードブロックに関して、送信ＳＡと、２つの受信ＳＡとを有する能力が含まれる。
【０１３５】
フラグには、ＩＰＳｅｃ  ＩＰｖ４フラグ、ＩＰＳｅｃ  ＩＰｖ６フラグ、認証サポートフラグ、および暗号化サポートフラグが含まれる。ＩＰＳｅｃ  ＩＰｖ４フラグが設定される場合、オフロード目標は、オフロード目標がサポートするすべての認証アルゴリズムおよび暗号化アルゴリズムに関するＩＰｖ４サポートを提供しなければならない。ＩＰＳｅｃ  ＩＰｖ６フラグが設定される場合、オフロード目標は、オフロード目標がサポートするすべての認証アルゴリズムおよび暗号化アルゴリズムに関するＩＰｖ６サポートを提供しなければならない。認証サポートフラグは、サポートされる認証アルゴリズムを示す。サポートされることが可能なアルゴリズムには、ＭＤ５＿Ａｈ、ＭＤ５＿Ｅｓｐ、ＭＤ５＿ＡｈＥｓｐ、ＳＨＡ１＿Ａｈ、ＳＨＡ１＿Ｅｓｐ、ＳＨＡ１＿ＡｈＥｓｐ、ＳＨＡ２５６＿Ａｈ、ＳＨＡ２５６＿Ｅｓｐ、ＳＨＡ２５６＿ＡｈＥｓｐ、ＳＨＡ３８４＿Ａｈ、ＳＨＡ３８４＿Ｅｓｐ、ＳＨＡ３８４＿ＡｈＥｓｐ、ＳＨＡ５１２＿Ａｈ、ＳＨＡ５１２＿Ｅｓｐ、ＳＨＡ５１２＿ＡｈＥｓｐ、および独自のアルゴリズムが含まれる。暗号化サポートフラグは、サポートされる暗号化アルゴリズムを示す。サポートされることが可能なアルゴリズムには、ＤＥＳ＿Ｅｓｐ、３ＤＥＳ＿Ｅｓｐ、ＡＥＳ１２８＿Ｅｓｐ、ＡＥＳ１９２＿Ｅｓｐ、ＡＥＳ２５６＿Ｅｓｐ、ＵＭＡＣ＿Ｅｓｐ、および独自のアルゴリズムが含まれる。
【０１３６】
スタックが、報告された能力のいずれかの組み合わせを使用することを決めた場合、スタックは、初期設定構成パラメータを設定する。初期設定構成パラメータには、ＲｅｐｌａｙＷｉｎｄｏｗＳｉｚｅ、ＥｎａｂｌｅＳｅｃｕｒｉｔｙＡｕｄｉｔ、Ｉｄｌｅタイムアウト時間、およびＴｉｃｋｓ  ｐｅｒ  Ｓｅｃｏｎｄが含まれる。ＲｅｐｌａｙＷｉｎｄｏｗＳｉｚｅは、受信されたパケットが範囲内になければならないウインドウサイズを指定する。パケットが、ウインドウサイズの範囲内にない場合、パケットは、ドロップされる。ＥｎａｂｌｅＳｅｃｕｒｉｔｙＡｕｄｉｔが設定された場合、処理を受け取る際にエラーが生じると、パケットは、適切な統計が更新された後、ドロップされない。代わりに、パケットは、受信エラーに関するデータバッファフォーマットを使用するＩＰＳｅｃＲｅｃｅｉｖｅＩｎｄｉｃａｔｅインタフェースを使用して、ＩＰＳｅｃレイヤに送られる。Ｉｄｌｅタイムアウト時間は、ＳＡがアイドルであることが可能な最大時間である。Ｔｉｃｋｓ  ｐｅｒ  Ｓｅｃｏｎｄは、他のオフロード目標（複数）とタイミングを同期させるのに使用される。
【０１３７】
ＳＡオフロードブロックのオフロードを開始する２つの形が存在する。オフロードは、ＩＰＳｅｃモジュール９２２によって開始されること、または中間レイヤスイッチ９１４によって（例えば、ＴＣＰチムニを介するＴＣＰオフロード要求の結果）開始されることが可能である。オフロード目標は、ＳＡオフロードブロック内のＳＡのすべてを受け入れるか、あるいは全く受け入れないかでなければならない。オフロード開始要求の中に、複数のＳＡオフロードブロックが存在することが可能である。オフロード目標は、１つのオフロード開始要求の中のＳＡオフロードブロックを個々に、受け入れるか、または拒否することができる。
【０１３８】
次に、図１３を参照すると、ＳＡオフロードブロックをオフロードするステップが示されている。以下の説明では、ＩＰＳｅｃモジュール９２２が、ＴＣＰブロックを含むか、否かに関わらず、オフロードを要求するコンポーネントである。図１３では、実線は、要求される呼び出しであり、破線は、（特定の状態に応じた）オプションの呼び出しである。すべての呼び出しが、非同期として示されているが、これは、必須ではない。最初の非同期呼び出しのリターンを表す戻りの矢印は、簡明にして（reduce clutter）、本発明を理解するのを助けるように、図示していない。一実施形態では、オフロード開始要求（例えば、ＩｎｉｔｉａｔｅＯｆｆｌｏａｄ）は、オフロードされるべき１つ、２つ、または３つのＳＡを含むことが可能であり、１つまでの送信ＳＡと、２つまでの受信ＳＡの任意の組み合わせであることが可能であることに留意されたい。プロトコルスタックを下に行く呼び出しシーケンスは、各レイヤがオフロードされる可能性があるものとしてリソースにフラグを付け、リソース要件を通知し、オフロードが成功した場合、ＮＩＣが必要とする可能性がある上位呼び出し（up-call）に関するハンドルを通知し、ネットワークレイヤ１３２２およびフレーミングレイヤ１３２４においてＣＯＮＳＴ状態、ＣＡＣＨＥＤ状態、およびＤＥＬＥＧＡＴＥＤ状態を収集することができるようにするように意図されている。
【０１３９】
オフロードは、ＴＣＰレイヤ１３２０がオフロードを要求し、オフロードが、ＩＰＳｅｃを要するポリシーを有すると、始まることが可能である。これが生じると、オフロード要求は、ＩＰＳｅｃモジュール１３２８に渡される（線１３５０）。ＩＰＳｅｃモジュール１３２８は、ＳＡオフロードブロック（一実施形態では、１つのＳＡから３つのＳＡまでに関する状態を含む）に関連する状態をパッケージアップ（package up）して、その状態をネットワークレイヤ１３２２に送る（線１３５２）。オフロード状態のスナップショットがとられた後、関連するＳＡ上で送信される、またはＳＡ上で受信されるあらゆるパケットは、オフロード要求が完了するまで、バッファリングされる。１つまたは複数のＳＡオフロードブロックが、単一の呼び出しにおいてオフロードされることが可能である。ネットワークレイヤが、各ネットワーク状態オブジェクトに関して、ネットワークレイヤの状態をパッケージし（前述）、ネットワークレイヤの状態をＩＰＳｅｃ状態に追加して、ＩＰＳｅｃモジュールおよびネットワークレイヤに関する結合された状態をフレーミングレイヤに送る（線１３５４）。フレーミングレイヤは、各フレーミング状態オブジェクトに関して、フレーミングレイヤの状態をパッケージし、フレーミングレイヤの状態を結合された状態に追加して、その結合された状態をＮＤＩＳ１３２６に送る（線１３５６）。ＮＤＩＳは、それらの状態のオフロードブロックリスト（図１２参照）をミニポート１３３０に渡す（線１３５８）。ミニポート１３３０は、状態を調べて、ミニポート１３３０が、オフロード要求を承諾することができるかどうかを判定する。オフロードブロックリストに関して前述した評価規則が適用される（すなわち、エラーコードが配置される場合、リソースの深さ優先の満足化（depth first satisfaction）など）。これには、オフロードされることが成功した各オフロードブロックデータに対するオフロードハンドルの割り当てが含まれる。
【０１４０】
オフロード目標（すなわち、ミニポート１３３０）は、オフロードを受け入れる場合、その要求に関する完了ルーチンを呼び出す。オフロードは、ＳＡオフロードブロックが、有効期限がもうすぐ切れるＳＡを含む場合、試みられないことに留意されたい。完了ルーチンは、オフロード目標が、状態を完全にキャプチャ済みであり、いつでも、ＩＰＳｅｃデータを受け取ることを開始して（ＴＣＰチムニを有していても、いなくても）、受け取られたデータをホストスタックに示すことができることを示す。データは、オフロード開始要求が完了する前に、ＩＰＳｅｃレイヤ１３２８に示されることが可能であることに留意されたい。完了コールは、各オフロードブロックに関するオフロードハンドルを戻す（線１３６０）。フレーミングレイヤは、オフロード要求に関する完了を受け取る（線１３６２）。オフロード中に、宛先ＭＡＣアドレスが変わった場合、近隣レイヤは、オフロード更新呼び出しを行い、近隣状態オブジェクトに関するオフロードハンドルを使用して、キャッシュ状態を更新する（線１３６４）。
【０１４１】
ネットワークレイヤは、オフロード要求の完了を受け取る（線１３６６）。パスＭＴＵ（最大転送単位）更新が、最初のオフロード要求から完了までの間に行われた場合、パス状態オブジェクトに対するオフロードハンドルを使用して、オフロード目標に対してオフロード更新コールが行われる（線１３６８）。ＩＰＳｅｃレイヤ１３２８が、オフロード要求に関する完了を受け取る（線１３７０）。ネットワークレイヤは、完了を処理することを終えた後、Ｏｆｆｌｏａｄ  ＢｌｏｃｋＬｉｓｔの中の残りのデータ構造が、ＩＰＳｅｃオフロードが要求されていない場合、ＩＰＳｅｃに渡されるべきか、またはＴＣＰに直接に渡されるべきかを判定しなければならないことに留意されたい。ＩＰＳｅｃキャッシュ状態のいずれも、オフロード要求中に変わることは可能でない。しかし、ＩＰＳｅｃレイヤは、送信データグラムまたは受信データグラムをバッファリングしている可能性がある。この時点で、ＩＰＳｅｃレイヤは、オフロード目標によって戻されたオフロードハンドルを使用するオフロード転送インタフェースを使用して（線１３７２）、あらゆる受信データグラムをＮＩＣに転送する。また、ＩＰＳｅｃレイヤは、オフロード中にポストされた、あらゆる送信データグラムも、オフロード目標に渡す（線１３７４）。
【０１４２】
ＴＣＰレイヤ１３２０が、オフロードを要求した場合、ＴＣＰレイヤ１３２０は、最初のオフロード要求の中に１つまたは複数のＴＣＰオフロードブロックが存在していた場合、オフロード要求の完了を受け取る（線１３７６）。バッファリングされた受信セグメントがオフロード目標に渡されることを要求することが可能な、ＴＣＰチムニ９１６に関する通常の処理が行われるか、あるいはキャッシュ状態が変わった場合、ＯｆｆｌｏａｄＵｐｄａｔｅが行われる。
【０１４３】
オフロード要求が、ＩＰＳｅｃ（例えば、ＴＣＰ）より上位のプロトコルスタックによって開始された場合、ＩＰＳｅｃに関するＢｌｏｃｋＬｉｓｔデータ構造の中のＤｅｐｅｎｄｅｎｔＢｌｏｃｋポインタは、非ＮＵＬＬであることに留意されたい（図１２参照）。ＳＡオフロードブロックが、既にオフロード済みである場合、ＩＰＳｅｃレイヤ１３２８は、単に、ＳＡオフロードブロックに関するミニポートハンドルで、オフロードブロックデータ構造を初期設定する。他のすべてのレイヤ（ＩＰＳｅｃ、パス、および近隣）の処理は、そのままである。このケースに関する機能の重要な違いは、オフロード目標が、オフロード要求をどのように扱うかである。ＩＰＳｅｃレイヤ１３２８は、上位のレイヤに関するオフロード要求を承諾することを選択した場合、完了ルーチンが呼び出されると、状態オブジェクトを宛先とするいずれのトラフィックも、適切なチムニ（すなわち、ＩＰＳｅｃチムニ）を介して、そのレイヤに直接に渡されることを確実にしなければならない。オフロードされない他の接続、または他の上位レイヤのプロトコル（例えば、ＵＤＰ）に関するＩＰＳｅｃチムニデータ転送は、そのままである（すなわち、ＳＡオフロードブロックを使用するデータ転送およびイベントインタフェース（複数）は、機能しつづける）。
【０１４４】
同期に関して、ＩＰＳｅｃレイヤ１３２８は、オフロードが完了するまで、着信データグラムおよび発信データグラムの限られたバッファリングにより、オフロード開始中にＳＡ状態が変わらないことを確実にする。ＩＰＳｅｃレイヤ１３２８は、過度なバッファリングが要求される場合、その時間フレーム中、パケットをドロップすることを選択することが可能である。何らかの追加のオフロード要求（例えば、キャッシュ状態の更新、状態の無効化、上位レイヤのチムニのオフロードなど）が、その特定のＩＰＳｅｃ状態、パス状態、または近隣状態に関して行われ、それらが、既にオフロード済みではない場合、それらの新たなオフロード要求は、現在のオフロード要求が完了するまで、ブロックされる。以上の要件が要求されるのは、オフロード目標が、各オフロードブロックに関するミニポートオフロードハンドルを戻してからでないと、オフロード状態に対するさらなる処理が行われることが可能でないからである。他の接続、パス、ＳＡオフロードブロック、または近隣構造に関するオフロード要求が、並行に行われることが可能であることに留意されたい。
【０１４５】
オフロード目標１３３０は、オフロード開始要求に関する完了を呼び出した直後、オフロード開始要求中に提供されたハンドルを使用して、受信データをＩＰＳｅｃレイヤ１３２８に示すこと開始することができる。これは、ＩＰＳｅｃレイヤ１３２８が、要求の完了ルーチンが呼び出される（また、オフロード目標に関するミニポートハンドルが戻される）前に、着信データを処理するのを始めることができることを意味する。処理には、オフロード開始要求の完了が行われるまでのバッファリングが含まれることが可能である。
【０１４６】
いずれのＩＰＳｅｃ  ＳＡオフロードブロックがオフロードに関して「最良」であるかを選択するためのＩＰＳｅｃオフロードヒューリスティックは、オフロードに対する適合性と併せて、おおむね、いずれのＳＡオフロードブロックが、最も多くのトラフィックを有するかに基づく。ＳＡオフロードブロックがオフロードされないようにする諸条件には、受信／送信ＳＡが、対称的ではないこと、および特定のＳＡに関する転送インタフェースが、過度に使用されていることが含まれる。オフロードの可能性が高くなるようにさせる、またはオフロード目標の中にオフロードされたＳＡオフロードブロックを保つ諸条件には、ＳＡオフロードブロックを経由するトラフィックが大量から、中程度までの量であること、並びにＳＡオフロードブロックが、依存するＴＣＰオフロードブロックを有するかどうかが含まれる。
【０１４７】
生じる可能性がある１つの問題は、有効期限がもうすぐ切れるＳＡを要求する、またはキー更新の最中のＴＣＰオフロード要求が行われる場合である。そのような場合、オフロードは、キー更新が行われている間、許される。キー更新が完了すると、オフロード更新インタフェースを使用して、オフロード目標が更新される。オフロード目標は、ソフト限度およびハード限度を実施し、この場合、ソフト限度には、オフロード開始要求が呼び出された時点で、既に達していることに留意されたい。オフロード目標が、ソフト限度のいずれかを過ぎたＳＡに関するオフロード要求を受け取った場合、オフロード目標は、そのソフト限度に関するイベントを生成してはならない。オフロード目標は、ハード限度を通常どおりに処理しなければならない。
【０１４８】
ＩＰＳｅｃを要求するポリシーに依存するＴＣＰオフロード要求が行われたが、ＩＰＳｅｃ  ＳＡのいずれもまだ、ネゴシエートされていない場合、ＩＰＳｅｃモジュールは、オフロード要求をペンドする（pend）（すなわち、要求を非同期で後の時点に完了させる）か、または適切な理由コードで、その要求を単に認めず、ＴＣＰチムニ９１６が、後の時点で再び試みることができることをチムニ９１６が知るようにすることができる。
【０１４９】
接続は、様々な理由で、ＩＰＳｅｃドライバによってアップロードされることが可能である。それらの理由には、余りにも多くのデータが、ＩＰＳｅｃＯｆｆｌｏａｄＦｏｒｗａｒｄインタフェースを介して、ＩＰＳｅｃレイヤによってオフロード目標に転送されていること、近隣エントリが存在しないこと、パスエントリが存在しないこと、オフロード目標上の媒体切断（この指示は、ＩＰＳｅｃレイヤ１３２８によって直接受け取られて、適切に処理され、このため、オフロード目標は、すべてアップロードの指示（upload all indication）を生成しない）、ホストスタックが、既にオフロードされたＳＡオフロードブロックを追加しよう、または置き換えようと試みて、オフロード目標が、呼び出しに失敗した場合、ポリシー変更、管理制御、および低帯域幅接続（あまりデータが転送されていない）が含まれる。
【０１５０】
ＳＡオフロードブロックのオフロードを終了する（すなわち、ホストスタックにアップロードして戻す）ことができる２つの形が存在する。ミニポートが、アップロードを開始すること、またはホストスタックが、アップロードを開始することが可能である。ホストスタックのアップロード開始は、ＩＰＳｅｃレイヤより上位のレイヤによって、またはＩＰＳｅｃレイヤ自体によって始められることが可能である。
【０１５１】
依存するＴＣＰ状態オブジェクトの参照カウントが０になるまで、特定のＳＡオフロードブロックがアップロードされるのを防止する、オフロードされたＴＣＰ接続（オフロード目標が、ＴＣＰチムニをサポートする場合）が、存在することが可能であることに留意されたい。これは、ＩＰＳｅｃオフロード状態オブジェクトがアップロードされる前に、オフロードされたすべてのＴＣＰ状態オブジェクトがアップロードされることを確実にする。このため、ＩＰＳｅｃチムニとＴＣＰチムニをともにサポートするオフロード目標は、ＴＣＰ「Ｕｐｌｏａｄ  Ａｌｌ」を前もって実行することなしには、ＩＰＳｅｃ「Ｕｐｌｏａｄ  Ａｌｌ」を実行することができない（すなわち、オフロード目標は、ＩＰＳｅｃチムニに「Ｕｐｌｏａｄ  Ａｌｌ」を要求する前に、ＴＣＰチムニに対して「Ｕｐｌｏａｄ  Ａｌｌ」を実行して、すべての状態がアップロードされることを確実にしなければならない）。
【０１５２】
一実施形態では、サポートされる唯一のアップロードは、ホストスタックが、アップロードを実行するのに相当な時間を要する可能性がある「レイジー（lazy）アップロード」である。この最適化は、ＩＰＳｅｃレイヤが、状態オブジェクトをオフロードしたすべての上位レイヤのチムニを把握しておかなくてもいいように行われる。オフロード目標が、必須のアップロードを生じさせることができ、オフロードされたＳＡオフロードブロックに依存する多くの上位レイヤのチムニオブジェクトが存在していた場合、ＳＡオフロードブロックをアップロードすることができるにはまず、上位レイヤのチムニのすべてが、それらのチムニの状態をまず、アップロードしなければならないか、またはオフロード目標が、データ転送の途中にＩＰＳｅｃ状態がアップロードされる（無効にされるだけでなく）、上位レイヤのチムニに対処することができなければならない。追跡される必要があるホストネットワークスタック状態は、ＳＡオフロードブロックごとに非常に大量である可能性があり、オフロードされたＳＡオフロードブロックの数に応じて拡大縮小する。例えば、ＳＡオフロードブロック当たり、１０００００のＴＣＰ接続が存在し、多くのＳＡオフロードブロックが存在していた場合、これにより、いずれのＴＣＰ接続がアップロードされる必要があるかを見分けることができるのに、莫大な量の状態が、ホストスタックによって格納され、追跡されることが生じさせられる。本発明の実施形態は、代わりに、ＩＰＳｅｃ状態オブジェクトに「アップロード要求済み（upload requested）」というマークを付ける。次に、周期タイマが始動して、上位レイヤのチムニの中のオフロードされた状態を再評価する。タイマは、オフロードされた接続を「順に進み（walk）」、アップロードを要求した依存するＩＰＳｅｃ状態オブジェクトが存在するかどうかを調べる。アップロードが要求されている場合、上位レイヤのチムニは、そのチムニの状態をアップロードする。ＩＰＳｅｃ状態オブジェクトの参照カウントが０になると、ＩＰＳｅｃ状態オブジェクトもアップロードされる。このため、オフロード目標は、実際のアップロードを待つ間、ＳＡオフロードブロックを介してデータを転送することを続けなければならない。全部のＳＡのアップロードは、カードリセット、電力状態変化（すなわち、電力状態が、オフロードされた状態をオフロード目標が保持するのを許さないレベルに変化している）、異なるオフロード目標への「チームにされた（teamed）」ＮＩＣ上のフェイルオーバイベント、あるいはオフロードされたすべてのＳＡがアップロードされることを要求するオフロードリソースの管理上の再割り当てを含め、いくつかの理由で要求される可能性がある。
【０１５３】
図１４ａ〜図１４ｂを参照すると、オフロード終了（Terminate Offload）に関する呼び出しシーケンスが示されている。オフロード目標は、オプションとして、オフロードの終了を要求することができ（図１４ａ）、あるいはＩＰＳｅｃレイヤより上位のレイヤ（例えば、ＴＣＰ）が、それらの状態の終了を要求することができる。ＳＡオフロードブロック参照カウント（以下に説明する）が、０になった場合、ＳＡオフロードブロックは終了されることが可能である。要求がどこを送信元としているかに関わらず、オフロード終了（Terminate Offload）コマンドを実際に実行するのはＩＰＳｅｃレイヤである。
【０１５４】
図１４ａは、オフロード目標がオフロードの終了を要求するのに行われるステップを示す。ミニポート１３３０が、以上のセクションに列挙した理由の任意の１つまたは複数のために、ＳＡオフロードブロック（１つから３つまでのＳＡを含む）をアップロードすることを決める。ミニポートは、ＳＡオフロードブロックハンドルおよび理由コードを指定することにより、オフロード終了要求を示す（線１４００）。オフロード目標は、オフロード終了要求が処理されている間に、データグラム送信要求およびデータグラム受信要求を処理することを続けなければならない。ＮＤＩＳは、ＩＰＳｅｃに関する、事前登録されたアップロード指示ハンドラを、そのＳＡオフロードブロックに関するＩＰＳｅｃコンテキストをとともに使用し、アップロード指示をＩＰＳｅｃレイヤ１３２８に送る（線１４０２）。ＩＰＳｅｃレイヤは、アップロード指示を獲得し、その要求を完了させる（線１４０４）。アップロード要求理由、並びにＳＡオフロードブロックに関する、依存するＴＣＰオフロード状態オブジェクトが存在するかどうかに依存して、ＩＰＳｅｃレイヤは、オフロード終了要求を開始すること、またはその要求を開始しないと決めることができる。
【０１５５】
次に、図１４ｂを参照すると、ＩＰＳｅｃレイヤ１３２８が、ＳＡオフロードブロックに関して、レイヤ１３２８が有するパスハンドルを使用して、ネットワークレイヤに関するオフロード終了を呼び出す（線１４１０）。ＩＰＳｅｃレイヤは、そのＳＡオフロードブロックに関して呼び出される、さらなる呼び出し（例えば、更新要求、送信要求、またはさらなる終了要求）が全くないことを確実にする。ネットワークレイヤ１３２２は、そのパスに関する参照カウントが１である（すなわち、オフロード終了要求が、値を０に低下させる）場合、レイヤ１３２２のＯｆｆｌｏａｄＢｌｏｃｋ（オフロードハンドルだけから成る）をブロックリストに追加する。ネットワークレイヤ１３２２は、ハンドルを追加するか否かに関わらず、次に、適切な近隣ハンドルを使用して、下位のフレーミングレイヤ１３２４に呼び出しを行う（線１４１２）。ネットワークレイヤが、オフロードを要求した場合、フレーミングレイヤ１３２４は、ネットワークレイヤ１３２２と同一のステップに従う。フレーミングレイヤは、オフロードを要求するかどうかに関わらず、ＮＤＩＳを呼び出す（線１４１４）。ＮＤＩＳは、ブロックリストを使用して、ミニポートを呼び出す（線１４１６）。オフロード目標１３３０は、ＳＡ状態をパッケージアップして、ＳＡ状態をホストプロトコルスタックに戻す。オフロード目標１３３０は、状態に自己矛盾がないことを確実にしなければならない。ミニポート１３３０は、ＯｆｆｌｏａｄＢｌｏｃｋＬｉｓｔの中の有効なハンドル（ＴＣＰエントリ、パスエントリ、および近隣エントリ）に関連する、あらゆる状態／リソースを解放しなければならない。
【０１５６】
ミニポートが、オフロード終了要求を完了させる（線１４２０）。完了前に、ミニポートは、ＵＰＬＯＡＤ＿ＩＮ＿ＰＲＯＧＲＥＳＳ呼び出し（例えば、ＯｆｆｌｏａｄＳｅｎｄ、ＯｆｆｌｏａｄＵｐｄａｔｅなど）を使用して、ＳＡオフロードブロックに関するすべての未処理の要求を完了させなければならず、ＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅ呼び出しが完了するのを待たなければならない。ミニポートは、終了要求に関する完了インタフェースを呼び出した直後に、関連する状態を自由に再使用する。状態が、ホストプロトコルレイヤ（例えば、ネットワークレイヤ９０２）に返されると、アップロードされたＳＡオフロードブロックの中に入っていたＳＡに関して受け取られたすべてのデータグラムが、慣用のＮＤＩＳインタフェースを介して送られなければならない。要求完了は、スタックを浸透して上に進み（percolate up）、各レイヤにおけるオフロードされた状態が、復元される（線１４２２、１４２４、１４２６）。
【０１５７】
ＩＰＳｅｃチムニ９２２は、ＳＡに関してオフロードされたＴＣＰ状態オブジェクトが存在する場合、オフロードの即時終了をサポートしない。代わりに、レイジーな（lazy）アプローチが採用される。ＩＰＳｅｃ状態オブジェクトは、すべての依存するＴＣＰ状態オブジェクトが終了されるのをＩＰＳｅｃレイヤ１３２８が待つ間に、無効にされる。定期的に、ＴＣＰスタック１３２０が、配置されているフィルタ（複数）が、依然、適切であることを再検証する。フィルタ（複数）が適切ではない場合、ＴＣＰは、ＴＣＰ状態オブジェクトのオフロードを終了する。すべてのＴＣＰ状態オブジェクトが終了されると、ＩＰＳｅｃレイヤ１３２８は、ＳＡオフロードブロックのオフロードを終了する。
【０１５８】
前に示した通り、ＩＰＳｅｃレイヤ１３２８は、ＳＡオフロードブロック参照カウントを保つ。その理由は、オフロード目標が、ＴＣＰチムニ、およびその他のタイプのチムニをサポートする場合、そのレイヤが、そのレイヤの状態オブジェクトに関するオフロードの終了を要求することが可能なことである。ＩＰＳｅｃは、ＳＡオフロードブロックごとに参照カウント（すなわち、ＳＡオフロードブロック参照カウント）を保つ。依存する状態オブジェクトに関する新たなオフロード要求ごとに、ＩＰＳｅｃは、参照カウントをインクリメントする。依存する状態オブジェクトの終了ごとに、ＩＰＳｅｃは、参照カウントをデクリメントする。単一の参照カウントを有することは、ＩＰＳｅｃレイヤ自体が、オフロードを開始したかどうかに応え（address）ないことに留意されたい。単一の参照カウントを有することは、ＩＰＳｅｃレイヤが、すべての依存するブロックがアップロードされた際に、アップロードを所望することを必ずしも意味しない。また、ＩＰＳｅｃ自体が、オフロードを要求した場合に、単に参照カウントをインクリメントすることも、それを意味しない。というのは、ＩＰＳｅｃは、上位のレイヤによってインクリメントされた参照カウント、または参照カウント自体が参照カウントをインクリメントしたかどうかの間の違いを見分けることができないからである。そのようなシナリオを扱うため、ＩＰＳｅｃが、ＳＡオフロードブロックに、ＩＰＳｅｃが開始したオフロードとしてマークを付けて、制御を保持するようにする。
【０１５９】
ネットワークスタック（例えば、ネットワークスタック９０２）は、オフロード終了の最中のＳＡオフロードブロックに関するＩＰＳｅｃデータグラムを受け取ることができることに留意されたい。これは、オフロード目標が、終了イベントに応答して、オフロード目標の委任状態をパッケージアップして、終了されたＳＡの１つに関して、ＩＰＳｅｃデータグラムが着信した場合に、行われることが可能である。オフロード目標は、慣用のＮＤＩＳパスを介して、それらをホストスタックにまで上に転送する。というのは、オフロード目標は、委任状態がパッケージされた後、着信データグラムを処理することができないからである。ＩＰＳｅｃレイヤが、完了メッセージをまだ受け取っていない場合、ＩＰＳｅｃレイヤは、オフロード終了完了メッセージが受け取られるまで、受け取られたデータグラムをバッファリングし、その後、データグラムを通常どおり処理する。データ転送インタフェースは、部分的に処理されたデータグラムが、ＩＰオプション／拡張ヘッダ処理のために、オフロード目標からホストに送られることを可能にすることに留意されたい。アップロードが、その処理の最中に行われた場合、ホストスタックは、単にその処理を引き継ぐ。
【０１６０】
前述した通り、ＩＰＳｅｃチムニ９２２は、データ転送に関して２つのモードをサポートする。１つのモードは、ＩＰＳｅｃレイヤ９２２が、チムニの最上端（top edge）であり、すべてのデータ転送が、データグラムの単位で行われる場合である。他方のモードは、ＩＰＳｅｃチムニが、別のチムニ（例えば、ＴＣＰチムニ９１６）に埋め込まれる場合である。両方のモデルとも、同時の有効にされることが可能であることに留意されたい（図１０参照）。ＩＰＳｅｃチムニとオフロード目標の間のデータ転送は、いくつかの理由で行われることが可能である。それらの理由には、以下が含まれる。すなわち、オフロードされたＳＡ以外（non-offloaded SA）での送信および受信に関する従来のソフトウェアスタックの使用、ＩＰＳｅｃレイヤが、オフロード目標に適用されるＳＡがオフロードされている場合に、オフロード目標にＩＰデータグラムを直接に送ること、ＩＰＳｅｃレイヤが、オフロードされているＳＡを宛先とするＩＰＳｅｃデータグラムを受け取り、そのＩＰＳｅｃデータグラムを、処理のためにオフロード目標に転送すること、オフロード目標が、オフロードされたＳＡを使用するデータグラムを受け取り、そのデータグラムに関して、オフロードされたより高いレベルのチムニが全く存在せず、オフロード目標が、復号化された／認証されたペイロードをＩＰＳｅｃレイヤに送ることである。
【０１６１】
動作中、上位レイヤのプロトコル（例えば、ＵＤＰまたはＴＣＰ）は、伝送すべきフォーマット済みのデータグラムをＩＰＳｅｃに渡す。非同期インタフェースが、ＳＡオフロードブロックに関するミニポートオフロードハンドルとともに、バッファリストをオフロード目標に渡すのに使用される。オフロード目標は、バッファリストが再使用されることが可能になると（すなわち、伝送が完了すると）、非同期要求を完了させる。前に示した通り、データグラムを含め、メッセージおよびデータを転送するのに、バッファが使用される。オフロード目標への送信バッファのポストは、ＩＰｖ４オプション処理およびＩＰｖ６拡張ヘッダ処理の注意（caveat）を伴って、単純明快である。ＩＰｖ６拡張ヘッダまたはＩＰＶ４オプションを送ることは、保たれる必要がある。というのは、いずれのアプリケーショントラフィックも、ＩＰＶ６拡張ヘッダまたはＩＰｖ４オプションを送ることを要求される可能性があるからである。ＩＰＳｅｃ  ＩＰｖ６の伝送のため、ホストプロトコルスタックは、ＩＰｖ６拡張ヘッダを作成し、それらのヘッダが、発信データグラムの一部として伝送されるように、それらのヘッダをオフロード目標にＯｆｆｌｏａｄＳｅｎｄの一部として送る。最大限の柔軟性のため、２つのポインタが、ＯｆｆｌｏａｄＳｅｎｄの中に含められる。すなわち、ＩＰＳｅｃ拡張ヘッダの前に挿入されるべきＩＰｖ６拡張ヘッダに対するポインタ（ＡＨのために１つ、ＥＳＰのために１つの、２つが存在することが可能であることに留意されたい）、およびＩＰＳｅｃ拡張ヘッダの後に挿入されるべきＩＰｖ６拡張ヘッダに対する別のポインタである。ＩＰＳｅｃ  ＩＰｖ４データグラムの伝送の場合、ホストプロトコルスタックは、ＩＰｖ４オプションヘッダを作成し、それらのヘッダが、発信データグラムの一部として伝送されるように、それらのヘッダをオフロード目標にＯｆｆｌｏａｄＳｅｎｄの一部として送る。発信データグラムの中に挿入されるべきＩＰｖ４オプションヘッダをポイントする単一のポインタが、ＯｆｆｌｏａｄＳｅｎｄの中で使用される。オフロード目標が、ＩＰフラグメンテーションをサポートする場合、ＩＰオプション／拡張ヘッダは、すべてのパケットの中でレプリケートされなければならない。すべてのトランスポートヘッダが、データグラムの中に既に配置済みであるため、順序正しい伝送は、厳密に要求されないことに留意されたい。しかし、上位レイヤのプロトコルが、最大限のパフォーマンスを保証するように、順序正しい伝送が、強く推奨される。
【０１６２】
ＩＰｖ６拡張ヘッダが、オフロード目標において、受信されたデータグラム上に存在し、最初のヘッダがＩＰＳｅｃではない場合、オフロード目標は、そのデータグラムをホストスタックまで、従来のデータパスを上に行くように転送しなければならない。ホストスタック９０２は、ＩＰＳｅｃヘッダが見つかるまで、拡張ヘッダを処理し、次に、データグラムをＩＰＳｅｃモジュール９２２に転送し、モジュール９２２は、ＩＰＳｅｃ  ＯｆｆｌｏａｄＦｏｒｗａｒｄインタフェースを使用して、すべてのＩＰ拡張ヘッダをそのままにして、データグラムをオフロード目標９０４まで下に送る。次に、オフロード目標は、ＩＰＳｅｃに関するＩＰＳｅｃ拡張ヘッダ処理を実行する。ＡＨが有効にされている場合、すべてのＩＰＳｅｃ拡張ヘッダが、データグラム検証（すなわち、不変のフィールド、および可変のフィールドに対するハッシュ）を可能にするように存在しなければならない。オフロード目標が終了した際、ＩＰｖ６拡張ヘッダがそれ以上、残っていない場合、オフロード目標は、完全なＩＰヘッダ、または部分的なＩＰヘッダを含むパケットフォーマットで、ＩＰＳｅｃＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅを呼び出す。さらなるＩＰｖ６拡張ヘッダが存在している場合（ＩＰＳｅｃ拡張ヘッダの後に）、オフロード目標は、未処理の拡張ヘッダ、およびアプリケーションペイロード（復号化された／認証された）を含むパケットフォーマットで、ＩＰＳｅｃＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅを呼び出す。
【０１６３】
最初の拡張ヘッダがＩＰｖ６であった場合、オフロード目標は、非ＩＰＳｅｃ拡張ヘッダが見つかるまで、またはＵＬＰヘッダが見つかるまで、そのＩＰｖ６ヘッダを処理する。非ＩＰＳｅｃ拡張ヘッダが見つかった場合、オフロード目標は、完全なＩＰヘッダ、復号化された／認証されたＵＬＰペイロード、および次のＩＰｖ６拡張ヘッダに対するオフセットを含むパケットフォーマットで、ＩＰＳｅｃＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅを呼び出す。
【０１６４】
ＩＰｖ４オプションが、受信上で存在する場合、オフロード目標は、受信されたデータグラムを、慣用のＮＩＣインタフェースを介してホストスタック９０２にまで上に行くように転送しなければならない。ホストスタックは、それらのオプションを処理し、データグラムを、処理のためにＩＰＳｅｃモジュール９２２に送り、ＩＰＳｅｃモジュール９２２が、データグラムを、すべてのオプションが存在する形で、ＩＰＳｅｃＯｆｆｌｏａｄＦｏｒｗａｒｄインタフェースを介してオフロード目標９０４に転送する。オフロード目標は、転送されたパケットに対してＩＰｖ４オプション処理は全く行わず、ＡＨが有効にされている場合だけ、ＩＰオプションを使用する（すなわち、オフロード目標は、ＡＨハッシュのため、またはＥＳＰに関するＩＰＳｅｃヘッダを見つけるために、ＩＰｖ４オプションを、つまり、可変対不変を解析することができなければならない）。ＩＰＳｅｃオプションを処理した後、ＩＰヘッダおよびＵＬＰ復号化済み／認証済みペイロードが、処理されていないＩＰオプション（すなわち、ＩＰＳｅｃヘッダの後に存在している場合）に対するオフセットとともに、ホストスタックに送り返される。
【０１６５】
ＩＰＳｅｃチムニは、上位レイヤプロトコルがＴＣＰではない場合、オフロード目標が、ＩＰフラグメントを生成するようにさせる可能性がある。例えば、ＴＣＰは、パスＭＴＵが変わると、パスＭＴＵに適合するように送信バッファを再セグメント化するが、ＵＤＰは、そうすることをしない。このため、オフロード目標は、送信パスを介するデータグラムサイズが、パスＭＴＵを超えた場合、ＩＰｖ４フラグメントを生成することができなければならない。ＩＰＳｅｃデータグラムの受信に関して、ＩＰＳｅｃフラグメント（ＩＰｖ４またはＩＰｖ６）は、次のヘッダがＩＰＳｅｃヘッダ（ＩＰｖ４）である場合、または拡張ヘッダが、ＩＰＳｅｃ拡張ヘッダ（ＩＰｖ６）を含む場合、オフロード目標によって扱われなければならない。しかし、オフロード目標は、限られた量のバッファリングを有するため、データグラムが着信し、利用可能なＩＰデフラグバッファ空間が存在しない場合、オフロード目標は、そのパケットをドロップしてはならない。代わりに、オフロード目標は、そのパケットを、慣用のＮＩＣデータパスを上に行くように送らなければならない（送ろうと試みなければならない）。さらに、オフロード目標は、慣用のパスを上に行くように送られたデータグラムと同一のフラグメントＩＤを有する、既にデフラグバッファの中に入っている、または後に着信するすべてのフラグメントを、データグラムが慣用のパスを上に行くように送信された後、インターネットパケット存続期間（通常、１２０秒間）にわたって、転送しなければならない。ホストスタックに転送されたＩＰフラグメントＩＤを追跡する余裕が、オフロード目標になくなった場合、オフロード目標は、すべてのフラグメントをホストスタックに転送しなければならない。ホストスタックに送られたＩＰフラグメントを追跡することに関連する状態は、重要であるため、デフラグのサポートは、オプションであることに留意されたい。
【０１６６】
オフロード目標は、ポストされることが可能な送信要求の数に全く制限を課してはならない。オフロード目標が、オフロード目標にポストされる送信要求を扱うのに要求されるメモリを有さない場合、オフロード目標は、ソフトウェアでバッファを管理する必要がある。バッファがポストされ、有効な送信ＳＡが全く存在しない（例えば、初めから送信ＳＡが存在しない、または送信ＳＡが、オフロード更新呼び出しを介して削除された）場合、オフロード目標は、エラーを戻し、バッファを伝送しない。バッファがポストされ、送信ＳＡが無効にされている場合、バッファは、ドロップされなければならず、呼び出しは、エラーで完了しなければならない。
【０１６７】
ＩＰＳｅｃモジュール９２２は、単一のＳＡオフロードブロックを使用する複数の上位レイヤを有することが可能であることに留意されたい。その結果、オフロード目標にバッファを事前ポストする機構は、全く存在しない。というのは、そのような機構は、上位レイヤプロトコル状態が、受信バッファに埋め込まれることを要するからである。したがって、指示インタフェースだけが、ＩＰＳｅｃチムニ９２２のために使用され、オフロード目標は、完全なデータグラムが受信され、処理されるまで、オフロード目標がペイロードを格納するのに使用する、バッファのプールを有する。完全なデータグラムが、受信され、処理されると（すなわち、復号化され／認証される）、オフロード目標は、データグラムをＩＰＳｅｃレイヤ９２２に直接に示す。オフロード目標は、表１の中の情報をホストスタックに示す。
【０１６８】
【表２】
2006191537.tif 000004
【０１６９】
ＩＰＳｅｃデータグラムが、受信のオフロードされたＳＡと合致しない（例えば、ＳＡが、存在しないか、またはオフロード更新インタフェースを介して削除されている）ＳＰＩを有する宛先ＩＰアドレスに対して受信された場合、オフロード目標は、受信されたデータグラムを、ネットワークスタックを上に行くように転送しなければならない。
【０１７０】
受信されたデータグラムのＩＰＳｅｃ処理が、失敗してエラーになった場合、適切な統計がインクリメントされなければならず、パケット内容は、インタフェース上のＥｎａｂｌｅＳｅｃｕｒｉｔｙＡｕｄｉｔフラグが設定されており、オフロードされたＳＡと合致するＳＰＩが見つかった場合、ホストに転送される。パケット内容は、ＩＰＳｅｃＲｅｃｅｉｖｅＩｎｄｉｃａｔｅ呼び出しを使用して、ホストに転送される。オフロードされたＳＡに対するＳＰＩを見つけることができない場合、ＩＰＳｅｃオフロード目標によってエラーが見出された場合でも、オフロード目標は、そのエラーを処理してはならず、代わりに、着信データグラムを、慣用の受信パスを上に行くように送らなければならないことに留意されたい。受信されたデータグラムが、ＭＡＣレイヤのブロードキャストアドレスまたはマルチキャストアドレスを含み、ＳＰＩ／ネットワークレイヤアドレスが、オフロードされたＳＡオフロードブロックと合致する場合、オフロード目標は、インタフェースＥｎａｂｌｅＳｅｃｕｒｉｔｙＡｕｄｉｔフラグが設定されていない限り、そのパケットをドロップし、統計をインクリメントしなければならない。ＥｎａｂｌｅＳｅｃｕｒｉｔｙＡｕｄｉｔフラグが設定されている場合、データグラムは、処理されず、ＩＰＳｅｃチムニインタフェースを介して、ホストネットワークスタックに転送される。
【０１７１】
ＩＰＳｅｃレイヤは、いくつかの理由で、ＩＰＳｅｃデータグラムを含むパケットをオフロード目標に転送することに留意されたい。それらの理由には、データグラムがＳＡオフロードブロックが送られたインタフェースとは異なるインタフェース上で着信したこと、データグラムがＩＰｖ４またはＩＰｖ６のオプション／拡張ヘッダを含み、このため、慣用のＮＩＣインタフェースを介するパスレイヤ処理のために、オフロード目標によってホストスタックを上に行くように送られたこと、オフロード開始プロセス中の競合状態、およびオフロード終了プロセスにおける競合状態が含まれる。転送インタフェースが、ＩＰＳｅｃデータグラムを転送するプロセスにおいて使用される。オフロード目標に対する転送インタフェースは非対称であり、ＳＡオフロードブロックミニポートハンドル、フラグ（認証済み、復号化済み）、ＭＡＣヘッダを含め、受信パケット全体を含むＮｅｔＢｕｆｆｅｒＬｉｓｔ、バッファ内の次の未処理のＩＰオプション／拡張ヘッダ（または、すべてのオプション／拡張ヘッダが処理済みである場合、ペイロード）に対するオフセットを含む目標情報を渡す。ＩＰＳｅｃレイヤは、転送インタフェースを経由する過度なトラフィックを検出した場合、ＳＡオフロードブロックをアップロードすることができる。
【０１７２】
前に示した通り、データ転送の第２のモードは、ＩＰＳｅｃチムニが、別のチムニ９１６、９１８に埋め込まれる場合である。例えば、ＴＣＰチムニが、ＩＰＳｅｃチムニの上に階層化された場合、データ転送は、システム作業負荷に応じて、ＰＳｅｃチムニとＴＣＰチムニの両方を介して、またはＴＣＰチムニだけを介して行われることが可能である。すべてのデータ転送が、より高位のレイヤのチムニを介して行われている場合、ＯｆｆｌｏａｄＳｅｎｄＩＰＳｅｃチムニインタフェースおよびＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅＩＰＳｅｃチムニインタフェース（以下に詳細に説明する）は、使用されない。転送インタフェース、イベント指示インタフェース、オフロード終了インタフェース、およびオフロード無効化インタフェースを含め、他のすべてのインタフェースは、使用される。すべての機能は、どのような上位レベルのチムニが配置されているかに関わらず、それらのインタフェースに関して同一である。前述した通り、アップロードが要求される場合、処理は、「レイジー」である。ＴＣＰスタックは、もはや有効ではない、オフロードされた状態オブジェクトを定期的に間引く（すなわち、オフロード終了を実行する）。ＳＡオフロードブロックに関する参照カウントが、０に達すると、そのＳＡオフロードブロックは、アップロードされる。ＩＰＳｅｃチムニは、オフロード終了が実行されることが可能なように、参照カウントが０に達するのを待っている間、特定のＳＡオフロードブロックに関するＯｆｆｌｏａｄＩｎｖａｌｉｄａｔｅを実行することができることに留意されたい。
【０１７３】
伝送処理は、データ転送が、ＴＣＰチムニを介する場合、単純明快である。送信側で、ＴＣＰチムニは、オフロード目標によってＴＣＰセグメントにスライスされたアプリケーションバッファをポストする。オフロード目標は、ＳＡオフロードブロック内で適切な送信ＳＡを見つけるのに十分な状態（ＩｎｉｔｉａｔｅＯｆｆｌｏａｄ呼び出し中に渡されたＯｆｆｌｏａｄＢｌｏｃｋＬｉｓｔからの）を有する。オフロード目標は、ＳＡによって示される通り、ＩＰＳｅｃ処理を実行し、データグラムを送る。受信側で、ＴＣＰチムニが使用される場合、ＩＰＳｅｃチムニは、着信ＩＰＳｅｃペイロードのＴＣＰ処理の前に、パケットを復号化する必要がある（暗号化が、ＳＡ上で有効にされている場合）。さらに、ＩＰＳｅｃチムニは、ＴＣＰ処理の前にパケットを認証して（有効にされている場合）、ホストスタックと同一の形で、ＴＣＰエラー処理が実行されることを確実にしなければならない（例えば、認証／復号化エラーが生じた場合、ＴＣＰ統計は、全くインクリメントされない）。ＴＣＰ処理が行われる前に、オフロード目標は、着信ＩＰＳｅｃデータグラムが、ＩｎｉｔｉａｔｅＯｆｆｌｏａｄが行われた際にＴＣＰ状態オブジェクトによって参照されたＳＡオフロードブロックを使用して処理されていることを検証しなければならない。ＳＰＩ値は、オフロードの存続期間中に変わり、受信トラフィックに関して特定のＳＡオフロードブロックに関連する、２つまでのＳＰＩ（１つのアクティブと１つのキープアライブ）が存在する可能性があることに留意されたい。
【０１７４】
複数のキープアライブＳＡが存在する場合、ホストスタックは、あらゆる着信データグラムを処理することを担う。ＩＰＳｅｃチムニオフロード目標は、認識されないデータグラム（すなわち、オフロードされていないＳＰＩを含む）を、慣用のＮＩＣインタフェースを介して、処理のためにホストスタックに送るように要求される。ホストスタックは、ＩＰＳｅｃデータグラムを処理し、次に、そのデータグラムをＴＣＰに転送する。次に、ＴＣＰは、そのデータグラムを、ＴＣＰセグメントがセキュリティ処理に合格したことを表明するフラグをとともに、通常の処理のために、ＴＣＰチムニ転送インタフェースを介してオフロード目標に転送する。フラグが要求されるのは、さもなければ、オフロード目標が、クリアテキストエラー（前述した）と、セキュリティ検査に合格した受信セグメントを区別することができないからである。
【０１７５】
前述したＴＣＰチムニアーキテクチャは、アプリケーションの事前ポストされた受信バッファが、オフロード目標に直接にポストされることを可能にする。オフロード目標は、場合により、認証済み／復号化済みのデータをそれらのバッファの中に直接にＤＭＡすることができる（ＴＣＰ処理の後）。このため、ＴＣＰは、ゼロコピーデータ受信をアプリケーションに提供することができる。一実施形態では、ＩＰＳｅｃチムニのコンテキストにおいて、オフロード目標は、事前ポストされたバッファの内容を変更する前に、ペイロードを認証する（有効にされている場合）。
【０１７６】
ＩＰＳｅｃチムニは、ＳＡオフロードブロックがオフロードされている間に、ＳＡオフロードブロックに対する更新を扱う際に、相当な多用性（versatility）をもたらす。多用性の１つの領域が、キー更新の際においてである。キー更新の理由には、ＳＡ存続期間に達したこと（すなわち、ＳＡが有効であることが可能な最大限の時間に達していること）、およびＳＡがキー更新されるべきである（例えば、ソフト限度に達している）ことをオフロード目標が示すことが含まれる。ＳＡオフロードブロックは、キー更新を行うのにアップロードされない。代わりに、すべてのキー更新は、その場で行われる。
【０１７７】
次に、図１５を参照すると、キー更新中、ＩＫＥ（インターネットキー交換）がまず、開始側（initiator）において、新たな受信セキュリティ関連付けを配管（plumb）し、メッセージを応答側（responder）に送る。応答側は、新たな受信セキュリティ関連付け、および新たな送信セキュリティ関連付けを配管する。応答側からの返信は、開始側が、送信セキュリティ関連付けを配管することを可能にする。ＩＰＳｅｃドライバは、新たな受信セキュリティ関連付けを獲得すると即時に、古い受信セキュリティ関連付けを取り除くことはできない。開始側のケースでは、ＩＫＥメッセージが、ピアに到達し、ピアが、そのメッセージを処理して、新たな受信セキュリティ関連付けおよび送信セキュリティ関連付けを配管しなければならない。開始側が、古い受信ＳＡを削除することができるにはまず、飛行中の（in-flight）データのすべてが、処理される必要がある（すなわち、ＩＰＳｅｃによって出力され、応答側ＮＩＣの出力キューの中に依然として入っているか、またはネットワークにおいて「飛行中」である、すべてのパケット）。古いＳＡは、キープアライブＳＡと呼ばれる。
【０１７８】
同様に、応答側は、開始側が、新たな送信ＳＡを配管（plumb）し、古い受信ＳＡ上のすべてのキューに入れられたパケット、および飛行中のパケットを処理してからでないと、応答側の古い受信ＳＡを削除することができない。この機能を提供するのに、キー更新中、いくらかの期間にわたって、２つの受信セキュリティ関連付けを存続させておくことが不可欠である。というのは、ホストは、いずれのＳＡを介して、受信ＩＰＳｅｃパケットが着信する可能性があるかを知らないからである。これを考慮に入れるため、タイマを使用して、新たな送信ＳＡが配管された後、ある時間（例えば、２０秒間、５０秒間、１２０秒間など）にわたって、キープアライブ受信ＳＡが存続させられる。ソフト限度が、キープアライブＳＡに関する設定時間より迅速に有効期限が切れるように設定されている場合、複数のキープアライブＳＡが有効であることが可能であることに留意されたい。一部のインプリメンテーションは、複数のキープアライブＳＡをサポートしない可能性があるものの、本発明は、複数のキープアライブＳＡをサポートする（ただし、前述した通り、１つだけが、オフロードされる）。
【０１７９】
ＳＡの最大存続期間は、ＩＰＳｅｃレイヤによって扱われる（すなわち、オフロード目標ではなく、ＩＰＳｅｃレイヤが、関連するタイマを管理する）。ソフト限度に達した場合、ＳＡキー更新が行われる。ハード限度に達した場合、オフロード更新インタフェースが、適切なＳＡを削除するように呼び出される。ＳＡが、キープアライブＳＡになった場合、ＩＰＳｅｃレイヤは、タイマを保持し、適宜、ＳＡを削除する。これにより、オフロード目標のために１つのタイマ機能しか要求されないことがもたらされる。要求されるタイマ機能は、受信ＳＡアイドル時間である。送信ＳＡアイドル時間などの、他の計時動作に関して、オフロード目標は、タイムスタンプを比較するだけでよい。以上のアプローチは、しばしば、費用のかかる動作である、ハードウェアで処理されるタイマ機能の数を減らすことにより、ＩＰＳｅｃ機能をオフロードすることのハードウェア費用を軽減する。
【０１８０】
オフロード目標が実行する他の比較が、送信ＳＡアイドル時間送信ＳＡ存続期間ハード限度（各パケットに関して比較される）、受信ＳＡ存続期間ハード限度（各パケットに関して比較される）、ソフトおよびハードのバイトカウント限度（各パケットに関して比較される）、並びにソフトおよびハードのパケットカウント限度（各パケットに関して比較される）である。
【０１８１】
ＩＰＳｅｃ機能をオフロードするのに行われる全体的なステップ、およびいくらかのインプリメンテーションの詳細を説明したので、インタフェース（複数）を説明する。ＩＰＳｅｃチムニアーキテクチャは、一部のレイヤ（例えば、近隣レイヤ、パスレイヤ、ＴＣＰレイヤ、およびＩＰＳｅｃレイヤ）に固有の状態オブジェクトハンドルの使用を介して、ＴＣＰチムニに関する既存の呼び出しインタフェース（複数）を活用するように設計されている。対応する完了呼び出しを有する共通な呼び出しは、ＩｎｉｔｉａｔｅＯｆｆｌｏａｄ、ＩｎｉｔｉａｔｅＯｆｆｌｏａｄＣｏｍｐｌｅｔｅ、ＴｅｒｍｉｎａｔｅＯｆｆｌｏａｄ、ＴｅｒｍｉｎａｔｅＯｆｆｌｏａｄＣｏｍｐｌｅｔｅ、ＵｐｄａｔｅＯｆｆｌｏａｄ、ＵｐｄａｔｅＯｆｆｌｏａｄＣｏｍｐｌｅｔｅ、ＱｕｅｒｙＯｆｆｌｏａｄ、およびＱｕｅｒｙＯｆｆｌｏａｄＣｏｍｐｌｅｔｅである。ＩｎｉｔｉａｔｅＯｆｆｌｏａｄは、オフロードを開始するのに使用される。ＴｅｒｍｉｎａｔｅＯｆｆｌｏａｄは、オフロードブロックを終了するのに使用される。前述したＵｐｄａｔｅＯｆｆｌｏａｄは、ＩＰＳｅｃオフロードブロックが、変数を更新し、かつ／または１つまたは複数のセキュリティ関連付けを追加する、削除する、または置き換えるのに使用される。ＱｕｅｒｙＯｆｆｌｏａｄは、委任変数に関して、オフロードされたブロックにクエリを行うのに使用される。
【０１８２】
ＴＣＰチムニと共通でないインタフェース（複数）には、ＩＰＳｅｃＯｆｆｌｏａｄＴａｒｇｅｔＥｖｅｎｔインタフェースおよびデータ転送インタフェース（複数）が含まれる。
【０１８３】
ＩｎｉｔｉａｔｅＯｆｆｌｏａｄインタフェースは、ＳＡオフロードブロックと呼ばれる新たなタイプのオフロードブロックを提供する。ミニポートは、オフロードされた状態を参照するのにホストスタックが使用するＳＡオフロードブロックハンドルを、初期オフロード中に作成する。ＳＡオフロードブロックは、１つまたは複数のＳＡを、送信ＳＡ、受信ＳＡ、およびキープアライブＳＡの任意の組み合わせで含むことが可能である。ＩｎｉｔｉａｔｅＯｆｆｌｏａｄインタフェースは、最低限、以下の状態オフロードをサポートする。すなわち、１つの受信ＳＡと１つの送信ＳＡ、２つの受信ＳＡ（１つは、キープアライブＳＡ）と１つの送信ＳＡ、１つの受信ＳＡ、および１つの送信ＳＡである。
【０１８４】
ＯｆｆｌｏａｄＵｐｄａｔｅインタフェースは、ＳＡオフロードブロック内の特定のＳＡ（複数）が操作されることを可能にする。オフロード目標ハンドル、受信／送信ＳＡに関するフラグ、およびＳＰＩの組み合わせを使用して、ＳＡブロック内の特定のＳＡが選択される（前述した通り、技術的に、ＳＰＩは、特定のＩＰアドレスに関してだけ一意であるが、厳密に１つの送信ＳＡが存在し、２つの受信ＳＡが存在する場合、それらのＳＡはともに、同一のＩＰアドレスを有し、このため、ＩＰアドレスは、必要とされない）。ＩｎｉｔｉａｔｅＯｆｆｌｏａｄインタフェースは、現在、有効であれば、どのようなＳＡでもオフロードすることができ（一実施形態では、単一のキープアライブＳＡがサポートされるという制限を伴って）、次に、ＯｆｆｌｏａｄＵｐｄａｔｅインタフェースを使用して、追加のＳＡが配管される（例えば、ＳＡが、キープアライブ状態に移され、新たなＳＡが配管される）、上書きされる（いくつかの条件下の送信ＳＡまたは受信キープアライブＳＡ）、または削除されるにつれ、オフロードされた状態を更新することができる能力を提供する。以上をサポートするのに、インタフェースは、以下の機能をサポートするように単一の呼び出しに結合することができる、Ａｄｄ（ｎｅｗ＿ＳＰＩ）、Ｒｅｐｌａｃｅ（ｏｌｄ＿ＳＰＩ，ｎｅｗ＿ＳＰＩ）、およびＤｅｌｅｔｅ（ｏｌｄ＿ＳＰＩ）に関するセマンティクス（semanitcs）を作成する。すなわち、送信ＳＡを追加する、受信ＳＡを追加する、送信ＳＡを置き換える、受信ＳＡを置き換える、受信ＳＡを追加し、送信ＳＡを置き換える、受信ＳＡを置き換え、送信ＳＡを置き換える、受信ＳＡを削除する、受信ＳＡおよび送信ＳＡを削除する、２つの受信ＳＡ、および１つの送信ＳＡを削除する、並びに送信ＳＡを削除する、である。追加のＳＡが追加され、その新たなＳＡに関して利用可能なハードウェアが不十分である場合、ミニポートは、更新を行わない（fail）ことが可能である。これが生じた場合、ホストスタックは、ＳＡオフロードブロックをアップロードする。
【０１８５】
ＳＡは、以下の理由で削除されることが可能である。すなわち、キープアライブＳＡの有効期限が切れた（受信ＳＡ）、最大ＳＡ存続期間に達した、並びに管理上の理由である。ＵｐｄａｔｅＯｆｆｌｏａｄＤｅｌｅｔｅ操作は、削除操作の中に含まれるＳＡオフロードブロック内の特定のＳＡに適用される。ＵｐｄａｔｅＯｆｆｌｏａｄに関する完了が呼び出されると、オフロード目標は、その特定のＳＡに関連するすべての状態を削除しなければならない。例えば、削除操作が、オフロードされたＳＡの数を３つから２つに変更することが可能であり、次に、ＵｐｄａｔｅＯｆｆｌｏａｄ  Ａｄｄ操作が実行されることが可能である。削除されたＳＡに関するすべての受信処理および送信処理は、あたかもＳＡが全くオフロードされていないかのように、同一である。ＴＣＰチムニオフロードされた接続が、ＩＰＳｅｃチムニＳＡオフロードブロックに依存し、要求される送信ＳＡが削除されている場合、ＴＣＰチムニ接続は、パス状態が無効にされた場合と同様に、データを全く伝送してはならず、エラーを処理してはならない（例えば、送信トラフィックに関して、有効な状態が全く存在しないことをホストスタックに示すとともに、通常のＴＣＰ再伝送タイムアウト処理）。
【０１８６】
新たなアウトバウンドＳＡが、ＯｆｆｌｏａｄＵｐｄａｔｅ  Ｒｅｐｌａｃｅ操作で配管（plumb）されると、オフロード目標は、古い送信ＳＡ状態全体を上書きする（キャッシュ状態および委任状態、つまり、ｃｏｎｓｔ状態は、そのままである）。オフロード目標は、現在、古いＳＡを使用している最中である送信パケットに対する処理を完了させて、特定のデータグラムが、古いＳＡ状態、または新たなＳＡ状態で完全に符号化されるようにする。ＯｆｆｌｏａｄＳｅｎｄ要求は、大量のデータである可能性がある、多くのＩＰＳｅｃデータグラムを含むことが可能であることに留意されたい。そのため、オフロード目標は、ＯｆｆｌｏａｄＳｅｎｄ要求の最中に処理を停止し、オフロード目標が開始しているＩＰＳｅｃデータグラムの符号化を終え、ＯｆｆｌｏａｄＳｅｎｄの残りの部分（およびキューに入れられている他の部分）に関して、新たな送信ＳＡに遷移することができなければならない。新たなＳＡへの遷移が完了すると、ＯｆｆｌｏａｄＵｐｄａｔｅ呼び出しが、完了されることが可能である。ＯｆｆｌｏａｄＵｐｄａｔｅＲｅｐｌａｃｅは、ＡＨおよびＥＳＰ  ＳＰＩを変更することが可能であるとともに、場合により、関連するアルゴリズム、キー、存続期間などを変更することも可能であることに留意されたい。
【０１８７】
一般的なインタフェース、並びにキープアライブタイマ（複数）を保持するホストのため、オフロード目標は、受信ＳＡが、キープアライブ状態にあるか、幼生期の（larval）アクティブな状態にあるか、またはアクティブな状態にあるかを認識していない。その結果、特定の動作（behavior）は、上位のインタフェース（複数）によってサポートされる。動作は、以下の通りである。すなわち、
ＩＰＳｅｃ双方向データ転送のための初期キーイング（ｋｅｙｉｎｇ）、すなわち、
・幼生期のアクティブな受信ＳＡのＩｎｉｔｉａｔｅＯｆｆｌｏａｄ（開始側による）
・送信ＳＡおよび受信ＳＡのＩｎｉｔｉａｔｅＯｆｆｌｏａｄ（応答側による）
・送信ＳＡを追加するＵｐｄａｔｅＯｆｆｌｏａｄ（幼生期のアクティブな受信ＳＡが、ＩｎｉｔｉａｔｅＯｆｆｌｏａｄでオフロードされた後、開始側による）
ＩＰＳｅｃＳＡの第１のキー更新、すなわち、
・新たな受信ＳＡを追加するＵｐｄａｔｅＯｆｆｌｏａｄ（開始側、古い受信ＳＡが、キープアライブＳＡになるが、オフロード目標は、そのことを認識していない）
・新たなＳＡを追加し、古い送信ＳＡを置き換えるＵｐｄａｔｅＯｆｆｌｏａｄ（応答側による）
・送信ＳＡを置き換えるＵｐｄａｔｅＯｆｆｌｏａｄ（開始側）
ＩＰＳｅｃＳＡの第２の（および、さらなる）キー更新、すなわち、
・受信ＳＡを置き換えるＵｐｄａｔｅＯｆｆｌｏａｄ（開始側）
・受信ＳＡを置き換え、古い送信ＳＡを置き換えるＵｐｄａｔｅＯｆｆｌｏａｄ（応答側による）
・送信ＳＡを置き換えるＵｐｄａｔｅＯｆｆｌｏａｄ（開始側）
最後に、キープアライブタイマが始動された後、またはキー更新なしに、ＳＡの存続期間が切れた場合、
・受信ＳＡを削除するＵｐｄａｔｅＯｆｆｌｏａｄ（開始側および応答側）
・受信ＳＡおよび送信ＳＡを削除するＵｐｄａｔｅＯｆｆｌｏａｄ（キープアライブが全く存在しない）
・受信ＳＡおよび送信ＳＡをともに削除するＵｐｄａｔｅＯｆｆｌｏａｄ
追加、置き換え、および削除の組み合わせの複雑さのため、チムニに関して行われるアプローチは、更新が、１つ、２つ、または３つのＳＡを含むことが可能であるようにすることであり、ただし、各ＳＡは、｛追加，削除，置き換え（ａｄｄ，ｄｅｌｅｔｅ，ｒｅｐｌａｃｅ）｝というセットにおいて演算子を有する。オフロード目標に対するインタフェースを単純化するため、オフロードされたＴＣＰ接続が、ＩＰＳｅｃを使用するのを始めることを要求する、新たなＩＰＳｅｃフィルタが配管（plumb）された場合、オフロードされた接続は、アップロードされ、次に、再オフロードされる。ＳＡオフロードブロック内でＳＡを見つけるのに、ＳＡオフロードブロックハンドル、受信／送信ＳＡ、およびＳＰＩの組み合わせを使用することは、ホストスタックが、ＳＡブロック内の個々のＳＡロケーションを管理することを担わないように行われる。ＩＰＳｅｃ  ＳＡオフロードブロックが、複数のキープアライブＳＡを要求する場合、残りのキープアライブＳＡは、ホストソフトウェアスタックによって扱われることが可能である。
【０１８８】
オフロード目標からホストへの指示呼び出しインタフェースを使用して、一般的なイベント（例えば、チムニ（複数）に共通の）、およびＩＰＳｅｃに関する特定のイベントが示される。ＥｖｅｎｔＩｎｄｉｃａｔｅ呼び出しは、一般的なイベントに関して使用される。ＩＰＳｅｃＥｖｅｎｔＩｎｄｉｃａｔｅ呼び出しは、ＩＰＳｅｃに関する特定のイベントに関して使用される。ＳＡ有効期限切れ、またはオフロード目標によって開始されたキー更新により、オフロード目標が、ＩＰＳｅｃＥｖｅｎｔＩｎｄｉｃａｔｅを呼び出して、キー更新を要求するか、または特定のＳＡの有効期限が切れたことをＩＰＳｅｃレイヤに知らせるようにさせられる。ＩＰＳｅｃＥｖｅｎｔＩｎｄｉｃａｔｅは、以下の引数を含む。すなわち、ＳＡオフロードブロックハンドル、ＳＰＩ、ＳＰＩが、受信ＳＡに関するか、送信ＳＡに関するかを指定するフラグ、ＡｃｔｉｏｎＲｅｑｕｅｓｔｅｄ、およびＡｃｔｉｏｎＲｅａｓｏｎである。ＡｃｔｉｏｎＲｅｑｕｅｓｔｅｄ、および関連するＡｃｔｉｏｎＲｅａｓｏｎは、ＲｅＫｅｙＲｅｑｕｅｓｔおよびＳＡＩｎｖａｌｉｄａｔｅｄである。
【０１８９】
ＲｅＫｅｙＲｅｑｕｓｅｔに関連するイベント通知は、ＫｂｙｔｅｓＳｏｆｔＲｅａｃｈｅｄおよびＯｕｔｂｏｕｎｄＰａｃｋｅｔＳｏｆｔＲｅａｃｈｅｄである。ＫｂｙｔｅｓＳｏｆｔＲｅａｃｈｅｄイベントは、転送されたキロバイト数が、ソフト限度閾値に達したことをホストに通知し、ＳＡキー更新プロセスが開始されなければならない。ＯｕｔｂｏｕｎｄＰａｃｋｅｔＳｏｆｔＲｅａｃｈｅｄイベントは、現在に至るまでに送信されたパケット数が、ソフト限度に達したことをホストに通知し、ホストスタックは、キー更新操作を開始しなければならない。
【０１９０】
ＳＡＩｎｖａｌｉｄａｔｅｄイベントは、限度に達したためにＳＡが無効にされた（すなわち、有効期限が切れた）という指示をホストスタックに与える。ＳＡＩｎｖａｌｉｄａｔｅｄイベントには、ＫｂｙｔｅｓＨａｒｄＲｅａｃｈｅｄ、ＯｕｔｂｏｕｎｄＰａｃｋｔＨａｒｄＲｅａｃｈｅｄ、ＩｄｌｅＴｉｍｅＲｅａｃｈｅｄ、およびパケットカウント限度ヒットが含まれる。ＫｂｙｔｅｓＨａｒｄＲｅａｃｈｅｄは、転送されたキロバイト数がハード限度に達したこと、および、ＳＡが無効にされなければならないことを示す。ＯｕｔｂｏｕｎｄＰａｃｋｔＨａｒｄＲｅａｃｈｅｄは、送られたパケットの数がハード限度に達したことを示す。ＩｄｌｅＴｉｍｅＲｅａｃｈｅｄは、ＳＡが指定された時間内にデータを転送していないことを示す。送信ＳＡに関して、検査は、ＩＰＳｅｃデータグラムの試みられた伝送によって駆動される。最後の伝送の時刻が格納され、現在の時刻に対して比較される。それが閾値を超えている場合、オフロード目標は、ホストに通知し、パケットをドロップし、ＳＡに無効としてマークを付ける。この検査は、リモートピアがクラッシュした場合、デッドロックが生じないことを確実にするために要求される。通常のアイドル間隔は２分間である。受信ＳＡに関して、検査は、タイマによって駆動されて、リソースが適時にクリーンアップされることを確実にする。タイマは、特定のＳＡ上でＩＰＳｅｃパケットが受信されると、リセットされる。通常のアイドル間隔は、５分間である。パケットカウント限度ヒットは、パケット達したことを示す。
【０１９１】
データ転送インタフェースは、ＯｆｆｌｏａｄＳｅｎｄ、ＯｆｆｌｏａｄＳｅｎｄＣｏｍｐｌｅｔｅ、およびＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅを含ふ。ＯｆｆｌｏａｄＳｅｎｄおよびＯｆｆｌｏａｄＳｅｎｄＣｏｍｐｌｅｔｅは、ホストスタックが伝送されるべきデータグラムの中に挿入されるＩＰｖ４オプションまたはＩＰｖ６拡張ヘッダを作成できることを前提にする。これには、ＡＨヘッダおよびＥＳＰヘッダの前または後にオプションを挿入することが含まれる。このため、ＯｆｆｌｏａｄＳｅｎｄインタフェースは、前述した通り、ＡＨ／ＥＳＰヘッダの前または後に含められるべきＩＰｖ６拡張ヘッダに対する２つの追加のポインタを含む（代替の実施形態は、第３のポインタがＡＨヘッダとＥＳＰヘッダの中間にオプションを含めることを可能にする）。ＩＰｖ４に関して、インタフェースは、前述した通り、ＩＰｖ４オプションの単一のリストを可能にする。代替の実施形態は、第２のポインタ、または第３のポインタが、ＡＨヘッダとＥＳＰヘッダの前、中間、または後にオプションが存在することを可能にすることができるようにする。ＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅ（ＩＰＳｅｃ受信に関する）は、データが受信されていることを示す。ＯｆｆｌｏａｄＲｅｃｅｉｖｅＩｎｄｉｃａｔｅは、ＳＰＩ、並びにＩＰヘッダとペイロード全体を含み（代替の実施形態は、ＭＡＣヘッダを含む、またはオプションが全く存在しない場合、ＩＰＳｅｃペイロードだけを含むことも可能である）、ＩＰオプション／拡張ヘッダの中の次の未処理のヘッダに対するインデックス、並びに現在まで終了した処理の結果を表明するフラグのセットを伴う。ＡＨヘッダおよび／またはＥＳＰヘッダは、有効なデータを含まなくてもよいことに留意されたい。
【０１９２】
ＱｕｅｒｙＯｆｆｌｏａｄインタフェースは、ホストスタックが、ＳＡのオフロードされた状態のクエリを行うことを可能にする。パラメータは、ＳＡオフロードブロックおよびＯｆｆｌｏａｄＢｌｏｃｋＬｉｓｔである。ＱｕｅｒｙＯｆｆｌｏａｄインタフェースは、通常、ＳＡの委任状態のクエリを行うのに使用される。これは、様々な理由で必要である可能性がある。また、デバッグ中、ＱｕｅｒｙＯｆｆｌｏａｄは、Ｃｏｎｓｔ変数およびＣａｓｈｅｄ変数の状態のクエリを行って、オフロード目標とホストが同期していることを確実にすることもできる。
【０１９３】
ＯｆｆｌｏａｄＩｎｖａｌｉｄａｔｅインタフェースは、ＯｆｆｌｏａｄされたＳＡが無効にされていることをシグナルする。ＳＡオフロードブロック内の特定のＳＡは、オフロード目標が無効化を生じさせたため、またはホストが、ＯｆｆｌｏａｄＩｎｖａｌｉｄａｔｅを呼び出したために、有効期限切れになる（無効になる）可能性がある。無効にされたＳＡは、削除されたＳＡとは異なることに留意されたい。ＳＡの削除は、削除の操作符号を使用して、ＯｆｆｌｏａｄＵｐｄａｔｅインタフェースを介して行われることが可能である。そのケースでは、オフロード目標の中に残されたＳＡに関する状態は、全く存在しない。しかし、ＳＡが無効にされた場合、状態は、ＳＡオフロードブロックのＴｅｒｍｉｎａｔｅＯｆｆｌｏａｄが行われるまで、オフロード目標の中に残る。オフロード終了は、委任状態のすべてが、ホストに転送されて返されることを要求する。ＯｆｆｌｏａｄＩｎｖａｌｉｄａｔｅは、管理上の理由（例えば、ポリシーの変更）で、またはオフロードの終了が要求されたために行われることが可能であるが、依存ＴＣＰ状態オブジェクトｒｅｆカウントは、０ではなく、したがって、オフロードは、まだ終了することができない。ｒｅｆｃｏｕｎｔが０になるのを待つ間、ＳＡは、無効にされる。ＯｆｆｌｏａｄＩｎｖａｌｉｄａｔｅに関する引数は、ミニポートＳＡオフロードハンドルおよびＯｆｆｌｏａｄＢｌｏｃｋＬｉｓｔである。無効にされたＳＡが、送信ＳＡである場合、ＯｆｆｌｏａｄＳｅｎｄに対する呼び出しは、エラーで完了されなければならず、データは、送られない。無効にされたＳＡが、受信ＳＡである場合、受信されたデータグラムは、ドロップされ（インタフェース統計が有効にされていない限り）、適切なエラーカウントがインクリメントされる。
【０１９４】
次に、統計を参照すると、オフロード目標が、統計を保持して、ＳＡオフロードブロックがオフロードされているか否かに関わらず、ホスト統計報告が影響を受けないようにする。ホストプロトコルスタックは、ホストごとの統計、およびＳＡごとの統計を保持する。ＩＰＳｅｃチムニは、ホスト全体の統計のクエリが行われる場合はいつでも、各ＩＰＳｅｃチムニ対応インタフェースに、そのインタフェースのインタフェース統計についてクエリを行う。ＩＰＳｅｃオフロード目標は、パスレイヤに関する、ＴＣＰチムニによって定義された統計、およびデータリンクレイヤ（すなわち、フレーミングレイヤ）に関する通常のＮＤＩＳ統計を保持する。さらに、ＩＰＳｅｃオフロード目標は、ＩＰＳｅｃデータグラムが、オフロード目標によって消費される（すなわち、慣用のデータパスを上に行くように送られない）場合にだけインクリメントされる、以下のＩＰＳｅｃ統計を保持しなければならない。
【０１９５】
インタフェースごとの統計は、３２ビットカウンタおよび６４ビットカウンタを含む。３２ビットカウンタは、ＮｕｍＢａｄＳＰＩＰａｃｋｅｔｓ、ＮｕｍＰａｃｋｅｔｓＮｏｔＤｅｃｒｙｐｔｅｄ、ＮｕｍＰａｃｋｅｔｓＮｏｔＡｕｔｈｅｎｔｉｃａｔｅｄ、およびＮｕｍＰａｃｋｅｔｓＷｉｔｈＲｅｐｌａｙＤｅｔｅｃｔｉｏｎである。６４ビットカウンタは、ＣｏｎｆｉｄｅｎｔｉａｌＢｙｔｅｓＳｅｎｔ、ＣｏｎｆｉｄｅｎｔｉａｌＢｙｔｅｓＲｅｃｅｉｖｅｄ、ＡｕｔｈｅｎｔｉｃａｔｅｄＢｙｔｅｓＳｅｎｔ、ＡｕｔｈｅｎｔｉｃａｔｅｄＢｙｔｅｓＲｅｃｅｉｖｅｄ、ＯｆｆｌｏａｄｅｄＢｙｔｅｓＳｅｎｔ、およびＯｆｆｌｏａｄｅｄＢｙｔｅｓＲｅｃｅｉｖｅｄである。以上のカウンタは、ハードウェアが、必ずしも６４ビットカウンタを実施するのを要求しないことに留意されたい。例えば、ハードウェアは、キャリーアウト（carry-out）が、ホストミニポートに対するイベントである３２ビットカウンタを実施して、上位３２ビットを把握しておくこともできる。全くオフロード目標対話なしに、完全にホストスタックだけによって保持されるインタフェースごとの統計は、ＮｕｍＡｃｔｉｖｅＡｓｓｏｃｉａｔｉｏｎｓ、ＮｕｍＯｆｆｌｏａｄｅｄＳＡｓ、ＮｕｍＰｅｎｄｉｎｇＫｅｙＯｐｓ、ＮｕｍＫｅｙＡｄｄｉｔｉｏｎｓ、ＮｕｍＫｅｙＤｅｌｅｔｉｏｎｓ、ＮｕｍＲｅＫｅｙｓ、ＮｕｍＡｃｔｉｖｅＴｕｎｎｅｌｓ、ＴｒａｎｓｐｏｒｔＢｙｔｅｓＳｅｎｔ、ＴｒａｎｓｐｏｒｔＢｙｔｅｓＲｅｃｅｉｖｅｄ、ＢｙｔｅｓＳｅｎｔＩｎＴｕｎｎｅｌｓ、およびＢｙｔｅｓＲｅｃｅｉｖｅｄＩｎＴｕｎｎｅｌｓである。
【０１９６】
ＳＡごとの統計は、オフロード目標が、いくらかの統計を追跡して、ソフト限度およびハード限度をサポートすることを要求する。同一のインタフェースごとのカウンタは、ＳＡごとに統計クエリを実施するのに使用される。ＯｆｆｌｏａｄＱｕｅｒｙインタフェースは、統計クエリがオフロードされたＳＡに関する場合、特定のＳＡ（複数）に関するＤｅｌｅｇａｔｅｄ状態を取得して、以下の６４ビットカウンタ値を埋めるのに使用される。すなわち、ＣｏｎｆｉｄｅｎｔｉａｌＢｙｔｅｓＳｅｎｔ（送信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＣｏｎｆＢｙｔｅｓを使用する）、ＣｏｎｆｉｄｅｎｔｉａｌＢｙｔｅｓＲｅｃｅｉｖｅｄ（受信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＣｏｎｆＢｙｔｅｓを使用する）、ＡｕｔｈｅｎｔｉｃａｔｅｄＢｙｔｅｓＳｅｎｔ（送信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＡｕｔｈＢｙｔｅｓを使用する）、ＡｕｔｈｅｎｔｉｃａｔｅｄＢｙｔｅｓＲｅｃｅｉｖｅｄ（受信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＡｕｔｈＢｙｔｅｓを使用する）、ＴｏｔａｌＢｙｔｅｓＳｅｎｔ（送信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＢｙｔｅｓを使用する）、ＴｏｔａｌＢｙｔｅｓＲｅｃｅｉｖｅｄ（受信ＳＡに関するＤＥＬＥＧＡＴＥＤパラメータ、ＣｕｒｒｅｎｔＢｙｔｅｓを使用する）、ＯｆｆｌｏａｄｅｄＢｙｔｅｓＳｅｎｔ（ホストスタックは、オフロードが開始されると、ＴｏｔａｌＢｙｔｅｓＳｅｎｔの値を記録する。ＯｆｆｌｏａｄｅｄＢｙｔｅｓＳｅｎｔパラメータが必要とされる場合、ホストプロトコルスタックは、オフロード目標に関するＤＥＬＥＧＡＴＥＤ状態のクエリを行って、ＳＡに関するＣｕｒｒｅｎｔＢｙｔｅｓを見出し、その値から、ＳＡがオフロードされていた際の値を引いた値を戻す）、およびＯｆｆｌｏａｄｅｄＢｙｔｅｓＲｅｃｅｉｖｅｄ（ＯｆｆｌｏａｄｅｄＢｙｔｅｓＳｅｎｔと同一のメソッドであるが、受信ＳＡに適用される）である。
【０１９７】
セキュリティ上の脅威は、益々大きくなっている問題である。本発明は既知の脅威を考慮に入れる。次に、図１６を参照すると、外部の脅威がＴＬＮＰインタフェースより上位に位置するアプリケーションから（おそらく、ユーザモードにおける−カーネルモードコンポーネントは信頼されるコンポーネントである）、またはワイヤ（wire）からシステムに注入されることが可能である。ワイヤソース（wire source）は、４つのデータパスの１つが使用される（exercised）ようにすることが可能である。４つのデータパスは、従来のネットワーキングスタックデータパス、オフロードＮＩＣデータパス、ホストスタックからオフロードＮＩＣへのＩＰＳｅｃ転送インタフェース（異なるインタフェース上でパケットを送信することによる）、およびＩＰＳｅｃエンジンとＴＣＰエンジンの間におけるオプションのオフロード目標内部インタフェース（これは、ＴＣＰチムニが、オフロード目標によってサポートされる場合にだけ可能である）である。また、管理者がオフロードマネージャ優先順位付けを制御することを可能にする特権モードインタフェースも存在する。
【０１９８】
データパスではない内部攻撃ポイントは、以下を行う。すなわち、新たなファームウェアをＮＩＣにロードし（すべてのＮＩＣが、これをサポートするわけではない）、制御パスを使用して（exercise）、オフロードされたＩＰＳｅｃ  ＳＡオフロードブロックの中の状態を更新し、制御パスを使用して、アップロードまたはダウンロードを強制する。
【０１９９】
ＳＡセットアップ／取り外し（teardown）に関係する新たな脅威は、全く存在しない。というのは、ホストプロトコルスタックが、すべてのＳＡセットアップおよびＳＡ取り外しを実行するからである。このため、プロトコルスタックに関する既存のセキュリティ分析は、ＳＡセットアップに当てはまる。ＩＫＥメッセージ、ＩＣＭＰメッセージ、ＡＲＰメッセージ、およびＲＩＰｖ４メッセージなどのすべての制御パケットも、ホストスタックによって処理され、このため、それらのメッセージの処理のためのホストスタックハードニング（hardening）は、そのままに留まる（remain in place）。しかし、ホストスタック状態が更新され、キャッシュされたコピーが、ＮＩＣ上に存在する場合、これは、ＩＰＳｅｃオフロード目標への制御パスが使用されることをもたらす可能性がある。
【０２００】
ホストスタックは、ＳＡ状態が、様々な理由でオフロードされた場合、ＩＰＳｅｃデータグラムを、転送インタフェースを介してＮＩＣに転送することができる。１つの理由は、ＩＰｖ４オプションのためである。データグラムが、ＩＰｖ４オプションを含む場合、データグラムは、ＩＰＳｅｃ処理の前に、ＩＰｖ４オプション処理のために、ホストスタックまで上に行くように転送され、次に、オフロード目標に転送される。別の理由は、ＩＰｖ６拡張ヘッダのためである。データグラムが、ＩＰｖ６オプションを含む場合、データグラムは、ホストスタックまで上に行くように転送される。ＩＰｖ６拡張ヘッダは、順に処理されなければならないので、ホストスタックとオフロード目標の間における複数回の往復（trip）を生じさせる、いくつかの病的なケースが存在する。最悪ケースは、パケットが、ＡＨおよびＥＳＰを使用し、ＡＨヘッダの前、ＡＨヘッダとＥＳＰヘッダの中間、およびＥＳＰヘッダの後にＩＰｖ６拡張ヘッダが存在する場合である。別の理由は、ＩＰフラグメントのためである。オフロード目標は、ＩＰフラグメントの再組み立てを行うことができるが、再組み立てのスペースが尽きた場合、特定のデータグラムに関するすべてのフラグメントを、慣用のホストインタフェースを介して移動させるオプションを有する。これが行われた場合、ホストが、データグラムの再組み立てを行う。再組み立てが行われると、それらが、オフロードされたＳＡを目標とするＩＰＳｅｃパケットである場合、それらは、処理のために、ＩＰＳｅｃオフロード目標に転送される。別の理由は、ＩＰＳｅｃデータグラムが、異なるインタフェースから受け取られ、ホストＩＰＳｅｃスタックによって受け取られることである。別の理由は、オフロードが行われた際に、ＩＰＳｅｃデータグラムが、ホストスタックを上に行く飛行中であった（in flight up）ことである。これは、遷移条件である。
【０２０１】
危険にさらされている資産のリストには、慣用のＮＩＣ（慣用のパスに関するセキュリティ分析の変更が全くない）、オフロードＮＩＣリソース（主にＩＰＳｅｃ  ＳＡオフロードブロック、ＩＰ再組み立てバッファ、ＩＰＳｅｃ送信バッファ（すべてのＮＩＣ上にはない）、およびＣＰＵ（存在する場合））、システム安定度、ＩＰＳｅｃ  ＳＡオフロードブロック状態（資格情報を含む）、パス状態、近隣状態、およびデータ完全性が含まれる。ＩＰＳｅｃチムニは、エラーに起因して、通常は、ドロップされることになる（適切なエラーカウンタをインクリメントした後）受信されたデータグラムをホストスタックに転送するよう、オフロード目標に要求する、「セキュリティ監査」モードをサポートすることに留意されたい。これは、必ずしも、いずれの特定の脅威も軽減することはないが、システム管理者が、システムを攻撃している可能性があるパケットを検査する能力を保持することを確実にする。
【０２０２】
スプーフィング（spoofing）、タンパリング（tampering）、および否認（repudiation）に関して、あるタイプの従来の形態のワイヤ攻撃は適用されない。というのは、ＳＡオフロードブロックは、ＳＡのＩＫＥネゴシエートの後、初めてオフロードされるからである。おそらく、匿名の攻撃、および介入者（man-in-the-middle）攻撃は不可能である（ＩＰＳｅｃ認証アルゴリズムまたはＩＰＳｅｃ暗号化アルゴリズムが破られていないことを前提条件に）。オフロード目標は、ＩＰアドレスが、以下の通りである場合にだけ、着信パケットを処理する。すなわち、ＳＰＩが、オフロードされたＳＡと合致する。相手が、オフロードされたＳＡを攻撃した場合、ハードウェアは、ホストよりもはるかに迅速にパケットをドロップすることができ、このため、システムは、従来のソフトウェアスタックより応答性に優れている。相手が、オフロードされていないＳＡを攻撃する、またはＩＰＳｅｃを使用しない場合、脅威モデルは、既存のソフトウェアスタック脅威モデルと同一である。相手が、ＩＰフラグメント（ｖ４またはｖ６）に対して、スプーフィング、タンパリング、または否認を行おうと試みた場合、転送インタフェースが動作させられることが可能である。正味のＣＰＵ使用量は、依然、ホストスタック単独よりも良好であるものと見込まれる。というのは、ホストスタックは、ハッシュを行い、または復号化を行って、パケットが不良であることを検証しなくてもよいからである。ホストスタックは、単に、パケットの再組み立てを行い、そのパケットをオフロード目標に転送し、オフロード目標が、攻撃するパケットをドロップする（また、カウンタをインクリメントするとともに、場合により、ログ記録が有効にされている場合、そのカウンタをホストに転送する）。
【０２０３】
情報開示に関して、情報開示のための新たな機構の機会は、ほとんど存在しない。というのは、新たなワイヤプロトコルが全く存在せず、ＡＰＩ変更は、特権を有する管理者が、オフロードマネージャ優先順位付けを設定することを可能にするため、並びにＳＡが、現在、オフロードされているかどうかを、任意のアプリケーションが確認できるようにするためだけだからである。関心事は、様々な攻撃を適用して、貴重なＮＩＣリソース（主に、限られた数のオフロードＳＡ）および／またはＣＰＵリソースを消費するように、アップロード／オフロードを強制しようとすることが可能であるかどうかである。攻撃の１つのアプローチは、アップロード／オフロードを生じさせようと試みて、次に、インタフェースにクエリを行って、オフロード／アップロードが成功したかどうかを確認し、その攻撃の形態上に反復する（iterate）ことを続けて、攻撃がよりうまくいくようにすることである。この攻撃がうまくいくには、攻撃者は、ローカルホスト上にいなければならないか、またはリモートロケーションから、ローカルホスト上の統計のクエリを行うことができなければならない。しかし、それはシステム管理者によって検出が可能であり、システム管理者は、ヒューリスティックを適用してサブネット／ホストからのオフロードを無効にするか、またはローカル接続へのオフロードを制限するか、または何らかの組み合わせを行うことができる。
【０２０４】
コードが、オフロードされたＮＩＣ上にロードされることを、リモートノードが生じさせることができる場合（以下により詳細に説明する）、もしかすると、別の形態の情報開示が行われることが可能であるかもしれない。別の問題は、何らかの新たな攻撃が公開されるかどうかである。というのは、キーは、現時点で、オフロード目標の中だけでなく、オペレーティングシステムの中にも入っているからである。このリソースを攻撃する唯一の形は、カーネルが侵害されている（compromised）場合だけである。というのは、ユーザモードからハードウェアにアクセスする機構は、全く存在しないからである。
【０２０５】
ＤｏＳ攻撃に関して、ＩＰＳｅｃチムニに対する攻撃は、認証されていないリモートピア、または感染した認証済みのリモートピアによって行われることが可能である。前述した通り、未知の攻撃者が、オフロードされたＳＡを攻撃しようと試みた場合、システムパフォーマンスは、攻撃するパケットが早期にドロップされることに起因して、実際、攻撃者が、オフロードされていないＳＡを攻撃した場合よりも良好である。リモートノードが攻撃することができる主なリソースは、ＩＰ再組み立てバッファ、オフロードされたＳＡのアップロードを強制すること、オフロードＮＩＣ  ＣＰＵサイクル、ホストＣＰＵサイクル、およびシステム安定性である。
【０２０６】
ＩＰ再組み立てバッファを攻撃することに関して、リモートノードが、ＩＰフラグメントを送信した場合、データグラムを処理し、再組み立てされたデータグラムをＩＰＳｅｃエンジンに送るのに、相当な量のＩＰ再組み立てバッファ空間が、関連するオフロードＮＩＣ  ＣＰＵサイクルとともに消費される可能性がある。オフロード目標は、オフロード目標のバッファ空間を超える、いずれのデータグラムも、ホストまで上に行くように送ることが企図されている（もちろん、オフロード目標は、所与のＩＰデータグラムの一部をオフロード目標の中に格納せず、他のセグメントをホストにまで上に行くように転送するよう、注意しなければならない）。これにより、ホストが、ＩＰフラグメント攻撃を追跡することが可能になる。オフロードされたＳＡが攻撃されている場合、データグラムを認証／復号化しようと試みる際に、ホストスタックによって節約される計算サイクルのため、正味の利得があるものと見込まれることに留意されたい。ホストスタックは、パケットのデフラグを行い、次に、認証される／復号化されるように、パケットを、オフロードされたＳＡに転送する。このアプローチを使用すると、攻撃者が再組み立てバッファをあふれさせ（overrun）ようと試みた場合、ホストスタック軽減は、引き続き配備されている。
【０２０７】
オフロードされたＳＡのアップロードを強制することに関して、アップロードされているＳＡが、多種多様なアプリケーションによって使用されている場合、それにより、システムパフォーマンスが影響を受ける可能性がある。特に懸念されるのが、「マジック」受信パケット、つまり、アップロードを強制することが可能な送信パケットが存在する場合である。ほとんどの一般的なグループポリシーは、２つの終端ノード間のすべての通信に関して、あるＳＡオフロードブロックを使用することである。このため、マジックパケットが可能である場合、２つのホストの間のすべての通信に影響する。ＩＰＳｅｃチムニは、リモートアプリケーションまたはローカルアプリケーションが、アップロードを生じさせることを許さないように、特に設計されている。このため、このタイプの攻撃は、不可能である。しかし、この軽減（mitigation）は、ＩＰオプション／拡張ヘッダ処理のために要求される転送のために、インタフェースにそれほどの複雑さを加えない。これにより、以下に説明する通り、ＣＰＵサイクルに対する攻撃の可能性が生じる。
【０２０８】
ＣＰＵサイクルを攻撃することに関して、主な形は、転送インタフェースの過度の使用を介して、ホストＣＰＵサイクルを消費することである。この場合の分析のために使用される重要なメトリック（metric）は、オフロードが存在しないとした場合にホストスタックが導入したであろうＣＰＵサイクルよりも、多くのＣＰＵサイクルを、特定の処理パス上で、オフロード目標が導入するかどうかであることに留意されたい。リモートノードは、ＳＡ（特定のＮＩＣにオフロードされる）を作成し、次に、現在のパスと代替のパスの間で行き来するようにピンポンして（ping-pong）、ＩＰＳｅｃデータグラムを、異なるＮＩＣ上に着信するようにさせることができる。データグラムをオフロード目標に転送し、攻撃するデータグラムをドロップする合計ＣＰＵサイクルは、パケットを認証する、または復号化するのに要求されるサイクルより少ないものと思われる。このため、ＩＰＳｅｃチムニの正味の効果は、攻撃するパケットをドロップする計算サイクルの削減である。転送インタフェースに対する別の攻撃は、ＩＰｖ４／ｖ６のオプションまたは拡張ヘッダを送信することである。ＩＰｖ４オプションおよびＩＰｖ６拡張ヘッダのまわりには、ａ）認証されているが、アップロードを強制することができない、悪意のあるアプリケーションを有するリモートホストも、ｂ）ローカルアプリケーションも、アップロードを要するパケットを送信できないことを確実にする、相当な複雑さが存在する。
【０２０９】
マジックパケットが全く許されないため、すべてのＩＰｖ４オプションおよびＩＰｖ６拡張ヘッダは、ホストによって処理される（これにより、新たなオプションが作成された際に、前方互換性（forward compatibility)が確実になり、オフロード目標の中の可能な攻撃表面(attack surface）も取り除かれる）。しかし、このアプローチは、転送インタフェースを介する諸形態の攻撃を導入して、ＩＰオプション／拡張ヘッダ処理を可能にする。ＩＰｖ４に関して、オプションの順序正しい処理は、要求されない。このため、オフロード目標は、オプション処理のために、データグラムをホストに転送する（すなわち、非オフロードパケット符号パス）。ホストは、オプションを処理するのを終えた後、ＩＰＳｅｃ処理のために、データグラムをオフロード目標に転送する。この場合も、転送インタフェースを経由する場合でも、オフロードに起因するサイクルカウント減少のため、この攻撃は、オフロードなしのホストスタックよりも多くのＣＰＵサイクルは消費しないものと見込まれる。ＩＰｖ６に関して、最悪ケースのパケットは、ＡＨヘッダとＥＳＰヘッダをともに有するパケットである。拡張ヘッダが、ＩＰＳｅｃ  ＡＨヘッダの前、ＡＨヘッダとＥＳＰヘッダの中間、およびＥＳＰヘッダの後に存在して、順序正しい拡張ヘッダ処理を確実にしている場合、パケットは、理論上、ＩＰＳｅｃオフロードだけが有効にされている場合の５倍、入出力バスを通過し、ＩＰＳｅｃチムニおよびＴＣＰチムニが有効にされている場合の７倍、入出力バスを通過する可能性がある。以下のシーケンスは、イベントの病的な順序付けである。すなわち、第１に、データグラムが、ホストスタックまで上に行くように転送されて、最初の拡張ヘッダが処理される。次に、データグラムは、ＡＨ処理のために、オフロード目標に転送され、認証されることに成功する（すなわち、認証済みのホストが感染する）。オフロード目標がＡＨ処理を実行した後、データグラムは、合格し、オフロード目標は、さらなる拡張ヘッダ処理のために、データグラムをホストスタックに示す。ホストスタックは、拡張ヘッダを処理し、ＥＳＰ処理のために、データグラムをオフロード目標に転送する。オフロード目標は、ＥＳＰ処理を実行し、データグラムは、合格し、オフロード目標は、さらなる拡張ヘッダ処理のために、データグラムをホストスタックに示す。ホストスタックは、拡張ヘッダ処理を終え、データグラムをＴＣＰに転送し、ＴＣＰは、データグラムを、オフロードされたＴＣＰ接続に転送する。オフロード目標は、ＴＣＰセグメントを処理し、ペイロードをアプリケーションに示す。
【０２１０】
以上のパケットフォーマットは、ＩＰＳｅｃスタックが、ＡＨヘッダとＥＳＰヘッダの中間でＩＰｖ６拡張ヘッダを伝送しないため、生成するのが困難である。さらに、ＴＣＰは、転送インタフェースを介する相当なトラフィックを経験した場合、その接続をアップロードする。これにより、遷移が、５つの遷移に削減され、場合により、３つの遷移に削減される。攻撃するピアが、未知である（通常の攻撃）場合、処理は、データグラムが、ＡＨ処理のためにオフロード目標に転送され、認証が失敗した後、停止される。リモートピアが、認証および復号化に合格することが可能である（例えば、信頼されるピアが、ウイルスに感染している）場合、以上のシーケンスが実行されることが可能である。ＩＰＳｅｃチムニは、過度な転送をログ記録する機構を含み、管理者が、違反するピアに対して、適切な措置をとることができるようにする。このケースは、認証済みの感染したクライアントに関してだけ生じる可能性があるため、軽減は、単純明快である。すなわち、そのクライアントからのさらなるトラフィックを停止するようにフィルタを配管する。
【０２１１】
攻撃するパケットが、純粋なソフトウェアホストスタックのそれよりも、多くのＣＰＵを消費するかどうかという点で、以上を検討すると、ＣＰＵ使用量の主な追加は、転送オーバーヘッドおよびＩＰＳｅｃチムニ受信指示オーバーヘッドである。ＣＰＵ使用量の主な削減は、認証／復号化オフロードに起因する。データグラムサイズに依存して、正味の効果は、オフロードされたケースの明確な勝ちであるか（完全なＭＴＵデータグラム）、または引き分けに近い（すなわち、ＣＰＵ使用量は、ほぼ同じである）。このため、主な副作用は、認証されたリモートホストに起因する、バス帯域幅利用率であるが、これは、重大なリスクとは思われない。
【０２１２】
別のＤＯＳベースの攻撃は、近隣更新またはルーティング更新を注入して、誤ったＭＡＣアドレスが選択されるようにするか、または誤ったインタフェースが選択されるようにすることである。これは、ホストスタックが抱える既存のセキュリティ問題であり、ホストスタックは、それらのタイプのメッセージのすべてを処理することを続けるため、ＩＰＳｅｃチムニに起因する新たな攻撃シナリオは、全く存在しない。微妙な違いは、ホスト上とＮＩＣ上の両方で（キャッシュ状態の更新に起因して）、追加のＣＰＵサイクルが、攻撃において消費される可能性があることである。しかし、これは、ＭＡＣアドレスを変更することができるというより重大な攻撃ウインドウ（これは、スプーフィングおよび／または否認の一形態と見なすこともできる）と比べて、相当に小さい副作用である。
【０２１３】
別の形態の攻撃は、特権の昇格（elevation）。特権の昇格をめぐる主な懸念は、オフロードＩＰＳｅｃインプリメンテーションが、セキュリティで保護されていない何らかの機構（またはバグ）により、リモートノードが、オフロード目標にコードをロードできるようにすることが可能であるかどうかである。ＮＩＣ製造業者に要求される事項には、製造業者は、リモートエンティティが認証済みでない限り、コードが、ＮＩＣ上に直接にロードされることを可能にしてはならないということが含まれなければならない。
【０２１４】
特権の昇格の別の形態は、システム管理者が、ＳＡがオフロードされる（すなわち、接続が、管理者が所望したよりも良好なサービスを受ける）のを防止するように、またはキューの中で自らを昇格させるヒューリスティックを推測することにより、オフロードに関して、他のプロセスと比べたＳＡの優先順位を変更するようにオフロードマネージャを構成している場合に、オフロードを強制することである。これについては、情報開示攻撃について説明した際に、上記で詳しく見た。
【０２１５】
本発明の諸原理を適用することが可能な多くの可能な実施形態に鑑みて、図面に関連して本明細書で説明した実施形態は単に例示的であることを意図しており、本発明の範囲を限定するものと解釈されるべきではないことを認識されたい。例えば、ソフトウェアで示した例示した実施形態の諸要素をハードウェアで実施してもよく、その逆の場合も同様であること、あるいは本発明の趣旨を逸脱することなく例示した実施形態の構成および詳細を変更できることが、当業者には認識されよう。したがって、本明細書で説明する本発明は、添付の特許請求の範囲および特許請求の範囲と均等の範囲に含まれる可能性がある、すべてのそのような実施形態を企図している。したがって、本発明の範囲は、以上の説明によってではなく添付の特許請求の範囲によって示される。特許請求の範囲と均等の趣旨および範囲に含まれるすべての変更は特許請求の範囲に包含されるものとする。
【図面の簡単な説明】
【０２１６】
【図１】本発明による諸特徴を実施することができる適切なコンピューティングシステムを示す図である。
【図２ａ】本発明によるネットワークスタックの機能レイヤ、およびＩＰセキュリティ代替パスを示すブロック図である。
【図２ｂ】本発明による、ＩＰセキュリティ代替パスが別のオフロードチムニ（chimney）に埋め込まれたネットワークスタックの機能レイヤを示すブロック図である。
【図３ａ】本発明によるネットワークスタックの機能レイヤ、およびＩＰセキュリティバイパスパスを示すブロック図である。
【図３ｂ】本発明による、ＩＰセキュリティバイパスパスが別のオフロードチムニに埋め込まれたＮＤＩＳパスの機能レイヤを示すブロック図である。
【図４】本発明の教示によるオフロード機構を示すラダーダイヤグラムである。
【図５Ａ】中間ソフトウェアレイヤ状態オブジェクトに関する逆転したツリーを示すオブジェクト図である。
【図５Ｂ】中間ソフトウェアレイヤ状態オブジェクトに関する逆転したツリーを示すオブジェクト図である。
【図５Ｃ】中間ソフトウェアレイヤ状態オブジェクトに関する逆転したツリーを示すオブジェクト図である。
【図５Ｄ】中間ソフトウェアレイヤ状態オブジェクトに関する逆転したツリーを示すオブジェクト図である。
【図６Ａ】ブロックポインタの集合に関する本発明による逆転したツリーを示すブロック図である。
【図６Ｂ】ブロックポインタの集合に関する本発明による逆転したツリーを示すブロック図である。
【図７】本発明の教示による状態オブジェクトのキャッシュ状態部分を更新するためのネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す図である。
【図８】周辺デバイスが、オフロードされたＴＣＰ接続の終了を要求する、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す図である。
【図９】本発明によるネットワークスタックの機能レイヤ、並びにＩＰセキュリティパスおよび他のバイパスパスを示すブロック図である。
【図１０】図９のＩＰセキュリティパスのデータ転送モードを示すブロック図である。
【図１１】ブロックポインタの集合に関する本発明によるＩＰセキュリティ関連付けを有する逆転したツリーを示すブロック図である。
【図１２】ブロックポインタの集合に関する本発明によるＩＰセキュリティ関連付けを有する逆転したツリーを示すブロック図である。
【図１３】本発明の教示によるＩＰセキュリティブロックオフロード機構を示すラダーダイヤグラムである。
【図１４ａ】周辺デバイスが、オフロードされたＩＰセキュリティ関連付けの終了を要求する、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す図である。
【図１４ｂ】周辺デバイスが、オフロードされたＩＰセキュリティ関連付けの終了を要求する、ネットワークプロトコルスタックにおける中間ソフトウェアレイヤ間の可能なシグナルシーケンスを示す図である。
【図１５】オフロードＩＰセキュリティ構造内のセキュリティ関連付けのキー更新を行うためのイベントのシーケンスを示すラダーダイヤグラムである。
【図１６】ＩＰセキュリティオフロードのセキュリティ脅威モデルを示すブロック図である。
【符号の説明】
【０２１７】
１２０  処理装置
１２１  システムバス
１３０  システムメモリ
１３４、１４４  オペレーティングシステム
１３５、１４５  アプリケーションプログラム
１３６、１４６  他のプログラムモジュール
１３７、１４７  プログラムデータ
１４０  リムーバブルでない不揮発性メモリのインタフェース
１５０  リムーバブルな不揮発性メモリのインタフェース
１６０  ユーザ入力インタフェース
１６１  マウス
１６２  キーボード
１７０  ネットワークインタフェース
１７１  ローカルエリアネットワーク
１７２  モデム
１７３  ワイドエリアネットワーク
１８０  リモートコンピュータ
１８５  リモートアプリケーションプログラム
１９０  ビデオインタフェース
１９５  出力周辺インタフェース
１９６  プリンタ
２００、９００  アプリケーション
２０４  周辺デバイス
２０６  中間レイヤ
２０８、３０６、９２２  ＩＰＳｅｃスイッチ
２２２、３２２、９１４  中間レイヤスイッチ
３００  トランスポートレイヤ
３０２  ネットワークレイヤ
３０４、９１２、１３２４  フレーミングレイヤ
３１０  ＮＤＩＳミニドライバ
３１２  チムニドライバ
３１４  ハードウェア
６００、６４６  近隣エントリ
６０２、６４４、６１０、６５０  パスエントリ
７２２、８２２、１３２２  ネットワークレイヤ（パス）
７２４、８２４  フレーミングレイヤ（近隣）
７３０、８３０、１３３０  ミニポート
９０４  ネットワーク物理インタフェース
９１０  ＩＰＳｅｃを有するパスレイヤ
９１６  ＴＣＰチムニ
１１００，１１０２  ＩＰＳｅｃ受信ＳＡ
【図１】
2006191537.tif 000005
【図２ａ】
2006191537.tif 000006
【図２ｂ】
2006191537.tif 000007
【図３ａ】
2006191537.tif 000008
【図３ｂ】
2006191537.tif 000009
【図４】
2006191537.tif 000010
【図５Ａ】
2006191537.tif 000011
【図５Ｂ】
2006191537.tif 000012
【図５Ｃ】
2006191537.tif 000013
【図５Ｄ】
2006191537.tif 000014
【図６Ａ】
2006191537.tif 000015
【図６Ｂ】
2006191537.tif 000016
【図７】
2006191537.tif 000017
【図８】
2006191537.tif 000018
【図９】
2006191537.tif 000019
【図１０】
2006191537.tif 000020
【図１１】
2006191537.tif 000021
【図１２】
2006191537.tif 000022
【図１３】
2006191537.tif 000023
【図１４ａ】
2006191537.tif 000024
【図１４ｂ】
2006191537.tif 000025
【図１５】
2006191537.tif 000026
【図１６】
2006191537.tif 000027
【外国語明細書】
2006191537000001.pdf