本発明の上、およびその他の利点および特徴を得る方法を説明するために、上で簡単に説明した本発明のより具体的な説明を付属の図面に示されている特定の実施形態を参照しながら行う。これらの図面が本発明の代表的な実施形態を示しているだけであり、したがって請求の範囲を制限しているものとみなされないことを理解していることを前提として、付属の図面を使用して本発明を具体的内容および詳細とともに説明する。
本発明は、一般に、コンピュータネットワーキング技術に関する。より具体的には、本発明は、一般に、通常、ホストプロセッサにより実行されるネットワークコンピューティングタスクの特定のハードウェアコンポーネントへのオフロードを最適化し、適宜制御権をホストプロセッサに返すメカニズムに関する。本発明では、さらに、仮想周辺装置を使用することにより、オフロードされたネットワークコンピューティングタスクの柔軟性を高める。このような柔軟性があるため、ホストの負荷が変化する、またはネットワーク装置状態が変化するときのオフロードされたネットワークコンピューティングタスクのフォールトトレランスが向上するだけでなく、仮想LANのサポートも可能になる。
したがって、本発明では、様々なネットワーク接続の間の状態の変化を補正し、また他の周辺装置間の異なるリソース機能を補正しながら、一方の周辺装置から他方の周辺装置へ、または周辺装置からホストプロセッサへネットワーク接続を転送することを考察している。制限ではなく説明として、明細書および請求項を読み終わった後、「周辺装置」はネットワークインターフェースカード、さらにネットワークアダプタを備えた汎用CPU、専用CPUを備えたネットワーク処理エンジン、オフロードNICを備えた従来のミニポート、またはハードウェアの状態機械の実装などのコンポーネントを含むことは理解されるであろう。したがって、以下の説明では、本発明の方法はコンポーネント間の長命または短命の接続のいずれか(またはその両方)を転送するためのCPUサイクルに関して説明する。
後に詳述するが、ホストは、周辺装置が持ちうるリソースを検出し、その結果の関連するデータ構造を調整して関連する接続の要件とオフロード周辺装置との間が一貫するようにする。オフロードデータ構造を操作できることで具体的応用があり、適宜オフロードまたはアップロードデータ構造内に追加データ構造を挿入することを含む、多様なネットワークプロトコルを用いて一貫したアップロードおよびオフロードを行うことが可能である。ホストは、接続をオフロードできるとしても特定のデータ構造に対する制御を維持しているため、またホストは最初の周辺装置のフェイルオーバーが発生した場合に新しい周辺装置とパラメータの再ネゴシエーションを実行できるため、本発明は、周辺装置の故障に関係なく、また接続が長命接続であろうと短命接続であろうと、一度に複数のTCP接続のオフロードおよびアップロードを実行する新規性のある堅牢な方法を提示する。
本発明の追加の特徴および利点は、以下の説明の中で述べられており、一部は、説明から明らかであるか、または本発明を実施することから知ることができる。本発明の特徴および利点については、書き添えられた請求項で特に指摘されている機器および組合せを使用することにより理解され、得られる。本発明によるこれらの特徴および他の特徴は、以下の説明および書き添えられた請求項を読むとよりいっそう明らかになるか、または以下で述べているように本発明を実施することで知ることができる。
本発明による本発明の範囲内の実施形態はさらに、格納されているコンピュータ実行可能命令またはデータ構造を搬送するまたは保持するためのコンピュータ読取り可能な媒体も含む。このようなコンピュータ読取り可能な媒体は、汎用または専用コンピュータからアクセスできる利用可能な媒体とすることができる。例としてであって、限定ではないが、このようなコンピュータ読取り可能な媒体には、RAM、ROM、EEPROM、CD−ROM、またはその他の光ディスク記憶装置、磁気ディスク記憶装置またはその他の磁気記憶装置、またはコンピュータ実行可能命令またはデータ構造の形で目的のプログラムコード手段を搬送または格納するために使用できる、専用または汎用コンピュータによりアクセスできる、その他任意の媒体を備えることができる。
ネットワークまたは別の通信接続(有線、無線、または有線と無線の組合せ)を介して情報をコンピュータに転送または供給すると、コンピュータはその接続をコンピュータ読取り可能な媒体として適切に認識する。したがって、そのような接続は、まさにコンピュータ読取り可能な媒体である。上記の組合せも、コンピュータ読取り可能な媒体の範囲に含めなければならない。コンピュータ実行可能命令は、例えば、汎用コンピュータ、専用コンピュータ、または専用処理装置に特定の機能または機能群を実行させる命令およびデータを含む。
そこで次に図1を参照すると、図は本発明によりネットワーキングモデルを構成するコンポーネントのいくつかの相互関係を例示している。通常のオペレーション中、ネットワーク上に流されるメッセージ(networked messages)は、アプリケーション100によりネットワークスタック102を通じ周辺装置104に送信され、そこからメッセージはネットワーク上の他の装置およびアプリケーションに送信される。さらに、ネットワーク上に流されるメッセージは、周辺装置104を使用してネットワーク上の他の装置およびアプリケーションから受信することができ、その後、このメッセージは、ネットワークスタック102を通じてアプリケーション100に受け渡される。ネットワークスタック102は、1つまたは複数の中間ソフトウェア層106を含む。アプリケーション100から送信されたデータは、中間ソフトウェア層106を通り、そこでデータのパッケージング、信頼できるデータ伝送、データの暗号化およびメッセージダイジェストの計算などの特定のオペレーションをデータに対して実行することができる。
スイッチ108は、ホストの処理装置から中間ソフトウェア層106のネットワークスタックオペレーションをオフロードするために使用される。スイッチ108は別に示されているが、スイッチ108はネットワークスタック102の上位中間層に組み込むことができることに注意されたい。ネットワークスタックオペレーションをオフロードした後、データがチムニー110を経由して周辺装置104に送信され、周辺装置104はネットワークスタックオペレーションを実行できる。この階層では、中間ソフトウェア層は、ホストまたは周辺装置内に単独で置かれていなくてもよい。さらに、この階層により、任意の中間層を完全にオフロードするか、ホスト内に残すか、またはその両方の組合せを実行することができる(例えば、1つまたは複数の特定の接続をオフロードする)。さらに、チムニーをチムニー上位に置き階層化することができる(例えば、IPSecチムニーは、TCPチムニー上位に階層化することができる)。
接続は、信頼できるデータ転送と信頼できないデータ転送との組合せとすることができ、ユニキャストまたはマルチキャストのデータ転送を含むことができる。いずれの場合も、所定の接続に対する状態オブジェクトがオフロードされ、その状態オブジェクト内にキャッシュ変数がある場合、中間層は、それぞれの状態オブジェクトについて「キャッシュ」と指定された変数がホスト内で変更された場合、変数のキャッシュされたコピーが周辺装置内で更新されることを保証する。例えば、接続をオフロードすることは、周辺装置104にすべてオフロードされたフレーミング層のアドレス解決プロトコルエントリ(ARP)とともに、ネットワーク層のルートキャッシュエントリ(RCE)を含むトランスポート層のトランスポート制御ブロック(TCB)状態エントリをオフロードすることを含むことができる。スイッチ108は、同じRCEを共有するホストネットワークスタック102を通じて異なるTCBに対してトラフィックを送信し続け、その一方で、スイッチ108は、オフロードされたTCBについてチムニー110を通じてトラフィックを送信する。
スイッチ108は、中間層106にオフロード要求を送信することによりオフロードを開始する。各中間層106は、オフロード要求を拒絶するか、またはリソース情報をオフロード要求に追加し、オフロード要求をネットワークスタック102内の隣接するソフトウェア層に送信する。オフロード要求は、接続を正常にオフロードできるか否かを周辺装置104が決定するのに役立つ(場合によっては、ネットワーク層毎の)リソース情報を含む。周辺装置104がオフロード要求を受信すると、接続のオフロードに使用可能なリソースがあるか否か算出する。オフロードが可能でなければ、周辺装置104はオフロード要求を拒絶する。可能であれば、周辺装置104はオフロード要求を受理し、その接続に対してリソースを割り当てる。周辺装置104は、パラメータのリストを含む完了メッセージを中間ソフトウェア層106に送信することによりオフロード要求を完了する。このパラメータのリストを使って、中間ソフトウェア層106およびスイッチ108に情報を送り、中間ソフトウェア層106およびスイッチ108が周辺装置と通信できるようにする。それぞれの中間ソフトウェア層106は、完了メッセージを受け取ると、その層に対する情報をパラメータのリストから削除し、完了メッセージのその残り部分を次の中間層106に渡し、中間層106がほかになければ、スイッチ108に渡す。
中間層106がオフロードの完了メッセージを受信した場合、またはもともとのオフロード要求中に、中間層106はその状態を周辺装置104に受け渡す。各状態は、CONST、CACHED、およびDELEGATEDという3種類の変数(「状態変数」とも呼ばれる)を有することができる。所定の中間層106に対応する状態オブジェクトは、3種類すべての状態を有するか、または3種類の状態の部分アグリゲートを有することができる。CONST状態変数は、オフロードされた接続の存続期間中決して変化しない定数である。
CONST状態変数は、ネットワークスタックの処理制御をオフロードするときに(これ以降、単に「オフロード中」と呼ぶ)周辺装置104に提供されるが、状態オブジェクトがホストプロトコルスタックにアップロードされたときには(これ以降、単に「アップロード中」と呼ぶ)該当する中間層106に周辺装置104により戻されない。これは、中間層106がCONST状態変数の値を保持しており、したがって、アップロード中に渡されたデータ構造をかなり小さくできるからである。
ホストプロセッサは、CACHED状態変数の所有権を保持し、ホストプロセッサ内のCACHED状態変数に生じた変更が周辺装置104内で更新されることを確実にする。CACHED状態変数を変更する制御メッセージは、ネットワークスタック102によって処理される。その結果、ホストは、オフロード中にCACHED状態変数を周辺装置に書き込むが、アップロード中にはCACHED状態変数を周辺装置から読み戻す必要はない。このため、さらに、アップロードにかかわるオーバーヘッドが減少する。
ホストプロセッサは、DELEGATED状態変数の所有権を周辺装置104に引き渡す。DELEGATED状態変数は、オフロード中に1回書き込まれ、アップロード中に読み戻される。DELEGATED状態変数の制御権を戻すことだけで、接続をホストにアップロードして戻すことに関連するオーバーヘッドが最小限に抑えられる。
したがって、オフロード中に、状態オブジェクトの制御権は、所定の状態オブジェクトの状態変数のいくつかの制御権はホストプロセッサ内で保持され、その一方で、所定の状態オブジェクトの他の状態変数の制御権は周辺装置104に渡されるという点で、ホストプロセッサと周辺装置104との間で共有される。したがって、それぞれの中間層に関連する状態の処理のための制御は、ホストプロセッサと周辺装置とにきれいに分割され、それぞれが状態の単独の部分を所有する。
ホストプロセッサは、必要なときに周辺装置104にDELEGATED状態変数について問い合わせることができる。ホストプロセッサは、さらに、診断のためCONSTまたはCACHED状態に問い合わせることもできる。状態を3つのカテゴリ(または「変数」)に分割することで、ネットワークスタック102をチムニー110ときれいに共存させることができる。周辺装置に与えられるべき状態変数(このような状態変数に対する制御権も周辺装置に渡すか否か)を最初のオフロード要求に入れて、周辺装置とホストスタックとの間のインタラクションの回数を最適化することができる。これは、状態オブジェクトが委譲状態を含まないか、またはホストスタックが、委譲状態オブジェクトが最初のオフロード要求からオフロード要求の完了までの間に変化しないことを確実にできる場合に実行できる。
アップロードは、直接、周辺装置104またはスイッチ108のいずれかにより開始することができる。アップロードは、さらに、中間層102により間接的に開始することもできるが、それは、例えば、中間層102がパスまたは隣接エントリを無効化しているからである。アップロードが開始されると、周辺装置104は、未完了のすべての要求を完了し、状態オブジェクトをホストスタックに渡して戻す。スイッチ108は、さらに送信要求があればそれをキューに入れ、周辺装置104への受信バッファのポストを停止する。アップロード中に、ホストスタックの中間層は、状態オブジェクトの制御権を取り戻し、アップロード要求を終了する。アップロード要求が完了した後、周辺装置104は、アップロードのためもはや使用されなくなったリソースを解放する。
ある種の状況では、特定の接続または状態オブジェクトに対するデータは、別の周辺装置を通って到着するか、またはホストプロトコルスタック(例えば、TCPセグメントを異なるネットワークインターフェース上に到達させるIPフラグメントまたはルートフラップ)により処理されなければならない場合がある。これが発生すると、中間層106はさらに、受信されたデータを周辺装置104に転送する転送インターフェースを備えることもできる。中間層106は、周辺装置が関連する接続または状態オブジェクトのアップロードの最中に、周辺装置104にデータを転送することを試みることができる。したがって、周辺装置104は、もはや、データパケットを処理するために必要な状態オブジェクトの制御権を保持することができない。このような場合、周辺装置104は、エラーメッセージを中間層106に返し、アップロードが進行中であることを示す。エラーメッセージは、入って来たデータの転送を停止し、中間層が状態オブジェクトを受け取るまで他のデータをバッファリングすることを中間層106に知らせる。あるいはまた、周辺装置104にバッファメモリを増設するのと引き換えになるが、入って来たデータを周辺装置104に転送し、周辺装置104がデータをバッファリングし、状態オブジェクトのアップロードが完了したときにデータを供給することも可能である。(図7では、このアップロードプロセスを詳しく説明している)。
中間ソフトウェア層106により、複数の接続を周辺装置104にオフロードすることができる。オフロードのため中間ソフトウェア層の状態オブジェクトを参照する上位層状態オブジェクト(つまり、中間ソフトウェア層106よりも上の層の状態オブジェクト)の個数の参照カウンタが、中間ソフトウェア層106により保持される。本明細書で用いているような状態オブジェクトは、特定の層に対する状態変数の集まり(「状態」ともいう)である。すでに述べたように、このような状態変数は、CONST、CACHED、またはDELEGATEDに分類することができる。特定の中間層のオフロードされた状態オブジェクトへの参照の回数が0にデクリメントされた場合(例えば、アップロード要求中に)、中間層106はメッセージを周辺装置104に送信して中間層に対する状態オブジェクトをアップロードし、対応する委譲状態変数を中間層106に送信し、中間層106に対する状態オブジェクトを削除する。参照カウンタを0にデクリメントさせるもともとのアップロード要求中に、または後で、アップロード要求を実行できることに注意されたい。
図2は、ハードウェア層214が、例えば、ネットワークインターフェースカード(NIC)である周辺装置を含む本発明による一実施形態を説明している。さらに、図2は、スイッチ206(つまり、トランスポート層インターフェース(TLI)スイッチ206)を含むソフトウェア層、およびトランスポート層201、ネットワーク層202、およびフレーミング層203を含むネットワークスタック220を示している。ネットワーク層202は、「パス層」とも呼ばれ、フレーミング層203は、「隣接層」とも呼ばれる。
一般に、アプリケーション200は、オペレーション中にネットワーク上に流されるメッセージを、ネットワークスタック220を通じて周辺装置(例えば、ハードウェア214)に送信する。アプリケーション200から送信されたデータは、TLIスイッチ206内を流れるが、これは、データがホストベースのネットワークスタック220またはチムニー230を下るかどうかを制御する。TLIスイッチ206は、ネットワークスタック220の上位層に組み込むことができることに注意されたい。ネットワークスタック220内のソフトウェア層は、アプリケーション200からデータを受信し、パケット形式でデータをパッケージし、その結果得られたパケットを、NDISミニドライバ210を介して周辺装置ハードウェア214に送信する。ソフトウェア層ではさらに、ペイロードをアプリケーションに渡す際にネットワークパケットが受信されたときの反対機能も提供する。データパケットがスタック220を通過するときにネットワークスタック220が実行することができる他のタスクとしては、データ暗号化および解読、信頼できるデータ伝送、およびメッセージダイジェストの計算またはチェック(例えば、データパケットのチェックサムまたはCRC)がある。これらのタスクの多くは、オフロードされなければホストプロセッサにより実行されるため、プロセッサに負担がかかる。
TLIスイッチ206は、チムニー230とチムニードライバ212を介してオフロードされた接続を周辺装置に送信することによりCPUから周辺装置にスタックオペレーションをオフロードするために用いられる。当業者であれば、明細書および請求項を読むと、NDISドライバ210およびチムニードライバ212が同じ実際のドライバであってよいことを理解できるであろう。当業者であれば、さらに、NDISミニドライバ210およびチムニードライバ212の上端はMICROSOFT(登録商標)WINDOWS(登録商標)オペレーティングシステム内のNDIS APIであることも理解するであろう。説明のため、伝送制御プロトコル(TCP)ベースのプロトコルスタックを使用して、本発明を説明する。しかし、当業者であれば、この説明を検討した後、様々な種類の周辺装置を使用することができ、また他のネットワークスタックのオフロードに本発明による原理を使用できることを理解するであろう。例えば、SCTP(stream control transmission protocol)またはUDP(user datagram protocol)ベースのプロトコルスタック、リモートDMA(RMDA)、またはIPSec暗号化/解読は、オフロードされることができる。さらに、本発明は、iSCSI(internet Small Computer System Interface)、NFS(Network File System)、またはCIFS(Common Interface File System)などの上位機能プロトコルをオフロードする場合にも使用されることができる。オフロードされたプロトコルは、接続オリエンテッド(例えば、TCP)またはコネクションレス型(例えば、IPSec)である。
ネットワーク接続のオフロードを実行する理由は多数ある。例であって限定ではないが、以下でいくつかの理由を述べる。システム管理者は、オフロードする特定のサービスを選択することが可能である。トラフィック(バイトまたはパケットの個数に関して)が大量のリソースを消費している場合、特定の接続をオフロードすることができる。さらに、IPSecサービスなど、いくつかの種類のサービスをオフロードすることができる。さらに、管理ポリシーにより処理オフロードを推進することもできる。例えば、管理者は、組織内からのすべての接続が最初にオフロードされるポリシー、または特定のアプリケーションに対するすべての接続が最初にオフロードされるポリシーを持つことができる。使用されているシステムリソース(例えば、CPU利用、データキャッシュ使用、ページテーブルキャッシュ使用、メモリ帯域幅)は、ホストプロセッサが接続をオフロードさせることができる。
図3は、TCP接続をオフロードするために実行される3ステッププロセスを示しており、ここでは、図2のアプリケーション層200は示されていないが、あるとすればTLIスイッチ306の左にある。さらに、図3では、周辺装置370は単に例示のためNICとして示されているが、他の種類の周辺装置でも、ネットワークアダプタを備えた汎用CPUを含む、本発明による同様のまたは類似の機能を実行することができる。一般に、図3は、TCP接続をオフロードするのに必要なリソースを割り当て、層300、302、304、306のそれぞれにハンドルを与え、層300、302、304、306のそれぞれの状態を周辺装置370にオフロードする工程を示している。オフロードの遷移中、TLIスイッチ306はアプリケーションから送信されたすべてのメッセージをバッファリングする。あるいはまた、トランスポート層300はデータをバッファリングする。オフロードが完了すると、バッファリングされているデータは、周辺装置370に転送される。オフロード遷移中に入って来るパケットが受信されると、周辺装置370は、トランスポート委譲状態が周辺装置370に受け渡されるまで、データを層300、302、304、306に送り続ける。オフロード遷移中にトランスポート層300が入って来るパケットを受け取ると、トランスポート層は、データをトランスポート状態オブジェクト委譲状態の一部として、または個別に、NIC370に転送する。
TLIスイッチ306は、トランスポート層300にオフロード要求330を送信することによりオフロードを開始する。オフロード要求は、次の層のローカル状態へのポインタ(例えば、トランスポート層300のTCBポインタ、ネットワーク層302のRCEポインタ、フレーミング層304のARPエントリポインタ、またはNDISミニドライバ210のNDISミニポートポインタ)を含む。オフロード要求はさらに、オフロードタイプ(例えば、TLIスイッチ306ではTCP、ネットワーク層302ではIPv6など)および周辺装置370がTCP接続を正常にオフロードできるかどうかを決定するのに役立つリソース情報も含む。TLIスイッチ306は、さらに、オフロードハンドルを周辺装置370に供給することもできる。TLIスイッチ306は、トランスポート層300へのアプリケーション送信または受信バッファの送信を停止し、それらをキューに入れ、トランスポート層300が完了メッセージ320を送信するのを待つ。
トランスポート層300は、オフロード要求を拒絶するか、またはTCPリソース情報をTLIスイッチリソース情報に追加してオフロード要求332をネットワーク層302に送信するかのいずれかを行う。トランスポート層300は、さらに、オフロードハンドルを周辺装置370に供給することもできる。未処理のアプリケーション送信または受信バッファが保留になっている場合、トランスポート層300はそれらのバッファをTLIスイッチ306に返す。
ネットワーク層302は、オフロード要求332を受信し、接続をオフロードするのを拒絶するか、またはネットワークリソース要件をTCPリソース情報およびTLIスイッチリソース情報に追加してオフロード要求334をフレーミング層304に送信するかのいずれかを行う。ネットワーク層302は、さらに、オフロードハンドルを周辺装置370に供給することもできる。
フレーミング層304は、接続をオフロードするのを拒絶するか、またはフレーミングリソース要件をネットワークリソース要件、TCPリソース情報、およびTLIスイッチリソース情報に追加してオフロード要求336を周辺装置370に送信するかのいずれかを行う。フレーミング層304は、さらに、オフロードハンドルを周辺装置370に供給することもできる。
周辺装置370は、オフロード要求を受信すると、TCP接続のオフロードに利用可能なリソースがあるかどうか算出する。NIC側で、オフロードが可能でないと判断した場合、オフロード要求を拒絶する。NICは、オフロードが可能であると判断した場合、オフロード要求を受け入れ、その接続用にリソース(例えば、TCB、ルートキャッシュエントリ(RCE)、アドレス解決プロトコル(ARP)テーブルエントリ(ATE))を割り当てる。周辺装置370は、パラメータおよびディスパッチテーブルのリンクリストを作成して、層300、302、304、および306に受け渡し、パラメータのリンクリストを含む完了メッセージ308をフレーミング層304に送信することによりオフロード要求を完了する。これらのパラメータは、層300、302、304、306のそれぞれ用のオフロードハンドルおよびディスパッチテーブルを含む。
本明細書で用いているように、オフロードハンドルとは、ソフトウェア層が周辺装置と通信する、または周辺装置がソフトウェア層と通信するためのメカニズムのことである。例としてであって限定ではないが、オフロードハンドルには、ポインタベースのハンドル、配列の検索に使用される整数値、ハッシュテーブル(例えば、ハッシュ関数)、ソフトウェア層(またはネットワークスタック)と周辺装置との間の通信チャネル、または周辺装置が状態オブジェクトを検索するために使用するソフトウェア層によって渡される一組のパラメータがある。
例としてであって限定ではないが、中間ソフトウェア層(306、300、302、および304)と周辺装置370との間の、ディスパッチテーブルと呼ばれる、通信メカニズムは、配列の検索に使用される関数呼び出しポインタ、ハッシュテーブル(例えば、ハッシュ関数)、ソフトウェア層(またはネットワークスタック)と周辺装置との間の通信チャネル、または周辺装置が状態オブジェクトを検索するために使用するソフトウェア層によって渡される一組のパラメータであり得る。ディスパッチテーブルは、周辺装置の初期化中に、または後で、入れ替えることができる。
ディスパッチテーブルは、周辺装置370に直接データを送信したり、または周辺装置370から直接データを受信したりするために使用される。ディスパッチテーブルは、さらに、診断を行う場合にも使用することができる。例えば、ソフトウェア層を2つの中間層の間、または一番下の中間層と周辺装置との間に挿入することにより、システムを監視し、フォールトを差し挟んで、システムが正常に機能していることを確認することができる。さらに、ディスパッチテーブルは、必要ならばさらに機能を追加することができるソフトウェア層によりパッチをあてることもできる。例えば、ソフトウェア層は、フィルタドライバまたは仮想周辺装置の機能を提供するために追加することができる。パッチ当ては、通常、挿入された中間層の関数ポインタでディスパッチテーブルを上書きすることにより行われる。その後、挿入された中間層の関数ポインタが呼び出され、挿入された中間層がその作業を終了すると、挿入された中間層は元のディスパッチテーブルから元の関数ポインタを呼び出す。
フレーミング層304が完了メッセージを受信すると、フレーミング層304は、フレーミング層のオフロードハンドルおよびディスパッチテーブルを更新しやすくする(例えば、送信先MACアドレスの変更またはカプセル化タイプの変更)ARPテーブルエントリに格納する。次に、フレーミング層304は、周辺装置370をATEと関連付けられている状態で更新する(310)。フレーミング層304は、リンクリストから状態を削除し、リンクリスト内の残りの情報をネットワーク層302に転送する(312)。
ネットワーク層302は、ネットワーク層302用のオフロードハンドルおよびディスパッチテーブルを格納する。次に、ネットワーク層302では、周辺装置370をRCEと関連付けられている状態で更新する(314)。ネットワーク層302は、リンクリストからネットワーク層情報を削除し、パラメータおよびディスパッチテーブルのリンクリストを含む完了メッセージ316をトランスポート層300に送信する。ネットワーク層302は、オフロード中に受信した任意のバッファリングされているIPフラグメントを処理のため周辺装置370に転送するか、またはネットワーク層内のIPフラグメントを処理して、トランスポート層300に転送することができる。
トランスポート層300は、トランスポート層用のオフロードハンドルを格納し、その状態を周辺装置370に送信する(318)。代替の実施形態では、トランスポート層およびTLIスイッチは、同じ層である。その後、トランスポート層は、完了メッセージを送信する(320)。
それに代わる一実施形態では、層の状態オブジェクトは、オフロード要求とともに送信される。例えば、フレーミング層の状態オブジェクト、ネットワーク層の状態オブジェクト、およびトランスポート層の状態オブジェクトは、オフロード要求とともに送信され、オフロード要求から完了イベントまでの間にキャッシュ状態が変化した場合にのみ更新される。層の状態オブジェクト全体は、委譲状態が存在しないか、またはオフロード要求からオフロード要求の完了までの間に変更できない場合にのみ、オフロード要求とともに送信されることができる。オフロードシーケンス中にDELEGATED状態を変化させるメッセージを受信した場合、そのメッセージは、一般的には、処理されず(バッファリングされる)、オフロードが完了したときに、処理のためメッセージをオフロード周辺装置に転送しなければならない。しかし、CACHEDと分類されている状態変数は、オフロード要求とともに送信することができ、またオフロード要求からオフロード要求の完了までの間に変化することがある。このような場合、CACHED状態変化における変化を記録しなければならず、オフロードが完了したときに、周辺装置においてCACHED状態を更新しなければならない。
TLIスイッチ306は、完了メッセージ320を受信すると、アプリケーション送信および受信バッファを周辺装置370に転送する(322)。TLIスイッチ306は、ディスパッチテーブルを使用して、未処理および将来のすべての受信バッファをポストし、処理のためNIC370に送信する。オフロード要求が完了するまでの期間に、それぞれの層300、302、および304は、オフロードされた状態オブジェクト(つまり、層に関連付けられている状態オブジェクト)の新しいオフロード要求を拒絶するか、またはオフロードが完了するまで問い合わせを続ける。代替の一実施形態では、アプリケーションバッファは、初期オフロード要求で受け渡される。
トランスポート層300は、それでも、初期オフロード要求332でトランスポート状態オブジェクトが周辺装置370にオフロードされなかった場合、入って来たTCPデータを処理し、TCPペイロードをTLIスイッチ306に受け渡す機能を有することができる。入って来るTCPデータがこのときよりも後にネットワークスタック302を通って到着した場合、入って来るデータは、周辺装置370に転送され、周辺装置により処理される。
その後のオフロード要求で、ネットワーク層302およびフレーミング層304は、周辺装置370から受け取ったオフロードハンドルを前のオフロードから周辺装置370に受け渡す。これは、周辺装置370がすでに、ネットワーク層302およびフレーミング層304に割り当てており、周辺装置370のリソースは保存され、オフロードが高速化されることを示す。
すでに示されているように、層300、302、304は、それらの状態を周辺装置370に渡す。各状態は、CONST、CACHED、およびDELEGATEDという3種類の変数を持つ。CONST状態変数は、その名が示すように、オフロードされた接続の存続期間中決して変化しない定数である。したがって、ホストは、接続が終了したときに、CONST状態変数を層に読み直さ必要はない。同様に、ホストプロセッサは、CACHED状態変数の所有権を保持し、ホストプロセッサ内の任意のCACHED状態変数に生じた変更が周辺装置370内で更新されることを確実にする。その結果、ホストはCACHED状態変数を書き出すが、(システム診断により要求されない限り)決して読み直さない。ホストCPUは、DELEGATED状態変数の所有権のみを周辺装置370に転送する。DELEGATED状態変数は、オフロードが実行されるときに1度書き込まれ、オフロートが終了したときに読み直される。周辺装置(例えば、NIC)はDELEGATED状態変数を転送し戻すだけでよいので、接続をホストに転送し戻すオーバーヘッドは最小限に抑えられる。さらに、ホストCPUは、必要なときのみDELEGATED状態変数(例えば、統計量)について周辺装置370に問い合わせる。
トランスポート層300のCONST状態変数は、送信先ポート、送信元ポート、トランスポート層の動作(例えば、ウィンドウの縮小拡大を有効にするか否か、SACKを有効にするか否か)を制御する1つまたは複数のフラグ、SENDおよびRECVウィンドウ表示倍率、およびリモートエンドポイントにより広告される初期最大セグメントサイズ(リモートMSS)を含むことができる。本明細書ですでに説明しているように、このような前述のTCP CONST変数の値は一定である、つまり、その値は、TCP接続の存続期間中変化しない。
トランスポート層300のCACHED状態変数には、TCP状態変数とIP状態変数がある。トランスポート構造では、実装によりネットワーク層の値を接続毎に上書きできればIP状態変数が必要になる場合がある。これらのCACHED状態変数は、1つまたは複数のフラグ(例えば、「Nagle」アルゴリズムである否か、またはTCPの「Keep−Alives」を有効にするか否か)、さらに、「Keep−Alive」設定(つまり、間隔、プローブ数、およびデルタ)、有効最大セグメントサイズ(または有効MSS)、初期デフォルト受信ウィンドウ(InitialRcvWnd)、周辺装置370により指示される受信バッファ内にコピーされるバイトの個数、IPv4のトラフィックタイプに応じてパケットを優先順位付けするサービスの種類(TOS)、および最後に、ネットワーク内でIPv6パケットの優先順位付けを行えるようにするトラフィッククラスおよびフローラベルを含むことができる。
DELEGATED状態変数は、IETF(Internet Engineering Task Force)RFC793で規定されているような現在のTCP状態、1つまたは複数のフラグ(例えば、リモートピアによる異常終了で閉じた接続であったかどうか)、次の予想TCP受信セグメントのシーケンス番号(つまり、RCV.NEXT)、受信ウィンドウサイズ(RCV.WND)、第1の肯定応答のないデータのシーケンス番号(SND.UNA)、送信する次のTCPセグメントのシーケンス番号(SND.NEXT)、送信ウィンドウサイズ(SND.WND)、最後のウィンドウ更新に使用されるセグメントシーケンス番号(SndWL1)、最後のウィンドウ更新に使用されるセグメント肯定応答番号(SndWL2)、これまでに送信された最大シーケンス番号(SND.MAX)、最大送信ウィンドウ(MAX_WIN)、および現在の輻輳ウィンドウ(Congestion Window)(CWnd)を含むことができる。
DELEGATED状態変数は、さらに、スロースタート閾値(Slow Start Threshold)(SSTHRESH)、平滑化往復時間(smoothed round trip time)(SRTT)、往復時間変動(RttVar)、次のTCP ACKで送信するタイムスタンプ値(TsRecent)、一番最近のタイムスタンプが受信された後の経過時間(TsRecentAge)、同じシーケンス番号で受け入れたACKの個数(DupAckCont)、送信されたkeepaliveプローブの個数(KeepAlive ProbeCount)、次のkeepaliveタイムアウトまでの残り時間(KeepAlive TimeoutDelta)、送信された再送回数(KeepAlive Count)、次の再送タイムアウトまでの残り時間(Retransmit TimeoutDelta)、およびバッファリングされている受信されたデータへのポインタ(BufferedData−オフロードまたはアップロードが進行している間に受信されたTCPデータ)を含むことができる。
ネットワーク層302のCONST状態変数は、送信先IPアドレス(IPv4またはIPv6のいずれかの)および送信元IPアドレス(IPv4またはIPv6のいずれかの)を含むことができる。ネットワーク層302のCACHED状態変数は、パス最大伝送単位(PathMTU)を含むことができる。ネットワーク層302のDELEGATED状態変数は、IPパケットID開始値を含むことができる。フレーミング層304のCACHED状態変数は、送信先MAC(Media Access Control)アドレス、IETF RFC 2461近隣探索(ホスト到達可能性デルタおよびNIC到達可能性デルタ)のパラメータ、およびヘッダの形式を示すフラグ(例えば、LLC/SNAP(論理リンク制御/サブネットワークアクセスプロトコル)形式またはDIX(Digital、Intel、Xerox)形式)を含むことができる。
トランスポート層状態は、ネットワーク層の状態オブジェクト用のハンドルを含み、ならびにネットワーク層(「パス」ともいう)の状態は、複数の接続間で共有されることができ、およびフレーミング層(「近隣」とも呼ぶ)の状態は、複数のパス間で共有されることができる(例えば、すべてのトラフィックが1台のルータを通る)ため、フレーミング層の状態オブジェクトのハンドルを含むことができる。この階層は、複数の理由から保持されている。IP IDネームスペースはパス毎にオフロードされたすべての接続にまたがって管理される場合があるため、またはパスMTUの更新はネットワーク層で1回行われることができ、TCP接続毎に個別に設定するのではなくすべてのTCP接続に作用するため、接続はネットワーク層のNICハンドルを必要とする場合がある。パスは、フレーミング層の状態オブジェクトのNICハンドルを必要とするが、それは、ルート更新により次のホップアドレスが変更される可能性があり、したがって新しいMACアドレスを指す場合があるからである。この階層はさらに、NICで保持する必要のある状態の量を圧縮する。例えば、IPv4のARP更新では、IPアドレスからMACアドレスへのマッピングが変更される場合がある(例えば、サーバ上でインターフェースがフェイルオーバーする)。ホストは、MACアドレスをキャッシュされた変数として保持し、したがって、キャッシュされている状態の更新を1回行うだけでよく、すべての接続は新しいインターフェースにフェイルオーバーする。
ホストがTCP接続をオフロードした後、周辺装置370は、IPv4を用いて送信するパケットに対するパケット識別子(例えば、IP ID)を割り当てる必要がある。IP IDは、インターフェース毎に、または層の状態オブジェクト毎にオフロードされる。いずれの場合も、周辺装置370は、IP IDネームスペースの一部を割り当てられる。一実施形態では、周辺装置370は、初期化の際に、全IP IDネームスペースの半分が割り当てられ、ホストプロトコルスタックは、周辺装置毎にIP_IDネームスペースの一部を保持する。別の実施形態では、ホストプロトコルスタックはパス毎にIP_IDを保持することができる。周辺装置には、ネットワークの状態オブジェクトが周辺装置370に受け渡されるときに使用するIPパケットID開始値が与えられる。周辺装置370では、以下の形式を使用して、送信するIPパケットに関するIP IDを生成する。
Cur_IPID=[(Start_IPID_For_This_Path)+(Counter_For_This_Path)mod32K]mod 64K
Counter_For_This_Path=Counter_For_This_Path+1
オフロードされた接続がアップロードまたは無効化されたとき、周辺装置370は、使用する次のIPID値をネットワーク層に転送して、次のオフロードの実行に備えて格納し、ホスト処理装置320は割り当てられたIP IDの一部を使用し続ける。ホスト処理装置320は、完全なIP IDネームスペースを使用することもできるが、ネットワーク上のIPパケットの最大存続期間を超えた後にのみ使用するのが好ましい。
周辺装置370は、データをデータの受信順序で受信バッファ内に配置し、オフロードされた接続についてポストされる順序でアプリケーションバッファに充填する。多くのアプリケーションは、受信バッファにポストする前に受信指示が出るのを待つ。一実施形態では、周辺装置370は、接続に対しデータが到着し、アプリケーション受信バッファがポストされていない場合に使用する大域的バッファプールを有する。大域的バッファプールは、オフロードされた接続にまたがって使用され、このプールを用いて、1)乱れているTCP伝送の処理、2)IPデータグラムのデフラグ、3)アプリケーションがゼロコピーアルゴリズムに対して小さすぎるバッファをポストしている場合にはゼロコピーアルゴリズムではなくバッファコピーアルゴリズム、および4)アプリケーションがバッファを事前にポストしていない場合にはアプリケーションに対してデータを示す指示メカニズムを実装することができる。それに代えて、バッファリソースの効率的使用が問題にならない場合には、バッファの接続毎のプールを使用することができる。この場合、大域的バッファプールは、アプリケーション側でバッファを事前ポストしていない場合、またはシステムリソースが不足した場合にのみ使用される(例えば、アプリケーションバッファをメモリ内に留めておくだけの十分なリソースがない場合)。
図4A〜4Dを参照すると、オフロードを受け取った通常の周辺装置(例えば、NIC)は、オフロードを表す、反転されたツリーデータ構造400を持つことができる。図の点線は、周辺装置によって割り当てられた新しい状態を表す。図4Aに示されている周辺装置は、ルートキャッシュエントリ404に結合されたARPエントリ402を有し、このルートキャッシュエントリ404はTCPエントリ406としてネットワーク接続に結合されている。例えば、すべてのネットワーク接続(例えば、TCP)トラフィックがルータに入るのであれば、次のホップは常に、同じARPエントリ402に入る。ルートキャッシュエントリ404が次のネットワーク接続オフロードのために使用される場合は、新しいリソースのみが新しいオフロードされたTCP状態オブジェクトである。したがって、ホストCPUがオフロードを開始しネットワークプロトコルスタックを下って行くとき、その状態をすでにオフロードしている中間ソフトウェア層(例えば、ネットワーク層302およびフレーミング層304)は単に、前のオフロード要求に割り当てられている周辺装置生成オフロードハンドルを挿入するだけである。周辺装置170は、新しいリソース(例えば、TCPエントリ408)を割り当てて、ネットワークプロトコルスタックをバックアップする新しいリソースにオフロードハンドルを送信するだけでよい。
ここで、反転されたツリー400は、ルートキャッシュエントリ404に結合されたTCPエントリ408を有する(図4bを参照)。このアプローチにより、周辺装置のリソースが節約され、オフロードが高速化される。さらに、キャッシュ変数の状態が変化した場合、単一の構造のみ更新すればよい。チムニー内の様々なソフトウェア層に対するすべての状態が単一エントリとしてオフロードされた場合、上位のソフトウェア層の下の任意の状態更新には、複数回の更新が必要になる。
図4Cは、さらに複雑な構成の反転ツリー400を示す。ARPテーブルエントリ402に入るルートキャッシュエントリには、404と410の2つがある。TCPネットワーク接続406および408では、ルートキャッシュエントリ404を利用する。TCPネットワーク接続412および414では、ルートキャッシュエントリ410を参照する。任意のARP更新が行われる(例えば、マルチホームサーバのインターフェースが無償ARP更新を使用してフェイルオーバーする)場合、更新しなければならないのはエントリ402だけである。これにより、潜在的に数千あるいは数十万にも達する接続を新しいインターフェースにフェイルオーバーするのに、周辺装置を1回更新するだけでよい。図4Dは、ルート更新が実行された後、2つの独立の反転ツリー(エントリ402〜408およびエントリ410〜416)が単一の反転ツリー400にマージされたことを示している。ルート更新の前、ルートキャッシュエントリ410に対する次のホップARPエントリはARPテーブルエントリ416である。ルート更新の後、次のホップARPテーブルエントリはARPテーブルエントリ402である。したがって、フレーミング層、ネットワーク層、およびトランスポート層に対する状態が単一のエントリとしてオフロードされた場合に、反転ツリーを使用することで、ルート更新を数千回または数万回実行するのではなく、周辺装置への1回のトランザクションでルート更新を処理することができる。重要なのは、反転ツリーという概念を拡張して、一度に複数の接続をオフロードするようにできることである。
図5Aおよび5Bは、ブロックリストハンドル(または「ブロックリスト」)への特定の参照を伴う本発明の他の特徴を示している。一般に、ブロックリストは、チムニーオフロードまたはチムニー終了時にオフロードターゲット(例えば、周辺装置)に与えられるデータ構造である。そのため、ネットワーク接続を処理しているコンポーネントは、初期参照点が任意となるように、「アップロード」の場合にはブロックリストをホストに送り返し、「オフロード」の場合には周辺装置に下り方向へ送信する。ブロックリストのデータ構造は、特定の次の層の状態オブジェクト(依存ブロック)または同じ層の状態オブジェクト(次のブロック)を指している一連のポインタを含む。
より具体的には、依存ブロックポインタは、階層内で上の次のレベルを指し、ネットワークプロトコルスタック内の中間ソフトウェア層間の任意の既存の依存関係をオフロードターゲットに通知する場合に使用される。例えば、近隣(またはフレーミング層)の状態オブジェクトはパス(またはネットワーク層)の状態オブジェクトに依存し、さらにこのオブジェクトは同じ階層のTCP接続に依存することがある。しかし、次のブロックポインタは、異なる階層内の同じレベルにあるデータ構造を指す。例えば、第1のTCP接続のパス(またはネットワーク層)の状態オブジェクトは、異なるTCP接続におけるパス状態オブジェクトを指すことができる。
図5Aは、図4A〜4Dに同様に示されているように、反転ツリーデータ構造を示している。図5Aの反転ツリーは、異なるTCP層の状態エントリを持つが、しかし共通パス(またはネットワーク層)状態エントリ505、および共通近隣状態エントリ500も持つ、2つのTCP接続510および515(つまり、TCP Conn1およびTCP Conn2)を示している。しかし、異なるネットワーク接続525(つまり、TCP Conn3)は、別のパス状態エントリ520を持つが、共通の近隣状態エントリ500を持つ。シーケンス階層全体は、接続が次のソフトウェア層に向かうように設定する一連のパスハンドルにより各ソフトウェア層の間で定義することができる。例えば、パスハンドル507および517は、TCP状態エントリ510および515がそれぞれ、パス状態エントリ505に向かうように設定し、さらにこのエントリは近隣状態エントリ500に向かうように設定するハンドル502を有する。同様に、TCP状態エントリ525は、パス状態エントリ520を指すハンドル527を有し、このエントリもやはり、ハンドル512を介して共通の近隣状態エントリ500に向かうように設定されている。本発明によれば、図5Aは、さらに、次のブロックポインタに関して表すこともでき、それにより、複数のネットワーク接続のチムニーを一度に含むことができる。
図5Bは、ブロックリストハンドル(様々な次のブロックポインタおよび依存ブロックポインタの集まり)による、同時オフロードに関する異なるネットワーク接続の間の複数のネットワーク接続ブロックの関係を示している。図5Aに示されているように、図5Bは、様々なソフトウェア状態ハンドルを含むソフトウェア層ブロックに関する反転ツリーを表している。示されているのは、TCPブロック540および545で、共通のパスブロック535および共通の近隣ブロック530を含む。第3のTCPブロック555は、パスブロック550および同じ近隣ブロック530を持つ。ブロックリストハンドルは、近隣ブロック530がパスブロック535を指す依存ブロックポインタ537を含むことを通知する。しかし、図5Aの前の反転ツリーとは対照的に、近隣ブロック530は、さらに、次のブロックポインタ532を通じて別の反転ツリーデータ構造を指すこともできる。次のブロックポインタ532が欠損している場合(例えば、NULL値)、これは、反転ツリーのその層に他の反転ツリーがないことを、ブロックリストにおいて知らせることができる。同様に、パスブロック535は、パスブロック550を指す次のブロックポインタ560、つまり、反転ツリーの全く異なる接続「分岐」を有する。
近隣ブロック530の場合のように、パスブロック535および550はそれぞれ、依存ブロックポインタ542および557、ならびに次のブロックポインタ560および570を有し、パスブロック550は、さらに、全く異なる反転ツリーの異なる接続パスを指すこともできる(例えば、572)。さらに、TCPブロック540、545、および555は各々、同じ反転ツリー内の別のTCPブロックを指すか(例えば、547)、またはこのツリー内にそれ以上ブロックがないことを示す(例えば、562および572)ことができる、次のブロックポインタ547、562、および572を有する。しかし、これらのポインタは静的でない。つまり、リンクは、あるパスに対してルートが変化した場合などに変化することがあり、次の近隣を異なるルートに変更する場合がある。その場合、例えば、パスブロック550は、使用する近隣エントリを近隣状態エントリ1 530から他の何らかの近隣(例えば、近隣エントリ2(図に示されていない))に変更することが可能である。したがって、ブロックリストを使用すると、複数の接続パス、および近隣エントリを1回のプログラム呼び出しでオフロードまたは終了することができる。
これは例に過ぎず限定ではないが、第1のオフロード要求では、オフロードターゲット(例えば、NIC)側でデータ構造各々(例えば、540、545、535、530など)に対する状態およびハンドルを割り当て、およびホストネットワークプロトコルスタックへのオフロードターゲットのハンドルを返す必要がある。特定のエントリ内のオフロードターゲット割り当てハンドルが無効であれば、状態オブジェクトは新しいオフロード要求である。ホストスタックによるその後のオフロード要求では、既存のパスまたは近隣状態エントリを再利用する可能性もある。ブロックリストは、層毎に状態オブジェクトを1つだけ含むか(例えば、単一の近隣状態オブジェクト、パス状態オブジェクト、およびTCP状態オブジェクト)、または図5A〜5Bで定義されているより複雑な構造であってもよい。指摘されているように、このより複雑な構造により、複数の接続パス、および近隣エントリを1回のプログラム呼び出しでオフロードまたは終了することができる。
示されているようにホストが接続をオフロードした後、1つまたは複数のソフトウェア層では、それぞれの状態オブジェクトの変更を更新する必要がある場合がある。図6は、本発明で状態オブジェクトのキャッシュ状態部分を更新するためのネットワークプロトコルスタック内の中間ソフトウェア層間の本発明による可能な信号シーケンスを示している。すでに述べたように、これは、ソフトウェア層において、層のCACHED状態変数の変化により周辺装置を更新するとき行われる。状態オブジェクトのCACHED状態変数を更新することで、中間ソフトウェア層と周辺装置状態との整合性をとることができる。
したがって、図6は、各ソフトウェア層がそのCACHED状態変数を周辺装置により更新するときに、各ソフトウェア層は更新信号を送信し、ミニポートドライバ690に届くまで信号はネットワークプロトコルスタックを下り方向へ進むことを示している。例えば、TCP層650がそのCACHED状態変数を周辺装置により更新する必要がある場合、TCP層650は信号610をネットワーク層(パス)660に送信し、さらにこれは、更新信号620をフレーミング層(近隣)670に送信し、さらにこれは、更新信号630をネットワークドライバインターフェース規約(NDIS)680に送信し、さらにこれは、信号640をミニポートドライバ690に送信する。CACHED状態変数が周辺装置により更新された後、ミニポートドライバ690は信号645をNDIS680に中継し、TCP層への一組の中継635、625、および615を続行し、TCP CACHED状態変数が周辺装置により更新されていることを通知する。
本発明では、ブロックリストデータ構造を使用しているため、これら一連の更新および確認ステップは、最初にCACHED状態変数を更新したソフトウェア層でのみ実行するだけでよい。つまり、例えば、フレーミング層(近隣)670がNICを備えた状態オブジェクトのCACHED状態変数部分を更新する必要があった場合、ステップ630、640、645、および635だけを実行すればよいということである。したがって、ネットワークプロトコルスタックの上位ソフトウェア層は、フレーミング層のCACHED状態を更新するために信号中継に参加する必要がない。また、このように複数の接続状態変更をブロックリストにより更新できるため、オフロードされたネットワーク接続各々の接続の完全性を非常に高いものとすることが可能である。それに代わる実施形態では、更新通信を、更新を実行するソフトウェア層とミニポートドライバ690との間で直接行わせることが可能である。しかし、これには、ミニポートドライバ690とのインターフェースを何回も呼び出す必要があり、追加ネットワークプロトコル層をオフロードに追加するように容易には拡張可能ではない。
ホストCPUまたは周辺装置がオフロードされた接続または状態オブジェクトを終了する必要がある場合、本発明では、信号送受信ステップの類似のシーケンスを提案している。前付として、ホストまたはオフロードターゲットはオフロードを終了することができる。中間プロトコル層では、さらに、TCP接続が依存していたパスまたは近隣状態オブジェクトを終了することにより、オフロードされたTCP接続を間接的に終了することもできる。最終的に、TCP接続タイムアウトが発生し、さらに、オフロードターゲットはTCP接続オフロードを終了するよう要求する。コレクションオフロードは、様々な理由から終了する。一般に、特定の接続のオフロードをプロトコルスタックに指示する管理メカニズムがある。管理者がオフロードするよう指令した接続についてオフロードの終了をオフロードターゲットが要求する場合、ホストはその終了を認め、管理者のためにイベントがログに記録される。
それに代わり、ネットワークインターフェースが停止した場合(例えば、媒体切断イベント)、オフロードターゲットは、オフロードされた状態オブジェクトの終了を要求すべきではない。ホストは、通常の信号送受信イベント通じてイベントが通知され、今後何を行えば最もよいのかを決定する。そのうえ、接続がリセットされた場合(これは、TCP RSTセグメントが受信された場合に発生する)、オフロードターゲットは、接続のオフロードを終了すべきであることをホストに指示する。次のホップアドレスが変更され、近隣状態オブジェクトが変更される場合、ホストスタックにより、古い状態オブジェクトが無効化される前に新しい状態オブジェクトが作成されることが保証される。これにより、オフロードターゲットでは、近隣またはパス状態オブジェクトが有効でなくなった場合、それは、ホストスタックからのパスおよび/または近隣状態オブジェクト更新に一時的競合状態が生じたためであることが確かであると判定できる。
図7は、周辺装置がオフロードされたTCP接続の終了を要求するネットワークプロトコルスタック内の中間ソフトウェア層間の本発明による可能な信号シーケンスを示している。周辺装置は、オフロードの終了を決定した場合、(ホストスタックによって通知される)「指示」機能を呼び出ことによりオフロードの終了をホストスタックに要求し、および周辺装置側でオフロードを終了することを望んでいる理由を含める。この理由としては、周辺装置が特定のネットワークプロトコル層の機能をサポートしていないため、緊急データを受信したが、それに対応できないという状況など、様々な理由があり得る。例えば、周辺装置の終了要求は、ミニポートドライバ790からNDIS780への呼び出し702で始まるプロトコル層を通じて一連の信号(702、704)の後に続き、さらに終了要求信号704がTCP層750に送信される。ホストが周辺装置の終了要求を許可した場合、ホストは、信号をミニポートドライバ790に送信することにより要求を確認する。
図7には、ホストスタックがオフロードの終了を決定した後、ホストスタックが中間ソフトウェア層各々を通じて信号を送信し、終了を中間層に通知する状況が示されている。例えば、TCP750は終了知らせる信号をネットワーク層760に送信し(728)、ネットワーク層は終了を知らせる信号をフレーミング層770に送信し(726)、さらに信号724および722でネットワークプロトコルスタックを下り方向へ進む。中間ソフトウェア層の最上位層(例えば、TCP)の場合、TCPトランスポート層750(つまり、トランスポート層300)は終了を要求し、TCP(またはトランスポート)層はオフロードターゲットへの新しいアプリケーション送信または受信バッファのポストを停止し、任意の受信したTCPセグメントのバッファリングを開始し、周辺装置によるネットワーク接続のアップロードが成功するまでバッファリングを続ける。それとは対照的に、ネットワークプロトコルスタック内の下位の各ソフトウェア層では、それぞれの層が状態オブジェクトに対する最後の依存ブロックリストデータ構造であるか検査する。それぞれの中間層にそれ以上依存ブロックがない場合、それぞれの層も、追加ブロックリストデータ構造をリストに加えることによりそれぞれの状態オブジェクトの終了を要求し、中間層のそれぞれの状態オブジェクトに対するオフロードターゲットハンドルを含める。追加依存ブロックがある場合は、状態オブジェクトのアップロードを要求せず、単に、アップロード要求を次層に転送するだけである。信号724および722を参照のこと。
オフロードターゲット(例えば、周辺装置)は、ネットワークプロトコルスタックを通じて要求された終了を確認すると、入って来るネットワーク接続データの処理を中止し、出て行くネットワーク接続データの処理を整合性のとれた状態にする。未処理の要求に関して(つまり、アプリケーション層はオフロード終了を確認する前にネットワーク接続データバッファをポスト済みである)、ステータス信号(732、734)によるオフロードターゲットの応答は、ネットワークプロトコルスタックを上り方向へ進んで戻り、接続「アップロード」が「進行中」であることを示す。周辺装置がすでにリモートコンピュータ(つまり、WAN上のリモートピアコンピュータ)への受け入れの受領確認を行っている受信済みネットワーク接続データがあるが、ホストのアプリケーションはまだ、(最終処理のため)それを消費するバッファをポストしていない場合、周辺装置はこのポストされたバッファを、中間ソフトウェア層に返すTCP DELEGATED状態変数の一部としてパッケージする。
いずれの場合も、周辺装置は、各DELEGATED状態変数の制御(例えば、信号744、746、748)を(例えば、NDIS780を通して)各中間ソフトウェアレベルに返し、ホストCPUはDELEGATED状態の制御を取り戻す。したがって、オフロードターゲットは、様々な層からの要求されたDELEGATED状態の一貫性のあるスナップショットが作成されることを保証し、その状態をOffloadBlockList構造に関連付けられた状態構造の中に書き込み、オフロード終了完了機能(742)を呼び出す。ここでもまた、ブロックリストデータ構造がオフロードされているため、接続終了呼び出しは、一度に1つまたは複数の接続について行うことができる。
1つまたは複数のNICドライバなど、1つまたは複数の物理周辺装置デバイスドライバを管理する1つまたは複数の仮想デバイスドライバをさらに用意することができる。仮想デバイスドライバは、単一のMAC(Media Access Control)アドレスをホストスタックに公開し、ホストスタックと仮想ドライバが管理する1つまたは複数の周辺装置デバイスドライバとの間のマッピングを提供する。または、仮想デバイスドライバは、実際に、複数の論理インターフェースを1つ(または複数の)物理周辺装置のホストスタックに提供し、ホストスタックが物理周辺装置よりも多いネットワークがあるかのようにネットワークトラフィックを管理することができる。その結果、周辺装置デバイスドライバは、ホストスタックからは1つまたは複数の仮想デバイスドライバに見えるように抽象化され、下の1つまたは複数の周辺装置デバイスに関する知識を持たない。仮想デバイスドライバは物理デバイスドライバと別であってもよいし、あるいはそれらの中に埋め込んでもよいことに注意されたい。
本発明では周辺装置初期化プロセスに参加させることにより仮想周辺装置を有効化することができ、それ自身を通じて物理装置にすべての呼び出しをリダイレクトし、システム内に存在する物理周辺装置よりも多いまたは少ない仮想周辺装置をホストスタックに潜在的に通知できる。
データ転送中に、周辺装置のチーム内のフェイルオーバーサポートのため、仮想周辺装置は特定の物理装置が故障しているかを検出することができる。これをサポートするメカニズムとしては、媒体感知が失われたかどうかを検出するもの、あるいはオフロードされた周辺装置からネットワークスイッチに一定間隔で繰り返される信号の形式で送られる一定のハートビートによるものなど、様々なものがある。ハートビートが失われたことを周辺装置が検出した場合(例えば、信号を検出しなくなることにより)、周辺装置デバイスドライバはこのイベントを信号で仮想周辺装置に送る。
本発明により、仮想周辺装置はオフロードされた状態オブジェクトを復元し、ネットワークトラフィックをチーム内の別の周辺装置に移動することを試みる。仮想周辺装置はこれをホストネットワークスタックを使用して別の物理周辺装置へのフェイルオーバーが発生している間にスタックを管理するか、または新しいプロトコルオフロード要求を中止し、状態オブジェクトを新しい物理周辺装置自体に移動させることにより、様々な方法で行うことができる。
遷移中にオフロードされた状態オブジェクトまたは接続(TCPの場合)のホストプロトコルスタックによる管理を許可することを仮想周辺装置で選択した場合、仮想周辺装置は、ホストプロトコルスタックが周辺装置への接続のオフロードを中止して、ホストがすでに周辺装置にオフロードしてしまっている既存の状態オブジェクトをアップロードすることを要求する。仮想周辺装置がオフロードを再有効化するまで、ホストは中間ソフトウェア層でリンクまたは接続を処理する。
仮想デバイスドライバは、1つまたは複数の周辺装置内の利用可能なすべての周辺装置を認識している。周辺装置が故障すると、仮想デバイスドライバは、接続または状態オブジェクトのオフロードを受け取ることができる新しい周辺装置を選択する。仮想デバイスドライバは、新しい周辺装置が所有することができるリソースを検出し、周辺装置内で必要な任意の状態を初期化する。周辺装置が初期化された後、仮想装置は状態オブジェクトのオフロードを再有効化する。
ホストスタックが特定の仮想周辺装置へのオフロードを再有効化されると、そのオフロード機能に関して仮想周辺装置に再度問い合わせる。ホストは、機能の新しいリストを使用して、オフロードできる状態オブジェクトまたは接続を選択する。この結果、通知された新しい周辺装置の機能に応じて、反転ツリーの制御権を移すことにより(つまり、委譲状態変数、キャッシュ状態変数、および定数状態変数を移すことにより)、仮想周辺装置(および、新しい周辺装置)に接続を再オフロードことになる場合がある。あるいは、新しい物理周辺装置がオフロードをサポートしていない場合、ホストは、オフロードを試みるのではなく、単に、中間ソフトウェア層を通じて自動的に接続の処理を継続するだけである。
それに代わって、仮想周辺装置は、周辺装置自体の間のオフロードされた状態オブジェクトの遷移を管理することを選択することができる。これが行われると、仮想周辺装置はまだ、上述のイベントシーケンスを使用してオフロード要求を終わらせる一方で、状態を(オフロードされた状態オブジェクトをホストプロトコルスタックに移動させるのではなく)直接移動し、フェイルオーバーが完了したときに機能の任意の変更を通知する。
ホストは、特定の状態オブジェクトまたは接続をオフロードできるとしても、オフロード機能が変わったときに一貫した状態を維持するため、またホストは最初の周辺装置のフェイルオーバーが発生した場合に新しい周辺装置とパラメータの再ネゴシエーションできるため、本発明では、周辺装置の故障に関係なく、一度に1つまたは複数の状態オブジェクトまたは接続のオフロードおよびアップロードを実行する新規性のある堅牢な方法を提供する。
仮想周辺装置が1つまたは複数の物理周辺装置上で複数の仮想LANをサポートするように構成されている場合、仮想周辺装置は、ここでもまた、物理装置の初期化を横取りし、代わりに、1つまたは複数の仮想周辺装置をホストスタックに通知し、特定の仮想アダプタに実行されるすべての呼び出しが適切な仮想LANタグおよび物理周辺装置にマッピングされることを保証する。オフロード中に、フレーミング層の状態オブジェクトへの追加または仮想周辺装置の新規状態オブジェクトの作成のいずれかにより、初期オフロード要求で仮想IDが転送される。特に、本発明により、仮想装置は1つの構造をBlockList内のフレーミング層構造のすぐ下のBlockList構造の中に挿入するか、またはフレーミング層のBlockListの状態オブジェクトにVIDを追加することができる。前者のアプローチでは、さらに、仮想周辺装置は、物理周辺装置に対し不透明な(opaque)データ(場合によってはベンダ専用データ)を指定することができる。接続がアップロードされるとき、オフロード中に仮想周辺装置により追加状態オブジェクトが加えられると、仮想周辺装置は、その構造を除去し、BlockListの残り部分をホストプロトコルスタックに受け渡す。
本発明は、さらに、機能ステップを含む方法および/または非機能動作に関して説明することもできる。以下では、本発明を実施する際に実行することができる動作およびステップについて説明する。通常、機能ステップでは、遂行される結果に関して発明を説明するが、非機能動作では、特定の結果を得るためのより具体的な動きを説明する。非機能ステップおよび非機能動作は特定の順序で説明または請求することができるが、本発明は、必ずしも、特定の順序付け、ならびに動作および/またはステップの組合せに限定されない。
図8は、1つまたは複数の送信先コンポーネント装置と1つまたは複数の送信元コンポーネント装置との間で制御を受け渡すための方法を実装する流れ図を示しており、この制御は、確立されているネットワーク接続の完全性を維持しながら、複数のネットワーク接続を処理し送信元コンポーネントの処理負荷を緩和するために必要である。図8は、本発明を実施するこの方法は、2つまたはそれ以上のネットワーク接続の処理制御を一度に受け渡すことにより2つまたはそれ以上のネットワーク接続を処理しているコンピューター化システムの処理要求を低減するステップ800を含むことを示している。理想的には、このステップ800は、状態変化、フェイルオーバーイベント、VLANタグに関して2つまたはそれ以上のネットワーク接続の完全性を保持するように実行されるべきである。
ステップ800は、ブロックリストを生成する特定の動作810を実行することにより遂行されることができる。動作810は、ブロックリストの生成を含むことができ、ブロックリストは、ネットワークプロトコルスタック上で2つまたはそれ以上のネットワーク接続のデータパスに対する連続するソフトウェア層に対応する一連のブロックポインタを含む。例えば、動作810は、ネットワークプロトコルスタックを通じて異なる接続のデータパス内の同じ状態の層を指す(例えば、2つの異なる近隣層530の状態間のポインタ532)、あるいはネットワークプロトコルスタックを通じて同じ接続のデータパス(例えば、535)内の同じ状態の層を指す(例えば、TCP540とTCP545との間のポインタ547)、次のブロックポインタを生成することにより実行することができる。
さらに、ステップ800は、状態オブジェクトの一部のブロックリストおよび制御を送信先コンポーネントに受け渡す特定のステップ830も含む。各ソフトウェア層の状態オブジェクトの一部は、1つまたは複数のDELEGATED、CACHED、およびCONST状態変数を含むことができる。そこで、ホストスタックは、各ソフトウェア層に対し(例えば、制御信号330、332、334、336を送信することににより)、周辺コンポーネント(例えば、周辺装置)にCACHEDおよびCONST状態変数のソフトウェア層での値を送信すること、およびその層はその層のDELEGATED状態変数の制御を周辺コンポーネントに受け渡す必要があることを指示することができる。
送信元コンポーネントは、その後、チムニーオフロード中またはチムニー終了(またはオフロード終了)中にブロックリストをオフロードターゲット(例えば、オフロード中には周辺装置、アップロード中にはCPU)に送ることができる。さらに、オフロードは、送信元コンポーネントが少なくとも、オフロードまたはアップロードのいずれかが行われているオフロードされたソフトウェア層のDELEGATED状態変数の制御を渡すまで完了しない。こうして、オフロード(またはアップロード)は、ブロックリストおよびそれぞれのDELEGATED状態変数を送信元コンポーネントから送信先コンポーネントに受け渡す特定の動作の後、1つまたは複数の反転ツリーからの複数の接続について完了する(および場合によっては、送信先コンポーネントがすでにそれを持っていなければCACHEDおよびCONST)。
図8の方法は、さらに、ステップ800を実行した後(動作810、820、および830を経由して)、送信先コンポーネントにより2つまたはそれ以上の接続を処理する特定の動作840を実行することを含むことを示している。上述の説明から推察されるように、動作840は、受け渡しの後に送信先コンポーネントにより2つまたはそれ以上の接続を処理することを含み、その際に、各状態オブジェクトのデータ構造部分のブロックリストおよび制御がソフトウェア層に渡される場合、中間ソフトウェア層で中央演算処理装置で接続を処理し、各状態オブジェクト部分のブロックリストおよび制御が周辺装置に渡される場合、周辺装置で接続を処理する。
例えば、多重接続アップロードの場合、周辺装置は、ネットワーク処理制御を中間ソフトウェア層、CPUへと戻し、通常のネットワークプロトコルスタックを通じて処理する。しかし、多重ネットワーク接続オフロードの場合、CPUはブロックリスト、および中間ソフトウェア層のそれぞれのCACHED、CONST、およびDELEGATED状態を周辺装置に受け渡して、チムニーを通じて処理するという形で、ネットワーク処理制御を周辺装置に受け渡す。本発明は、長命接続および短命接続の両方で実施することができる。短命のTCP接続などの短命接続を特に参照すると、CPUはデータ転送の「スロースタート」段階で各短命接続をオフロードすることができる。
説明のため、例えば、リモートコンピュータがサーバとの短命HTTP接続を確立したとすると、このサーバは、通常、要求されたデータをすべて一度に送信することによりリモートコンピュータの要求に応答するわけではない。ほとんどの場合、サーバは、最初、接続帯域幅を評価するため、ゆっくりとデータを転送し、リモートコンピュータまたはパス内の他の装置もしくはリンクをオーバーフローさせるのを避ける。この評価を行うため、サーバは要求されたデータを、徐々にデータパケット数を増やしながら繰り返しリモートコンピュータに送信する。例えば、サーバは、500バイトパケットを送信し、リモートコンピュータからの肯定応答の届くのを待ち、その後、2つの500バイトパケット(1000バイトパケット)を送信し、リモートコンピュータから肯定応答の届くのを待ち、そして5つの500バイトパケットを送信し、というように、サーバがリモートコンピュータとの間で最大データ転送速度に達するまでこの作業を続ける。
したがって、リモートコンピュータで使用できるのが、28.8Kbps(キロビット/秒)のダイヤルアップ接続だけであれば、サーバは最終的に、ある特定の速度(データパケット/秒)でしかデータを転送できないが、リモートコンピュータで使用できるのが、1000Mbps(Mbps:100万ビット/秒)のブロードバンド接続であれば、サーバは最終的に、かなり高い速度でデータを転送することができる。このインクリメンタルデータ送信速度(incremental data send rate)(「スロースタート」)では、ある遅延ウィンドウがあり、通常は、CPUと周辺装置との間の短命接続の制御を受け渡すのに必要な時間よりも長い。したがって、一部はこの方法が一度に複数の接続をオフロードする機能を提供するので、「スロースタート」転送ウィンドウを使用する本発明は、特にオフロードする接続が多数ある場合に、短命ネットワーク接続と長命ネットワーク接続の両方の処理制御を受け渡すのに特に適している。
図9は、障害が発生した1つまたは複数の周辺装置から、複数のオフロードされた接続を受け取ることができる他の周辺装置に複数のオフロードされたアグリゲートネットワークリンクを受け渡し、その一方で、確立されたアグリゲートネットワークリンク各々の安全性を維持する方法を実装する流れ図を示している。図9は、送信先コンポーネントにフェイルオーバーが発生した場合に1つまたは複数のアグリゲートネットワークリンクの完全性を動的に保持する機能ステップ900を実行することにより、本発明に基づく実施形態を実装することを示している。すでに述べたように、このステップは、障害の発生していない1つまたは複数の送信先コンポーネント(つまり、代替の送信先コンポーネント)で1つまたは複数のアグリゲートネットワークリンクを処理できるように実行しなければならない。さらに、ステップ900は、1つまたは複数の初期周辺装置が故障したことを検出する特定の動作910を含む。動作910は、1つまたは複数のアグリゲートネットワークリンクの処理制御を行う1つまたは複数の初期周辺装置が故障したことを検出することを含む。
例としてであって限定ではないが、ネットワークリンクは、「チーム化NIC」環境(例えば、802.3ad)などで「アグリゲート」する(つまり、複数の周辺装置上の複数のリンクを1つのネットワークリンクとして扱う)ことができる。本発明によるホストCPUでは、1つまたは複数のブロックリストおよび1つまたは複数のDELEGATED状態を中間ソフトウェア層から1つまたは複数の初期周辺装置に送信することにより、タスクを処理するネットワークの処理をチーム化周辺装置にオフロードすることができる。これらのアグリゲートリンクはかなり大きくなる可能性があるため、接続の完全性はCPUにとってある程度重要なことである。したがって、ホストCPUは、周辺装置のうち1つまたは複数がオフロードされたネットワークリンクを処理できなくなった場合にそのことを検出する必要があるかもしれない。
そのために、NICが周辺装置である一実施形態では、オフロードされた周辺装置およびリンク上のネットワークから一定間隔で繰り返される信号の形の一定の「パルス」があってよい。例えば、このパルスは、NICにアグリゲートリンクがまだアクティブであることを知らせるNICとネットワーク装置(例えば、ネットワークルータ)の間の連続する電気信号形でよい。したがって、パルスが停止するか、またはネットワーク装置がある種のエラーメッセージ形のパルスを送信するか、またはホスト管理者がコンポーネントにフェイルオーバーの指令を送った場合に、ホストはNICがオフロードされたタスクを実行できなくなったことを認識する。
ステップ900は、さらに、処理制御を中央演算処理装置に戻す特定の動作920も含む。動作920は、1つまたは複数のアグリゲートネットワークリンクの処理制御を初期周辺装置から中央演算処理装置に返す動作を含む。例えば、NICは、エラーまたは障害信号(例えば、信号702、704、および708)への応答として、ホストCPUが複数のネットワークリンクについてすでにオフロードされていたブロックリストおよびDELEGATED状態変数をアップロードすることを要求することができる。NICは、その後、ネットワークプロトコルスタック内の中間ソフトウェア層を通じてそれぞれのDELEGATED状態変数のブロックリストおよび制御をホストCPUに受け渡さなければならない。
ステップ900は、さらに、異なる1つまたは複数の代替周辺装置の処理リソースを検出する特定の動作930も含む。動作930は、アグリゲートリンクを受け取ることができる1つまたは複数の代替周辺装置のリソースの機能を検出することを含む。例えば、1つまたは複数の様々なNICの有するリソース能力は、フェイルオーバーNICよりもかなり多いか、またはかなり少ない場合があるが、様々なデータサイズの処理能力を備えていたり、または低速/高速なプロセッサを装備したりしているからである。さらに、接続は、異なるNICで接続のうちごくわずかしか処理できない(つまり、1つまたは複数の代替NICがいくつかのセキュリティパラメータをサポートしていない)、あるいはNICが一度に処理できる接続は比較的少数に限られるというような性質を持つことがある。したがって、本発明では、ブロックリストの1つまたは複数、およびそれぞれの状態オブジェクトを操作し、新しい1つまたは複数のNICがオフロードされた接続を効果的に受け取れるようにするそれぞれの状態オブジェクトにより、新しい1つまたは複数のNICとパラメータのネゴシエーションを行うことを規定している。一実施形態では、フェイルオーバーイベントの検出、および新しい使用可能な周辺装置の検出を行い、受け渡しを取り扱う作業は、本明細書で説明しているように、また図10の中間ドライバとしても説明されているように、仮想デバイスドライバにより実行できる。異なる(新しい)1つまたは複数のNICとパラメータのネゴシエーションを行う機能により、複数の接続オフロードを継ぎ目のない形でサポートすることができる。
図9は、さらに、機能ステップ900の後にネットワークリンク処理制御を1つまたは複数の代替周辺装置に受け渡す特定の動作940を続けることにより本発明の方法を実装することを示している。動作940は、1つまたは複数のアグリゲートネットワークリンクの処理制御を1つまたは複数の代替周辺装置に受け渡すことを含む。例えば、ホストは、1つまたは複数の新しい周辺装置(例えば、NIC)とパラメータのネゴシエーションを行った後、それぞれのDELEGATED状態のそれぞれのブロックリストおよび制御を適切な1つまたは複数の中間ソフトウェア層に受け渡すことができる。ホストがブロックリストおよびDELEGATED状態を適切な1つまたは複数の代替NICに受け渡した後、1つまたは複数の代替NICは、アグリゲートネットワークリンクを処理し、それにより、ホストからそれらのネットワーク処理負荷を取り除くことができる。
図10は、本発明による一実施形態を実装する流れ図を示しており、本発明は中間ドライバ(仮想周辺装置デバイスドライバなど)をオフロードデータ構造の隣に挿入し、ネットワーク接続のオフロードおよび/またはアップロードプロセス中に、仮想ローカルエリアネットワークおよび802.3adフェイルオーバーイベントのうち少なくとも1つをより円滑にする方法を実行する。このフローチャートを特に参照すると、本発明の実施形態は、2つまたはそれ以上のCACHED状態データ構造を検出する特定の動作1000を含む。動作1000は、ネットワークプロトコルスタック内の1つまたは複数の中間ソフトウェア層の2つまたはそれ以上の状態オブジェクトと一致する2つまたはそれ以上のCACHED状態データ構造を検出することを含む。
例えば、アプリケーション層は、ネットワークプロトコルスタック内の各ネットワーク層に指示信号(例えば、330、332、334)を送信して、各層の状態オブジェクトのエクステント、およびもしあるとすればどのようなプロセスを層はアップロードする必要があるかを判断することができる。ホストが処理制御を周辺装置に与える際の唯一の状態変数は、CACHED状態変数であるため、アプリケーション層では、各層に問い合わせを行い、どの層でCACHED状態変数をオフロードするかを調べる必要がある。多重接続の場合、少なくとも2つのCACHED状態変数が、ネットワークプロトコルスタックの同じ中間ソフトウェア層内で検出される。
図10に示されている本発明の方法は、さらに、2つまたはそれ以上のCACHED状態をチムニースタックにまとめる特定の動作1010を含む。動作1010は、2つまたはそれ以上のCACHED状態データ構造を順次、チムニースタックデータ構造にまとめ、チムニースタックデータ構造を周辺装置にオフロードすることにより、周辺装置に2つまたはそれ以上のCACHED状態データ構造に対するプロセッサ制御を提供する。例えば、ソフトウェア層でCACHED状態変数を示した後、ホストプロセスは、CACHED状態を正しい処理順序でNIC内に読み込む。単一のネットワークリンクの場合、ソフトウェア層に対する状態のこのようなシーケンスは、本明細書で説明されている反転ツリーの単一の枝(例えば、図4A)として表すことができる。複数のネットワークリンクがある場合、CACHED状態と、複数の次のおよび依存ブロックポインタをまとめるブロックリストとを組み合わせたシーケンスをデータ構造ブロックの反転ツリーとして表すことができる(例えば、図5B)。いずれの場合も、チムニーはNICにオフロードされる単一データ構造を含む。名前から分かるように、チムニーデータ構造は、煙が実際の煙突の中を通るのと同様に、データは単一のデータインターフェースのところから入り、別の単一インターフェースから出るだけであり、処理中(または通過中)他のオペレータとの外部相互作用を持たないという点で、ビルに備わっている実際の煙突と酷似している。
さらに、図10に示されている方法は、チムニースタックを含むオフロードデータ構造を作成する特定の動作1020を含む。例えば、チムニーデータ構造(例えば、308)は、さらに、チムニードライバデータ構造、1つまたは複数のネットワークドライバインターフェース規約(NDIS)データ構造、およびミニポートドライバデータ構造と結合することができる。データ構造の集まり全体を、複合オフロードデータ構造として組み合わせることができる。
図10の本発明の方法は、さらに、オフロードデータ構造内に中間ドライバを挿入する特定の動作1030も含む。例えば、複数のまたは集められたリンク間のより具体的なニーズに対処するため、中間ドライバをオフロードデータ構造の中に挿入する必要がある場合がある。中間ドライバは、オフロードの開始後、ホストスタックにより生成することが可能である。802.3adのアグリゲートリンクの場合、中間ドライバ(IMドライバ)をオフロード構造の中に挿入することで、さらに2つの「チーム化」NICの間のリソースおよび接続を調整することが可能である。それに代わり、単一のNIC、または汎用CPUなどの単一の周辺装置を表す複数の中間ドライバを作成し、オフロードデータ構造の中に挿入することも可能である。仮想ローカルエリアネットワーク(VLAN)の場合、1つまたは複数のIMドライバで、入って来るデータパケットに添付されているVLANタグを変換する必要があることがある。
説明のため、ネットワーク管理者は、文書はすべて同じネットワーク上にあるが、組織の特定のグループのみが互いに相手の文書を見られるようにしたいとする。VLANを使用すると、データにタグ付けすることによって特定の仮想ネットワークのメンバのみが互いのコンピュータデータにアクセスできるよう対応できる。つまり、同じネットワーク上で、管理者は「研究」VLANのメンバが「マーケティング」VLAN上のメンバのコンピュータを見られないように複数のVLANを編成することができる。VLANでは、オフロードスタックがVLANデータタグを解読できなくてもよいので、複数の長命または短命接続をオフロードすることに対し特別に複雑な問題が生じることがある。これは、一部、入って来るデータパケットが、ネットワーク接続の処理の前後に解読されなければならない複数のVLANタグを含む可能性があるからである。
そこで、本発明では、2つまたはそれ以上のVLANタグを含むデータパケットを逆多重化(de-multiple)し、データトラフィックを適宜処理することができる1つまたは複数の中間ドライバを(複数の周辺装置に基づく単一の中間ドライバであろうと、単一の周辺装置に基づく複数の中間ドライバであろうと)オフロードデータ構造内に挿入することを規定する。このVLAN機能は、一般に、フレーミング層により割り当てられる。
しかし、本発明および請求項を考慮すると、1つまたは複数の中間ドライバは、さらに、IPSECプロトコルを通じてデータトラフィックのセキュリティ保護を行うなど、ネットワーク層により割り当てられた機能を処理することも可能であることが分かるであろう。これは、VLANタグのフレーミング層機能への追加とすることもできる。例えば、中間ドライバは、データパケットに認証ヘッダを追加したり、またはデータパケットをカプセル化したり、またはその両方を行う機能を実行することができる。これは、フレーミング層を通じて割り当てられた任意の追加VLANタグ管理に関係なく、またはそれに加えて行うことができる。したがって、本発明では、セキュリティ保護されたリンクを必要とする環境を含む、多様な環境において実現することができるデータ構造およびドライバを提示する。
図11および以下の説明は、本発明を実施できる適当なコンピューティング環境について簡潔に述べた一般的な説明である。必要というわけではないが、ネットワーク環境でコンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的文脈において本発明を説明する。一般に、プログラムモジュールは、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。コンピュータ実行可能命令、関連するデータ構造、およびプログラムモジュールは、本明細書で開示している方法のステップを実行するプログラムコード手段の例を表している。このような実行可能命令または関連するデータ構造の特定の並びは、そのようなステップで説明される機能を実装するための対応する動作の例を表す。
当業者であれば、本発明がパーソナルコンピュータ、携帯型装置、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラム可能な家電製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータなどをはじめとする、様々な種類のコンピュータシステム構成とともにネットワークコンピューティング環境で実施できることを理解するであろう。また、本発明は、ローカルおよびリモート処理装置がタスクを実行し、通信ネットワークを通じて(有線リンク、無線リンク、または有線と無線リンクの組合せにより)リンクされている分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、プログラムモジュールは、ローカルおよびリモートのメモリ記憶装置に置くことができる。
図11を参照すると、本発明を実装するシステム例は、処理装置1120、システムメモリ1130、およびシステムメモリ1130を含む様々なシステムコンポーネントを処理装置1120に結合するシステムバス1121を備える、従来のコンピュータ1110の形をとる汎用計算装置を含む。システムバス1121は、メモリバスまたはメモリコントローラ、周辺装置バス、および各種バスアーキテクチャを採用するローカルバスを含む数種類のバス構造のどれでもよい。システムメモリは、読み取り専用メモリ(ROM)1131およびランダムアクセスメモリ(RAM)1132を含む。起動時などにコンピュータ1110内の要素間の情報伝送を助ける基本ルーチンを含む基本入出力システム(BIOS)1133は、ROM1131に格納することができる。
コンピュータシステム1110は、さらに、磁気ハードディスク(図示せず)への読み書きを行うための磁気ハードディスクドライブ1141、リムーバブル磁気ディスク1129への読み書きを行うための磁気ディスクドライブ1151、およびCD−ROMまたはその他の光媒体などのリムーバブル光ディスク1128への読み書きを行うための光ディスクドライブ1155を備えることもできる。磁気ハードディスクドライブ1141、磁気ディスクドライブ1151、および光ディスクドライブ1155は、固定の不揮発性メモリインターフェース1140、およびリムーバブル不揮発性メモリインターフェース1150によりそれぞれシステムバス1121に接続される。ドライブおよび関連コンピュータ読取り可能な媒体は、コンピュータ1110用のコンピュータ実行可能命令、データ構造、プログラムモジュール、およびその他のデータを格納する不揮発性記憶装置を実現する。本明細書で説明している環境例では、磁気ハードディスク(図示せず)、リムーバブル磁気ディスク1129、およびリムーバブル光ディスク1128を採用しているが、磁気カセット、フラッシュメモリカード、デジタル多目的ディスク、ベルヌーイカートリッジ、RAM、ROMなどの、データを格納するための他の種類のコンピュータ読取り可能な媒体を使用することができる。
ハードディスク(図示せず)、磁気ディスク1129、光ディスク1128、ROM1131、またはRAM1132には、オペレーティングシステム1134、1つまたは複数のアプリケーションプログラム1135、その他のプログラムモジュール1136、およびプログラムデータ1137など1つまたは複数のプログラムモジュールを含むプログラムコード手段を格納できる。ユーザは、キーボード1162、ポインティングデバイス1161、またはマイク、ジョイスティック、ゲームパッド、衛星放送アンテナ、スキャナなどの他の入力装置(図示せず)を通じてコンピュータ1110にコマンドおよび情報を入力することができる。これらの入力デバイスおよび他の入力デバイスは、多くの場合、システムバス1121に結合されているインターフェース1160を通じて処理装置1121に接続される。それとは別に、入力デバイスは、パラレルポート、ゲームポート、またはユニバーサルシリアルバス(USB)などの他のインターフェースにより接続することもできる。モニタ1191または他の表示装置も、ビデオアダプタ1190などのインターフェースを介して、システムバス1121に接続される。パーソナルコンピュータは、通常、モニタのほかに、スピーカ1197およびプリンタ1196など、他の周辺出力装置を備える。
コンピュータ1110は、リモートコンピュータ1180などの1つまたは複数のリモートコンピュータへの論理接続を使用してネットワーク環境で動作可能である。リモートコンピュータ1180はそれぞれ、他のパーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、またはその他の共通ネットワークノードでもよく、通常は、コンピュータ1110に関係する上述の要素の多くまたはすべてを含むが、メモリ記憶装置1181に関連するアプリケーションプログラム1185だけが図11に示されている。図11に示されている論理接続は、例として、ただしこれに限られないが、ここに示されているローカルエリアネットワーク(LAN)1173およびワイドエリアネットワーク(WAN)1171を含む。このようなネットワーキング環境は、オフィスまたは企業全体にわたるコンピュータネットワーク、イントラネット、およびインターネットでは一般的なものである。
LANネットワーキング環境で使用する場合、コンピュータ1110はネットワークインターフェース1170またはアダプタ(図示せず)を介してローカルネットワーク1171に接続される。WANネットワーキング環境で使用する場合、コンピュータ1110は、通常、モデム1172、無線リンク、またはインターネットなどのワイドエリアネットワーク1173上で通信を確立するためのその他の手段を備えることができる。モデム1172は、内蔵でも外付けでもよいが、シリアルポートインターフェース(図示せず)を介してシステムバス1121に接続される。ネットワーク環境では、コンピュータ1110またはその一部に関して述べたプログラムモジュールは、リモートにあるメモリ記憶装置に格納できる。図に示されているネットワーク接続は例であり、ワイドエリアネットワーク1173上で通信を確立する他の手段を使用することもできる。
本発明は、本発明の精神または本質的特徴から逸脱することなく他の特定の形式で実現することが可能である。説明されている実施形態は、すべての点で、説明のみを目的としており、制限することを目的としていないとみなすべきである。したがって、本発明の範囲は、上記の説明ではなく、付属の請求項により指示される。請求項の同等性の意味および範囲内にある変更はすべて、本発明の範囲に含まれるものとする。