(57)【特許請求の範囲】
【請求項１】
コンピュータシステム環境で、ネットワーク化メッセージのパスを、スイッチ層およびネットワークスタックを通って周辺デバイスに行く第１のパスから、前記スイッチ層を通って前記周辺デバイスに行く第２のパスに変更するために、複数のソフトウェア層からなるネットワークスタックの状態変数をオフロードする方法であって、前記方法は、
前記ネットワークスタックの状態変数をオフロードするためのオフロード要求を、前記第１のパスを介して前記周辺デバイスに送るステップと、
前記オフロード要求を受け取った周辺デバイスにより前記ネットワークスタックの状態変数がオフロードされる場合に、
前記複数のソフトウェア層の少なくとも１つにおいて、前記周辺デバイスと通信できるようにするためのオフロードハンドルを前記周辺デバイスから受け取るステップと、
前記オフロードハンドルを受け取った複数のソフトウェア層の前記少なくとも１つから前記周辺デバイスに前記ネットワークスタックの状態変数を送るステップであって、キャッシュされる状態変数、ならびに、一定の状態変数およびオフロード中の所有権が前記周辺デバイスに委任される状態変数のうちの少なくとも一方を有する状態変数を送るステップと、
前記スイッチ層から前記周辺デバイスにバッファを転送するステップとを備えることを特徴とする方法。
【請求項２】
前記オフロード要求はリソース要件リストを含み、前記複数のソフトウェア層の少なくとも１つは前記リソース要件リストに層リソース要件を追加することを特徴とする請求項１に記載の方法。
【請求項３】
前記周辺デバイスから、前記スイッチ層またはソフトウェア層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した少なくとも１つの第１のディスパッチテーブルを受け取るステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項４】
前記少なくとも１つの第１のディスパッチテーブルは、ネットワークスタック全体についてのプロトコルスタックディスパッチテーブル、および前記複数のソフトウェア層のうちの１つについての層ディスパッチテーブルの少なくとも一方を含むことを特徴とする請求項３に記載の方法。
【請求項５】
前記周辺デバイスに、前記スイッチ層またはソフトウェア層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した第２のディスパッチテーブルを送るステップをさらに備えることを特徴とする請求項３に記載の方法。
【請求項６】
前記第１のディスパッチテーブルおよび前記第２のディスパッチテーブルにパッチを当てて、少なくとも１つの機能を実施するための少なくとも１つのソフトウェア層を追加するステップをさらに備えることを特徴とする請求項５に記載の方法。
【請求項７】
前記少なくとも１つのソフトウェア層は、追加機能、性能診断、および機能診断のうちの少なくとも１つを実施することを特徴とする請求項６に記載の方法。
【請求項８】
前のオフロードが行われたかどうかを前記複数のソフトウェア層のそれぞれによって判定するステップと、
前記前のオフロードが行われた場合に、
前記周辺デバイスに前記オフロードハンドルを送るステップとをさらに備えることを特徴とする請求項１に記載の方法。
【請求項９】
前記複数のソフトウェア層の１つはＴＣＰ層であり、前記一定の変数は、宛先ポート、ソースポート、ウィンドウスケールファクタ、および前記オフロードハンドルのうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１０】
前記複数のソフトウェア層の１つはＴＣＰ層であり、前記キャッシュされる変数は、ＴＣＰ変数およびＩＰ変数のうちの少なくとも一方を含むことを特徴とする請求項１に記載の方法。
【請求項１１】
前記複数のソフトウェア層の１つはＴＣＰ層であり、前記委任される変数は、現在ＴＣＰ状態、受信ウィンドウサイズ、次のＲＥＣＶについてのシーケンス番号、最大送信ウィンドウ、現在輻輳ウィンドウ、送信済み最大シーケンス番号、および次のＳＥＮＤについてのシーケンス番号のうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１２】
前記複数のソフトウェア層の１つはネットワーク層であり、前記一定の変数は、宛先ＩＰアドレスおよびソースＩＰアドレスのうちの少なくとも一方を含むことを特徴とする請求項１に記載の方法。
【請求項１３】
前記複数のソフトウェア層の１つはネットワーク層であり、前記キャッシュされる変数は次の層への前記オフロードハンドルを含むことを特徴とする請求項１に記載の方法。
【請求項１４】
前記複数のソフトウェア層の１つはネットワーク層であり、前記委任される変数は、ＩＰパケットＩＤ開始値、ローカルアドレス、およびリモートアドレスを含むことを特徴とする請求項１に記載の方法。
【請求項１５】
前記複数のソフトウェア層の１つはフレーミング層であり、前記キャッシュされる変数はＡＲＰアドレスを含むことを特徴とする請求項１に記載の方法。
【請求項１６】
前記複数のソフトウェア層の１つはＩＰセキュリティ層であり、前記一定の変数は、ソースポート、宛先ポート、プロトコルタイプ、ローカルＩＰアドレス、リモートＩＰアドレス、およびセキュリティアソシエーション変数のうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１７】
前記複数のソフトウェア層の１つはＩＰセキュリティ層であり、前記キャッシュされる変数は、バイトカウントに対する鍵更新、バイトカウントに対するストップ、事前定義済みティックにおける鍵更新、事前定義済みティックにおけるストップ、およびセキュリティアソシエーションを使用できる最大アイドル時間のうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１８】
前記複数のソフトウェア層の１つはＩＰセキュリティ層であり、前記委任される変数は、セキュリティアソシエーションで暗号化または復号されるバイトのカウント、前記セキュリティアソシエーションに残された存続時間、および前記セキュリティアソシエーションに残されたアイドル時間のうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１９】
ホスト処理デバイスが、前記キャッシュされる変数を処理し、前記キャッシュされる状態中の変数が変化したときに前記キャッシュされる変数を更新するよう前記周辺デバイスに命じることを特徴とする請求項１に記載の方法。
【請求項２０】
少なくとも１つのキャッシュされる変数を更新するために前記周辺デバイスに更新メッセージを送るステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２１】
前記更新メッセージにシーケンス番号を付加するステップをさらに備えることを特徴とする請求項２０に記載の方法。
【請求項２２】
オフロード完了メッセージが受け取られて、それにより前記バッファが前記周辺デバイスに転送されるまでは、前記複数のソフトウェア層を介してデータを送信するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２３】
前記複数のソフトウェア層のうちの１つに関する特定の構造がオフロードされつつある場合に、前記複数のソフトウェア層のうちの１つに対する追加のオフロード要求を、前記オフロード要求が完了するまでブロックするステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２４】
前記ネットワークスタックの状態変数がオフロードされるかどうかを前記複数のソフトウェア層の少なくとも１つによって判定するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２５】
前記オフロード要求が送られるかどうかを判定するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２６】
前記オフロード要求が送られるかどうかを判定するステップは、
オフロードする特定のサービスを選択するステップ、
前記ネットワークスタックの状態変数に関連するバイト数およびパケット数のうちの一方がホストリソースを多量に消費しているかどうかを判定するステップ、
オフロードの実施をポリシーが要求するかどうかを判定するステップ、ならびに
プロセッサ利用、データキャッシュ使用、ページテーブルキャッシュ使用およびメモリ帯域幅使用のうちの少なくとも１つがしきい値を超えるかどうかを判定するステップのうち、少なくとも１つのステップを含むことを特徴とする請求項２５に記載の方法。
【請求項２７】
ＩＰ  ＩＤ空間全体の一部を前記周辺デバイスに割り当てるステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項２８】
前記ＩＰ  ＩＤ空間全体の一部を割り当てるステップは、前記ＩＰ  ＩＤ空間全体のほぼ半分を前記周辺デバイスに割り当てるステップを含むことを特徴とする請求項２７に記載の方法。
【請求項２９】
パケットに対するＩＰ  ＩＤを、以下の式
現在のＩＰ  ＩＤ=[(パスのＩＰパケットＩＤ開始値)+(前記パスのカウンタ値) mod ３２０００] mod ６４０００
前記パスのカウンタ値=前記パスのカウンタ値+1
に従って生成するステップをさらに備えることを特徴とする請求項２８に記載の方法。
【請求項３０】
請求項１に記載のステップを実施するためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読媒体。
【請求項３１】
前記周辺デバイスから、前記スイッチ層またはソフトウェア層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した少なくとも１つの第１のディスパッチテーブルを受け取ること、および
前記周辺デバイスに、前記スイッチ層またはソフトウェア層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した第２のディスパッチテーブルを送ることを含むステップを実施するための実行可能命令をさらに有することを特徴とする請求項３０に記載のコンピュータ可読媒体。
【請求項３２】
前記キャッシュされる変数を処理すること、および前記キャッシュされる状態中の変数が変化したときに前記キャッシュされる変数を更新するよう前記周辺デバイスに命じることを含むステップを実施するための実行可能命令をさらに有することを特徴とする請求項３０に記載のコンピュータ可読媒体。
【請求項３３】
コンピュータシステム環境で、ネットワーク化メッセージのパスを、スイッチ層およびネットワークスタックを通って周辺デバイスに行く第１のパスから、前記スイッチ層を通って前記周辺デバイスに行く第２のパスに変更するために、複数のソフトウェア層からなるネットワークスタックの状態変数をオフロードする方法であって、前記周辺デバイスにより実行される方法は、
前記ネットワークスタックの状態変数をオフロードするためのオフロード要求を、前記スイッチ層から受け取るステップであって、前記オフロード要求はリソース要件リストを有するステップと、
前記受け取ったオフロード要求に応答して、ネットワークスタックの状態変数がオフロードされるかどうかを判定するステップと、
前記ネットワークスタックの状態変数がオフロードされる場合に、
前記受け取ったオフロード要求に含まれたリソース要件リストを扱うためのリソースを割り振るステップと、
前記複数のソフトウェア層の少なくとも１つに、前記周辺デバイスと通信できるようにするためのオフロードハンドルを渡すステップと、
前記オフロードハンドルを受け取った複数のソフトウェア層の前記少なくとも１つから、前記周辺デバイスへの前記ネットワークスタックの状態変数を受け取るステップであって、キャッシュされる状態変数、ならびに、一定の状態変数およびオフロード中の所有権が前記周辺デバイスに委任される状態変数のうちの少なくとも一方を有する状態変数を受け取るステップと、
前記スイッチ層からバッファを受け取るステップとを備えることを特徴とする方法。
【請求項３４】
前記スイッチ層から、前記スイッチ層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持したディスパッチテーブルを受け取るステップをさらに備えることを特徴とする請求項３３に記載の方法。
【請求項３５】
前記スイッチ層に、前記スイッチ層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持したディスパッチテーブルを送るステップをさらに備えることを特徴とする請求項３３に記載の方法。
【請求項３６】
請求項３３に記載のステップを実施するためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読媒体。
【請求項３７】
前記スイッチ層から、前記スイッチ層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した第１のディスパッチテーブルを受け取ること、および
前記スイッチ層に、前記スイッチ層またはソフトウェア層と前記周辺デバイスとの間で送受されるデータまたはポインタを保持した第２のディスパッチテーブルを送ることを含むステップを実施するためのコンピュータ実行可能命令をさらに有することを特徴とする請求項３６に記載のコンピュータ可読媒体。
【請求項３８】
コンピュータ環境で、ネットワーク化メッセージのパスを、スイッチ層およびネットワークスタックを通って周辺デバイスに行く第１のパスから、前記スイッチ層を通って前記周辺デバイスに行く第２のパスに変更するために、複数のソフトウェア層からなるネットワークスタックの状態変数をオフロードする方法であって、前記方法は、
前記ネットワークスタックの状態変数をオフロードするためのオフロード要求を、前記第１のパスを介して前記周辺デバイスに送るステップであって、前記オフロード要求はリソース要件リストを有するステップと、
前記オフロード要求を受け取った周辺デバイスにより前記ネットワークスタックの状態変数がオフロードされる場合に、
前記複数のソフトウェア層の各層につき、前記層が前のオフロードからの前記周辺デバイスと通信できるようにするための既存のオフロードハンドルを有さない場合に前記リソース要件リストにリソース要件を追加すること、および前記リソース要件リストに既存のオフロードハンドルを追加することのうちの一方を実施し、
前記状態変数をオフロードしつつあり既存のオフロードハンドルを有さない前記複数のソフトウェア層のそれぞれにつき、キャッシュされる状態変数を前記周辺デバイスに送るステップと、
前記ネットワークスタックの状態変数がオフロードされた場合に、前記スイッチ層から前記周辺デバイスにバッファを転送するステップとを備えることを特徴とする方法。
【請求項３９】
前記複数のソフトウェア層はトランスポート層、ネットワーク層、およびフレーミング層を含み、状態エントリが第１の状態エントリから変化した場合に、前記リソース要件リストにリソース要件を追加するステップは、
プロトコル状態エントリが第１のプロトコル状態エントリから変化した場合に、前記リソース要件リストにトランスポートリソース要件を追加するステップと、
ネットワーク状態エントリが第１のネットワーク状態エントリから変化した場合に、前記リソース要件リストにネットワークリソース要件を追加するステップと、
フレーミング状態エントリが第１のフレーミング状態エントリから変化した場合に、前記リソース要件リストにフレーミングリソース要件を追加するステップとを含むことを特徴とする請求項３８に記載の方法。
【請求項４０】
前記複数のソフトウェア層の各層につき、
状態エントリが変化していない場合に前記周辺デバイスに第１のハンドルを送るステップをさらに備えることを特徴とする請求項３８に記載の方法。
【請求項４１】
前記状態エントリが変化していない場合に前記周辺デバイスに前記第１のハンドルを送るステップは、プロトコル状態エントリが変化していない場合に、前記周辺デバイスに第１のプロトコルハンドルを送るステップを含むことを特徴とする請求項４０に記載の方法。
【請求項４２】
前記状態エントリが変化していない場合に前記周辺デバイスに前記第１のハンドルを送るステップは、ネットワーク状態エントリが変化していない場合に、前記周辺デバイスに第１のネットワークハンドルを送るステップを含むことを特徴とする請求項４０に記載の方法。
【請求項４３】
前記状態エントリが変化していない場合に前記周辺デバイスに前記第１のハンドルを送るステップは、フレーミング状態エントリが変化していない場合に、前記周辺デバイスにフレーミングハンドルを送るステップを含むことを特徴とする請求項４０に記載の方法。
【請求項４４】
請求項３９に記載のステップを実施するためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読媒体。
【請求項４５】
前記複数のソフトウェア層の各層につき、
前記状態エントリが変化していない場合に前記周辺デバイスに前記第１のハンドルを送ることを含むステップを実施するための実行可能命令をさらに有することを特徴とする請求項４４に記載のコンピュータ可読媒体。
【請求項４６】
前記複数のソフトウェア層はトランスポート層、ネットワーク層、およびフレーミング層を含み、状態エントリが第１の状態エントリから変化した場合に、前記リソース要件リストにリソース要件を追加するステップは、
プロトコル状態エントリが第１のプロトコル状態エントリから変化した場合に、前記リソース要件リストにトランスポートリソース要件を追加するステップと、
ネットワーク状態エントリが第１のネットワーク状態エントリから変化した場合に、前記リソース要件リストにネットワークリソース要件を追加するステップと、
フレーミング状態エントリが第１のフレーミング状態エントリから変化した場合に、前記リソース要件リストにフレーミングリソース要件を追加するステップとを含むことを特徴とする請求項４４に記載の方法。
【請求項４７】
コンピュータ環境で、スイッチ層およびプロトコルスタックを通って周辺デバイスに行く第１のパスから、前記スイッチ層から前記周辺デバイスに行く第２のパスに変更するために、プロトコルスタックの状態変数をオフロードする方法であって、
前記プロトコルスタックの状態変数をオフロードするためのオフロード要求を受け取るステップであって、前記オフロード要求は、リソース要件リストと、前記複数のソフトウェア層の少なくとも１つに対する前記周辺デバイスと通信できるようにするための少なくとも１つの既存のオフロードハンドルとを有するステップと、
前記プロトコルスタックの状態変数がオフロードされるかどうかを判定するステップと、
前記プロトコルスタックの状態変数がオフロードされる場合に、前記リソース要件リストを扱うためのリソースを割り振るステップと、
既存のオフロードハンドルを有さない前記複数の層の各層が状態変数をオフロードした場合に、前記各層にオフロードハンドルを送るステップとを備えることを特徴とする方法。
【請求項４８】
前記複数のソフトウェア層はプロトコル層、ネットワーク層およびフレーミング層を含み、既存のオフロードハンドルを有さない前記複数の層の各層が状態変数をオフロードした場合に前記各層に前記オフロードハンドルを送るステップは、
プロトコル層の状態変数がオフロードされた場合に、前記プロトコル層にプロトコルハンドルを送るステップと、
ネットワーク層の状態変数がオフロードされた場合に、前記ネットワーク層にネットワークハンドルを送るステップと、
フレーミング層の状態変数がオフロードされた場合に、前記フレーミング層にフレーミングハンドルを送るステップとを含むことを特徴とする請求項４７に記載の方法。
【請求項４９】
請求項４７に記載のステップを実施するためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は一般に、コンピュータシステムの効率、速度、および／またはスループットを向上させる方法に関し、より詳細には、通常ならホストプロセッサによって実施されるコンピューティングタスクを特定のハードウェアコンポーネントにオフロードする（ｏｆｆｌｏａｄｉｎｇ）方法に関する。
【０００２】
【従来の技術】
オペレーティングシステム、アプリケーションソフトウェア、ネットワーキング、ネットワーク化通信などの複雑さおよび精巧さは、劇的な速度で増大し続けている。複雑化および精巧化の結果の１つとして、アプリケーションおよびシステムの機能の増加がある。この機能増加により、増加したシステム機能およびアプリケーション機能を実行するためにＣＰＵが実施しなければならない義務が追加されるせいで、しばしばＣＰＵオーバーヘッドが増大する。
【０００３】
ＣＰＵオーバーヘッドの増大が容易にわかる領域の１つはネットワーク化アプリケーションの領域であり、この領域では、高帯域幅メディアが増加しているためにネットワーク速度が上昇している。ネットワーク速度はしばしば、ホストコンピュータのＣＰＵプロセッサ速度およびメモリ帯域幅能力に匹敵し、ますますそれを超過している。これらのネットワーク化アプリケーションは、７層ＩＳＯモデルやＷｉｎｄｏｗｓ（登録商標）オペレーティングシステムによって使用される階層モデルなど、ほとんどのオペレーティングシステムによって階層アーキテクチャが使用されるせいで、さらにホストプロセッサに負担を課す。周知のように、このようなモデルは、ネットワークへの物理接続とエンドユーザアプリケーションとの間のデータフローを記述するのに使用される。データビットをネットワークケーブル上に配置するなどの最も基本的な機能は下層で実施され、アプリケーションの詳細に伴う機能は上層で実施される。本質的に各層の目的は、サービスが実際にどのように実装されるかに関する詳細を次に高い層から見えないようにして、次に高い層にサービスを提供することである。各層は、それぞれが他のコンピュータ上の同じ層と通信していると信じるような形で抽象化される。
【０００４】
データパケットが各層間を進む中でデータパケットに対して実施される様々な機能は、ソフトウェア集約的である可能性があり、かなりの量のＣＰＵプロセッサリソースおよびメモリリソースを必要とすることが多い。例えば、様々な層でパケットに対して実施されるいくつかの機能は、パケットチェックサム計算および検証、データの暗号化および復号（例えばＳＳＬ暗号化やＩＰ  Ｓｅｃｕｒｉｔｙ暗号化）、メッセージダイジェスト計算、ＴＣＰセグメンテーション、ＴＣＰ再送および肯定応答（ＡＣＫ）処理、サービス拒否攻撃から守るためのパケットフィルタリング、ユーザデータグラムプロトコル（ＵＤＰ）パケットフラグメンテーションなど、非常にＣＰＵ集約的である。これらの各機能が実施されるとき、その結果ＣＰＵに求められる需要は、コンピュータシステム全体のスループットおよび性能に大きく影響する可能性がある。
【０００５】
ＣＰＵリソースに対する需要は増大しているものの、ネットワークインタフェースカード（ＮＩＣ）などのコンピュータハードウェア周辺装置の能力およびスループットもまた増大している。これらの周辺装置には、通常ならＣＰＵによって実施されるタスクおよび機能の多くを実施することのできる専用プロセッサおよびメモリが装備されることが多い。
【０００６】
コンピュータ産業はこの能力を認識し、従来はＣＰＵによって実施されていたＣＰＵ集約的なタスクおよび機能をオフロードする方法を開発した。例えば、周辺デバイスに照会し、集約的なタスクおよび機能を実施できる周辺デバイスに特定のプロセッサタスクをオフロードする解決法が提供されている（例えば、本願と同じくＡｎａｎｄ他に譲渡された特許文献１、２０００年９月７日出願の米国特許出願第０９／６５７５１０号明細書「Method and Computer Program Product for Offloading Processing Tasks from Software to Hardware」、２０００年１１月２９日出願の米国特許出願第０９／７２６０８２号明細書「Method and Computer Program Product for Offloading Processing Tasks from Software to Hardware」参照）。通常オフロードされる特定のタスクには、ＴＣＰ（伝送制御プロトコル）および／またはＩＰ（インターネットプロトコル）チェックサム計算、ＬＳＯ（ｌａｒｇｅ  ｓｅｎｄ  ｏｆｆｌｏａｄ）などのＴＣＰセグメンテーション、セキュアインターネットプロトコル（ＩＰＳＥＣ）暗号化および復号が含まれる。
【０００７】
これらのオフロード機構は、ネットワークスタックに最小限の数の変更を加えるという副次的要件を有する点で制限される。この副次的要件の結果、オフロードがロングコードパスを有するという別の制限がある。というのは、周辺デバイスに到達するために、オフロードされるタスクおよび機能がディセーブルにされた状態でネットワークスタック全体がトラバースされるからである。さらに、ネットワークスタックとの統合がないという制限もある。ネットワークスタックが周辺デバイスに対して照会またはパラメータ設定するための明確なインタフェースがなく、あるいは通知または能力変更がある場合にネットワークスタックに通知するための周辺デバイス用インタフェースがない。例えばＬＳＯ要求の処理中にルートが変化した場合、この場合のフォールバック機構は、スタックがタイムアウトを待機してＬＳＯ要求を再送するようにするものである。
【０００８】
周辺デバイス製造業者が試みたもう１つの手法は、ＴＣＰ接続全体をコアスタックからネットワークインタフェースカード（ＮＩＣ）にオフロードするものである。この手法は、プロプラエタリインタフェースを使用してプロトコルスタック全体をバイパスするものであり、周辺デバイスがＴＣＰメッセージ、ＩＰ（インターネットプロトコル）メッセージ、ＩＣＭＰ（インターネット制御メッセージプロトコル）メッセージ、ＤＮＳ（ドメインネームサーバ）メッセージ、ＲＩＰメッセージのすべてを扱う必要があり、ＮＩＣが全部を処理する必要がある。さらにこの手法は、マルチホーム環境に対処せず、ホストオペレーティングシステムのネットワーク管理ユーティリティとすっきり統合しない。状態が変化すると、オフロード接続は容易に失敗する可能性がある。
【０００９】
【特許文献１】
米国特許第６，１４１，７０５号明細書
【００１０】
【発明が解決しようとする課題】
本発明は、ＴＣＰベースのプロトコルスタックなどのネットワークスタック接続をオフロードする方法を提供する。
【００１１】
【課題を解決するための手段】
複数のソフトウェア層を有するＮＤＩＳ（ネットワークドライバインタフェース仕様）パスを介して周辺デバイスに通常なら送られるデータを、スイッチ層から周辺デバイスへのパスにオフロードする。ネットワークスタックおよび処理ユニットとの密な同期が維持される。スタックをオフロードする要求が、ＮＤＩＳパスを介して周辺デバイスに送られる。この要求は、周辺デバイスがリソース割振りに必要な情報を有することができるように、リソース要件のリストを含む。ＮＤＩＳパス中の各層は、その層のリソース要件をリストに加える。周辺デバイスが要求を受け入れる場合、周辺デバイスは、各ソフトウェア層にリソースを割り振り、各ソフトウェア層が周辺デバイスと通信できるように、各ソフトウェア層にオフロードハンドルを送る。
【００１２】
周辺デバイスがオフロードを受け入れたことがソフトウェア層に通信されると、各ソフトウェア層ごとの状態が周辺デバイスに送られる。あるいは、状態はオフロード要求と共に送られ、状態に加えられた変化だけが周辺デバイスに送られる。各状態は状態変数を有し、各状態変数は、一定の変数、キャッシュされる変数、または委任される（ｄｅｌｅｇａｔｅｄ）変数として分類される。一定の変数は、プロトコルスタックがオフロードされている間は変化しない。キャッシュされる変数はＣＰＵが扱い、委任される変数は周辺デバイスが扱う。
【００１３】
本発明はまた、オフロードされたネットワーク接続を周辺デバイスからホストにアップロードする方法も提供する。アップロードは、周辺デバイスおよびスイッチ層のいずれかから開始される。アップロードが開始されると、周辺デバイスはすべての未解決要求を完了し、委任される状態をスイッチ層に渡す。委任される状態がホストに受け入れられた後、周辺デバイスにおける状態リソースは開放される。
【００１４】
オフロード転送またはアップロード転送の間、更新（例えばＡＲＰ更新またはＲＩＰ更新）が到着する可能性がある。複数の更新メッセージが周辺デバイスによって受信される場合は、周辺デバイスが古いデータを使用しないように、シーケンス番号を用いて一番最近の更新メッセージが使用されるようにする。
【００１５】
本発明の他の特徴および利点は、例示的な実施形態に関する後続の詳細な説明から明らかになるであろう。この詳細な説明は、添付の図面を参照しながら進める。
【００１６】
本発明の特徴については頭記の特許請求の範囲に詳細に述べるが、本発明はその目的および利点と共に、後続の詳細な説明を添付の図面と合わせて読めば最もよく理解されるであろう。
【００１７】
【発明の実施の形態】
図面に目を向けると、本発明を適したコンピューティング環境で実施する場合が示してあり、図面では、同じ参照番号は同じ要素を指す。必須ではないが本発明は、パーソナルコンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的なコンテキストで述べる。一般にプログラムモジュールは、特定のタスクを実施するかまたは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。さらに、当業者なら理解するであろうが、この発明的方法はハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラム可能な民生用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、ネットワーク化された周辺装置（例えばネットワーク化されたプリンタ）など、他のコンピュータシステム構成でも実施することができる。本発明は分散コンピューティング環境で実施することもでき、その場合、タスクは通信ネットワークを介してリンクされたリモート処理デバイスによって実施される。分散コンピューティング環境では、プログラムモジュールは、ローカルおよびリモートの両方のメモリ記憶デバイスに位置することができる。
【００１８】
図１に、本発明を実施できる適したコンピューティングシステム環境１００の例を示す。コンピューティングシステム環境１００は、適したコンピューティング環境の一例にすぎず、本発明の使用範囲または機能についてどんな制限を意味するものでもない。またコンピューティング環境１００は、この例示的な動作環境１００に示すコンポーネントのいずれか１つまたは組合せに関してどんな依存も要件も有するものと解釈すべきではない。
【００１９】
本発明は、その他多くの汎用または専用コンピューティングシステム環境または構成でも動作する。本発明で使用するのに適する可能性のある周知のコンピューティングシステム、環境、および／または構成の例には、限定しないがパーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な民生用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、ネットワーク化された周辺装置（例えばネットワーク化されたプリンタ）や、これらのシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれる。
【００２０】
本発明は、コンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的なコンテキストで述べることができる。一般にプログラムモジュールは、特定のタスクを実施するか特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。本発明は分散コンピューティング環境で実施することもでき、その場合、タスクは通信ネットワークを介してリンクされたリモート処理デバイスによって実施される。分散コンピューティング環境では、プログラムモジュールは、メモリ記憶装置を含めたローカルとリモートの両方のコンピュータ記憶媒体に位置することができる。
【００２１】
図１を参照すると、本発明を実施するための例示的なシステムは、コンピュータ１１０の形をとる汎用コンピューティングデバイスを含む。コンピュータ１１０のコンポーネントには、限定しないが処理ユニット１２０と、システムメモリ１３０と、システムメモリを含めた様々なシステムコンポーネントを処理ユニット１２０に結合するシステムバス１２１とを含めることができる。システムバス１２１は、様々なバスアーキテクチャのいずれかを用いた、メモリバスまたはメモリコントローラ、周辺バス、クロスバー、スイッチトバスファブリック、ローカルバスを含めて、いくつかのタイプのバス構造のいずれかとすることができる。システムバス１２１は、バスの階層とすることもできる。限定ではなく例として、このようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  ＣｈａｎｎｅｌＡｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｅ）ローカルバス、ＮＣ−ＮＵＭＡ（Ｎｏ  Ｃａｃｈｅ  Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）アーキテクチャバス、ＣＣ−ＮＵＭＡ（Ｃａｃｈｅ−Ｃｏｈｅｒｅｎｔ  Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）アーキテクチャバス、およびメザニンバスとも呼ばれるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）バスが含まれる。
【００２２】
コンピュータ１１０は通常、様々なコンピュータ可読媒体を備える。コンピュータ可読媒体は、コンピュータ１１０からアクセスできる任意の利用可能な媒体とすることができ、揮発性および不揮発性、取外し可能および取外し不可能の両方の媒体が含まれる。限定ではなく例として、コンピュータ可読媒体には、コンピュータ記憶媒体および通信媒体を含めることができる。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報を記憶するための任意の方法または技術で実現される、揮発性と不揮発性、取外し可能および取外し不可能の両方の媒体が含まれる。コンピュータ記憶媒体には、限定しないがＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ディジタル多用途ディスク（ＤＶＤ）または他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶デバイスが含まれ、あるいは、所望の情報を記憶するのに使用できコンピュータ１１０からアクセスできる他の任意の媒体が含まれる。通信媒体は通常、搬送波や他のトランスポート機構など変調されたデータ信号中に、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを組み入れたものであり、任意の情報送達媒体が含まれる。「変調されたデータ信号」という語は、信号中の情報が符号化される形で１つまたは複数の特性が設定または変更された信号を意味する。限定ではなく例として、通信媒体には、配線式ネットワークや直接配線式接続などの配線式媒体と、音響、無線周波、赤外線、その他の無線媒体などの無線媒体とが含まれる。以上の任意の組合せもコンピュータ可読媒体の範囲に含めるべきである。
【００２３】
システムメモリ１３０は、読取り専用メモリ（ＲＯＭ）１３１およびランダムアクセスメモリ（ＲＡＭ）１３２など、揮発性および／または不揮発性メモリの形のコンピュータ記憶媒体を含む。ＲＯＭ１３１には通常、起動中などにコンピュータ１１０内の要素間で情報を転送するのを助ける基本ルーチンを含むＢＩＯＳ（ｂａｓｉｃ  ｉｎｐｕｔ／ｏｕｔｐｕｔ  ｓｙｓｔｅｍ）１３３が記憶されている。ＲＡＭ１３２は通常、処理ユニット１２０がすぐにアクセス可能な、かつ／または現在作用している、データおよび／またはプログラムモジュールを含む。限定ではなく例として、図１には、オペレーティングシステム１３４、アプリケーションプログラム１３５、その他のプログラムモジュール１３６、およびプログラムデータ１３７を示す。
【００２４】
コンピュータ１１０はその他の取外し可能／取外し不可能、揮発性／不揮発性コンピュータ記憶媒体を備えることもできる。例にすぎないが図１には、取外し不可能な不揮発性の磁気媒体に対して読み書きするハードディスクドライブ１４１と、取外し可能な不揮発性の磁気ディスク１５２に対して読み書きする磁気ディスクドライブ１５１と、ＣＤ  ＲＯＭや他の光媒体など取外し可能な不揮発性の光ディスク１５６に対して読み書きする光ディスクドライブ１５５を示す。この例示的な動作環境で使用できるその他の取外し可能／取外し不可能、揮発性／不揮発性コンピュータ記憶媒体には、限定しないが磁気テープカセット、フラッシュメモリカード、ディジタル多用途ディスク、ディジタルビデオテープ、半導体ＲＡＭ、半導体ＲＯＭなどが含まれる。ハードディスクドライブ１４１は通常、インタフェース１４０などの取外し不可能メモリインタフェースを介してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は通常、インタフェース１５０などの取外し可能メモリインタフェースでシステムバス１２１に接続される。
【００２５】
以上に論じ図１に示した各ドライブおよびそれらに関連するコンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、および他のデータの記憶域をコンピュータ１１０に提供する。例えば図１には、ハードディスクドライブ１４１がオペレーティングシステム１４４、アプリケーションプログラム１４５、その他のプログラムモジュール１４６、およびプログラムデータ１４７を記憶しているのが示されている。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、その他のプログラムモジュール１３６、およびプログラムデータ１３７と同じ場合もあり異なる場合もあることに留意されたい。ここでは、オペレーティングシステム１４４、アプリケーションプログラム１４５、その他のプログラムモジュール１４６、およびプログラムデータ１４７が少なくとも異なるコピーであることを示すために、異なる番号を付してある。
【００２６】
ユーザは、キーボード１６２や、マウス、トラックボール、タッチパッドと一般に呼ばれるポインティングデバイス１６１などの入力デバイスを介して、コンピュータ１１０にコマンドおよび情報を入力することができる。その他の入力デバイス（図示せず）には、マイクロホン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナ、ビデオ入力などを含めることができる。これらおよび他の入力デバイスは、システムバスに結合されたユーザ入力インタフェース１６０を介して処理ユニット１２０に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス（「ＵＳＢ」）など、他のインタフェースおよびバス構造で接続されてもよい。モニタ１９１または他のタイプの表示デバイスもまた、ビデオインタフェース１９０などのインタフェースを介してシステムバス１２１に接続される。モニタに加えて、コンピュータは通常、スピーカ１９７、プリンタ１９６、ビデオ出力など、他の周辺出力デバイスも備えることができ、これらは出力周辺インタフェース１９５を介して接続することができる。
【００２７】
コンピュータ１１０は、リモートコンピュータ１８０など１つまたは複数のリモートコンピュータへの論理接続を用いて、ネットワーク化された環境で動作することができる。リモートコンピュータ１８０は、別のパーソナルコンピュータ、サーバ、ルータ、ネットワーク周辺デバイス（例えばプリンタ）、ネットワークＰＣ、ピアデバイス、または他の一般的なネットワークノードとすることができる。図１にはメモリ記憶デバイス１８１しか示していないが、通常はパーソナルコンピュータ１１０に関して上述した要素の多くまたはすべてを含む。図１に示す論理接続は、ローカルエリアネットワーク（ＬＡＮ）１７１およびワイドエリアネットワーク（ＷＡＮ）１７３を含むが、他のネットワークを含むこともできる。このようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネット、およびインターネットでよくみられるものである。
【００２８】
パーソナルコンピュータ１１０は、ＬＡＮネットワーキング環境で使用されるときは、ネットワークインタフェースまたはアダプタ（例えばネットワークインタフェースカード（ＮＩＣ）１７０を介してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用されるときは通常、モデム１７２、またはインターネットなどのＷＡＮ１７３を介した通信を確立するための他の手段を備える。モデム１７２は内蔵でも外付けでもよく、ユーザ入力インタフェース１６０または他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク化環境では、パーソナルコンピュータ１１０に関して示したプログラムモジュールまたはその一部を、リモートメモリ記憶デバイスに記憶することができる。限定ではなく例として、図１には、リモートアプリケーションプログラム１８５がメモリデバイス１８１上にあるものとして示す。図示のネットワーク接続は例示的なものであり、コンピュータ間に通信リンクを確立するための他の手段を使用してもよいことは理解されるであろう。
【００２９】
以下の記述では、特に指示しない限り、１つまたは複数のコンピュータによって実施される働きおよび操作の象徴表現に関して本発明を述べる。したがって、このような働きおよび操作は、しばしばコンピュータ実行される（ｃｏｍｐｕｔｅｒ−ｅｘｅｃｕｔｅｄ）と言及するが、データを構造化形式で表す電気信号をコンピュータの処理ユニットによって操作することを含むことは理解されるであろう。この操作は、データを変形させるか、データをコンピュータのメモリシステム中の位置に維持し、これにより、当業者によく理解されている方式でコンピュータの動作が再構成あるいは改変される。データが維持される位置のデータ構造は、データのフォーマットで定義される特定の属性を有する、メモリの物理位置である。ただし、こうしたコンテキストで本発明を述べるが、当業者には理解されるように、以下に述べる多くのアクションおよび動作はハードウェアに実装することもできるので、このコンテキストは限定的なものではない。
【００３０】
図２に、本発明のネットワーキングモデルおよびコンポーネントを構成するいくつかのコンポーネントの相互関係を示す。通常の動作中は、ネットワーク化メッセージがアプリケーション２００からネットワークスタック２０２を介して周辺デバイス２０４に送られ、そこでメッセージは、ネットワーク上の他のデバイスおよびアプリケーションに送られ、他のデバイスおよびアプリケーションから受け取られる。ネットワークスタック２０２は、１つまたは複数の中間ソフトウェア層２０６を含む。アプリケーション２００から送られたデータは中間ソフトウェア層２０６の中を通るが、このときデータには、データのパッケージ化、高信頼データ送信、データ暗号化、およびメッセージダイジェストの計算など、特定の操作を実施することができる。
【００３１】
スイッチ２０８は、中間ソフトウェア層２０６に対するネットワークスタック動作の実施から処理ユニット１２０をオフロードするのに使用される。スイッチ２０８は別個に示してあるが、ネットワークスタック２０２の最上部の中間層に統合してもよいことに留意されたい。周辺デバイス２０４に対するチムニー２１０を介して周辺デバイス２０４にデータが送られ、ネットワークスタック動作が実施される。この階層構造では、中間ソフトウェア層はすべてホスト中または周辺デバイス中にある必要はなく、いずれかの中間層を完全にオフロードすることもでき、ホストに残すこともでき、あるいはこの両方を組み合わせることもできる（例えば１つまたは複数の特定の接続をオフロードする）。さらに、チムニーの最上部にチムニーを重ねることもできる（例えばＴＣＰチムニーの最上部にＩＰＳＥＣチムニーを重ねることができる）。接続は、高信頼および低信頼データ転送とユニキャストまたはマルチキャストのデータ転送との任意の組合せとすることができる。中間層がホストに残される場合、ホストは、周辺デバイス２０４中のキャッシュされる変数（後述する）を更新する。例えば、接続に関するトランスポート制御ブロック（ＴＣＢ、ｔｒａｎｓｐｏｒｔ  ｃｏｎｔｒｏｌ  ｂｌｏｃｋ）状態エントリをトランスポート層についてオフロードし、ネットワーク層についてのルートキャッシュエントリ（ＲＣＥ）を周辺デバイス２０４にオフロードすることができる。スイッチ２０８は、オフロードされたＴＣＢのためにチムニー２１０を介してトラフィックを送りながら、同じＲＣＥを共有する別のＴＣＢのためにネットワークスタック２０２を介してトラフィックを送り続ける。
【００３２】
スイッチ２０８は、中間層２０６にオフロード要求を送ることによってオフロードを開始する。オフロード要求は、周辺デバイス２０４が接続をうまくオフロードできるかどうかを決定する助けとなるリソース情報を含む。各中間層２０６は、オフロード要求を拒否するか、またはオフロード要求にリソース情報を加えて、ネットワークスタック２０２中の隣接するソフトウェア層に送る。周辺デバイス２０４は、オフロード要求を受け取ると、接続をオフロードするのに利用できるリソースがあるかどうかを計算する。オフロードが不可能な場合は、周辺デバイス２０４はオフロード要求を拒否する。そうでない場合はオフロード要求を受け入れ、接続のためのリソースを割り振る。周辺デバイス２０４は、パラメータのリンクリストを有する完了メッセージを中間ソフトウェア層２０６に送ることによってオフロード要求を完了する。パラメータのリンクリストは、中間ソフトウェア層２０６およびスイッチ２０８が周辺デバイスと通信できるようにするための情報を、中間ソフトウェア層２０６およびスイッチ２０８に提供するものである。各中間ソフトウェア層２０６は、その層についての情報をパラメータのリンクリストから除去する。
【００３３】
中間層２０６は、オフロードのための完了メッセージを受け取ると、その状態を周辺デバイス２０４に渡す。各状態は、ＣＯＮＳＴ（一定）、ＣＡＣＨＥＤ（キャッシュされる）、ＤＥＬＥＧＡＴＥＤ（委任される）の３タイプの変数を有するものとすることができる。１つの状態が３タイプの変数すべてを有することもあり、３タイプの変数のサブセットを有することもある。ＣＯＮＳＴ変数は、オフロードされた接続の寿命の間は決して変化しない定数である。これらは、接続がアップロードされるときに層に再び読み込まれることはない。ホスト処理ユニット１２０は、ＣＡＣＨＥＤ変数の所有権を維持し、ホスト処理ユニット１２０中のＣＡＣＨＥＤ変数に変化があった場合には周辺デバイス２０４中で更新されるようにする。ＣＡＣＨＥＤ状態を変更する制御メッセージが、ネットワークスタック２０２によって扱われる。この結果、ホストはＣＡＣＨＥＤ変数を書き込むが、接続がアップロードされるときに再び読み出す必要はない。ホスト処理ユニット１２０は、ＤＥＬＥＧＡＴＥＤ変数の所有権を周辺デバイス２０４に譲渡する。ＤＥＬＥＧＡＴＥＤ変数は、オフロードが行われるときに１度書き込まれ、オフロードが終了したときに再び読み込まれる。接続をホストに転送して戻すオーバーヘッドは、ＤＥＬＥＧＡＴＥＤ変数を転送して戻すだけで最小化される。ネットワークスタック２０２と、様々な性能上の理由でオフロード（すなわち委任）されている周辺デバイス２０４との間で共有（例えば制御）しなければならない状態は、ネットワークスタック２０２とチムニー２１０（例えばＴＣＰオフロードにおけるＩＰ  ＩＤ）との間ですっきりと分離され、したがって、ネットワークスタック２０２と周辺デバイス２０４は両方とも、その状態の排他的部分をそれぞれ保有する。ホスト処理ユニット１２０は、必要なときにＤＥＬＥＧＡＴＥＤ変数を周辺デバイス２０４に照会する（例えば統計のため）。ホスト処理ユニット１２０はまた、診断のためにＣＯＮＳＴ変数またはＣＡＣＨＥＤ変数を照会することもできる。状態を３つのカテゴリに分けることにより、ネットワークスタック２０２は、チムニー２１０とすっきりと共存することができる。状態はオフロード要求に含めることもできることに留意されたい。これは、状態が、委任される状態変数を含まない場合、あるいは最初のオフロード要求とオフロード要求完了との間で変化しない委任される状態変数を含む場合に行うことができる。
【００３４】
周辺デバイス２０４またはホストは、オフロードされた接続をアップロードするときを決定する。アップロードは、周辺デバイス２０４およびスイッチ２０８のいずれかによって開始される。アップロードが開始されると、周辺デバイス２０４は、すべての未解決要求を適切な状態で完了し、一番上の中間層の委任される状態をスイッチ２０８に渡す。スイッチ２０８は、それ以上の送信要求があればそれらをキューに入れ、受信バッファのポスティングを停止する。スイッチ２０８は、委任される状態の制御を獲得するよう一番上の中間層に命じる。一番上の中間層は、委任される状態の制御を握り、完了メッセージをスイッチ２０８に送る。スイッチ２０８は、完了メッセージを受け取った後、アップロードを周辺デバイス２０４に確認し、これにより周辺デバイス２０４は、もう使用されていないリソースを開放することができる。
【００３５】
一番上の中間層は、委任される状態の制御を獲得するまでは、オフロードされた接続に関する入来データパケットを周辺デバイス２０４に転送して、処理されるようにすることに留意されたい。データパケットは、周辺デバイス２０４が委任される状態をスイッチ２０８に渡すときと、一番上の中間層が委任される状態の制御を獲得するときとの間に到着する場合もある。周辺デバイス２０４は、委任される状態をスイッチ２０８に渡した後はもう入来データパケットを処理することができない。入来データを受け取ったときは、周辺デバイス２０４は、アップロードが進行中であることを示すエラーメッセージを一番上の中間層に送る。エラーメッセージは、入来データの転送を停止して、委任される状態を受け取るまでそれ以上のデータをバッファに入れるよう、一番上の中間層に通知する。あるいは、周辺デバイス２０４上のバッファメモリをさらに犠牲にして、入来データを周辺デバイス２０４に転送し、周辺デバイス２０４がそのデータをバッファするようにすることもできる。
【００３６】
複数の接続を中間ソフトウェア層２０６から周辺デバイス２０４にオフロードすることもできる。中間ソフトウェア層２０６は、上層の状態オブジェクト（すなわちその中間ソフトウェア層２０６よりも上の層の状態オブジェクト）の数に関する参照カウンタを維持する。これらの状態オブジェクトは、オフロードについての中間ソフトウェア層の状態オブジェクトを参照するものである。本明細書において、状態オブジェクトとは、特定の層についての状態変数の集合であり、本明細書ではＣＯＮＳＴ、ＣＡＣＨＥＤ、またはＤＥＬＥＧＡＴＥＤとして分類する。中間層のオフロードされる状態オブジェクトがそれよりも上の層からそれへの参照を有さない場合、中間層２０６は、この中間層についての状態オブジェクトをアップロードして委任される状態変数を中間層２０６に送るよう周辺デバイス２０４にメッセージを送る。周辺デバイス２０４は中間層２０６についての状態オブジェクトを削除し、中間層２０６はスイッチ２０８に完了メッセージを送る。
【００３７】
全体概念を述べたところで、次に図３に目を向け、一実施形態における本発明の詳細について述べる。この実施形態では、周辺デバイス２０４はＮＩＣ１７０であり、スイッチ２０８はトランスポート層インタフェーススイッチ（ＴＬＩ）３０６であり、ネットワークスタック２０２はトランスポート層３００、ネットワーク層３０２、およびフレーミング層３０４を備える。ネットワーク層３０２はパス層とも呼ばれ、フレーミング層３０４は隣接層とも呼ばれる。
【００３８】
動作中、ネットワーク化メッセージがアプリケーション２００からネットワークスタック２０２を介してＮＩＣ１７０に送られる。アプリケーション２００から送られたデータはＴＬＩスイッチ３０６を通るが、ＴＬＩスイッチ３０６は、データがホストベースのネットワークスタック２０２を下りるかまたはチムニー３０８を下りるかを制御する。ＴＬＩスイッチ３０６はネットワークスタック２０２の最上層に組み入れてもよいことに留意されたい。ネットワークスタック２０２中のソフトウェア層は、アプリケーション２００からデータを受け取り、パケット形式にパッケージし、ＮＤＩＳミニドライバ３１０を介して周辺デバイスハードウェア３１４に送る。データパケットがネットワークスタック２０２を通る間にスタック２０２が実施することのできる他のタスクには、データ暗号化、高信頼データ転送、およびメッセージダイジェスト（例えばデータパケットについてのチェックサムやＣＲＣ）の計算が含まれる。これらのタスクの多くは、処理ユニット１２０によって実施され、プロセッサ集約的である。
【００３９】
ＴＬＩスイッチ３０６を使用して、接続に関するデータをチムニー３０８（およびチムニードライバ３１２）を介してＮＩＣ１７０に送ることにより、スタック動作の実施から処理ユニット１２０をオフロードする。ＮＤＩＳミニドライバ３１０およびチムニードライバ３１２の上端は、Ｍｉｃｒｏｓｏｆｔ（登録商標）オペレーティングシステムにおけるＮＤＩＳ  ＡＰＩであることを当業者なら認識するであろう。説明のために、伝送制御プロトコル（ＴＣＰ）ベースのプロトコルスタックを用いて本発明を説明する。ただし理解されるように、本発明の教示を用いて多くのタイプの周辺デバイスを使用することができ、他のネットワークスタックをオフロードすることもできることを、当業者なら認識するであろう。例えば、ＳＣＴＰ（ｓｔｒｅａｍ  ｃｏｎｔｒｏｌ  ｔｒａｎｓｍｉｓｓｉｏｎ  ｐｒｏｔｏｃｏｌ）またはユーザデータグラムプロトコル（ＵＤＰ）ベースのプロトコルスタックをオフロードすることもできる。さらに、本発明を用いて、ｉＳＣＳＩ（ｉｎｔｅｒｎｅｔ  ｓｍａｌｌ  ｃｏｍｐｕｔｅｒ  ｓｙｓｔｅｍ  ｉｎｔｅｒｆａｃｅ）、ネットワークファイルシステム（ＮＦＳ）、またはＣＩＦＳ（ｃｏｍｍｏｎ  ｉｎｔｅｒｆａｃｅ  ｆｉｌｅ  ｓｙｓｔｅｍ）など、より高機能のプロトコルをオフロードすることもできる。
【００４０】
オフロードが行われるのには多くの理由がある。限定ではなく例として、いくつかの理由を以下に挙げる。システム管理者が、オフロードする特定のサービスを選択することがあり得る。接続上にあるトラフィック（バイト数またはパケット数からみて）が多量のリソースを消費している場合に、特定の接続がオフロードされることもある。あるタイプのサービスがオフロードされることもある。例えば、ＩＰＳＥＣなどのセキュリティプロトコルがオフロードされることがある。オフロードはポリシーによって主導することもできる。例えば管理者は、組織内からの接続はすべて最初にオフロードされるというポリシーを有することができる。使用されているシステムリソース（例えばＣＰＵ利用、データキャッシュ使用、ページテーブルキャッシュ使用、メモリ帯域幅）により、ホストプロセッサが接続をオフロードすることになる場合もある。
【００４１】
図４に、ＴＣＰ接続をオフロードするために実施されるステップを示す。３段階のプロセスが用いられる。一般に、この３段階のプロセスは、ＴＣＰ接続をオフロードするのに必要なリソースを割り振り、各層３００、３０２、３０４、３０６にハンドルを提供し、各層３００、３０２、３０４、３０６についての状態をＮＩＣ１７０にオフロードするものである。オフロード移行中、ＴＬＩスイッチ３０６は、アプリケーション２００から送られたメッセージをすべてバッファに入れる。あるいは、トランスポート層３００がデータをバッファに入れる。オフロードが完了したとき、バッファに入れられたデータは、オフロードデータ送信と同じ機構を使用してＮＩＣ１７０に転送される。オフロード移行中に入来パケットが受信されたときは、ＮＩＣ１７０は、トランスポート層の委任される状態がＮＩＣ１７０に渡されるまで、層３００、３０２、３０４、３０６を介してデータを上に移動させ続ける。
【００４２】
ＴＬＩスイッチ３０６は、トランスポート層３００にオフロード要求を送ることにより（線４００）、オフロードを開始する。オフロード要求は、次の層のローカル状態へのポインタ（例えばトランスポート層３００ではＴＣＢポインタ、ネットワーク層３０２ではＲＣＥポインタ、フレーミング層３０４ではＡＲＰテーブルポインタ、またはＮＤＩＳミニドライバ３１０ではＮＤＩＳミニポートポインタ）、オフロードタイプ（例えばＴＬＩスイッチ３０６ではＴＣＰ、ネットワーク層３０２ではＩＰｖ６など）、および、ＮＩＣ１７０がＴＣＰ接続をうまくオフロードできるかどうか決定する助けとなるリソース情報を含む。ＴＬＩスイッチ３０６はまた、ディスパッチテーブルをＮＩＣ１７０に提供することもできる。トランスポート層３００は、オフロード要求を拒否するか、あるいは、ＴＣＰリソース情報をＴＬＩスイッチリソース情報に付加して、オフロード要求をネットワーク層３０２に送る（線４０２）。
【００４３】
ネットワーク層３０２は、オフロード要求を受け取り、接続のオフロードを拒否するか、あるいは、ＴＣＰリソース情報およびＴＬＩスイッチリソース情報にネットワークリソース要件を付加して、オフロード要求をフレーミング層３０４に送る（線４０４）。ネットワーク層３０２はまた、ディスパッチテーブルをＮＩＣ１７０に送ることもできる。フレーミング層３０４は、接続のオフロードを拒否するか、あるいは、ネットワークリソース要件、ＴＣＰリソース情報、およびＴＬＩスイッチリソース情報にフレーミングリソース要件を付加して、オフロード要求をＮＩＣ１７０に送る（線４０６）。
【００４４】
ＮＩＣ１７０は、オフロード要求を受け取り、ＴＣＰ接続をオフロードするのに利用可能なリソースがあるかどうかを計算する。オフロードが不可能であると判定した場合は、ＮＩＣはオフロード要求を拒否する。オフロードが可能であると判定した場合は、ＮＩＣはオフロード要求を受け入れ、この接続のためのリソース（例えばＴＣＢ、ルートキャッシュエントリ（ＲＣＥ）、アドレス解決プロトコル（ＡＲＰ）テーブルエントリ（ＡＴＥ））を割り振る。ＮＩＣ１７０は、層３００、３０２、３０４、３０６に渡すためにパラメータのリンクリストおよびディスパッチテーブルを生み出し、パラメータのリンクリストを有する完了メッセージをフレーミング層３０４に送ることによってオフロード要求を完了する（線４０８）。パラメータは、各層３００、３０２、３０４、３０６ごとのオフロードハンドルおよびディスパッチテーブルを含む。本明細書において、オフロードハンドルとは、ソフトウェア層が周辺デバイスと通信できるようにする機構を意味する。限定ではなく例として、オフロードハンドルは、ポインタベースのハンドル、配列のルックアップとして使用される整数値、ハッシュテーブル（例えばハッシング関数）、ソフトウェア層（またはネットワークスタック）と周辺デバイスとの間の通信チャネルとすることができ、または、周辺デバイスが状態オブジェクトをルックアップするのに使用する、ソフトウェア層から伝えられたパラメータのセットとすることができる。
【００４５】
ディスパッチテーブルは、データをＮＩＣ１７０に直接送るかまたはデータをＮＩＣ１７０から直接受け取るのに使用される。ディスパッチテーブルはまた、診断を提供するのに使用することもできる。例えば、システムが正しく機能しているようにするために、システムを監視して障害を注入するソフトウェア層を追加することができる。さらに、必要なら、追加機能を加えることのできるソフトウェア層でディスパッチテーブルにパッチを当てることもできる。例えば、フィルタドライバの機能を提供するソフトウェア層を追加することができる。パッチを当てるのは、通常、追加機能を挿入する場所で元の機能へのポインタをとって、追加機能にリダイレクトする（すなわちポイントする）ことによって行う。パッチが挿入された後、元の機能が呼び出されたとき、追加機能はその機能を実施してから元の機能を呼び出す。
【００４６】
フレーミング層３０４は、フレーミング層についてのオフロードハンドルおよびディスパッチテーブルをそのＡＲＰテーブルエントリに記憶し、宛先ＭＡＣアドレスが変化した場合またはカプセル化タイプが変化した場合に更新しやすくする。次いでフレーミング層３０４は、ＡＴＥに関連するＮＩＣ１７０の状態を更新する（線４１０）。フレーミング層３０４は、その状態をリンクリストから除去し、リンクリスト中の残りの情報をネットワーク層３０２に転送する（線４１２）。
【００４７】
ネットワーク層３０２は、ネットワーク層３０２についてのオフロードハンドルおよびディスパッチテーブルを記憶する。ネットワーク層３０２もまた、その状態をＮＩＣ１７０に送る（線４１４）。ネットワーク層３０２は、ネットワーク層情報をリンクリストから除去し、パラメータのリンクリストおよびディスパッチテーブルを有する完了メッセージをトランスポート層３００に送る（線４１６）。ネットワーク層３０２は、オフロード状態について受け取るＩＰフラグメントをＮＩＣ１７０に転送して、処理されるようにすることもでき、あるいはＩＰフラグメントをネットワーク層で処理して、トランスポート層３００に転送することもできる。
【００４８】
代替実施形態では、層の状態オブジェクトはオフロード要求と共に送られる。例えば、フレーミング層状態オブジェクトおよびネットワーク層状態オブジェクトはオフロード要求と共に送られ、キャッシュされる状態がオフロード要求と完了イベントとの間で変化したときだけ状態は更新される。層の状態オブジェクト全体は、委任される状態が存在しない場合、または委任される状態がオフロード要求とオフロード要求完了との間で変化し得ない場合だけ、オフロード要求と共に送ることができる。ただし、委任される状態が存在し、オフロード要求とオフロード要求完了との間で変化し得る場合であっても、ＣＯＮＳＴとして分類される状態変数は、オフロード要求と共に送ることができる。
【００４９】
トランスポート層３００は、トランスポート層についてのオフロードハンドルを記憶し、その状態をＮＩＣ１７０に送る（線４１８）。未解決の送信バッファまたは受信バッファが保留中である場合は、トランスポート層３００はバッファをＴＬＩスイッチ３０６に返す。トランスポート層３００がバッファをＴＬＩスイッチ３０６に戻し始めると、ＴＬＩスイッチ３０６は、バッファをトランスポート層３００に送るのを停止し、それらをキューに入れ、トランスポート層３００からＴＬＩスイッチ３０６にパラメータのリンクリストおよびディスパッチテーブルを有する完了メッセージが送られてくるのを待機する。トランスポート層３００は、すべてのバッファを返し、次いで完了メッセージを送る（線４２０）。ＴＬＩスイッチ３０６は、完了メッセージを受け取ると、送信バッファおよび受信バッファをＮＩＣ１７０に転送する（線４２２）。ＴＬＩスイッチ３０６は、ディスパッチテーブルを使用して未解決のおよび将来の受信バッファをすべてポストし、処理のためにＮＩＣ１７０に送る。オフロード要求が完了するのにかかる時間の間、各層３００、３０２、３０４は、オフロードされる状態オブジェクト（すなわち層に関連する状態オブジェクト）に対する新しいオフロード要求を拒絶するか、あるいはオフロードが完了するまでそれらをキューに入れる。
【００５０】
トランスポート状態がまだＮＩＣ１７０にオフロードされていない場合、トランスポート層３００は依然として、入来ＴＣＢデータを処理してデータをＴＬＩスイッチ３０６に渡す能力を有する。ＴＣＢデータがオフロードの最中に到着した場合、トランスポート層３００は、データを保持するか、あるいはデータを処理してＴＬＩスイッチ３０６に渡すことができる。トランスポート層３００がその状態をＮＩＣ１７０に送るとき（線４１８）とＴＬＩスイッチがバッファをＮＩＣ１７０に転送するとき（線４２２）との間、ネットワークスタック２０２を通ってくる入来ＴＣＢデータはＮＩＣ１７０に送られる。
【００５１】
後続のオフロード要求時には、ネットワーク層３０２およびフレーミング層３０４は、ＮＩＣ１７０から受け取った前のオフロードからのオフロードハンドルをＮＩＣ１７０に渡す。これにより、ネットワーク層３０２およびフレーミング層３０４のためのリソースがすでに割り振られていることがＮＩＣ１７０に信号で伝えられ、したがって、ＮＩＣリソースが温存され、オフロードが高速化される。
【００５２】
先に示したように、層３００、３０２、３０４は、それらの状態をＮＩＣ１７０に渡す。各状態は、ＣＯＮＳＴ、ＣＡＣＨＥＤ、ＤＥＬＥＧＡＴＥＤの３タイプの変数を有する。ＣＯＮＳＴ変数は、オフロードされた接続の寿命の間は決して変化しない変数である。これらは、接続終了時に層に再び読み込まれることはない。ホスト処理ユニット１２０は、ＣＡＣＨＥＤ変数の所有権を維持し、ホスト処理ユニット１２０中のＣＡＣＨＥＤ変数に変化があった場合にはＮＩＣ１７０中で更新されるようにする。この結果、ホストはＣＡＣＨＥＤ変数を書き込むが、再び読み出すことはない（システム診断がそう要求しない限り）。ホスト処理ユニット１２０は、ＤＥＬＥＧＡＴＥＤ変数の所有権をＮＩＣ１７０に譲渡する。ＤＥＬＥＧＡＴＥＤ変数は、オフロードが行われるときに１度書き込まれ、オフロードが終了したときに再び読み込まれる。接続をホストに転送して戻すオーバーヘッドは、ＤＥＬＥＧＡＴＥＤ変数を転送して戻すだけで最小化される。ホスト処理ユニット１２０は、必要なときにＤＥＬＥＧＡＴＥＤ変数をＮＩＣ１７０に照会する（例えば統計のため）。
【００５３】
トランスポート層３００についてのＣＯＮＳＴ変数は、宛先ポートと、ソースポートと、「気付（ｃａｒｅ−ｏｆ）」アドレスが変化する可能性のあるモバイルＩＰケースがあることを示すフラグと、ＳＥＮＤおよびＲＥＣＶウィンドウスケールファクタと、ネットワーク層３０２についてのＮＩＣハンドルとを含む。トランスポート層３００についてのＣＡＣＨＥＤ変数は、ＴＣＰ変数およびＩＰ変数である。ＴＣＰ変数は、Ｅｆｆｅｃｔｉｖｅ  ＭＳＳ、ＮＩＣ１７０によって受信指示にコピーされるバイトの数、Ｎａｇｌｉｎｇをオフにするフラグ、キープアライブが必要であることを示すフラグ、およびキープアライブ設定（すなわち間隔、プローブ数、およびデルタ）を含む。ＩＰ変数は、ＴＯＳおよびＴＴＬを含む。ＤＥＬＥＧＡＴＥＤ変数は、現在ＴＣＰ状態、次のＲＥＣＶ（すなわちＲＣＶ．ＮＥＸＴ）についてのシーケンス番号、受信ウィンドウサイズ（ＲＣＶ．ＷＮＤ）、Ｆｉｒｓｔ  Ｕｎ−Ａｃｋｅｄ  Ｄａｔａについてのシーケンス番号（ＳＮＤ．ＵＮＡ）、次のＳＥＮＤについてのシーケンス番号（ＳＮＤ．ＮＥＸＴ）、それまで送られた中で最大のシーケンス番号（ＳＮＤ．ＭＡＸ）、最大Ｓｅｎｄ  Ｗｉｎｄｏｗ（ＭＡＸ＿ＷＩＮ）、現在輻輳ウィンドウ（ＣＷＩＮ）、スロースタートしきい値（ＳＳＴＨＲＥＳＨ）、平滑化ＲＴＴ（８＊Ａ）、Ｄｅｌｔａ（８＊Ｄ）、現在再送カウント、Ｎｅｘｔ  Ｒｅｔｒａｎｓｍｉｔに残された時間、およびエコーされるタイムスタンプを含む。
【００５４】
ネットワーク層３０２についてのＣＯＮＳＴ変数は、宛先ＩＰアドレス（ＩＰｖ４とＩＰｖ６のいずれかの場合の）、およびソース宛先ＩＰアドレス（ＩＰｖ４とＩＰｖ６のいずれかの場合の）を含む。ネットワーク層３０２についてのＣＡＣＨＥＤ変数は、フレーミング層３０４についてのＮＩＣハンドルを含む。ネットワーク層３０２についてのＤＥＬＥＧＡＴＥＤ変数は、ＩＰパケットＩＤ開始値を含む。フレーミング層３０４についてのＣＡＣＨＥＤ変数は、ＡＲＰアドレスと、ヘッダのフォーマット（例えばＬＬＣ／ＳＮＡＰ［Ｌｏｇｉｃａｌ  Ｌｉｎｋ  Ｃｏｎｔｒｏｌ／Ｓｕｂ−Ｎｅｔｗｏｒｋ  Ａｃｃｅｓｓ  Ｐｒｏｔｏｃｏｌ］やＤＩＸ［Ｄｉｇｉｔａｌ、Ｉｎｔｅｌ、Ｘｅｒｏｘ］）を示すためのフラグを含む。
【００５５】
トランスポート層の状態は、ネットワーク層についてのハンドルを含み、ネットワーク層の状態は、フレーミング状態についてのハンドルを含む。というのは、ネットワーク層の状態は複数の接続間で共有される可能性があり、フレーミング層の状態は複数のパス間で共有される可能性があるからである（例えばＩＰエイリアス）。この階層はいくつかの理由で維持される。ＩＰ  ＩＤ名前空間はオフロードされる接続すべてにわたってパスごとに管理しなければならないので、接続にはネットワーク層についてのＮＩＣハンドルが必要である。ルート更新が次のホップアドレスを変更し、それにより新しいＭＡＣアドレスをポイントする可能性があるので、パスにはフレーミング層についてのＮＩＣハンドルが必要である。また、この階層により、ＮＩＣが維持する必要のある状態の量が圧縮される。例えば、ＩＰｖ４の場合のＡＲＰ更新は、ＩＰアドレスからＭＡＣアドレスへのマッピングを変更する可能性がある（例えばサーバ上でフェイルオーバされたインタフェース）。ホストは、キャッシュされた変数としてＭＡＣアドレスを維持しており、したがってキャッシュされる状態の更新を１度するだけでよく、すべての接続は新しいインタフェースにフェイルオーバされる。
【００５６】
ＴＣＰ接続がオフロードされると、ＮＩＣ１７０は、送信するパケットに対するパケット識別子（例えばＩＰ  ＩＤ）の割当てを担う。ＩＰ  ＩＤは、インタフェースごとに、または層状態オブジェクトごとにオフロードされる。ＮＩＣ１７０には、ＩＰ  ＩＤ名前空間の一部が割り当てられる。一実施形態では、ＮＩＣ１７０には、ＩＰ  ＩＤ名前空間全体の半分が割り当てられ、ネットワーク状態がＮＩＣ１７０に渡されたときに使用するＩＰパケットＩＤ開始値が与えられる。ＮＩＣ１７０は、以下の式を用いて、送信するＩＰパケットに対するＩＰ  ＩＤを生成する。
Cur_IPID=[(Start_IPID_For_This_Path)+(Counter_For_This_Path)mod32K]mod64K
Counter_For_This_Path=Counter_For_This_Path+1
【００５７】
オフロードされた接続がアップロードされるか無効にされるときは、ＮＩＣ１７０は、使用することになる次のＩＰＩＤ値をネットワーク層に転送して、行われる次のオフロードのために記憶し、ホスト処理ユニット１２０は、割り当てられたＩＰ  ＩＤ名前空間の一部を使用し続ける。ホスト処理ユニット１２０は、ＩＰ  ＩＤ名前空間を全部使用することもできるが、カウンタはオフロードが行われるたびにセットしなければならない。
【００５８】
ＮＩＣ１７０は、データが受け取られた順にデータを受信バッファに配置し、アプリケーションバッファがオフロード接続のためにポストされた順にアプリケーションバッファを満たす。多くのアプリケーションは、受信バッファをポストする前に受信指示を待機する。一実施形態では、ＮＩＣ１７０は、データが接続のために到着したがアプリケーション受信バッファがポストされていない場合に使用するために、大域的なバッファプールを有する。大域的バッファプールは、オフロードされたいくつかの接続にまたがって使用され、１）順番になっていないＴＣＰ送信を処理し、２）ＩＰデータグラムのデフラグメンテーションを実施し、３）アプリケーションがゼロコピーアルゴリズムには小さすぎるバッファをポストしている場合にゼロコピーアルゴリズムではないバッファコピーアルゴリズムを実施するのに使用することができる。あるいは、リソースの効率的使用が問題でない場合は、接続単位のバッファプールを使用することもできる。ただし、ＮＩＣが接続単位のバッファプールをサポートしない場合、またはシステムリソースが不足している場合（例えばアプリケーションバッファをメモリ中に留めておくのに十分なリソースがない場合）は、大域的バッファプールを使用する。
【００５９】
次に図５Ａ〜５Ｄに目を向けると、ＮＩＣ１７０は、オフロード実施後のオフロードを表す逆ツリー５００を有する。図において、点線はＮＩＣ１７０によって割り振られた新しい状態を表す。図５ＡのＮＩＣ１７０では、ＡＲＰエントリ５０２がルートキャッシュエントリ５０４に結合され、ルートキャッシュエントリ５０４はＴＣＰエントリ５０６に結合されている。例えばすべてのトラフィックがルータに行くことになる場合、次のホップは常に同じＡＲＰエントリ５０２へのホップになる。ルートキャッシュエントリ５０４が次のＴＣＰ接続オフロードに使用される場合、新しいリソースはオフロードされる新しいＴＣＢだけである。したがって、オフロードがネットワークスタック２０２の下方に向けて開始したとき、すでに状態をオフロードしている中間ソフトウェア層（例えばネットワーク層３０２やフレーミング層３０４）は、単に、ＮＩＣによって生成されて前のオフロード要求時に割り振られたオフロードハンドルを挿入するだけである。ＮＩＣ１７０は、新しいリソース（例えばＴＣＰエントリ５０８）を割り振り、新しいリソースについてのオフロードハンドルをネットワークスタック２０２を通して上に送り返すだけでよい。このとき逆ツリー５００では、ＴＣＰエントリ５０８がルートキャッシュエントリ５０４に結合されている（図５Ｂ参照）。この手法は、ＮＩＣリソースを節約し、オフロードを高速化する。さらに、キャッシュされる変数状態が変化した場合も、単一の構造を更新するだけでよい。もしチムニー中の様々なソフトウェア層についてのすべての状態が単一のエントリとしてオフロードされたとすれば、最上部のソフトウェア層よりも下の状態更新は、複数の更新を必要とすることになる。
【００６０】
図５Ｃには、逆ツリー５００のより詳細な構成を示す。ＡＲＰテーブルエントリ５０２を通る２つのルートキャッシュエントリ５０４および５１０がある。ＴＣＰ接続５０６および５０８がルートキャッシュエントリ５０４を使用する。ＴＣＰ接続５１２および５１４がルートキャッシュエントリ５１０を参照する。ＡＲＰ更新が行われる場合（例えばマルチホームサーバのインタフェースがフェイルオーバする場合）は、エントリ５０２だけを更新すればよい。これにより、ＮＩＣ１７０への更新を１度しか必要とせずに、何千も何十万もあるかもしれない接続を新しいインタフェースにフェイルオーバすることができる。図５Ｄには、独立した２つの逆ツリー（エントリ５０２〜５０８およびエントリ５１０〜５１６）が、ルート更新の実施後に単一の逆ツリー５００にマージされたのを示す。ルート更新前は、ルートキャッシュエントリ５１０に対する次のホップＡＲＰエントリはＡＲＰテーブルエントリ５１６である。ルート更新後は、次のホップＡＲＰテーブルエントリはＡＲＰテーブルエントリ５０２である。したがって、逆ツリーを用いると、ルート更新は、ネットワークスタック状態が単一のエントリとしてオフロードされた場合の何千や何万もの更新ではなく、ＮＩＣ１７０への単一のトランザクションとして処理することができる。
【００６１】
次に図６に目を向けるが、接続がＮＩＣ１７０にオフロードされた後は、ＮＩＣ１７０へのパスは２つある。第１のパスは、ＮＤＩＳミニドライバ３１０を通り、フレーミング層３０４、ネットワーク層３０２、およびトランスポート層３００を通る。第２のパスはオフロード接続６０８を通り、これはチムニーと呼ばれる。ホストコンピュータからみると、通信の点では２つのパスについてすべて同じである。キャッシュされる状態変数が２つのパスを同期させ、処理ユニット１２０は、先に示したようにＮＩＣ１７０中のキャッシュされる状態変数を更新する。キャッシュされる変数の更新を矢印６０２、６０４、６０６で示す。
【００６２】
入来データパケットが到着したとき、ＮＩＣ１７０は、入来データパケットがオフロードされるパスを通るかオフロードされないパス（すなわちＮＤＩＳミニドライバ３１０および層３０４、３０２、３００のＮＤＩＳパス）を通るかを決定する。一実施形態では、ＮＩＣ１７０は、ソースおよび宛先ＴＣＰポート番号と、ソースおよび宛先ＩＰアドレスと、プロトコルタイプとに対してハッシング関数を実施することにより、どちらのパスに入来データパケットを送るかを決定する。ハッシュがオフロードされる接続パラメータと一致する場合（すなわち、ハッシュバケットチェーンが調べられ、接続のタプルすべての一致が生じる場合）は、チムニー６０８を使用する。ハッシュがハッシュインデックスと一致しない場合は、ネットワークスタック２０２を通るオフロードされないパスを使用する。キャッシュされる状態を更新する制御メッセージが、ホストによって処理される。この結果、ＮＩＣ１７０は、ＩＣＭＰ、ＤＮＳ、ＲＩＰメッセージなど、オフロードされる接続の外にあるどんな制御メッセージも処理する必要がない。
【００６３】
本発明は、Ｎｅｔｓｔａｔなど既存のツールを使用して、ホスト上のすべての接続や、プロトコルタイプ、ローカルとリモートのポートおよびＩＰアドレスバインディング、接続の状態、プロセスＩＤなどの接続パラメータを含めた、様々な情報を取り出し、統計を導き出す能力をユーザに提供する。本発明では、統計は、層ごとまたは層状態オブジェクトごとに収集される。１つの層内で層状態オブジェクトをグループ化して、複数の層状態オブジェクトにわたる統計を収集することができる。例えば、ネットワーク層についての統計は、使用されるプロトコル（例えばＩＰｖ４およびＩＰｖ６）ごとの統計になるように分割することができる。ＣＯＮＳＴおよびＣＡＣＨＥＤ状態変数に関連する統計はホストから提供され、ＤＥＬＥＧＡＴＥＤ状態変数に関連する統計は周辺デバイス２０４から提供される。照会が行われたとき、ＤＥＬＥＧＡＴＥＤ状態変数に関連する統計は、ＣＯＮＳＴおよびＣＡＣＨＥＤ状態変数に関連する統計に添付される。
【００６４】
パケットカウントなどのように、ホスト層状態と周辺デバイス層状態のグループ化全体にわたって合計される種類の統計もある。別のタイプの統計は、システム中にある機能の状態のリストである（例えばシステム中のあらゆるＴＣＢの状態のリスト）。ＴＣＢについての統計は、ホストによって追跡される統計と周辺デバイスによって追跡される統計とが組み合わさったものである。同様に、パケットカウントについての統計は、ホスト層状態の統計と周辺デバイス層状態の統計の合計である。
【００６５】
以下の表１に、ＴＣＰ  ＭＩＢ（管理情報ベース）の場合におけるホストと周辺デバイス２０４との分割の例を示し、以下の表２に、ＩＰｖ４  ＭＩＢ統計を提示する。表では、第１列はフィールドであり、第２列は、統計の追跡を周辺デバイスが担当するかホストネットワークスタックが担当するかを指定し、第３列は、各フィールドがどのように追跡されるかを示す。周辺デバイスが担当する統計は、層状態オブジェクトごとまたは層ごとに追跡される。本明細書において、層ごととは、プロトコルごとの周辺デバイスごとの層ごとに統計が追跡されることを意味する。ただし、ホスト状態と周辺デバイスからの状態で統計が統合されるときは、統計は概してプロトコルごとに提示されることに留意されたい。ホストネットワークスタックが周辺デバイスに照会せずに生成することのできる統計は、「スタックが完全な情報を有する」または「スタックだけで行われる」として類別している。「スタックが完全な情報を有する」カテゴリは、周辺デバイスが統計について知っているが統計を追跡しないことを示す。「スタックだけで行われる」統計は、周辺デバイスが統計について知らないことを示す。通常のＮＤＩＳインタフェースを介して、アダプタ統計に照会する。アダプタ統計は、ｂｙｔｅｓ  ｓｅｎｔやｂｙｔｅｓ  ｒｅｃｅｉｖｅｄなどの変数を含む。
【００６６】
【表１】
0004327496.tif 000002
【００６７】
ｔｓ＿ＲｔｏＡｌｇｏｒｉｔｈｍは、肯定応答されなかったオクテットを再送するのに用いられるタイムアウト値を決定するのに使用されるアルゴリズムの値である。ｔｓ＿Ｒｔｏ＿Ｍｉｎは、ミリ秒で測定された送信タイムアウトに関する、ＴＣＰ実装によって許容される最小値の値である。ｔｓ＿Ｒｔｏ＿Ｍｉｎは、ミリ秒で測定された再送タイムアウトに関する、ＴＣＰ実装によって許容される最大値である。ｔｓ＿ＭａｘＣｏｎｎは、サポートできるＴＣＰ接続の総数である。ｔｓ＿ＡｃｔｉｖｅＯｐｅｎｓは、ＴＣＰ接続がＣＬＯＳＥＤ状態からＳＹＮ＿ＳＥＮＴ状態への直接移行を行った回数である。ｔｓ＿ＰａｓｓｉｖｅＯｐｅｎｓは、ＴＣＰ接続がＬＩＳＴＥＮ状態からＳＹＮ＿ＲＣＶＤ状態への直接移行を行った回数である。ｔｓ＿ＡｔｔｅｍｐｔＦａｉｌｓは、ＴＣＰ接続がＳＹＮ＿ＳＥＮＴ状態およびＳＹＮ＿ＲＣＶＤ状態のいずれかからＣＬＯＳＥＤ状態への直接移行を行った回数と、ＴＣＰ接続がＳＹＮ＿ＲＣＶＤ状態からＬＩＳＴＥＮ状態への直接移行を行った回数とを足した回数である。ｔｓ＿ＥｓｔａｂＲｅｓｅｔｓは、ＴＣＰ接続がＥＳＴＡＢＬＩＳＨＥＤ状態およびＣＬＯＳＥ＿ＷＡＩＴ状態のいずれかからＣＬＯＳＥＤ状態への直接移行を行った回数である。ｔｓ＿ＣｕｒｒＥｓｔａｂは、現在の状態がＥＳＴＡＢＬＩＳＨＥＤおよびＣＬＯＳＥ＿ＷＡＩＴのいずれかであるＴＣＰ接続の数である。ｔｓ＿ＩｎＳｅｇｓは、エラーで受信されたものを含めた受信セグメントの総数である。ｔｓ＿ＯｕｔＳｅｇｓは、再送オクテットしか含まない接続を除いた現在の接続上にある送信セグメントの総数である。ｔｓ＿ＲｅｔｒａｎｓＳｅｇｓは、再送されたセグメントの総数である。ｔｓ＿ＩｎＥｒｒｓは、エラー（例えば不良ＴＣＰチェックサム）で受信されたセグメントの総数である。ｔｓ＿ＯｕｔＲｓｔｓは、ＲＳＴフラグを含む送信済みＴＣＰセグメントの数である。ｔｓ＿ＮｕｍＣｏｎｓは、現存するＴＣＰ接続の総数である。
【００６８】
【表２】
0004327496.tif 000003
【００６９】
ｉｐｓｉ＿Ｆｏｒｗａｒｄｉｎｇは、ホスト宛ではないがホストによって受信されたデータグラムの転送に関して、ホストがＩＰルータとして働いているかどうかの指標を提供する値である。ｉｐｓｉ＿ＤｅｆａｕｌｔＴＴＬは、ＴＴＬ値がトランスポート層プロトコルから供給されないときに、このエンティティで発生するデータグラムのＩＰヘッダのＴｉｍｅ−Ｔｏ−Ｌｉｖｅフィールドに挿入されるデフォルト値である。ｉｐｓｉ＿ＩｎＲｅｃｅｉｖｅｓは、エラーで受信されたものを含めた、インタフェースから受信された入力データグラムの総数である。ｉｐｓｉ＿ＩｎＨｄｒＥｒｒｏｒｓは、バッドチェックサム、バージョン番号不一致、その他のフォーマットエラー、生存時間の超過、入力データグラムのＩＰオプションの処理中に発見されたエラーなどを含めて、入力データグラムのＩＰヘッダにあるエラーのせいで廃棄された入力データグラムの数である。ｉｐｓｉ＿ＩｎＡｄｄｒＥｒｒｏｒｓは、入力データグラムのＩＰヘッダの宛先フィールドにあるＩＰアドレスがホストで受信される有効アドレスではなかったために廃棄された入力データグラムの数である。ｉｐｓｉ＿ＦｏｒｗＤａｔａｇｒａｍｓは、ホストが入力データグラムの最終ＩＰ宛先ではなく、そのため最終宛先に転送するルートを見つける試みがなされた入力データグラムの数である。ｉｐｓｉ＿ＵｎｋｎｏｗｎＰｒｏｔｏｓは、うまく受信されたが未知のまたはサポートされないプロトコルであるために廃棄された、ローカルにアドレス指定されたデータグラムの数である。ｉｐｓｉ＿ＩｎＤｉｓｃａｒｄｓは、継続処理を阻む問題には遭遇しなかったが廃棄された（例えばバッファ空間の不足により）、入力ＩＰデータグラムの数である。ｉｐｓｉ＿ＩｎＤｅｌｉｖｅｒｓは、うまくＩＰユーザプロトコルに送達された入力データグラムの総数である。ｉｐｓｉ＿ＯｕｔＲｅｑｕｅｓｔｓは、ローカルＩＰユーザプロトコル（ＩＣＭＰを含む）が送信要求に応じてＩＰに供給したＩＰデータグラムの総数である。ｉｐｓｉ＿ＲｏｕｔｉｎｇＤｉｓｃａｒｄｓは、有効であるにもかかわらず廃棄が選択されたルーティングエントリの数である。ｉｐｓｉ＿ＯｕｔＤｉｓｃａｒｄｓは、宛先に送信されるのを阻む問題には遭遇しなかったが廃棄された（例えばバッファ空間の不足により）、出力ＩＰデータグラムの数である。ｉｐｓｉ＿ＯｕｔＮｏＲｏｕｔｅｓは、宛先に送信するためのルートが見つからなかったために廃棄されたＩＰデータグラムの数である。ｉｐｓｉ＿ＲｅａｓｍＴｉｍｅｏｕｔは、受信フラグメントがホストで再アセンブルされるのを待機している間に受信フラグメントが保持される最大秒である。ｉｐｓｉ＿ＲｅａｓｍＲｅｑｄｓは、ホストで再アセンブルする必要のあった受信ＩＰフラグメントの数である。ｉｐｓｉ＿ＲｅａｓｍＯＫｓは、うまく再アセンブルされたＩＰデータグラムの数である。ｉｐｓｉ＿ＲｅａｓｍＦａｉｌｓは、ＩＰ再アセンブリアルゴリズムによって検出された障害（例えばタイムアウトやエラーなど）の数である。ｉｐｓｉ＿ＦｒａｇＯＫｓは、ホストでうまくフラグメント化されたＩＰデータグラムの数である。ｉｐｓｉ＿ＦｒａｇＦａｉｌｓは、ホストでフラグメント化する必要があるのにそうすることができなかったために廃棄された、例えばＤｏｎ’ｔ  Ｆｒａｇｍｅｎｔフラグがセットされていたために廃棄された、ＩＰデータグラムの数である。ｉｐｓｉ＿ＦｒａｇＣｒｅａｔｅｓは、ホストにおけるフラグメント化によって生成されたＩＰデータグラムフラグメントの数である。ｉｐｓｉ＿ＮｕｍＩｆは、使用可能なインタフェースの総数である。ｉｐｓｉ＿ＮｕｍＡｄｄｒは、システム上の固有ＩＰアドレスの総数である。ｉｐｓｉ＿ＮｕｍＲｏｕｔｅｓは、現在アクティブなルートの総数である。
【００７０】
本発明は、オフロードされたネットワーク接続を周辺デバイスからホストにアップロードする方法も提供する。アップロードが行われるのには多くの理由がある。限定ではなく例として、いくつかの理由を次に挙げる。ルートが変更され、トラフィックを異なるインタフェース上に送ることが必要になる場合がある。接続トラフィック挙動が変化し、したがってもはやオフロードに適さなくなる場合もある。例えば、トラフィックが不十分であったり、アクティビティが不足していたり、接続が設定時間よりも長くフロー制御されていたりする（例えばウィンドウ更新が受信されていない）ことがある。さらに、周辺デバイスが特定の機能をサポートできない場合もあり、また、過剰なＩＰフラグメント、順番になっていない過剰なトラフィック、帯域外データの使用、過剰な再送がある場合や、キープアライブがタイムアウトした場合、セキュリティ関連付けが無効になり更新されない場合、過剰なデータが周辺デバイスに転送されている場合は、トラフィック挙動がオフロードに適さないことがある。オフロードされた接続をアップロードすることに対する他の理由は、リソースの問題によるものである。例えば、接続の処理を継続するためのリソースが周辺デバイスに不足している場合がある。別の接続が、オフロードされた接続よりも高い優先度を有することがあり、周辺デバイスのリソース使用可能性がしきい値よりも低いときに接続をアップロードすれば、優先度のより高い接続が周辺デバイスのリソースを使用し続けることができる場合がある。
【００７１】
システムリソースは、オフロードされた接続を処理するためのリソースをホストプロセッサが有するように、変更されている場合がある。チムニーは、元のオフロードとは異なるリソースを必要とする場合がある（例えばセキュリティフィルタ変更など）。ホストは、周辺デバイスのリソースがしきい値レベルに近づいているかどうかを判定することができ、この場合、オフロード接続はホスト処理ユニットによってより効率的に処理される。例えばしきい値には、トラフィックサイズ（バイト数またはパケット数）、フラグメント数、ウィンドウサイズ、オフロードタイプを含めることができる。
【００７２】
次に図７に目を向けると、アップロードは、周辺デバイス２０４（例えばＮＩＣ１７０）とＴＬＩスイッチ３０６のいずれかによって開始される。接続は様々な理由でアップロードされることがある。これらの理由には、接続が別の周辺デバイスに移動すること、メディア切断の発生、順番になっていない過剰なセグメント、過剰なデータが周辺デバイス２０４に転送されること、アプリケーション２００がバッファを事前ポストしないこと、過剰なＩＰフラグメント、低帯域接続、過剰な再送が含まれる。
【００７３】
図７は、ＴＬＩスイッチ３０６がアップロードを開始する場合を示している（線７００）。ＮＩＣ１７０がアップロードを開始する場合は、線７００は存在しないことに留意されたい。アップロードが開始されると、ＮＩＣ１７０はすべての未解決要求を適切な状態で完了し、委任されるトランスポート層状態をスイッチ層に渡す（線７０２）。ＮＩＣ１７０は、送信を完了しない、または受信バッファを完全に満たさない場合もある。ＮＩＣ１７０は、すべての送受信状態が、トランスポート層３００に戻される委任される状態と同期するようにするだけである。ＴＬＩスイッチ３０６は、それ以上の送信要求があればそれらをキューに入れ、受信バッファのポストを停止する。ＴＬＩスイッチ３０６は、委任されるトランスポート状態の制御を獲得するようトランスポート層に命じる（線７０４）。トランスポート層３００は、受け取ったセグメントをＮＩＣ１７０に転送するのを停止し、委任される状態の制御を獲得し、完了メッセージをＴＬＩスイッチ３０６に送る（線７０６）。ＴＬＩスイッチ３０６は、トランスポート層３００が委任されるトランスポート状態の制御を握った旨の確認を受け取った後、ＮＩＣ１７０にアップロードを確認し（線７０８）、それによりＮＩＣ１７０はリソースを開放することができる。トランスポート層３００はまた、完了メッセージをＴＬＩスイッチ３０６に送る前またはその後に、アップロードする接続をネットワーク層３０２に通知する（線７１０）。
【００７４】
トランスポート層３００は、委任される状態の制御を獲得する（線７０６）までは、オフロードされた接続に関する入来データパケットをＮＩＣ１７０に転送して、処理されるようにすることに留意されたい。データパケットは、ＮＩＣ１７０が委任される状態をＴＬＩスイッチ３０６に渡すとき（線７０２）と、トランスポート層３００が委任される状態の制御を獲得するとき（線７０６）との間に到着するかもしれない。ＮＩＣ１７０は、委任される状態をＴＬＩスイッチ３０６に渡した後はもう入来データパケットを処理することができない。アップロード接続に関する入来パケットを受信したときは、ＮＩＣ１７０は、アップロードが進行中であることを示すエラーメッセージをトランスポート層３００に送り、場合によってはこれらの入来パケットを廃棄する。エラーメッセージは、入来データの転送を停止するようトランスポート層３００に通知する。一実施形態では、トランスポート層３００は、委任される状態を受け取るまではそれ以上のデータをバッファに入れる。
【００７５】
複数の接続を中間ソフトウェア層から周辺デバイスにオフロードすることもできる。中間ソフトウェア層は、中間ソフトウェア層から周辺デバイスにオフロードされた接続の数に関する参照カウンタを維持する。参照カウントが０になる場合、次の中間ソフトウェア層へのアップロード要求が生成される。これにより、次の層の参照カウントがデクリメントされる。次の層の参照カウントが０になる場合、アップロード要求はネットワークスタック２０２中を下降し続ける。中間ソフトウェア層の参照カウントが０でなくなるか、または周辺デバイスがアップロード要求を受け取るまで、このプロセスが繰り返される。ネットワーク層３０２は、ＮＩＣ１７０に関連するオフロードされた状態オブジェクトの数に関する参照カウントをデクリメントする。参照カウントが０になる場合は、ＮＩＣ１７０中でネットワーク層３０２のために割り振られたリソースを使用しているＴＣＢはない。参照カウントが０になるとき、ネットワーク層３０２はＮＩＣ１７０にメッセージを送り、ネットワーク層３０２についての状態オブジェクトをアップロードして委任されるネットワーク状態変数をネットワーク層３０２に送るよう伝える（線７１２）。ＮＩＣ１７０は、状態を削除して、委任されるネットワーク状態変数およびＮＩＣ１７０が使用したであろう次のＩＰＩＤ値をネットワーク層３０２に送る（線７１４）。ネットワーク層３０２は、接続が再びオフロードされた場合に初期値として使用するために、この情報を記憶する。ネットワーク層３０２はフレーミング層３０４にもメッセージを送り、フレーミング層３０４にその参照カウントをデクリメントさせる（線７１６）。
【００７６】
フレーミング層３０４もまた参照カウントを維持し、ネットワーク層３０２からメッセージを受け取ったときにその参照カウントをデクリメントする。フレーミング層３０４中の参照カウントが０になる場合、フレーミング層は、フレーミング層状態を削除するようＮＩＣ１７０にメッセージを送る（線７１８）。ＮＩＣ１７０は、ＮＩＣ１７０中の状態変数を削除し、委任される状態変数があればフレーミング層に送る（線７２０）。フレーミング層３０４はネットワーク層３０２に完了メッセージを送り（線７２２）、ネットワーク層３０２はトランスポート層に完了メッセージを送る（線７２４）。
【００７７】
ＴＣＰ接続は、その存続期間のいずれかの時点で、ＩＰＳＥＣなどのセキュリティプロトコルを使用したセキュア接続を用いることが必要な場合がある。接続がＩＰセキュアであり周辺デバイス２０４がセキュリティを扱うことができない場合、接続をオフロードすることはできない。セキュアＩＰ接続をオフロードするときは、前述のようにセキュリティ関連状態をＣＯＮＳＴ変数、ＣＡＣＨＥＤ変数、およびＤＥＬＥＧＡＴＥＤ変数に分割して扱う。ホスト処理ユニット１２０は、鍵の再交渉などの制御メッセージを管理する。周辺デバイス２０４は、セキュリティアソシエーション状態変数を使用して、必要なすべてのＩＰＳＥＣデータ操作を実施する。
【００７８】
次に図８に目を向けると、セキュア接続をオフロードするステップが示されている。以下の記述では、図４に示した前述のステップは同じであり、繰り返し記述しない。例示のために、トランスポートモードで動作するＩＰＳＥＣ接続を用いる。トランスポート層３００が、ＴＣＰリソース情報をＴＬＩスイッチリソース情報に追加したオフロード要求をＩＰＳＥＣ層８００に送ったとき、ＩＰＳＥＣ層オフロードが開始する（線４０２’）。ＩＰＳＥＣ層８００は、ＩＰＳＥＣリソース要件をＴＣＰリソース情報およびＴＬＩスイッチリソース情報に追加したオフロード要求を、ネットワーク層３０２に送る（線８０２）。リソース要件は、ＩＰＳＥＣ層がオフロードしたいセキュリティアソシエーションの数を含む。ＮＩＣがオフロード要求を受け入れる場合、ＮＩＣはセキュリティアソシエーションを扱うためのリソースを割り振る。ネットワーク層３０２は、パラメータのリンクリストおよびディスパッチテーブルを有する完了メッセージを、トランスポート層３００ではなくＩＰＳＥＣ層に送る（線８０４）。
【００７９】
ＩＰＳＥＣ層８００は、完了メッセージを受け取ると、ＩＰＳＥＣ状態が前にオフロードされていない場合はＩＰＳＥＣ層状態をインバウンド記述子およびアウトバウンド記述子の一部としてＮＩＣ１７０に送り、セキュリティアソシエーション中の委任される状態の所有権をＮＩＣ１７０に譲渡する（線８０６）。状態が前にオフロードされている場合は、ＩＰＳＥＣ層は参照カウントをインクリメントする。所有権が譲渡されると、ＮＩＣ１７０はすべてのパケットを復号および暗号化する。ＩＰＳＥＣ層８００は、パラメータのリンクリストおよびディスパッチテーブルを有する完了メッセージをトランスポート層に送る（線４１４’）。
【００８０】
ＩＰＳＥＣ層８００からＮＩＣ１７０に渡されるＣＯＮＳＴ状態変数は、パケットを特定のセキュリティアソシエーションに分類するのに必要な情報と、インバウンドおよびアウトバウンドのセキュリティアソシエーションに固有の情報からなる。ＣＯＮＳＴ変数は、ソースおよび宛先ポート、プロトコルタイプ、およびセキュリティアソシエーション変数を含む。
【００８１】
ＣＡＣＨＥＤ状態変数は、セキュリティアソシエーションの存続期間を決定するファクタと、インバウンドおよびアウトバウンドのセキュリティアソシエーションに固有の情報を備える。ＣＡＣＨＥＤ変数は、暗号化されるバイトに基づくソフト制限（例えばバイトカウントに対する鍵更新（ｒｅｋｅｙ））およびハード制限（例えばバイトカウントに対するストップ）、セキュリティアソシエーションを使用できる最大回数に関するソフト制限（例えば事前定義済みティックでの鍵更新）およびハード制限（例えば事前定義済みティックでのストップ）、セキュリティアソシエーションを使用できる最大アイドル時間に関するハード制限（例えば最大アイドルティック）を含む。ソフト制限に達したときは、ＮＩＣ１７０はホスト処理ユニット１２０に通知する。ハード制限に達したときは、ＮＩＣ１７０はセキュリティアソシエーションを廃棄する。
【００８２】
ＤＥＬＥＧＡＴＥＤ変数は、実行情報（ｒｕｎｎｉｎｇ  ｉｎｆｏｒｍａｔｉｏｎ）と、インバウンドおよびアウトバウンドのセキュリティアソシエーションに固有の情報とを含む。ＤＥＬＥＧＡＴＥＤ変数は、セキュリティアソシエーションで暗号化または復号されるバイトのカウント、セキュリティアソシエーションの存続時間、およびセキュリティアソシエーションのアイドル時間を含む。
【００８３】
次に図９に目を向けると、ＩＰＳＥＣを使用してオフロード済みネットワーク接続を周辺デバイスからホストにアップロードする場合が示されている。以下の記述では、図７に示した前述のステップは同じであり、繰り返し記述しない。トランスポート層３００は、完了メッセージをスイッチ層３０６に送る前またはその後に、アップロードする接続をＩＰＳＥＣ層８００に通知する（線７１０’）。すべてのセキュリティアソシエーションに関連する参照カウントがデクリメントされる。０になる参照カウントがない場合は、ＩＰＳＥＣ層８００は完了メッセージをトランスポート層３００に送る（線７２４’）。オフロードされている接続が、特定のセキュリティアソシエーションを使用する最後の接続である場合は、ＩＰＳＥＣ層８００はＮＩＣ１７０にメッセージを送り、委任される状態変数をＩＰＳＥＣ層８００にアップロードするよう伝える（線９００）。ＮＩＣ１７０は、委任される状態変数をＩＰＳＥＣ層８００に返す（線９０２）。ＮＩＣ１７０は、セキュリティアソシエーションの使用を停止し、セキュリティアソシエーションに属するパケットをスタック２０２を介してＩＰＳＥＣ層８００に送る。ＩＰＳＥＣ層８００はＮＩＣ１７０に完了メッセージを送り、ＮＩＣ１７０は、セキュリティアソシエーションのために割り振られたリソースを開放する（線９０４）。
【００８４】
セキュリティアソシエーションの参照カウントが０になる場合は、ＩＰＳＥＣ層８００はネットワーク層３０２にもメッセージを送り、アップロードされる状態をネットワーク層３０２に通知する（線９０６）。フレーミング層３０４がネットワーク層３０２に完了メッセージを送った後（線７２２）、ネットワーク層３０２はＩＰＳＥＣ層に完了メッセージを送る（線９０８）。ＩＰＳＥＣ層８００は、トランスポート層に完了メッセージを送る（線７２４’）。
【００８５】
トランスポート層３００、ネットワーク層３０２、フレーミング層３０４、またはＩＰＳＥＣ層８００についての状態がオフロードされているとき、更新（例えばＡＲＰ更新やＲＩＰ更新）が到着する可能性がある。完了メッセージが受け取られる前に更新が行われる場合は、単にローカル状態が更新され、オフロード要求と共に状態オブジェクトが送られた場合に状態が変更されたことを示すフラグがセットされる。
【００８６】
キャッシュされる状態を更新するためのＮＩＣの更新ルーチンが呼び出されている間に更新が行われる場合、競合があり得る。別個のメッセージが次いで状態を更新し、それによりＮＩＣ更新ルーチンが呼び出された場合、ＮＩＣは、スケジューリングの問題のせいで２番目の呼出しを先とみなし、元の更新が到着したときに古いデータを使用することになる可能性がある。古いデータが使用された場合、次の更新が到着するまで誤ったエントリが使用されることになり、多量のデータが誤った場所に送信されるか、あるいはドロップされる可能性がある。この競合状況に対しては２つの解決法が考えられる。第１の考えられる解決法は、完了メッセージが常に第２の更新を実施するようにすることだが、この結果、多数の更新が入来した場合に再帰問題が生じる可能性がある。第２の考えられる解決法は、更新にシーケンス番号を付加して、一番最近のシーケンス番号を常に使用するようにすることである。
【００８７】
ＩＰＳＥＣがサポートする別の動作モードはトンネリングであり、トンネリングでは、データパケットがセキュア接続の一部として新しいパケットにカプセル化される。トンネルは、ネットワークスタック２０２に対しては仮想インタフェースに見える。ＩＰＳＥＣトンネルをオフロードするステップは、トランスポートモードでＩＰＳＥＣ接続をオフロードするステップと同様である。トランスポートモードでは、ＩＰＳＥＣヘッダがＩＰヘッダとＴＣＰヘッダとの間に配置される。トンネルモードでは、ＵＤＰを用いてトンネルを提供する。ヘッダチェーンは、ＴＣＰヘッダ、ＩＰＳＥＣヘッダ、ＵＤＰヘッダ、ＩＰヘッダ、フレーミング層ヘッダと続く。トンネルを確立するために、交渉されたセキュリティ接続を記述するインバウンド記述子およびアウトバウンド記述子を周辺デバイスに送る。記述子は、接続についての状態変数と、接続を確立するのに必要な他の情報を含む。トンネルについてのＣＡＣＨＥＤおよびＤＥＬＥＧＡＴＥＤ状態変数は、トランスポートモードのＣＡＣＨＥＤおよびＤＥＬＥＧＡＴＥＤ状態変数と同じである。トンネルについてのＣＯＮＳＴ状態変数は、ソースおよび宛先ポート、ローカルアドレス、リモートアドレス、プロトコルタイプ、およびセキュリティアソシエーション変数を含む。
【００８８】
ホスト処理ユニットとの密な同期を維持して、ネットワークスタック接続を周辺デバイスにオフロードおよびアップロードする方法について述べた。この方法は多くのプロトコルで用いることができる。例えば、使用できるプロトコルにはＴＣＰやＳＣＴＰなどが含まれる。
【００８９】
本発明の原理を適用できる多くの可能な実施形態に鑑みれば、図面に関して本明細書に述べた実施形態は例示的なものでしかなく、本発明の範囲を限定するものと解釈すべきではないことが理解されるであろう。例えば、本発明の趣旨を逸脱することなく、ソフトウェアで示した例示的実施形態の要素をハードウェアで実装することもでき、またその逆も可能であり、あるいは例示的実施形態の構成および詳細を修正することもできることは、当業者なら理解するであろう。したがって、本明細書に述べた本発明は、頭記の特許請求の範囲およびその均等物に含まれるこのような実施形態すべてを企図する。
【図面の簡単な説明】
【図１】本発明が存在する例示的なコンピュータシステムを一般的に示すブロック図である。
【図２】本発明のネットワークスタックの機能層およびバイパス経路を示すブロック図である。
【図３】本発明のＮＤＩＳ経路の機能層およびバイパス経路を示すブロック図である。
【図４】本発明のオフロード機構を示すラダー図である。
【図５Ａ】本発明の逆ツリーを示す図である。
【図５Ｂ】本発明の逆ツリーを示す図である。
【図５Ｃ】本発明の逆ツリーを示す図である。
【図５Ｄ】ルート更新の実施後に単一の逆ツリーにマージされた２つの独立した逆ツリーを示す図である。
【図６】ホストコンピュータと周辺デバイスとの間の同期を示すブロック図である。
【図７】本発明のアップロード機構を示すラダー図である。
【図８】本発明の教示による、セキュアプロトコルスタック接続のオフロード機構を示すラダー図である。
【図９】本発明の教示による、オフロードされたセキュアプロトコルスタック接続のアップロード機構を示すラダー図である。
【符号の説明】
１００  コンピューティングシステム環境
１１０  コンピュータ
１２０  処理ユニット
１２１  システムバス
１３０  システムメモリ
１３１  ＲＯＭ
１３２  ＲＡＭ
１３３  ＢＩＯＳ
１３４  オペレーティングシステム
１３５  アプリケーションプログラム
１３６  その他のプログラムモジュール
１３７  プログラムデータ
１４０  取外し不可能な不揮発性メモリインタフェース
１４１  ハードディスクドライブ
１４４  オペレーティングシステム
１４５  アプリケーションプログラム
１４６  その他のプログラムモジュール
１４７  プログラムデータ
１５０  取外し可能な不揮発性メモリインタフェース
１５１  磁気ディスクドライブ
１５２  磁気ディスク
１５５  光ディスクドライブ
１５６  光ディスク
１６０  ユーザ入力インタフェース
１６１  マウス
１６２  キーボード
１７０  ネットワークインタフェースカード（ＮＩＣ）
１７１  ローカルエリアネットワーク
１７２  モデム
１７３  ワイドエリアネットワーク
１８０  リモートコンピュータ
１８１  メモリ記憶デバイス
１８５  リモートアプリケーションプログラム
１９０  ビデオインタフェース
１９１  モニタ
１９５  出力周辺インタフェース
１９６  プリンタ
１９７  スピーカ
２００  アプリケーション
２０２  ネットワークスタック
２０６  中間層
２０８  スイッチ
２１０  チムニー
３００  トランスポート層
３０２  ネットワーク層
３０４  フレーミング層
３０６  ＴＬＩスイッチ
３１０  ＮＤＩＳミニドライバ
３１０  ＮＤＩＳミニポート
３１２  チムニードライバ
３１４  ハードウェア
５００  逆ツリー
５０２  ＡＲＰテーブルエントリ
５０４  ルートキャッシュエントリ
５０６  ＴＣＰエントリ
５０８  ＴＣＰエントリ
５１０  ルートキャッシュエントリ
５１２  エントリ
５１４  エントリ
５１６  ＡＲＰテーブルエントリ
８００  セキュリティ層
８００  ＩＰＳＥＣ層
【図１】
0004327496.tif 000004
【図２】
0004327496.tif 000005
【図３】
0004327496.tif 000006
【図４】
0004327496.tif 000007
【図５Ａ】
0004327496.tif 000008
【図５Ｂ】
0004327496.tif 000009
【図５Ｃ】
0004327496.tif 000010
【図５Ｄ】
0004327496.tif 000011
【図６】
0004327496.tif 000012
【図７】
0004327496.tif 000013
【図８】
0004327496.tif 000014
【図９】
0004327496.tif 000015