JP4271234B2 - 修正関数を有するプロトコルスタック - Google Patents

修正関数を有するプロトコルスタック Download PDF

Info

Publication number
JP4271234B2
JP4271234B2 JP2006526479A JP2006526479A JP4271234B2 JP 4271234 B2 JP4271234 B2 JP 4271234B2 JP 2006526479 A JP2006526479 A JP 2006526479A JP 2006526479 A JP2006526479 A JP 2006526479A JP 4271234 B2 JP4271234 B2 JP 4271234B2
Authority
JP
Japan
Prior art keywords
layer
function
message
module
protocol
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2006526479A
Other languages
English (en)
Other versions
JP2007523505A (ja
Inventor
ファーナム、ティモシー・デビッド
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp filed Critical Toshiba Corp
Publication of JP2007523505A publication Critical patent/JP2007523505A/ja
Application granted granted Critical
Publication of JP4271234B2 publication Critical patent/JP4271234B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • H04L69/321Interlayer communication protocols or service data unit [SDU] definitions; Interfaces between layers

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Communication Control (AREA)

Description

本発明は、モバイル電話、ラップトップコンピュータ及び基地局などの通信端末に限らないが、特にこれらについてのプロトコルスタックとプロトコルスタック内のプロトコルレイヤとに関する。
モバイル電話、ラップトップコンピュータ及び基地局などの通信デバイスは、異なる任意の特徴を潜在的に(潜在的に同時に)支援するする多重無線アクセスネットワーク規格の支援を可能にするために異なる構成を有する多重プロトコルスタックを支援することを益々必要としている。例えば、ラップトップコンピュータは、無線ローカルエリアネットワーク、GSM又はUMTS及びBluetooth(登録商標)上の安全及び安全でないインターネットアクセスの両方を支援する必要がある。リンクレイヤでの暗号化及びIPプロトコルスタック内のVPN特徴の一部として設けられるセキュリティはプロトコルスタック内の異なるオプションとして設けられている。しかしながら、暗号化されていないパケットが他の安全でない(又は安全性が低い)スタックに転送されないことが重要である。従って、これらの異なる通信規格をサポートするプロトコルスタックは安全なフレームワークに設ける必要がある。理想的にはこれらのプロトコルスタックは、新たなプロトコルソフトウェアモジュールをダウンロードすることによって新たな通信規格又はオプション及び既存の規格の拡張を支援できるように構成可能にする必要がある。さらに、通信デバイスはバッテリ不足及び無線周波数リソースを効率的に使用できることを益々必要としている。
従って、セキュリティ強化、性能又は電力消費最適化などの更なる機能性を含む、新たなエアインタフェース技術及び任意の特徴と、これらの技術の拡張とを許容する通信ソフトウェアをインストールすることができることが必要である。
通常、プロトコルスタックの再構成はレイヤ間のインタフェースが動的に変化せずうまく定義されるように実行されるプロトコルスタックソフトウェアのモジュールを必要とする。プロトコルスタック及びネットワークインタフェースドライバソフトウェアのフレームワークは、プロトコル(又はドライバ)モジュールがこれらのインタフェース定義の正確なバージョンに準拠し、モジュールをシステムにインストールする特定の機構に実行環境(オペレーティングシステム)を利用することをチェックするために多数のオペレーティングシステム上に存在している。ソフトウェアを認証し、プロトコルソフトウェアによって実行可能な関数上の制約を強化するための方法も用いてもよい。しかしながら、これらの制約は上述したプロトコルスタック構成の状況を通常考慮しておらず、これは、サポートされているサービスのタイプに応じてセキュリティ(実行環境)保護方法及び性能に関して異なる要件を有する可能性がある。また、これらの既存のアプローチは、プロトコルスタック構成を実行するための複数の実行環境の使用については考慮していない。
通常、モバイル通信デバイス用のプロトコルスタックは単一のベンダによって提供される。将来、端末デバイスは異なる通信技術をサポートするためのより柔軟なプロトコルスタックを必要とし、複数のベンダがプロトコルスタック解に関与することになる。このことは、多数のオプション関数を有する複数の規格をサポートする必要のある無線端末においてとりわけ重要である。従って、プロトコルスタックの付加的更新を可能にすることは非常に魅力的である。
プロトコルスタックは、各々が受信パケット又はメッセージ上の(プロトコルに対応する)一連の所定のステップを実行するソフトウェアプロセスと見なすことができ、また一定のプロトコル実現と関連付けることができるレイヤのセットにより構成される。複数の論理プロトコルスタックは、例えば複数のスレッドを使用して所定のシステムにおいてインスタンスを作成して、同一のベーシックタイプの複数のトラフィッククラスやネットワークインタフェースを同時にサポートすることができる。同一のプロトコルスタックの複数の論理インスタンスは従来、これらの論理プロトコルスタックインスタンスの全てについて単一のソフトウェア構成(プロトコルスタック構成)を使用することによって達成される。しかしながら、これは、異なるセキュリティと、異なる論理インスタンスに対する実行環境の最適化とを提供する際の柔軟性を制限する。
プロトコルスタックの想定されている挙動は、全モジュールが必要な適時性とうまく相互作用し、また使用中のプロトコル定義に従っている場合にのみ達成される。これはまた、多くのプロトコルは通信接続をセットアップして維持するために異なるデバイス上のプロトコルスタック間の相互作用に依存しているので、複数のデバイス上のプロトコルスタックの実現に依拠している。ソフトウェアレイヤの動的な挿入置換又は修正を許容する柔軟なプロトコルスタックは通常、プロトコル定義に従わない、パケットを間違った受信者に送る、パケットを破壊する、正しくない又は無効なパケットを形成する、あるいは安全な接続に意図的に侵入したりアクセスしたりするためにパケットを遮断及び転送する、又は単に引き延ばす(ハンギングする)ことのいずれかによってプロトコルスタックの全動作又はセキュリティに影響する可能性がある(悪意がある、又はひどい挙動をする)危険なソフトウェアに対して弱い。
国際公開第02/28052号は、プログラマブルプロトコルスタックの動きを定義するためのパラメータを使用する適合可能なプロトコルを有する無線ネットワークインタフェースを開示している。これによって、異なるパラメータを使用することによって限られた量の再構成が実行可能となる。しかしながら、これは新たなプロトコルソフトウェアモジュールやレイヤの動的挿入は許容しない。プログラマブルプロトコルスタックの動きを定義するためのパラメータを使用する適合性プロトコルは、行うことができる限定された量の再構成しか存在しないので、より予測可能な挙動を伴う。これらはまた、新たなプロトコルソフトウェアモジュールを動的に挿入することを可能にするプロトコルスタックほどの柔軟性を与えない。
米国特許第5751972号は、ランタイム時にネットワーク上の異なるプロトコルを使用するデータ送信経路を確立するコンピュータを動的に構成することを開示している。プロトコルスタックの構成は、オペレーティングシステム固有のリンク付け機構を使用して達成される。これは、各プロトコルスタックモジュールは特定のオペレーティングシステム依存性インタフェース定義に準拠していなければならないという点において柔軟性が制限されている。また、限られた範囲のプロトコルモジュールのみが、レイヤ間の相互作用がうまく定義されてスタックがうまく動作することを保証するために使用可能である。
国際公開第01/88707号は、上下のプロトコルレイヤ間に柔軟なリンクを提供するプロトコルスタックのレイヤの各々間のアクティブプログラミングインタフェースレイヤを用いて、ランタイム時に変更可能な柔軟性プロトコルスタックアーキテクチャを開示している。しかしながら、これらの更なる中間レイヤはスタックの複雑さに加わり、込み入った実行環境の実現が必要な場合にはこれの性能を著しく低下させる可能性がある。また、ソフトウェアモジュールのリンク付けは実行環境及びプログラミング言語固有の方法(Java(登録商標)仮想マシン)で実行され、プロトコルスタックの動的再構成を可能にするJavaにおける動的クラスロードコンセプトを有効に利用するために最適化される。
プロトコルスタックにおけるレイヤは一般的に、多数の所定の状態のうちの1つに存在するように設計される。特定の状態におけるレイヤは特定のメッセージ又は信号を受信し、それに応答するように動作できるようき構成される。メッセージはレイヤを別の所定の状態に変換するか、あるいはレイヤの状態をそのまま維持するかのいずれかである。
これらの所定の状態間でのレイヤの条件的遷移は、レイヤによる受信されるメッセージに依存する。レイヤが柔軟に動くことの有効性は、メッセージが使用されているコンピュータプログラミング言語に関係なく対処されるようにすること、すなわち言語独立性を促進すること、及び異なる実行環境において状態機能性の実行を可能にすることによって高められる。
レイヤの効果的かつ永続的な設計と、適切なソフトウェアの設計による実現を可能にするために、設計者は、レイヤの状態と、受信メッセージに応答してレイヤの所望の動きを記述する状態間の遷移とを最初に決定してもよい。従って、レイヤの各状態は最も適切な言語の対応する関数モジュールによって実現されて、最も適切な実行環境において実行されることが可能である。
この場合、状態モジュールは、インスタンスを作成可能なレイヤのある特定の状態の自己完結的関数を定義してそれを直接適用するメッセージを捕捉するのに対して、別の状態にある場合にはレイヤの動きに対処する別のモジュールによる処理について適用しないメッセージを無視する。
プロトコルスタックが定義されているデバイスの寿命の間に、スタックの1つ以上のレイヤにおいて1つ以上のモジュールの機能性を変更することが必要であろう。これは、例えばプロトコルスタックの機能性が新たな通信技術を収容するなどのために拡張される必要がある場合、又は少数の改善がプロトコルスタックの1つ以上のレイヤに必要とされる場合に必要であろう。レイヤのロード関数を利用してレイヤ全体を置換することは可能であろう。プロトコルスタックへの新たなレイヤのロードを可能にする一般的な関数について添付の図面を参照して次に説明する。これは、過去に提出されている英国特許出願公開第0322985.3号にすでに説明されており、このコピーは本出願に具備され、ここに参照して組み込まれている。
図1は、当業者には既知の通信プロトコルスタックを示している。プロトコルスタックは、信号やプロトコルメッセージが処理される多数のソフトウェアつまりプロトコルレイヤL1からL7を備える。例えばアプリケーション(L7)はGSMボイスコール用のウェブブラウザやコントローラであってもよく、アプリケーション(L7)によって生成された信号及びメッセージは、例えば電波、銅線、又は光ケーブルなどの物理的インクにわたる別のアプリケーションと通信するために下レイヤL1からL6を介して処理される。
図2は通信スタックレイヤの1つの簡略例を示している。各レイヤの動作する様子に関する実際の詳細は使用されている特定のプロトコルに依存する。レイヤはボイスコールやウェブページの一部などのパケットを受信する。レイヤは受信パケット上で一連の所定のステップ(プロトコル)を実行するソフトウェアプロセスである。第1のステップはチェックサム計算を実行して、必要ならばパケットを拒絶してからパケットヘッダを取り除き、別のステップはこれのデータペイロードを暗号解読する。さらなるステップにおいて、次いでレイヤは、修正された大きなパケットを高次のレイヤにパスする前に多数の受信パケットのデータコンテンツを蓄積することができる。この蓄積は、不要なメモリコピーを回避する共有バッファ(つまりキュー)において実行可能である(そしてしばしば実行される)。通常通信レイヤはまたレイヤの高レベルから低レベルへと反対方向にパケットを処理する。原理上、2つの隣接するレイヤは、他のレイヤが実行していること及びその様子を「知る」必要はないが、実際レイヤ間のインタフェースはデータ(パケット)コンテンツの正確なフォーマットと、パスしたバッファ記憶構成と、これが達成される様子、例えばどのレイヤがこのデータをパスするか、及びパスされたデータを処理するこのレイヤの開始方法を知ることに関して定義する必要がある。これは、既知の構成に関して上述されたスタックの柔軟性を制限する。
モバイル電話などにおける代表的な一般の再構成不可通信プロトコルスタックは製造時に設定され、作業メモリにおける種々のソフトウェアレイヤについてインスタンスを作成するのに必要なソフトウェアコードは、できれば電話内のファームウェアとして固定及び記憶される。これは、レイヤの1つがアップグレードを必要な場合、プロトコルスタックがシャットダウンされて、コード全体又は少なくともアップグレードされたレイヤコードが通信デバイスに書き換えられて、次いで端末が再起動されてアップグレードされたプロトコルスタックが再びインスタンスを作成されることを意味している。このことは、通信デバイス上の任意のアクティブコールが終了させられてデバイスがコールをオフラインにされることを必要とする。このアプローチに関する別の問題は、異なるレイヤは通常、上記の参照の一部に記されているようにプロトコルスタックを動作させる極めて特殊な方法で相互にインタフェース接続されているという点である。このことは、新たな又はアップグレードされたソフトウェアのプロバイダが特定の実行及びプラットフォームについて上下のレイヤとの相互作用方法を事前に正確に知る必要があることを意味している。またこれはスタックの柔軟性を制限する。
ランタイム時にプロトコルスタックの再構成をサポートする他の提案されるアプローチは、一時的にスタック実行を停止して、新たなソフトウェアを、既存の実行環境及びプログラミング言語固有の機構を使用して既存のスタックにリンク付けすることによってプロトコルソフトウェアのダウンロード及び、プロトコルソフトウェアの既存のプロトコルスタックへの動的挿入を可能にする。これはまた、アクティブ通信セッションの一時的停止ならびに、いずれの他のスタックソフトウェアがインタフェース接続するかを知っている新たなソフトウェアのプロバイダと、問題になっているレイヤ専用の共有パケットバッファ構成と、言語及びオペレーティングシステム固有のコマンド及びデータフォーマットとを提供する観点においてこれを実行する方法とを必要とする。これらのアプローチはまた、ソフトウェアがうまく機能しない場合に、問題が検出されて危険なソフトウェアが取り除かれるまでアクティブ通信セッションの多くを壊してしまうという危険がある。また、新たなモジュールの挿入を許容するレイヤ間のインタフェースは容易にアップグレードすることはできず、あるいは、論理インスタンスが汎用インタフェースレイヤには見えないのでプロトコルソフトウェアの異なる論理インスタンス間の相互作用を制限するように個々に構成することはできない。
さらに、レイヤが他のレイヤと異なるソフトウェア言語で書き込まれることが将来的に必要である。例えば、物理レイヤに近いレイヤは迅速な処理を必要としているために、高速実行用にかなり最適化されているハードウェア固有のマシン言語に事前コンパイルされている可能性があるのに対して、スタックより高いレイヤはプラットフォーム独立型であり、そのために仮想マシン環境やインタプリタ上で動作し、プラットフォーム独立性を許容するために非常にゆっくりであるがより柔軟性があり、従って第三者の新たなアプリケーションの開発を促進する。しかしながら、異なる言語を使用する2つのレイヤは、言語固有データ構成、ネーミング定義(ネームハンドル定義)及び関数コール(パラメータパス)定義の観点で既知の共通言語を検索することができない。
現アプローチに関する別の問題は、レイヤの各々が、しばしば言語及びオペレーティングシステム(実行環境)固有である上下のレイヤ間の相互作用をサポートする(共有バッファ構成を含む)インタフェース定義によって厳しく制約されるために、スタックをアップグレードする性能を制限してしまう点である。この状況は、インタフェース接続を必要とするレイヤに対して同一の言語(及び環境によっては同一のコンパイラ)と、インタフェース関数及び共有バッファフォーマットとを使用するインタフェースを提供しなければならない様々なベンダによってプロトコルスタックの異なるレイヤが将来提供される可能性において深刻である。
動的柔軟性Javaプロトコルスタックを提供する既知のアプローチが図3に示されており、各プロトコルスタックレイヤ(L1からL4)間のインタフェースレイヤを利用している。これは国際公開第01/88707号の開示に対応する。2つのプロトコルスタックレイヤ間に、インタフェースすなわち中間レイヤが、その上下のレイヤに「既知の」インタフェースフォーマットによってインスタンスを作成される。インタフェースレイヤはテーブルを調べていずれの高次プロトコルレイヤをインタフェース接続するかを判断し、そして既知の(Java)インタフェースを使用する。従って、示されている例において、アップグレードされたプロトコルレイヤL2’はインスタンスを作成され、インタフェースレイヤlはルックアップテーブルより、レイヤL1からレイヤL2ではなくレイヤL2’に入ってくるパケットに向かうべきと判断する。そしてレイヤL2’はパケットを、これらをプロトコルスタックレイヤL3にリダイレクトするインタフェースレイヤlに向ける。従って、各プロトコルスタックレイヤ(L1からL4)とルックアップテーブル間のこれらのインタフェースレイヤ(lからl)の使用によって、プロトコルスタックは動的に再構成可能である。しかしながら、インタフェースとプロトコルレイヤ間のリンクがうまく定義されるための要件があり(レイヤは全てJVMにあり、またクラスロード、インヘリタンス、クラス作成及び破壊、方法識別及びコール定義などのJava言語の使用特徴である)、変換(ラップ関数)が正しいインタフェースを提供する必要がある場合に実行される。また。インタフェースレイヤが隣接するレイヤ間の相互作用を同期的にサポートするため、パケットを記憶するための共有バッファ構成をサポートせず、これは、異なるレイヤ間のメッセージをパスするときに過度のパケットデータのコピーとメモリ要件につながる可能性がある。さらに、このアプローチが単一の言語のプロトコルスタックに適切であるのに対して、種々の関数コールとフォーマット化されたデータが言語固有のフォーマットと、プロセッサ及びメモリインテンシブなネーミング定義との間で変換されなければならないために異なる言語のレイヤが使用されている場合には面倒である。
図4は、実施形態に従ったプロトコルスタックを示している。スタックは多数のプロトコルレイヤ(L1からL4)を備えており、これはレイヤ間の信号パケットなどのプロトコルメッセージ(図7)をパスする。これらは低次のレイヤから高次のレイヤへと続いて示されているが、同一の原理は、スタックを介して下方に進む信号について等しく適用することが分かる。各レイヤはバインドメッセージ(図5)を受信し、バインドハンドラを備えており、これがバインドメッセージからいずれのレイヤに出力するかを判断する。
出力される次のレイヤは一意の識別子(bind ref.)によって示される。レイヤ間でメッセージをパスする好ましい方法は永続的なメッセージキューを使用するが、これが実行される方法と、1つのレイヤから別のレイヤへ実行がパスされる様子についての具体的な詳細は、以下により詳細に説明されるようにプロトコルレイヤソフトウェアから要約される。
図5を参照すると、バインドメッセージは、例えばL2などの一意のLLI名すなわち識別子(instance.ref)を含む。同じレイヤに対して複数の論理レイヤインスタンス(LLI)が平行して(例えば、異なるコールを処理する別のスタックインスタンスにおいて)使用される場合、LLI名は、例えばL2及びL2という同じレイヤの他のインスタンスと比較してそのレイヤインスタンスを一意に識別する。レイヤの複数のインスタンス作成について以下により詳細に説明する
バインドメッセージはまた言語特定関数のテーブルを備えていてもよく、これは、JavaやC++「プロトコルスタックオペレーティングシステム」クラスに動的にカプセル化されてもよく、あるいはC構成及び、レイヤソフトウェア内でそれらにアクセスするのに使用される1セットのラップ関数に含有されてもよいオペレーティングシステムアプリケーションプログラマインタフェース(API)を示している。関数のテーブルは、新たなLLIインスタンス作成(create_new_LLI)及びLLIメッセージ(send_message.receive_message)などの所定のセットの基本オペレーティングシステム関数を備える。提供されているテーブルは、レイヤ(又はレイヤの複数のLLIのうちの1つ)が稼動する実行環境に依存する。すなわち、関数自体はオペレーティングシステムあるいは仮想マシン(例えばJVM)環境固有のものであるが、これらはバインド時にレイヤ(インスタンス)にパスされるので、このことは、レイヤ(インスタンス)自体がオペレーティングシステム及び実行環境独立型であり、関数テーブルを使用して、これのスタックの他のレイヤと適切に相互作用することを意味している。
代替構成において、バインドメッセージは必要なオペレーティングシステム特定関数へのポインタ(function.pointer)を含んでおり、これは例えば共有メモリのテーブルに記憶されていてもよい。
図6の図示において、レイヤに使用される所定の汎用関数(Func#1からFunc#n)はオペレーティングシステム特定関数(op.sys.func1.からop.sys.funcn)にマッピングされる。一部の一般的な例の関数、例えばオペレーティングシステムがレイヤのために実行するcreate_new_LLIが示されている。
従って、各レイヤは、他のレイヤとの相互動作を可能にする汎用関数コール(Func#1からFunc#n)を備えるが、オペレーティングシステム特定関数がバインド時にパスされるのでいずれのオペレーティングシステム環境が実行されるかは分からない。これはまた、LLI間の相互作用をサポートするのに使用されるプロセス間通信(メッセージ)及びセキュリティ機構の特定のタイプのコードモジュールとして実現されているソフトウェアレイヤから抽出可能である。唯一の要件は、レイヤのベンダが、新たなLLI、Func#2を開始するため、別のLLI、Func#3にメッセージを送るため、別のLLIなどからメッセージを受信するために、例えばFunc#1などの適切な所定の汎用関数コールを使用しなければならないことである。同様に、2つのLLIが同じ特定のオペレーティングシステム関数をパスされると、同じメッセージパス関数を使用することによって相互にインタフェース接続することが可能になる。
これをさらに用いると、2つのLLIには異なるオペレーティングシステム特定関数がパスされて、これによって、以下により詳細に説明される仮想オペレーティングシステム関数テーブルを使用する異なる実行環境において動作することができる。このように、レイヤはオペレーティングシステム及び言語独立型である。残りのスタックと相互動作するために必要とされる必要なオペレーティングシステム特定関数はバインド/リバインド時にパスされる。
同一レイヤの異なるインスタンスは、これのバインドメッセージにおいて異なるオペレーティングシステム特定関数を有する異なる関数テーブルをパスされることによって異なる環境で実行可能である。従って1つのコード(モジュール)は、各LLIの一般的なsend_message及びreceive_message関数にマッピングされている異なるタイプのオペレーティングシステム特定関数を有することによってのみ、他のビットのコード(モジュール)と様々に相互作用することができる(例えば、一方では関数コール、他方では非同期メッセージパス)。これは、一般的なsend_message関数を対応するオペレーティングシステム特定関数にマッピングするのに使用されるテーブルがLLI単位で実行されるからである。しかしながら、LLIが別のLLIとうまく通信するためには、両方のLLIが一般的なsend_message及びreceive_message関数からオペレーティングシステム関数への同じマッピングを使用する必要があり、そうでなければLLIの受信は、LLIがsend_messageを実行する場合に何も受信しない。
バインドメッセージはまた、レイヤのインスタンスを、例えば異なる任意のプロトコル特徴を有効化あるいは無効化するレイヤの論理インスタンスに適切に構成するレイヤインスタンス構成情報(config_1からconfig_n)を含んでいてもよい。
この一般的かつレイヤ固有でないバインド機構を使用することによって、各論理レイヤインスタンスは、別のバインドメッセージをそのインスタンスに送ることによって新たな論理レイヤインスタンスに相互作用することを動的に(ランタイム時に)命令されることが可能である。このことは新たなレイヤの動的挿入を含んでいてもよく、さらにレイヤ間の言語独立型相互作用を見込んでいることが分かる。
図7を参照すると、プロトコルメッセージが、プロトコルスタックの上下に信号又はパケット情報を通信するためにレイヤ間でパスされる。各プロトコルメッセージは、送信元レイヤと関連したbind.ref識別子に従って送信元レイヤ(例えばレイヤ1)から宛先レイヤ(例えばレイヤ2)に送られ、これのバインドメッセージの送信元レイヤに提供される(図5参照)。プロトコルメッセージはまた信号データ、あるいは共有メモリの信号データを示す信号ポインタを備える。また信号データ(又はポインタ)及び識別子(send.inst.ref及びdest.inst.ref)は共通の汎用共有データフォーマットである。
プロトコル及びバインドメッセージはプロトコルスタックエンティティ(種々のLLI)間でパスされる信号であり、この信号パスは、関数コールやスレッドメッセージ機構などの異なる機構を使用して実行可能である。通常スレッドメッセージは異なるオペレーティングシステムスレッド間にあり、メッセージがキュー上に置かれてから、オペレーティングシステムが、キューからメッセージを読むために受信スレッドを呼び起こす(スケジューリングする)。
(send_message及びreceive_messageなどの)汎用関数を使用して、どのような方法も特定の相互作用に対するターゲットプラットフォームに適しているメッセージパスを可能にする。コード自体はいずれの方法が使用されるかを知る必要はない。しかしながら、send_message関数を呼び出すことは、送信中のメッセージが汎用フォーマットであり、所定の方法でsend_message関数にパスされることを必要とする。メッセージは(オペレーティングシステム特定関数のテーブル内に供給されている)一般的なcreate_message関数を使用することによって動的に作成されて識別されることができ、これはsend_message関数内で使用可能なメッセージのハンドル(又はレファレンス)を生成する。メッセージをsend_message関数にパスするための好ましい方法は、それをレファレンスによってパスすることである(メッセージへのポインタは関数コールにおいてパスされる)。これは生じるはずのデータのコピー量を最小限にするが、そうでなければメッセージデータはヒープ(又は共有)メモリからスタックメモリへ、そしてヒープ(又は共有)メモリに戻ってコピーされる。好ましいアプローチは効率的であり、メッセージデータの過度なコピーを伴わない。実際、メッセージデータが常にヒープ又は共有メモリに保持されている場合、コピーはまったく必要ない。
従ってレイヤソフトウェア(モジュール)は、使用可能なsend_message及びcreate_message関数のコール定義を知るだけでよいために、メッセージを送信中のソフトウェアレイヤ(モジュール)内で使用されている言語について、又はコール定義についてさえも知識を必要としない。同様に、受信ソフトウェアレイヤ(モジュール)はreceive_message関数については知る必要がある。そして実際のメッセージコンテンツはアクセスされなければならず、共通の汎用共有データ記憶方法は、このデータにアクセスする言語固有のアクセス関数と共に使用される。同様の方法で、バインドメッセージやプロトコルメッセージ(パケット)は、プログラミング言語及び実行環境に関係なく各レイヤによって一般的な方法でアクセス可能である。
データにアクセスするのに使用される関数は、バインドメッセージ内のオペレーティングシステム特定関数の一部としてソフトウェアレイヤ(コードモジュール)にパスされることが可能である。メッセージ(又は信号)、構成及び共有データが異なるプログラミング言語によって効率的にアクセスされることを可能にし、またアップグレードを可能にするために、フォーマットは拡張可能であるべきである。例えば、拡張可能なマークアップ言語(XML)や(Abstract Syntax Notation ASN.1などの)他のテンプレート定義を使用して、データフォーマットを定義し、そして、データ要素とこれの対応するデータタイプとを識別するための一意の識別子を使用することによってランタイム時に共有データ記憶構成にアクセスすることができる。そして言語固有のデータアクセス関数は必要とされる要素を効率的に検索する。これによって、異なるバージョンのプロトコルソフトウェアによる同一データの使用が可能になる。古いバージョンは新たなデータメンバにアクセスする必要はなく、またそれらにアクセスしようともしない。破棄されたデータメンバに関する知識の除去はまたより新しいソフトウェアバージョンで可能であるが、データテンプレート定義は依然として、古いソフトウェアモジュールバージョンをサポートするための破棄されたデータメンバに対するプレースホルダ(placeholder)を有している。(全ての破棄されたデータメンバを含む)データメンバを一意に識別する識別子は、これらのデータメンバにアクセスするソフトウェアモジュール内で使用される。しかしながら、言語固有のデータアクセス関数によって提供された間接参照(indirection)のために、実際のデータは全て、個々のLLIによるデータへの不正アクセスを防止するために共通の共有メモリ領域及び(読書きロック機構を使用するデータタイプや要素レベル認証などの)適切なセキュリティ手段に記憶することが可能である。
これらの関数はより複雑なインタフェース定義言語(IDL)スキーム内にカプセル化されて、既存の又は新たなコンポーネント技術の特徴の取得を可能にすることができる。言語固有のIDL定義はまた異なる言語間(例えば、Javaレイヤ用の1セットのJavaクラス及びコンポーネントインタフェースと、C++レイヤ用の1セットのC++インタフェースクラスなど)で容易にマッピングできない複雑なデータタイプの取得を可能にする。XML又はASN.1テンプレートに対する特定のIDLのマッピングは、この追加コンポーネントインタフェースソフトウェアによって対処することを必要とする。共通の記憶構成を使用する大量の共有データへのアクセス速度を改良するために、識別子はリンク付けされたリスト又はデータアレイ内に順次階層的に構成されて、所望の要素を検索するのに必要なルックアップタイムを最小にすることができる。
プログラミング言語独立型データテンプレート定義の一例はそれぞれ、拡張可能なマークアップ言語(XML)スキームや、Abstract Syntax Notation(ASN)タグや、データシーケンス定義である。データ要素(又は属性)アクセス関数は、下記の表に示されているようなアクセス性能を改良するためのデータ要素シーケンス内の実際の項目にアクセスする間接参照(メモリポインタ)を利用することができる。このように、データ要素の解決はルックアップ動作及び、テンプレートに定義されているような必要なデータフォーマットへの結果のキャスティング又は変換になる。
Figure 0004271234
但し、例ASN−1定義は
Message::=SEQUENCE(
Message_Number INTEGER OPTIONAL,
Message_Name STRING
}である。
メッセージデータにアクセスするのに使用される汎用関数はまた、データアクセス関数の実際の実現をプラットフォームに対して最適化するバインドメッセージによってパスされた関数の汎用オペレーティングシステムテーブル内に含まれていてもよい。例えば一意の識別子「1243」を有するデータ要素について、ソフトウェアレイヤは汎用レイヤ関数get_attribute(「1243」)を呼び出す。レイヤソフトウェアはXML又はASN.1テンプレートフォーマットで定義されている要素のデータタイプを知る必要がある。レイヤソフトウェアによって使用されている構成データ及びメッセージに対応するテンプレートは、必要に応じてタイプ変換を可能にするために、一般的なget_attribute及びset_attribute関数によって知られる必要がある。従って、get_attribute及びset_attribute関数はテンプレート定義に対するハンドル(レファレンス)をパラメータとする。ハンドル(又はレファレンス)は一般的なload_template関数によって生成される。汎用関数get_attribute及びset_attributeはまた構成データかメッセージハンドル(又はレファレンス)を用い、特定のデータ要素に対するメモリポインタレファレンスを記憶し、これの一意の識別子のレファレンスを記録することができるようにルックアップテーブルを保持する。
別のオプションは、同一の実際のデータ要素を示す2つの属性識別子を有することである。これは、異なる識別子が実際に同一のデータ要素に対応しているが異なる変換タイプを有する場合にデータの重複を回避するのに魅力的である。例えば、データ要素識別子「1243」がデータ要素に対応する場合、それはテンプレート内で「メッセージ名」として特定されて、ヌルで終わるUnicodeストリングである。属性識別子「1244」はまた同一の「メッセージ名」に対応するが、例えば255バイトのASCII文字列などの異なるフォーマットである。タイプの変換は、get_attribute関数によってソフトウェアレイヤから隠される。従って、Javaソフトウェアモジュールがget_attributeを呼び出す場合、それは識別子「1243」を使用中であり、Unicodeストリングを取得し、またC++モジュールがデータ要素へのアクセスを望む場合には、「1244」要素上のget_attributeを呼び出して、255バイトのASCIIストリングを取得する。
好ましい実施形態において、同一のテンプレートが、メッセージ送信及び受信するLLIに関係なく全メッセージデータについて使用される。これは、LLI内のプロトコル関数から独立したLLIにいわゆる汎用サービスアクセスポイント(GSAP)を提供する。GSAPに対する考えられる例示的な汎用テンプレート定義を以下に示す。
・列挙及びタイプ定義
GPI_PRIMITIVETYPE::=ENUMERATED{GPI_BIND(1),GPI_REBIND(2),GPI_SUSPEND(3),GPI_RESUME(4),GPI_UNBIND(5),GPI_TERMINATE(6),GPI_UPGRADE(7),GPI_OPTIMISE(8),GPI_OK(9),GPI_ERR(10)};
・汎用MACレイヤについて
GPI_MACTYPE::=ENUMERATED{GPI_CSMACA(0),GPI_CSMACD(1),GPI_TPB(2),GPI_TPR(3),GPI_TDMA(4)};
GPI_CRCTYPE::=ENUMERATED{GPI_CRC32(0),GPI_CRC16(1),GPI_CRC24(2)};
GPI_ARQTYPE::=ENUMERATED{GPI_SAW(0),GPI_GBN(1),GPI_SEL(2),GPI_NONE(3)};
GPI_HARQTYPE::=ENUMERATED{GPI_TYPE1(0),GPI_TYPE2(1),GPI_NONE(2)};
GPI_HARQCODETYPE::=ENUMERATED{GPI_GOLAY(0),GPI_RS(1),GPI_NONE(2)};
GPI_CRYPTOTYPE::=ENUMERATED
{GPI_RSA(0),GPI_DES(1),GPI_3DES(2),GPI_GEA3(3),GPI_NONE(4)};
・バインドプリミティブについて
GPI_QOSTYPE::=ENUMERATED{GPI_CO(0),GPI_CL(1)};
・接続指向及び接続なし
GPI_SECURITYLEVEL::=ENUMERATED{GPI_HIGH(0),GPI_MEDIUM(1),GPI_LOW(2)};
・汎用データパケットプリミティブについて
GPI_PACKETTYPE::=ENUMERATED{GPI_IP(0),GPI_ETHER(1),GPI_PPP(2)};
GPI_DIRECTION::=ENUMERATED{GPI_UP(0),GPI_DOWN(1)};
GPI_TFTYPE::=SEQUENCE{
・汎用トランスポートフォーマットタイプ定義
GPI_MOD GPI_MODTYPE[変調タイプ],
GPI_CODING GPI_CODINGTYPE[チャネル符号化タイプ]
GPI_BLOCKSIZE INTEGER[バイト単位のトランスポートブロックサイズ],
GPI_ANTENNA INTEGER OPTIONAL[どのアンテナを利用するかを指示]

・プリミティブ定義
GPI_MANPRIMITIVE::=SEQUENCE{
・汎用GPI管理プリミティブ
GPI_PRIMITIVE GPI_PRIMITIVETYPE[これは特定のプロトコルメッセージプリミティブタイプである],
・プロトコルモジュール独立型パート
GPI_REQUESTOR GPI_LL_IDENT[これはリクエストLLIである],
・プリミティブ−バインドのタイプに応じた任意のパートは追加情報を含む
GPI_BIND GPI_BINDPRIMITIVE OPTIONAL[バインド、リバインド、最適化について]

GPI_BINDPRIMITIVE::=SEQUENCE{
GPI_UPPER_SAP STRING[これはLLI上のサービスアクセスポイント名である],
GPI_UPPER_USER GPI_LL_IDENT[これは、SAPを使用し、かつパケットが受信及び送信されるLLIの(複数の)一意の識別子である],
GPI_LOWER_SAP STRING[これはLLIの下のサービスアクセスポイント名である],
GPI_LOWER_USER GPI_LL_IDENT[これは、SAPを使用し、かつパケットが受信及び送信されるLLIの(複数の)一意の識別子である],
GPI_GSAP GPI_GSAP_TABLE[これは、言語独立性、性能の最適化、及びGSAP境界にわたる相互作用を安全に許容するためにLLIの環境を設定する(仮想)オペレーティングシステムテーブルである],
・一般的な方法でLLIを構成するQoS属性
GPI_QOS GPI_QOSTYPE[LLIと関連するQoS],
GPI_RCV_THROUGH_TARGET INTEGER[kビット/秒のターゲット受信スループット],
GPI_RCV_THROUGH_ACCEPT INTEGER[kビット/秒の受容可能な受信スループット],
GPI_RCV_TRANSDELAY_TARGET INTEGER[ミリ秒単位のターゲット受信待ち時間],
GPI_RCV_TRANSDELAY_ACCEPT INTEGER[ミリ秒単位の受容可能な受信待ち時間],
GPI_XMT_THROUGH_TARGET INTEGER[kビット/秒のターゲット送信スループット],
GPI_XMT_THROUGH_ACCEPT INTEGER[kビット/秒の受容可能な送信スループット],
GPI_XMT_TRANSDELAY_TARGET INTEGER[ミリ秒単位のターゲット送信待ち時間],
GPI_XMT_TRANSDELAY_ACCEPT INTEGER[ミリ秒単位の受容可能な送信待ち時間],
GPI_PRIORITY_MIN INTEGER(0..100)[トラフィッククラス/接続の最低優先順位],
GPI_PROTECTION_MIN INTEGER[GPI_NONE,GPI_MONITOR,GPI_MAXIMUM],
GPI_PRIORITY_MAX INTEGER(0..100)[トラフィッククラス/接続の最高優先順位],
GPI_PROTECTION_MAX INTEGER[GPI_NONE,GPI_MONITOR,GPI_MAXIMUM],
GPI_RESILIENCE_DISC_PROB INTEGER(0..10000)[切断に対する復元力],
GPI_RESILIENCE_RESET_PROB INTEGER(0..10000)[接続リセットに対する復元力],
GPI_RESIDUAL_SUCCESS INTEGER(0.10000000)[エラーレートの余剰サクセスレートの逆数],
・任意のコスト及び電力消費、リソース利用及びセキュリティ要件
GPI_RCV_COST_TARGET INTEGER OPTIONAL[電流単位のターゲットスループットにおけるターゲット受信コスト/分],
GPI_RCV_COST_ACCEPT INTEGER OPTIONAL[受容可能な受信コスト/分],
GPI_XMT_COST_TARGET INTEGER OPTIONAL[電流単位のターゲットスループットにおけるターゲット送信コスト/分],
GPI_XMT_COST_ACCEPT INTEGER OPTIONAL[受容可能な送信コスト/分],
GPI_POWER_CONSUMPTION_TARGET INTEGER OPTIONAL(0..100)[受容可能なバッテリ寿命を達成するために許容可能な最大電力消費量の%としてのターゲット最大電力消費量],
GPI_SECURITY GPI_SECURITYLEVEL OPTIONAL[必要なセキュリティレベル],
GPI_MEMORY_TARGET INTEGER(0..100)OPTIONAL[全体のうちのターゲット最大メモリ使用%],
GPI_PROCESSOR_TARGET INTEGER(0..100)OPTIONAL[全体のうちのターゲット最大プロセッサ使用%],
・LLI固有のパート−ここで使用されている属性はLLIのタイプに大きく依拠している
GPI_MAC GPI_MACTYPE OPTIONAL[これはMACのタイプを示している],
GPI_MAC_AIFS INTEGER OPTIONAL[タイムスロットのアービトレーションフレーム間分離],
GPI_MAC_SLOTTIME INTEGER OPTIONAL[マイクロ秒単位のCSMA及びTDMA系MACのスロットタイム],
GPI_MAC_FRAMESIZE INTEGER OPTIONAL[タイムスロットのフレームサイズ],
GPI_MAC_BACKOFFWINDOW INTEGER OPTIONAL[タイムスロットの開始バックオフウィンドウサイズ],
GPI_HEADER_CRC GPI_CRCTYPE OPTIONAL[汎用ヘッダCRCの設定],
GPI_PAYLOAD_CRC GPI_CRCTYPE OPTIONAL[汎用ペイロードCRCの設定],
GPI_HEADER_CRC_GEN INTEGER OPTIONAL[ヘッダCRCの生成器多項式],
GPI_PAYLOAD_CRC_GEN INTEGER OPTIONAL[ペイロードCRCの生成器多項式],
GPI_ARQ GPI_ARQ_TYPE OPTIONAL[ARQの設定],
GPI_ARQ_BLOCKSIZE INTEGER OPTIONAL[バイト単位の再送信ブロックサイズ],
GPI_ARQ_WINDOWSIZE INTEGER OPTIONAL[GBN及びSelectiveの再送信ウィンドウサイズ]
GPI_HARQ GPI_HARQTYPE OPTIONAL[ハイブリッドARQの設定],
GPI_HARQ_CODE GPI_HARQCODETYPE OPTIONAL[ハイブリッドARQ符号化の設定],
・暗号化/解読設定−汎用暗号化LLIに使用される
GPI_CRYPTO GPI_CRYPTOTYPE OPTIONAL[暗号化/解読の設定],
GPI_CRYPTO_IV GPI_IV OPTIONAL[暗号の初期化ベクトル],
GPI_CRYPTO_KEY GPI_KEY OPTIONAL[暗号化/解読のセッションキー]

GPI_PACKET::=SEQUENCE{
・汎用データパケット(又はフレーム)定義
・必須パケット情報
GPI_PACKET GPI_PACKETTYPE[これはパケットタイプである],
GPI_PACKET_HEADER_PTR GPI_PACKET_HEADER[プロトコル固有のフォーマットの実際のパケットヘッダ],
GPI_PACKET_PAYLOAD_PTR GPI_PACKET_PAYLOAD[プロトコル固有のフォーマットの実際のパケットペイロード],
GPI_PACKET_HEADER_LEN INTEGER[バイト単位のヘッダ長],
GPI_PACKET_PAYLOAD_LEN INTEGER[バイト単位のペイロード長],
・任意のパケット情報
GPI_TRCH GPI_TRCH_IDENT OPTIONAL[トランスポートチャネル識別子],
GPI_TF GPI_TFTYPE OPTIONAL[トランスポートフォーマット],
GPI_DEST_MAC GPI_MAC_ADDRESS OPTIONAL[宛先MACアドレス],
GPI_SRC_MAC GPI_MAC_ADDRESS OPTIONAL[送信元MACアドレス],
GPI_DEST_IP GPI_IP_ADDRESS OPTIONAL[宛先IPアドレス],
GPI_SRC_IP GPI_IP_ADDRESS OPTIONAL[送信元IPアドレス],
GPI_DEST_PORT INTEGER OPTIONAL[宛先ポート番号],
GPI_SRC_PORT INTEGER OPTIONAL[送信元ポート番号],
GPI_SN INTEGER OPTIONAL[シーケンス番号],
GPI_IP_HEADER_CHKSUM GPI_IP_HEADER_CHECK_SUM OPTIONAL[IPチェックサム],
GPI_TRAFFICCLASS INTEGER OPTIONAL[トラフィックタイプの識別子],
GPI_PACKETDIRECTION GPI_DIRECTION OPTIONAL[プロトコルスタックにおけるパケットの方向]

レイヤにおける汎用関数と、これの実行環境においてLLIによって呼び出されたオペレーティングシステム特定関数との間のマッピングは多数の方法で実行可能である。図8を参照すると、各ソフトウェアレイヤ(例えばL2)は多数の所定の汎用関数を備える。L2レイヤのベンダが所定の汎用関数を使用すると仮定すると、このレイヤはプロトコルスタック内の他のレイヤと相互動作する。プロトコルスタックのレイヤをサポートする実行環境はオペレーティングシステムテーブル(OS1)や他のオブジェクトと関連付けられており、これはレイヤと関連付けられている汎用関数を、その特定の実行環境において汎用関数を実行するオペレーティングシステム特定関数に効率的にマッピングする。示されている例において、L2の汎用関数1、例えばreceive_messageはUNIX(登録商標) POSIX系実行環境ついての等価関数に変換される。オペレーティングシステムテーブル(OS)やマッピングオブジェクトは、例えばプロトコルスタックのオペレータによって、あるいは実行環境プロバイダなどの他のエンティティによって供給されてもよい。
図9は代替構成を示しており、ソフトウェアレイヤL2は、オペレーティングシステムテーブル(OS2)や他のマッピングオブジェクトによってこれのL2フォーマットから直接ローカルオペレーティングシステムフォーマットにマッピングされることが可能なレイヤに特定関数を備える。従って、例えば(これもまたsend_messageに対応する)L2の関数1はオペレーティングシステムテーブルOS2によって、ローカルUNIX POSIX系実行環境関数又はreceive_message関数に対する関数にマッピングされる。この具体的な構成において、L2ソフトウェアレイヤのベンダはまた対応するオペレーティングシステムテーブルOS2やマッピングオブジェクトをUNIXオペレーティングシステム環境に供給してもよい。L2のベンダは、ベンダが供給したL2ソフトウェアレイヤを解釈するために、異なるタイプのオペレーティングシステムについての多数のオペレーティングシステムテーブルを供給することができる。
図10は、示されている例において汎用関数コールを適切なオペレーティングシステム−UNIX(OS1)やMICROSOFT WINDOWS(登録商標)(RTM)(OS2)にポインティングするために使用可能な仮想オペレーティングシステム(VOS)の使用を概略的に示している。従って、例えば1つ以上のオペレーティングシステムや実行環境オプションが、例えば基地局や端末などのデバイスや装置上で通常のプロトコルレイヤを駆動するために使用される場合、VOSは汎用関数コールを、ソフトウェアレイヤL2から、例えばUNIXやMicrosoft Windows(RTM)のオペレーティングシステムテーブル(それぞれOS1又はOS2)、あるいはマッピングオブジェクトのいずれかに向けることができる。同一ソフトウェアレイヤの2つのインスタンスが異なる動作環境で実行される場合、VOSは同一の汎用関数(例えば汎用関数1)を、第1のLLIのUNIXオペレーティングシステムテーブル(OS1)と、第2のLLIのMicrosoft Windows(RTM)オペレーティングシステムテーブル(OS3)とにマッピングすることができ、ここでは同一の汎用関数はそれぞれop.sys function xとop.sys function.aとに対応している。ソフトウェアレイヤL2は汎用関数を使用しているために、L2のベンダは実際のレイヤソフトウェア(モジュール)を供給することのみを必要としており、VOSやオペレーティングシステムテーブルソフトウェアを伴う必要はない。VOSの動作を以下により詳細に説明する。
次に図11を参照すると、ベンダが供給したL2ソフトウェアレイヤは、異なるオペレーティングシステム間のL2特定関数をマッピング可能なL2のベンダによって供給されてもよい仮想オペレーティングシステム(VOS)によってマッピングされるレイヤ特定関数を備えており、これはまたL2特定関数をそれぞれのオペレーティングシステム関数、例えばそれぞれUNIX及びMicrosoft Windows(RTM)にマッピングするために、L2のベンダによって供給されてもよいオペレーティングシステム固有のテーブル(OS2、OS4、OS5)やマッピングオブジェクトを使用している。従って、種々の実施形態が実現されて、プロトコルレイヤソフトウェアとは無関係の言語及び/又はオペレーティングシステムを達成することができる。
図11はまた、例えば各々が異なるLLIに対応している2つのスレッドは異なる実行環境の実行に関する異なるオペレーティングシステムテーブルにマッピング可能である様子を示している。スレッド1はVOSテーブルにおける固有のエントリにポインティングされ、L2特定関数(L2の関数1)によってマッピングし、一方でUNIX環境において実行可能な関数(op.sys.function.x)に対応するUNIXオペレーティングシステムテーブルOS2における特定のエントリにポインティングされる。そしてスレッド1はレイヤL2モジュールの次の関数ポインタ(L2の関数2)に戻る。異なる実施形態において、スレッド1は、Windowsの環境において、レイヤL2モジュールにおけるL2特定関数ポインタ(L2の関数1)に対応するWindows特定関数(op.sys.function.a)の実行について、VOSによってWindowsのオペレーティングシステムテーブルOS4にポインティングされてもよい。
スレッド2は異なるLinux(登録商標)実行環境において実行された同一のレイヤL2の異なるLLIに対応していてもよい。このシナリオにおいて、L2特定関数ポインタ(例えばL2の関数3)はLinux特定関数(op.sys.function.m)にマッピングされ、これが実行されるとスレッド2はレイヤL2モジュールにおけるこれの次の関数ポインタ(L2の関数4)に戻る。
図12は、複数のプロトコルスタックにおけるレイヤの複数のインスタンス作成を示している。UMTSビデオコールと2つのWLANインターネット閲覧プロトコルスタックが同時にアクティブに示されている。インターネットスタックのうちの1つが無制限なインターネット閲覧をサポートしているのに対して、他方はイントラネットの閲覧をサポートしており、このこと自体が(例えば仮想プライベートネットワーキングVPNプロトコルに基づいて)暗号化をサポートしているにちがいない。2つのブラウザスタックは各々WLANに結合されている4つのプロトコルレイヤインスタンス(それぞれL4からL1とL4からL1)を有しているが、レイヤ2のインスタンス(L2とL2)はそれぞれ別々に構成されている。これは、暗号化をサポートするレイヤ2の第2のインスタンスを示すインターネットスタックにおけるL2(sec)と、暗号化をサポートしないレイヤ2の第1のインスタンスを示すインターネットスタックにおけるL2(non-sec)とによって図示されている。これらの構成はこのレイヤ(L2とL2)の各インスタンスに送られたオリジナルのバインドメッセージによって判断される。レイヤ1、3及び4は2つのブラウザスタックについて同一であり、それぞれのレイヤの別個である(それぞれL1、L3、L4とL1、L3、L4)が等しく構成されているインスタンスを含む。
安全なスタックレイヤインスタンスを実行するのに使用されている実行環境は安全でないインスタンスからのメッセージや構成データへのアクセスの可能性をなくすように構成できる。例えば、これは、全メモリアクセスの認証と、安全なスタックインスタンスから分離するためのメッセージ動作とを実行するオペレーティングシステム関数テーブルを使用して遂行される。例えばsend_message関数の根本的な実現は、VOS及び/又はオペレーティングシステムマッピングオブジェクトの供給者が何を行うかを関数に求めることによって決定される。従って、例えばソフトウェアレイヤが信頼できない場合、send_message及びreceive_message関数によって実行され関数はなおさらセキュリティに関して敏感である。このことは、例えば基本的な検索データ関数に結合された認証関数を含んでいてもよい。さらなる例において、create_LLI関数は自身のメモリ領域を有する別個のプロセスを作成し、レイヤが信用できるソフトウェアモジュールによって使用されているメモリにアクセスできる可能性がないことを保証する。オペレーティングシステム自体が十分に信頼されていないと思われる場合は、別個のオペレーティングシステム環境においても実行可能である。
各レイヤはまた異なる性能最適化、例えば処理集中的な暗号化動作を実行するスタックインスタンスに与えられた優先順位によって実現されてもよい。
レイヤ2の(L2の)第2のLLIは第1のLLI(L2)と同じコードモジュール(レイヤ2)を使用しているが、それは作業メモリにロードされているコードモジュールの更なるコピーではなく新たな論理エンティティ(この場合は実行又はプロセスのオペレーティングシステムスレッド)である。例えば、第2のLLI(L2)はこのコードモジュール内の第2の実行スレッドであってもよく、これはオペレーティングシステムによってコントロールされており、また自身の一意の識別子とそれに関連した構成を有している。この構成情報は論理レイヤのLLI(例えばスレッド)と、インスタンスごとに構成をセットアップするコントロールエンティティ(以下により詳細に説明するCM)にのみアクセス可能である。LLI間の相互作用はまたCMによって構成されており、必要ではないLLIが(実行環境構成手段を介して)相互作用することを防ぐことができる。
さらに、レイヤ2の2つのLLI(L2とL2)は共通の機能性をサポートしているが、これらは別々に構成されてもよい。この例において、L2は暗号化/解読をサポートするが、L2はサポートしない。これらの構成設定はバインドメッセージによって設定され、スタックにおける適切な位置や各インスタンス(LLI)と関連付けられた作業メモリにおけるテーブルに記憶されてもよい。
レイヤ2のソフトウェアの第2のLLIは異なるLLI識別子[instance.ref]ならびに、異なる出力レイヤにリンクしている異なるバインドレファレンス[bind.ref]を有する。汎用関数を、これのそれぞれの実行環境内でこれらの関数を実行するために必要なオペレーティングシステム特定関数にマッピングするための異なるオペレーティングシステム関数テーブルを必要とする異なる実行環境において動作していなければ、[function.ref]によって同定されるオペレーティングシステム関数テーブル(又はオペレーティングシステムクラス)はレイヤ2の第1のLLIによって使用されているのと同じオペレーティングシステムテーブルであってもよい。第2のLLIはまたこれ自体の実行スタック(L2スタック)とヒープメモリとを有していてもよい。各LLIは使用可能な同一の構成オプションを有するが、これらを別々に有効化/無効化することができる。これらはパラメータとしてこれのそれぞれのLLI構成に記憶されてもよい。
各レイヤは所定の汎用関数コールを利用し、これはスレッド管理ならびにメモリ管理関数を含む。そしてこれらはランタイム時に、ターゲットデバイス上でオペレーティングシステム特定関数のセットにマッピングされる。(オペレーティングシステム関数テーブル及び信号パケットなどの)1つ以上のLLIにアクセスされたデータは所定のフォーマットで提供され、これによって各LLIは所定の関数コールのセットを使用してこの情報にアクセスすることができる。
バインド信号[bind.para]はオリジナルなバインド信号の後も含めて常にLLIによって受信可能であり、従ってLLIの構成オプションを変更可能にし、さらにはbind.refパラメータを変更することによってLLIを別のLLIに結びつけることができ、それによってプロトコルスタックの動的リバインドを可能にしている。
プロトコルレイヤのLLIは、(例えば、異なるスレッド間の優先順位ベースのマルチタスクを終了及び提供できる)他の実行スレッドからの一定の制御及び分離を行う自己実行スタックを有するオペレーティングシステムのスレッドにインスタンスを作成することによって生成可能である。あるいはまた、異なるLLIは異なるオペレーティングシステムプロセスとしてインスタンスを作成されて、各プロセスにこれ自身のメモリヒープを提供して、他のLLIからのアクセスを防止することによって更なる分離及び制御を行うことができる。しかしながら、このことは、優先順位ベースのマルチタスク(つまり、スレッドに並列するプロセス間のコンテクスト切り替え)を実行する際のオーバーヘッド増大のペナルティを招く。最終的に、LLIは同一のオペレーティングシステムスレッド内でインスタンスを作成できる。このことは、LLIをセットアップして制御する際にはオーバーヘッドは最小であるという利点を有するが、別個のスタックやヒープはなく、それゆえに(LLI構成などの)データへのアクセス及びこれの実行に関する制御(つまり優先順位付け)は、オペレーティングシステムのセキュリティ手段に依存している場合には親スレッドに大きく依存できる。この後者の場合、LLIに使用されるプログラミング言語及び実行環境はこれの親スレッドと同じであるが、これは必須ではないという点が好ましい。
上記のオペレーティングシステムの実行環境に加えて、FPGAやDSPなどの外部プログラマブルデバイスにおいてLLIにインスタンスを作成することもできる。これらの実行環境は、同一のオペレーティングシステムのコントロール下の単一の(又は複数の)プロセッサ構成内の環境とかなり異なる。しかしながら、仮想オペレーティングシステム関数テーブル(VOS)によってデバイス間通信の複雑さは、LLIを異なるデバイス上に実現するソフトウェアモジュールから取り除かれる。
上記の方法で、複数の論理レイヤインスタンスは、異なる実行又はプロセススレッドを使用する異なる実行環境において作成できる。これに加えて、各LLIは異なるプロトコル特徴(構成オプション)で構成できるが、共通のデータアクセス機構を使用して信号メッセージデータ及び他の共有データにアクセスすることができる。上記の通り1つ以上のLLIが同一のスレッド内で作成される場合に特殊な場合が生じる。
既に述べたとおり、異なる実行環境において(同一又は異なる)プロトコルスタックレイヤの異なるLLIを実行し、様々なレベルのセキュリティ及び性能を提供することが可能である。例えば、Bluetoothスタックは、安全な高速接続と、安全でない低速接続との両方をサポートしていてもよい。安全な高速接続に対処するLLIの実行環境はセキュリティ及び性能について最適化可能であり、低速接続をサポートするLLIは、安全が低くかつそれほど最適化されていない実行環境においてサポートできる。
このアプローチはLLI間の相互作用を制限し、必要ならばLLIごとに(適切なセキュリティ手段によって)異なる実行環境を使用して適切にこれらを分離する。このように、かなり信頼できるソフトウェアにはさらなる自由が認められ、実行中の危険なランタイムセキュリティチェックや機能性への制限なしに、より最適化された実行環境において実行できるのに対して、信頼性の低いソフトウェアを使用するLLIは、他のLLIとの可能な相互作用についてより多くの制限を有するより安全な環境で実行される。これらの手段はまたソフトウェア内の信頼レベルだけではなく、LLIにサポートされているサービスタイプと関連した完全性及び(プライバシー及び機密性などの)他のセキュリティ要件にも依存している。
図13は、例えば携帯電話においてレイヤにインスタンスを作成し、一方のソフトウェアレイヤから別のソフトウェアレイヤにバインドするためのセットアップ及びアップグレードシナリオを示している。電話は、作業メモリに直接(すなわちネイティブに)ロードされている多数のソフトウェアコードモジュールを記憶又はダウンロードをし、又は(Javaクラスのロード原理などの)仮想マシン環境機構を使用するとエントリポイントが識別される。示されている例において、これはレイヤ1から3と、ソフトウェアレイヤに対応するコードモジュールを作業メモリにロードし、エントリポイントを呼び出し、レイヤを構成又は再構成するための適切なバインドメッセージを送信することによってプロトコルスタックの構成をコントロールする構成マネージャ(CM)とを含む。例えば、レイヤ1に送られたバインドメッセージはそれにレイヤ2を「バインド」することを命令する。
レイヤ2がレイヤ2’と置換されるアップグレードシナリオにおいて、レイヤ2’のソフトウェアレイヤファイル又はコードモジュールは作業メモリ(L2’)にロードされて、構成マネージャ(CM)はレイヤエントリポイントを新たなレイヤに呼び出す。そしてバインドメッセージをレイヤL2’に発行し、これの出力をレイヤ3に向け、適切なプロトコルオプションをセットアップする。構成マネージャはまたバインドメッセージをレイヤ1に向け、レイヤ2からレイヤ2’に変更する。このアップグレード再構成はランタイム時に生じ、また比較的簡単なバインドメッセージの実現を必要としているにすぎない。またこれによって(古い)レイヤ2(L2)を通過するパケットはいずれも処理を継続されてレイヤ3(L3)にパスすることができ、これによって関連セッションは動的再構成によって終了されない。従って、スタックの再構成時のセッションの終了の必要はなく、新たなインスタンスが古いインスタンスの(状態を含む)構成データにアクセスすることになる。
図14を参照すると、例えばレイヤ2の第1のインスタンス(L2)にインスタンスを作成するために、構成マネージャ(CM)はレイヤ2のコードモジュールを作業メモリのプログラムコードエリア(又は仮想マシン環境)にロードする。そして構成マネージャは、ネイティブソフトウェアモジュールの場合には直接作業メモリにおけるコードのエントリポイント(レイヤエントリポイント)を呼び出し、又は仮想マシン環境におけるレイヤエントリポイントメンバ関数(稼動方法)を呼び出すことによってLLIを開始する。
CMは、クラスファイルをロードすることを意味するJavaと、実行環境に適切な方法で1セクションのコードをメモリにロードしているネイティブレイヤとについてロード手順を実行する。CMは実行環境を知っているので、モジュールのロード方法を知っており、デフォルトの適切なVOS及び/又はオペレーティングシステムテーブル(OS)をパスする。これらの例を以下により詳細に説明する。ネイティブコードレイヤにおいて、これはエントリポイント関数を構成及び実行することによってエントリポイントを呼び出すことを要求できた。エントリポイント関数は、バインドメッセージを受信可能にするデフォルトの動きを有する必要がある。例えばJavaクラスにおいて、receive_message関数を呼び出せるように、デフォルトVOS及び/又はオペレーティングシステム固有のクラスをJVMにロードすることを実行する。ネイティブレイヤにおいて、エントリポイントは、デフォルトVOS及び/又はオペレーティングシステム固有の(OS)テーブルへのポインタであるパラメータを含んでいてもよい。モジュールエントリポイントが初期化されると(例えばVOS又はOSテーブルのコピーと、作業又はヒープメモリの割り当てを実行してもよく)、VOS(又はオペレーティングシステム関数テーブル)におけるreceive_message関数を呼び出し、そしてバインドメッセージが受信されるまでは何もしない。
上記の初期化関数は、デフォルトVOS(又はオペレーティングシステム)テーブルを取得し、必要ならばそれをコピーし(又は共有メモリにおけるこれの位置にポインティングし)、receive_message関数を呼び出すというブートストラップ方法にすぎない。
receive_message関数はVOS又はオペレーティングシステムテーブル(OS)にあり、(関数コールかオペレーティングシステムスレッドメッセージのいずれかによる)メッセージの送信方法を判断するのはVOSかOSである。バインドメッセージは特殊なメッセージタイプである(全てのメッセージは、メッセージのタイプを判断できる一意の識別子を有している)。従って、(通常クリーンな出口を強いる終了とは異なる)他のメッセージは、バインドメッセージを待機している時には無視される。
バインドハンドラは、新たなスレッド又はプロセスインスタンスを実行してもよいが、実際はこれを実行できずにLLIテーブルを修正するだけのVOS又はOS関数であるcreate_new_LLIを単に呼び出すだけである。しかしながら、バインドメッセージからの構成情報は、構成がそのLLIについてセットアップされるように、create_new_LLI関数にパスされる。これはLLIが使用する特殊なVOS及び/又はOSテーブルへのレファレンスを含む。これは、例えばレイヤが異なる実行環境においてプロトコルメッセージをレイヤにパスする必要がある場合には、初期化関数によってコピー又は使用されるVOS及び/又はOSテーブルと異なっていてもよい。新たなスレッドは、処理するメッセージを待機するために特殊なVOS(又はオペレーティングシステムテーブル)内のreceive_message関数を呼び出す。
上記のとおり、バインドメッセージは、レイヤの出力を次のレイヤに向けるための相互作用又はインタフェース情報を含む。バインドメッセージはまた、これ(関数テーブル)を実行するのに必要な関数コールを備えていてもよい。例えば関数又は関数ポインタの初期化テンプレートはモジュールエントリポイントにパスされてもよいのに対して、処理関数のより具体的なテンプレートは、例えば関連LLIについて選択された構成オプション及び/又はこれの実行環境に応じて、バインドメッセージによってモジュールにパスされてもよい。そしてCMは実行環境特有のセキュリティ機構に新たなLLIから許容された他のLLIへの相互作用を可能にすることを命令し、また共有構成データへのアクセスコントロール機構を任意に設定して、新たなLLIによって許容された構成データの一部へのみアクセスを許容することができる。
バインドメッセージ構成オプションは、セキュリティ、性能及び電力消費についての汎用構成の優先順位を使用してレイヤ内の暗号化を有効化するか否かなどの、有効にする特徴を判断することができる。複数のプロトコルスタックインスタンスが同時に使用中である場合、1つのレイヤにつき複数のLLIがあってもよく、これらは一意のインスタンス識別子(instance.ref)によって識別される。同一レイヤの異なるLLIが異なる構成を有しており、例えば一部は暗号化をサポートし、一部はサポートしないということもまた可能である。
エントリポイントの呼び出しとパラメータのパスは、実現の具体的な詳細に関係なく一般的な方法でサポートされている。好ましくは、ANSI規格C(Cdeclとも称される)定義を使用して、ネイティブソフトウェアモジュール、例えば(function.pointer)や(start.pointer)のパラメータを、(構成データアクセス関数を含む)スレッド作成及びメッセージ関連関数などの実行環境関連関数を与えるエントリポイントにパスする。しかしながら、Javaレイヤについては、ソフトウェアレイヤのJavaクラスはスレッドJavaクラスを拡張し、稼動方法は、レイヤがJVMにロードされるときに自動的に実行される。ネイティブのレイヤエントリポイントが呼び出されて新たなスレッドにインスタンスを作成すると、新たなインスタンスが新たな実行スレッドにおいて作成されて、エントリポイントは戻る。
あるいはまた、(とりわけレイヤが仮想マシン環境において実行するがこれらのレイヤだけに制限されない場合)エントリポイントクラス(又は位置)はレイヤソフトウェアモジュールを伴うマニフェスト(メタ)情報ファイルにおいて示されることが可能である。バインドメッセージが処理されると、新たなインスタンススレッドがcreate_new_LLIを使用して作成されて、次にreceive_message関数を使用してプロトコルメッセージを待機する。
各レイヤインスタンス構成データは、[signal.pointer]などのパケットやプロトコルメッセージを送るための次の(複数の)レイヤインスタンスに関する情報を含む。従って、レイヤが(プロトコルメッセージ内に含まれている)パケットを次のレイヤに送る必要がある場合、バインドレファレンス(bind.ref)のget_attribute関数を使用して、メッセージが送られる次のレイヤインスタンスをLLI構成データから取得する。
同一レイヤの複数のLLIにインスタンスを作成する場合、バインドハンドラは(L2スタックにおける)新たなレイヤインスタンスについて構成データの新たなインスタンスを形成する。上記の構成データはインスタンスについての一意の識別子を含んでおり、新たなスレッドインスタンスが認証を作成するとCMに戻され、次にこれは適切な実行環境セキュリティ手段をセットアップする。バインドメッセージはCMによってLLIに直接送られ、インスタンスの構成を変更する。
上述のとおり、着信バインドメッセージはインスタンス番号[instance.ref]を備える。バインドレファレンス[bind.ref]は、出力プロトコルメッセージが向けられるべき現在のLLIの上のレイヤのLLIを識別する。関数ポインタ[function.pointers]は特定のLLIに適したオペレーティングシステム関数テーブル(OS及び、可能ならばVOS)を識別して、レイヤが所定数の関数のうちの1つ(例えば「create_new_LLI」)を呼び出すと、関数ポインタは、LLIが動作中の具体的な実行環境又はオペレーティングシステムに関するこの関数の現在フォーマット化されている関数コールを含む適切な位置及びメモリにポインティングする。すなわち、オペレーティングシステム関数テーブルはLLI内の「汎用」関数コールを、オペレーティングシステムによって使用される言語及びオペレーティングシステム依存関数にマッピングしてこれらの関数を実行する。関数テーブルは通常、信号パケットや、レイヤ間でパスされる他のメッセージにアクセスすることを含むメモリアクセス及び管理関数を含む。従って、例えばレイヤ1が(signal_packet_2の)信号パケットポインタ[signal.pointer]を、オペレーティングシステム関数send_messageを使用してレイヤ2内のLLIに渡してもよい。これによってレイヤ2のLLIはこの具体的な信号パケットにアクセスでき、さらにそれを、オペレーティングシステム関数テーブルによって提供された関数を使用し、またこれ自体のLLI実行スタック(L2スタック)を利用するこれの内部プロトコル関数に従って処理することができる。
上述のとおり、共通のプラットフォーム独立型仮想オペレーティングシステム(VOS)関数テーブルを利用して、実行環境関数及びLLI構成情報にアクセスすることができる。これは実行環境(オペレーティングシステム及び仮想マシン)独立性を改良し、図15に示されている。「古い」レイヤ3(L3)並びにアップグレードされたレイヤ3(L3’)を含む5つのレイヤ(L1からL4)が示されている。レイヤのうちの2つ(L3’とL4)が、Java仮想マシン(JVM)内で動作している様子が示されている。JVMは、これらのレイヤに対応するソフトウェアモジュールのコードをリアルタイムに解釈するためのインタプリタや仮想マシン環境を必要とし、また非Javaソフトウェアとのインタフェース接続用のネイティブインタフェース(NI)を提供する。他のレイヤ(L1からL3)はオブジェクトコードに事前コンパイルされており、オペレーティングシステムによってランタイム時にネイティブに実行される。
またオペレーティングシステム1及びオペレーティングシステム2は各々異なるレイヤを実行するように示されている複数の実行環境を提供可能であるが、レイヤは依然として相互に通信可能である。
レイヤにおける汎用関数コールは、オペレーティングシステム関数テーブル(OS)を使用して実際のオペレーティングシステム特定関数に変換される。VOSの場合、更なる変換又はマッピングが必要である。各LLIへのバインドメッセージは、それ自体がOSにおけるオペレーティングシステム特定関数にポインティングしてレイヤの実行を可能にするVOS関数テーブルに関数ポインタを与える。これは、VOS関数テーブルは異なるオペレーティングシステム特定関数において再ポインティングされることが可能であるために、オペレーティングシステム独立性を提供する。例えばCMは(バインドメッセージを介して)LLIに、例えばUNIX系POSIX関数(OSx)からUNIX系システムVオペレーティングシステム関数(OSy)にLLIによってランタイム時に動的に使用される汎用関数に対応するオペレーティングシステム特定関数のLLIのVOSテーブルを変更することを命令可能である。しかしながら動的変化は、一定のオペレーティング特定関数はシステム状態関連情報(とりわけセマフォ及びメモリ割り当てのような他のシステムリソース取扱関数)を含有又は変更するためにケアを必要とし、従ってVOSのコンセプトによって、これらの間接参照機構内のインテリジェンス及びオペレーティングシステムの要約を提供することによって必要ならばOS環境間で途切れることなく切り替えが可能である。それによってまた、異なる実行環境をサポートすることができる最も一般的な方法でソフトウェアコードモジュールが書き込まれる。
プロトコルソフトウェアにおいて、ストリング操作は頻繁には実行されないが、「calculate_crc」や「convert_ip_address_2_string」などの任意の頻繁な動作は対応するオペレーティング特定関数を有する汎用関数としてオペレーティングシステムテーブル(OS)やVOSテーブルに含まれていてよい。代替構成において、暗号化及び解読などの一定の信号データ操作関数は、異なる暗号化及び解読動作を実行するように構成可能な汎用暗号化/解読レイヤにおいて実現可能である。これは、最も数学的関数を含んでおり、またこれらの複雑な数学的関数についての性能アクセラレータによって(コプロセッサのように)実行環境で動作可能であるために、数学的な拡張子を有するVOS又はオペレーティングシステムテーブル(OS)を(必要ならば)使用可能なレイヤである。そして、その他のかつ一般的なプロトコルレイヤはこれらの拡張子のない汎用VOSやオペレーティングシステムテーブル(OS)を使用する。
関数ポインタが実行環境及び言語独立的な方法でモジュールにパスされる方法が図16及び17に示されている。具体的には、これはCなどのネイティブコードの例を示しており、図16は既知の動的リンク付け方法を示しており、図17は実施形態に従って関数テーブルポインタをパスする方法を示している。
図16を参照すると、ソフトウェアモジュールのベンダは、一連のAPI関数(x及びy)と、ターゲットプラットフォームのメモリに記憶されているデータと相互作用するための変数(ハードウェア、関数ライブラリセット、及び入力/出力などのオペレーティングシステム関数)と、可能ならばプラットフォーム上で動作する他のAPIライブラリモジュールとを備える(この例ではCプログラミング言語の)ソースコードプログラムを開発する。ソースコードは既知のコンパイラによってオブジェクトコードにコンパイルされており、これは一連の関数を、ターゲットプラットフォームに固有のバイナリマシン(又はオブジェクト)コードに翻訳する。バイナリコードは、各々がAPIライブラリモジュールにおける一連の関数(x及びy)のうちの1つに対応する一連のプレースホルダやシンボル(シンボルX及びシンボルY)を備える。
オブジェクトコードがターゲットプラットフォーム上のメモリにロードされて実行される場合、動的リンカーはコードを検査し、一連のシンボル(シンボルX及びシンボルY)を、ライブラリソースコードにおける関数(それぞれx及びy)に対応する事前ロードされているAPIライブラリモジュールにおけるAPIライブラリ関数(mem.loc(X)及びmem.loc(Y))のメモリ位置と置き換える。ライブラリモジュールがまだロードされていない場合は、動的リンカー(又はJava系実現の場合はクラスローダー)によって動的にロード可能である。そしてプラットフォームは、プログラム命令を含む一連のメモリ位置を介してプログラムカウンタをステッピングし、ソフトウェアモジュールが必要とするようなAPIライブラリ関数コール(mem.loc(x)、mem.loc(y))に対応するメモリ位置にジャンプする(分岐する)ことによってコードを実行可能である。
図17を参照すると、ターゲットにロードするソフトウェアモジュールのベンダ(Cプログラマ)は、実際のAPI関数コール(関数x及び関数y)が図16のアプローチで使用されている場所に対応する一連のAPI関数コール(redirect.f(x)及びredirect.f(y))を備えるソースコードプログラムを開発する。出力先変更関数(redirect function)は、(アレイ内のヒープ又は共有メモリにおけるコンパイルタイムロケーションでは、一部は未知のまま保持されている)特定化されたVOS又はOS関数ポインタテーブル内の特殊エントリのメモリ位置に関数コールを出力先変更するだけである。Cソースコードは、またもバイナリマシンコードを備えるオブジェクトコードにコンパイラによってコンパイルされているが、ソースコードにおける関数に対応するシンボル(X及びY)はない。その代わり、出力先辺呼応関数は、ターゲットプラットフォームにランタイム時にロードされているメモリ常駐関数テーブル内のエントリ(各エントリは1つのAPI関数に対応する)に保持されているメモリ位置へのジャンプ(分岐)命令に単にコンパイルされる。
このように、複数の実行スレッドは、ソフトウェアモジュールを動的に再リンクする必要なく異なるAPI実現コードを使用してソフトウェアモジュールコードを稼動させることができる。
コンパイラはリダイレクト関数を相対的なメモリポインタに翻訳し、これはランタイム時にOS又はVOSテーブルの開始に関連しており、それゆえに、オブジェクトコードによって示されている適切な実行環境特定関数でポインティングする。この場合、ソースコードは、図16のAPI型関数ではなく出力先変更関数を使用して書き込まれる必要がある。
代替構成において、従来技術のソースコードプログラムは修正コンパイラによって同一のオブジェクトコードに翻訳され、コンパイラはC特定関数(例えば関数x)をリダイレクト関数コールredirect.f(x)に翻訳して、(ランタイム時に動的にロードされた)関数テーブルの使用を可能にする。
このソフトウェアモジュールオブジェクトコードはメモリにロードされると、(メモリの開始アドレスなどの)プラットフォーム固有のマッピングテーブルのレファレンスがパスされ、これはヒープ又は共有メモリ内の場所に対応する。関数ポインタのデフォルトテーブルは、例えばソフトウェアモジュールがテーブルレファレンスポインタにエントリポイント関数や他のパス手段を含んでいない場合にもまた可能であるオブジェクトコードに関して、所定の相対的なメモリ位置にロードされることが可能である。
そしてプラットフォームは、プラットフォーム上の実際のOS又はVOSライブラリ関数(mem.loc(x))のメモリ位置にあるテーブルエントリ(redirect.f(x))に対応するメモリ値にプログラムカウンタを出力先変更(ジャンプ又は分岐)するredirect.f(x)からコンパイルされる一連の命令を実行することによってこのオブジェクトコードを実行することができる。関数は実行されて、プログラムカウンタは、ジャンプ(又は分岐)がソフトウェアモジュールオブジェクトコードにおいて生じた場所に戻る。
これによって、プラットフォーム(オペレーティングシステム、動的リンカー、あるいはJava仮想マシン)がソフトウェアモジュールコードの特殊な言語及び意味や他のモジュールとどのように相互作用するかについての知識を有している必要がないという意味において、位置独立型コード(つまり任意のメモリアドレスから実行可能なコード)にコンパイルされてプラットフォーム独立的になるロード可能なソフトウェアモジュールが可能になることが分かる。また、動的ローダーがプラットフォーム特定関数について解釈しまたメモリ位置と置換する必要がある所定のシンボルではなくマッピングテーブルへの同一ポインタをコンパイルされたオブジェクトコードは含むので、ソースコードは言語と無関係であってもよいことがわかる。例えば、C、VisualBasic、あるいはPascalで書かれたプログラムは各々相対的な関数ポインタの同じオブジェクトコードにコンパイルされて、これは実行環境特定関数が配置されているメモリ内の開始ポイントにパスされて、相対的ポインタはこの開始ポイントからの対応する関数の相対的位置を示している。これによってベンダは、いずれの言語でも書き込みができ、またプラットフォームとは無関係のソフトウェアモジュール(オブジェクトコード)を提供することができる。
最終的に、ソフトウェアモジュールコードを実行する各スレッド又はプロセスは異なるライブラリ関数テーブルマッピングによってこのように実行でき、同じコードの動きを、ライブラリ関数が実現されている方法で全く異なるものとすることができる。従って、(メモリ常駐バイナリ又はバイトコードモジュール上の)1つの実行スレッドは、軽量のセットのライブラリ関数を実現して性能について最適化するライブラリ関数を呼び出すことができ、また(同じメモリ常駐コードの)別の実行スレッドは重量のライブラリ関数実現を使用して、例えばセキュリティについて最適化することができる。
図18及び19を参照すると、Java言語系レイヤプログラムについて動的リンク付け(クラスローダー)及び関数ポインタパス方法がそれぞれ示されている。ネイティブ及びJavaソフトウェアモジュール間の主な違いは、Javaにおいて、間接参照についての余分なレイヤが導入されてJava及びネイティブソフトウェアモジュール間をまたぐことである。Javaソフトウェアモジュールは、ネイティブライブラリ関数Java_class_redirect.f(x)及びJava_class_redirect.f(y)にそれぞれ対応するJavaのネイティブインタフェース方法redirect.m(x)とredirect.m(y)とを有している。Javaのネイティブインタフェース方法はクラスローダーによってネイティブ関数にマッピングされる。通常、標準JVMクラスローダーを使用する場合は、ネイティブライブラリモジュールはSystem.LoadLibrary方法を使用してロードされなければならない。しかしながら、クラス及びライブラリをロードする他の方法を使用してもよいカスタムJavaクラスローダーを作成することも可能である。
そしてクラスローダーは、この例においてはJavaのネイティブインタフェースクラス(mem.loc(redirect.f(x))とmem.loc(redirect.f(y))において使用されているネイティブシンボルを解決する。そしてこれらの出力先変更関数は、ネイティブ出力先変更関数と同様に動作し、マッピングテーブルを使用して、関数コールを真の関数、mem.loc(x)とmem.loc(y)とに出力先変更する。
Javaクラスローダーは、明らかにプラットフォーム固有の方法で実行されて、かつ各プラットフォームは対応するセットのインタフェースライブラリを有しており実際のネイティブAPIライブラリへのアクセスを可能にすることを必要としているために、ネイティブインタフェースライブラリをロードするというこの中間ステップを排除するようにカスタマイズされることが可能である。
図20はプロトコルスタックの実現に対するスレッド/メッセージアプローチを示している。このアプローチにおいて、スレッドはプロトコルスタックにまたがる各パケット又は信号と関連付けられている。示されている例において、thread_signal1は、スタックインスタンス内のレイヤ1によって処理されて、示されている種々の関数やサブモジュールによってメッセージが処理される(パケット又はプロトコルメッセージは図14においてコードブロック又はモジュールの一部を処理する)レイヤ2上に継続するプロトコルメッセージ信号1と関連しており、実行は、メッセージがさらに処理されるレイヤ3上に継続する。同様に、thread_signal2はプロトコルメッセージ信号2に関連しており、これはレイヤ1を介してレイヤ2上にパスされて、示されている特定の時点でレイヤ2の「チェックサム」サブ関数に到着する。このアプローチは既存の提案されるフレームワークに類似しているが、多くのマルチタスクオペレーティングシステムによって提供されている異なるセキュリティ及び性能構成を有する異なる実行環境は異なるLLIを識別するのに容易に使用することができず、代わりに、LLIに基づいて必要ならばスレッドを事前に空にすることができるカスタマイズされたスケジューラを実現する必要があるという欠点がある。
蓄積関数が破線のアウトラインで示されているが、説明を容易にするために上述されていない。蓄積関数がスレッド/メッセージアプローチにおいて実現される場合、実現について2つの可能性がある。1つはスレッドを単に終了させることであるが、これは、バッファされているパケットを提供するためにバッファをモニタする別のスレッドに依存している。もう1つはコール関数に戻ることであり、実行スレッドを使用して、別のメッセージを処理することができる。非常に軽量のスレッドモデルが実現されない限り、オペレーティングシステム上でのスレッド作成の待ち時間及びオーバーヘッドはかなりかかるために、これはスレッドを終了するよりも魅力的である。
これは図21に概略的に見られ、2つのコードブロック2が、これらのコードブロックを介する種々の実行スレッドと関連している実行スタックと、ヒープ又は他の共有メモリオブジェクトと共に、作業メモリに示されている。種々の実行スタックは、マイクロプロセッサのレジスタの現在の状態、関数及びモジュール内の静的データ、及び関数コールパラメータパスについての種々のパラメータを記憶する。スケジューラ及びスレッドマネージャは既知の方法で種々のスレッドの動作をコントロールし、現在又は存続しているスレッドについてのそれぞれのスタックの適切なコンテンツによってマイクロプロセッサのレジスタをロードし、レジスタのコンテンツを、(コンテクスト切り替えとして既知の)切り替えられたスレッドについての適切なスタックに記憶する。例えば、コード(TS1)のL2ブロックにおけるthread_signal1の実行ポイントがコードを介してthread_signal2(TS2)よりもさらに進められており、ここでは(TS1)と(TS2)はスレッドごとのプログラムカウンタ値を示しており、それゆえにコードモジュールのいずれのポイントをそのスレッドの次に実行するのかを示しているということが分かる。種々の他の実行スタックはプロトコルスタックの種々のコードブロックL1からL5を介してパスする他の信号と関連している。各スレッドが単一の信号と関連しており、同期的な方法でプロトコルスタックを介して「それに続く」ことが分かる。
逆にさらなる実施形態は図22に示されているようにLLIごとにスレッドを使用している。thread_layer2_LLI#1はレイヤ2又はコードモジュール内の1つのスレッドに対応しており、これが下部レイヤ(例えばレイヤ1)から信号やパケット(プロトコルメッセージ)を受信している。スレッドはレイヤの種々のサブ関数を介してこれを処理して、処理した出力(信号、パケットあるいはメッセージ)を高次のレイヤ(例えばレイヤ3)にパスする。そして、これの関連レイヤ2の受信メッセージや入力関数に戻り、次のプロトコルメッセージの処理にそなえる。同様にthread_layer2_LLI2は第1のスレッドと同じレイヤ(レイヤ2)における分離パケットやプロトコルメッセージと関連しているが、異なるインスタンス又はLLIにある。示されている時点で、この第2のスレッド又は実行ポイントはレイヤ2の暗号解読サブ関数に到達している。各スレッドがこれのLLIを介してプロトコルメッセージを処理すると、アイドル状態に戻り、receive_messageオペレーティングシステム関数を呼び出して下部レイヤからの新たなパケットを待つ。LLI間をパスするメッセージは実行環境によって、可能ならば、LLIを実行する実行環境が別個の物理的プロセッサ上に常駐している場合には関連するLLIのいずれかからの異なるオペレーティングシステムスレッド又はプロセス(例えばthread_send_message(x))を使用して対処される。receive_message関数は所定のメッセージキューにおいてメッセージを待機して検索するだけである。同様に、send_message関数はメッセージを所定のメッセージキューに置く。
先ほどのアプローチに対するこのスレッド/LLIアプローチの利点は、不当に動作したソフトウェアモジュールが他のLLIの動作に悪影響を及ぼすのを回避するために、各LLIが(必要ならば)異なる優先順位を有し、また(適切な場合は)異なるセキュリティ手段を適所に有している異なる実行環境において動作するように構成可能であることである。
また蓄積関数が、最初の説明を簡潔にするために破線のアウトラインで示されているが、プロトコルスタックに対するこのアプローチは元来本質的に非同期的である(すなわちメッセージの蓄積を有している)ため、非同期メッセージのパスを使用することは魅力的であり、メッセージ(パケット)は、送信者及び受信者双方がアクセス可能である共通の永続的な方法でバッファされている。(スレッド/メッセージアプローチの場合同様に)蓄積がレイヤコード内で自然に実行される場合、メッセージデータは送信者から蓄積バッファにコピーされて、再びバッファから次のレイヤにコピーされなければならない。
永続的な共有メモリキューを有することによって、メッセージはデータコピーの必要なくキューにポスティングされる。プロトコルスタック実現におけるコピーは良好な性能を得るために最小化されなければならない。従って、send_message関数が受信者のメッセージキューのメッセージへのポインタを単に置くだけならば、データコピーは全くなく、受信者は依然として同様にデータにアクセスできる。他の利点は、1つのレイヤインスタンスLLIが別のLLIによって再構成(つまり置換)されている場合、依然としてキューは存在し、またメッセージデータも依然として存在するために、何もなくならず、何事も起こらなかったように処理は継続可能である点である。
さらなる利点は、スタックにおけるLLIのアップグレード又は置換時に、LLIによって処理されているがアップグレードされていないプロトコルメッセージ(信号)が影響を受けないという点である。また、必要ならば、事前実行切り替えが、古いインスタンス向けのパケットを、新たなインスタンスによって、又は古いインスタンスを停止することによって(これによってパケットを破棄せずに古いバージョンによる更なる処理を防ぐ)使用されるキューに出力先変更することによって達成できる。パケットは新たなLLIインスタンスにそなえてキューに入れられ始めるので、例えば、send_messageとreceive_message関数が永続的な共有メモリキューで実現されて、キューが、新たなLLIのインスタンスの作成前に新たなLLIバージョンインスタンスの上下のLLIインスタンスに対してCM送信バインドメッセージによって再度関連付けられることができる場合にこれは可能である。このアプローチは、新たなLLIのインスタンスの作成は時間がかかるものであってもよいために魅力的であり、例えば安全でないLLIバージョンから安全なLLIバージョンに切り替わると、安全でない方法で続けられているパケット処理はシステムにおける脆弱さを現すであろう。
図23は、図21に類似の、スレッド/メッセージアプローチの概略を示しているが、スレッド/インスタンスアプローチに対応する実行スタックを示している。例えば、レイヤ2のコードモジュールに関連した2つのスレッドが示されているが、各々は、L2内の異なるプロトコルメッセージとは反対にL2の異なるインスタンス(LLI)と関連している。(TL2)、(TL2)及び(TL1)は、LLIスレッドごとのコードモジュールにおけるプログラムカウンタ値又は位置を示している。
図24及び25は、実施形態におけるアプリケーションについてコードモジュールに到達するための異なるルートを示している。図24において、ベンダはC++ソースコードプログラムを開発しており、これは、関数テンプレートにおける汎用関数に対応する一連のポインタを備える汎用実行コードモジュールフォーマットにソースコードを翻訳するために、「ソーストゥポインタ(source-to-pointer)」コンパイラによってコンパイルされている。ポインタは上述のように共通のデータフォーマットであり、OSテーブルやオブジェクトにおける対応するオペレーティングシステム特定関数への相対的なメモリポインタである。例えば、第1の汎用関数(例えば、create_new_LLIであるFunc#1)はOSにおける第1のオペレーティングシステム特定関数に対応する。対応するOSがメモリ内のどこにあるかを知っていれば、モジュールを実行できるので、実行環境はOSにおける適切にフォーマット化された実行環境特定関数にポインティングされる。
図25に示されている代替構成において、ベンダは同じC++ソースコードプログラムを開発し、これは標準C++コンパイラによってプラットフォーム固有のC++コードモジュールにコンパイルされる。さらなるコンパイラは、上述のような、かつOS(別の実施形態においてはVOS)による実行に適した汎用関数ポインタコードモジュールにこのモジュールを変換する必要がある。
図26は上記の実施形態の一部を使用する例示的実現を示している。Bluetooth性能を有する端末デバイスは、ネイティブ言語ソフトウェアレイヤ(ソフトウェアレイヤ#1及び#2)内で標準Bluetoothプロトコルスタックを稼動する。Bluetoothスタックは、プラットフォームオペレーティングシステム及び言語独立型プロトコルレイヤが動的に共にリンク付けされることを可能にする上記のバインド機能性を使用する。2つのプロトコルスタックインスタンスが示されており、(インスタンス#1及びインスタンス#2)は異なるBluetoothサービスを提供するように構成可能である。例えば、LANアクセスプロファイルインスタンス及びVoIP又はBluetoothネットワークカプセル化プロファイルインスタンスである。そしてLANアクセスプロファイルを使用して専用Bluetoothアクセスポイントを使用するウェブ閲覧を実行し、VoIPプロファイルを使用して同時に同じアクセスポイントを介して電話をかける。
そしてBluetoothスタックは、図27に示されているようなダウンロードされたJavaレイヤ(レイヤ#3)を使用する新たなプロファイルに対するサポートを付加することによってカスタマイズ可能である。このレイヤは(例えば)強化されたセキュリティや性能、又は新たなサービス機能性を提供する。Javaレイヤは動的にロードされて、新たなレイヤインスタンス(LLI#1及びLLI#2)は、用いられている実施形態のおかげでBluetoothスタックを再開する必要なく既存のネイティブ言語のBluetoothスタックに結びつく。従って、既存のBluetoothの接続セッションは切断されない。そして新たなレイヤを使用して、端末とアクセスポイント間でデータを暗号化及び解読するのに使用される強化セキュリティプロファイルにインスタンスを作成可能である。
オペレーティングシステムの独立性をサポートするために、プロトコルスタック内の他のモジュールと相互作用するためにモジュール内で使用される必要のあるプラットフォーム特定関数のオペレーティングシステム関数テーブル(例えば共有メモリ割り当て及びスレッドメッセージなどを可能にする関数)が使用される。バインドメッセージはまた、いずれの他のモジュールが相互作用可能であるかを判断し、実行環境機構はこれらのソースの認証を検証するために存在する。バインドメッセージはプロトコルレイヤが必要とする全ての必要な開始構成データを含んでいなければならない。
このBluetoothスタック内のレイヤは異なる実行スレッドを使用してインスタンスが作成されて、各レイヤはプロトコルメッセージエントリ及び出力ポイントとしてVOS又はOSのreceive_message及びsend_messageをそれぞれ利用して、VOS又はOSが、LLIの選択された実行環境に適した相互作用機構を実現することを可能にする。スレッド又はプロセスは一意のLLI名によって識別可能であり、これは一意のレイヤ名(この場合は「Bluetoothスタックレイヤ#3」とレイヤインスタンス識別子(この場合は「LLI#1」と「LLI#2」)から成る。このように、スレッド名を使用してレイヤインスタンスを一意に識別する。VOS及びOSはオペレーティングシステム特有の機構を使用して、LLI間の相互作用及びLLIスレッドのスケジューリングをサポートすることができ、またプロセスや独自性(proprietary)や高度に最適化された機構もまた用いることができる。これは、セキュリティや性能の観点、さらにはメモリ及び電力消費などのリソース利用の観点から最適化されることができる。
このアプローチによってLLIは異なる構成によって生成可能である。各LLIはバインドプロセス時に、LLIが通信する他のLLIだけではなく、特定のインスタンスについて使用する構成データをも同定するバインド信号によって構成される。
VOSにサポートされているLLIメッセージキューは永続的な共有メモリに保持されて、ソフトウェアの動的アップグレードを可能にするのに対してプロトコルスタックは依然としてアクティブである。LLIのリバインドはまた、レイヤのアクティブプロトコルスタックへの挿入を可能にすることができる。
新たなレイヤ(Bluetoothスタックレイヤ#3)をプロトコルスタックに構成するプロセスは以下のとおりである。
1.第1のステップは関連モジュールエントリポイントを呼び出すことによって「Bluetoothスタックレイヤ#3」の実行を開始することである。Javaモジュールの場合、クラスファイルがCMによって選択されたJVM環境にロードされる。モジュールは、まだロードされていない場合にはデフォルトVOS又はOSのAPIをロードする。そして稼動方法はJVMによって自動的に呼び出されて、レイヤソフトウェア(モジュール)は、構成及びメッセージデータに引き続きアクセスできるようにload_template関数を呼び出して、またreceive_message関数を呼び出してバインドメッセージを待機する。
2.バインドメッセージは必要な構成情報を有する「Bluetoothスタックレイヤ#3」スレッドにパスされる。そしてスレッドは、VOS又はOSのcreate_new_LLI関数を呼び出すことによって新たなLLIインスタンスを作成する。新たなLLI内で、LLI固有のVOS及び/又はOSテーブルは必要ならばロードされる。スレッド「Bluetoothスタックレイヤ#3のインスタンス#1」が作成されてOK応答が送り返される。新たなLLIは(異なるテンプレートが必要ならば)汎用load_template関数を実行して、メッセージ及び構成データへのアクセスを可能にして、そして次のメッセージを待機するためにreceive_messageを呼び出す。
3.「Bluetoothスタックレイヤ#2のインスタンス#1」へのリバインドリクエストメッセージはOKメッセージによって応答してリバインドを確認して、「ホストインターネットスタック」を元々目的とする次のパケットは全て「Bluetoothスタックレイヤ#2のLLI#1」に送られる。
4.「ホストインターネットスタック」に対するリバインドメッセージ及びルーティングテーブルは更新されてOK応答が受信される。
5.LLI#1が次にアクティブとなり、同じ手順がレイヤ#3のLLI#2について繰り返される。
Java Bluetoothスタックレイヤ#3がネイティブ言語Bluetoothスタックレイヤ#2及びホストインターネットスタックと容易に相互動作できるように、上記の共通VOS及び/又はOSがサポートしている相互作用機構と、スレッド及びプロセスのスケジューリングが使用される。プラットフォーム独立的にこの共通機能性にアクセスするのに使用される方法は、動的にロード可能なVOS及び/OS関数ライブラリによる。
「Bluetoothスタックレイヤ#3」スレッドがJVM環境においてインスタンスを作成されると、デフォルトVOS及び/又はOSライブラリをロードするためのJavaコールが実行される。VOS及び/又はOSライブラリは1セットのシステムリソース関連取扱関数を含む。これらは最小限以下を含む。
・信号及びメモリ割当関数
・スレッド作成(及び破棄)関数
・メッセージ送信及び受信関数
・構成及び信号データアクセス関数
関数のVOS及び/又はOSライブラリを引き続き使用して(適切なロード済みテンプレートを使用する)他のLLI及びアクセス構成データと通信する。汎用LLI及びVOS関数は多数の異なるオペレーティングシステム上でサポート可能であり、また多数の異なる言語及び仮想マシン環境からアクセスできる。関数のライブラリはまたメッセージキュー、信号及び構成データへのコントロールされたアクセスを提供する。例えば、関数のライブラリはLLI識別子に基づいた構成データへのアクセスを制限可能であり、また適切に認証された送信元及び宛先に対するメッセージの送信及び受信の使用を制御できる。このようにして、安全な言語及びオペレーティングシステム独立型プロトコルスタックの実行環境が作成される。
このようにして、例えば「Bluetoothスタックレイヤ#3のLLI#1」が一定のセットの暗号化機能性設定によって作成可能である。これらの設定は「Bluetoothスタックレイヤ#3のLLI#2」においては異なっていてもよく、バインドプロセスで使用されるバインドメッセージで定義される。そしてLLI#2はLLI#1のパラメータにアクセスすることができず、この逆も同様であり、またLLI#1はLLI#2向けのパケットを遮断することはできず、この逆も同様である。
しかしながら、(コンピュータ実行可能な命令によって定義されているような)機能性の全く新たなレイヤのプロトコルスタックへのロードは、プロトコルスタックが定義されているコンピュータにおいて実質的なメモリリソースを拡張可能であるために、環境によっては困難である。
メモリがコンピュータにおいてリソース不足である場合、追加レイヤの動的ロードは、追加レイヤを定義するマシンコード命令の更なるメモリリソースの保持が必要であるために望ましくない。これはコンピュータの性能の悪さや誤作動につながる可能性がある。
さらに、実際は、追加レイヤは、これの機能性の特定な部分を除いて置換することを意図しているために、プロトコルスタックのレイヤと実質的に同じマシンコード命令によって定義されてもよい。従って、使用に際して、追加レイヤを含むプロトコルスタックのインスタンスは、追加レイヤの導入によって強化されなかった置換されたレイヤの機能性に関する多数の命令のうちの2つコピーを記憶する必要がある。実質的なメモリリソースを有するコンピュータにおいて、これは実際的な問題ではないのに対して、これはプロトコルスタックと平行して更なる機能性の稼動を可能にするために、コンピュータにおけるメモリ消費を削減する方法を見出すことは常に望ましい。
プロトコルスタックにおけるレイヤは従来多数の所定の状態のうちの1つに存在するように設計される。特定の状態にあるレイヤは一定のメッセージを受信し、それに応答し(メッセージは所定の状態のうちの別の状態にレイヤを変換する)、あるいはレイヤの状態をそのままにしておくように動作可能であるように構成される。
これらの所定の状態間のレイヤの条件的遷移はレイヤによるプロトコルメッセージの受信に依存している。柔軟に動作するレイヤの有効性は、メッセージが利用されているコンピュータプログラミング言語に関係なく対処されること、すなわち言語独立性を促進することによって高められる。
レイヤの有効かつ永続的な設計を可能にし、また適切なソフトウェアの設計によって実現するために、設計者はレイヤの状態、及び受信メッセージに応答してレイヤの所望の動きを記述する状態間の遷移を最初に決定してもよい。従って、レイヤの各状態は関数モジュールによって実現される。
モジュールはレイヤがインスタンスを作成されるコンピュータの自己完結機能性を定義し、それに直接適用するメッセージを捕捉する一方で、別の状態にある場合にはレイヤの動きに対処する別のモジュールによって処理するために、適用しないメッセージを無視する。
従って、状態を定義する複数の関数モジュールのようなレイヤのコンテクストにおいて、また受信メッセージに応答した状態間の所定の遷移によって、更なる機能性のレイヤへの所望の導入は状態定義モジュールのうちの1つにのみ変化する必要があるということが可能である。
上記の例において、置換レイヤに関する対応するマシンコード命令のかなりの割合が元のレイヤに対する命令と同じであろうがなかろうが、レイヤ全体を置換することが必要である。これはまずメモリを不必要に拡張するが、いずれの方法にせよ、新たなマシンコード命令をコンピュータにロードするという動作は、コンピュータに既に存在している命令をロードすることに関係する。
従って、レイヤを定義する状態マシン全体ではなく、変更する必要のある状態マシン内の状態を定義するマシンコード命令のみをロードすることができるというのが望ましい。これは、一方で、メモリがそれほど高価ではなく、また送信ソースが制限された送信リンク上でより少数のマシンコード命令の転送を介して達成可能であるという解決策につながる点において好都合である。
コンピュータに送信されたデータ量を削減するという関数は動作環境を表すという点が理解される。従って、状態ベースのレイヤプロトコルスタックを実行するコンピュータに、レイヤの改良をレイヤの置換機能性の導入によって実行可能にする関数を提供する一方で、そのまま、レイヤの機能性が事前ロードされたマシンコード命令によって実現されているということがさらに望ましい。
本発明の一態様は、プロセッサ及びメモリを有する処理装置に与えられる信号を処理するための通信プロトコルを修正するための方法を提供し、前記プロトコルは複数のプロトコルレイヤによって定義されており、少なくとも1つのレイヤが使用中に複数の所定の状態のうちの1つを占めることが可能であり、各レイヤは、他の状態のうちの1つへの前記レイヤのメッセージ依存性遷移を含む所定の機能性と関連しており、前記方法は、ソフトウェア更新モジュールをメモリにロードすることを備えており、前記モジュールは前記レイヤのうちの1つの前記状態の1つに対応する1つ以上のメッセージを受信及び処理するように構成されており、前記モジュールは別の状態にレイヤを遷移させるように動作可能である少なくとも1つのメッセージ依存性遷移ユニットを備える。
好ましくは、前記モジュールは対応する状態を実現する前記所定の機能性を意図したメッセージを傍受して、前記メッセージ依存性遷移ユニットに関係のない前記所定の機能性メッセージにパスするように動作できる。
本発明の好ましい実施形態において、前記更新モジュールは、メッセージを受信及び処理して、別の状態にレイヤを遷移させるように動作でき、前記メッセージは前記モジュールのロード前に前記レイヤを遷移させるようには動作できない。
前記更新モジュールは、前記信号に対応するプロトコルメッセージを他のモジュールと交換するように構成されてもよく、前記他のモジュールは、前記他のレイヤに対応する1セットの汎用関数に従って前記信号を処理するように構成されている。
前記方法はさらに、前記他のソフトウェアモジュールを前記メモリにロードすることを備えており、前記他のモジュールは、関数マッピングオブジェクトにおける前記汎用関数に対応する汎用関数ポインタを備えており、
他のモジュールごとに、前記関数マッピングオブジェクトを前記メモリにロードし、前記オブジェクトは、前記汎用関数を1つ以上の装置特定関数にマッピングするために、前記汎用関数に対応する装置特定関数ポインタを備えており、
受信信号をプロトコルレイヤに従って処理するために、前記マッピングされた装置特定関数に従って前記他のモジュールを実行する。
好ましくは、前記方法はさらに、前記別のモジュールに対する識別子を備えるバインドメッセージを受信する各ロード済みソフトウェアモジュールを備えており、第1のモジュールはバインドメッセージによって同定された前記他のモジュールとプロトコルメッセージとを交換するように構成されている。
前記モジュールは前記プロトコルメッセージを処理するための異なる構成オプションを有していてもよい。
前記バインドメッセージは、前記モジュールの前記実行において実現する前記構成オプションを判断するための識別子を備えていてもよい。
前記プロトコルメッセージ、前記バインドメッセージ及び前記汎用関数ポインタは共通の汎用フォーマットであってもよい。
好ましくは、前記方法はさらに、第2のソフトウェアモジュールを前記メモリにロードすることを備えており、前記第2のモジュールは、第2のレイヤに対応する1セットの汎用関数に従って前記信号を受信及び処理するように構成されており、前記第2のモジュールは第2の関数マッピングオブジェクトにおける前記汎用関数に対応する汎用関数ポインタを備えており、前記第2の関数マッピングオブジェクトを前記メモリにロードすることを備えており、前記オブジェクトは、前記汎用関数を1つ以上の第2の装置特定関数にマッピングするために前記汎用関数に対応する第2の装置特定関数ポインタを備えており、前記プロトコルレイヤに従って受信信号を処理するために前記マッピングされた第2の装置特定関数に従って前記第2のモジュールを実行することで成り、前記第1及び第2のモジュールは異なる実行又は装置固有の環境で実行する。
前記更新モジュールは言語独立型であってもよい。
高レベルソフトウェア言語コードは、前記レイヤに対応する前記1セットの汎用関数に従って前記信号を処理するために提供されてもよく、前記コードを前記言語独立型ソフトウェアモジュールにコンパイルする。
本発明の第2の態様は、好ましい形態で本発明の前記第1の態様の方法を実行するための処理装置をコントロールするためのプログラムを備える。
記憶媒体が提供されてもよく、設定可能装置にロードされる場合に、前記設定可能装置に好ましい形態で本発明の前記第1の態様の方法を実行させるためのプログラムを実行可能にするデータを有している。
信号が提供されてもよく、設定可能装置にロードされる場合に、前記設定可能装置に好ましい形態で本発明の前記第1の態様の方法を実行させるためのプログラムを実行可能にするデータを有している。
本発明の第3の態様によれば、プロセッサとメモリを有する処理装置に与えられる信号を処理するための通信プロトコルを修正するための装置が提供されており、前記プロトコルは複数のプロトコルレイヤによって定義されており、少なくとも1つのレイヤは使用中に複数の所定の状態のうちの1つを占めることが可能であり、各状態は、他の状態のうちの1つへのレイヤのメッセージ依存性遷移を含む所定の機能性と関連しており、前記装置はソフトウェア更新モジュールをメモリにロードするための手段を備えており、前記更新モジュールは前記レイヤのうちの1つの前記状態の1つに対応する1つ以上のメッセージを受信及び処理するように構成されており、前記モジュールは別の状態に前記レイヤを遷移させるように動作可能な少なくとも1つのメッセージ依存性遷移ユニットを備える。
本発明の第4の態様は、本発明の第3の態様のような装置として構成された設定可能装置を提供する。
本発明の具体的な実施形態を、添付の図面を参照して例示によってのみ次に説明する。
図28に示されているように、(後に説明する図30に示されている)汎用プロトコルスタックのレイヤ10は3つの可能な状態を有しており、遷移はこれらの状態間で定義される。本例において、3つの状態は切断状態12と、connect_pending状態14と接続状態16とを有する。
切断状態12は状態メッセージ取扱関数ポインタFUNC#1を含む。connect_pending状態14は2つのメッセージ取扱関数ポインタFUNC#2及びFUNC#3を含んでおり、接続状態16はまた2つのメッセージ取扱関数ポインタFUNC#4及びFUNC#5を含む。
関数ポインタはレイヤが受信したプロトコルメッセージを検出するように動作可能であり、レイヤは対応する状態12、14、16にある場合、対応するオペレーティングシステム関数にアクセスすることによって適切なメッセージの受信に応答する。これらの関数は、プロトコルスタックに沿った送信についての更なるプロトコルメッセージの生成をもたらす。
図29は、メッセージ取扱関数ポインタFUNC#1からFUNC#5とオペレーティングシステム関数間の関係を示している。メッセージ取扱関数ポインタはオペレーティングシステム関数又はそのシーケンスに対応し、意図している方法でシステム又は実行環境リソースにアクセスする。
明確には、メッセージ取扱関数ポインタは同定可能な動作に対応し、connect_req(接続リクエスト関数)、connect_conf(接続確認関数)、connect_res(接続リクエスト関数への応答)、切断及びchange_QoS(サービス品質変更関数)というラベルに関連している。
図30に示されているように、通信デバイス29は、マシンコード実行可能な命令を実行することができ、無線通信リンクによってアンテナ28を介して別のデバイスへの物理的接続を確立するための通信ハードウェアユニットにバス24を介して接続されているプロセッサ22と、(オーディオ又はディスプレイ手段によって)ユーザとのデータ出力を確立するためのユーザ出力ユニット30と、適切な入力デバイス上のユーザ入力動作を検出するためのユーザ入力管理ユニット32とを含む。
ユーザ入力管理ユニット32は、キーパッド、スクリーン上のポインティングデバイス、タブレット及び書き込み実現、スクリーン上のダイレクトペン動作、音声入力及びその適切な解釈、そしてまた光線などの上級の入力技術の起動などのユーザの入力動作を受容することができ、プロセッサ22はまた、加入者同定モジュール(SIM)などの内部メモリ及び/又はリムーバブル記憶メモリを含んでいてもよい記憶デバイス34に対するレファレンスを作成できる。
プロセッサ22はさらに作業メモリ36と通信しており、本例ではここに、3つのレイヤ、つまりレイヤ1、レイヤ2及びレイヤ3とプロトコルレイヤインスタンス構成データ(各インスタンスは異なる方法で構成可能である)を備えるプロトコルスタックが記憶されている。
使用中、図31に示されているように、モバイル通信デバイスは無線インターネットアクセスユニット40と無線通信を確立することができ、それによってこれはインターネット42と、ひいては適切な手段、第2の強化状態(connect_pending状態14)を備える第1のアップグレードユニット46、及び複数の状態へのモジュール強化を備える第2のアップグレードユニット48によってポスティングされているサーバ44との接続を確立することができる。
図32に示されているように、示されている通信デバイス29は、適切な手段によって、第2の状態の強化機能性を含むモジュール46のコピーを受信している。作業メモリ36におけるこのモジュール46の記憶によって、レイヤ2の動作が強化される。これが達成される手段について次に図33を参照して説明する。図33に示されているように、connect_pending#2状態モジュールは、オリジナル関数ポインタFUNC#2に対応するリダイレクト関数50と、オリジナルのconnect_pending状態14の関数ポインタFUNC#3に対応する更新関数ポインタ52とを備える。これの更新の性質について、この関数ポインタ52はFUNC#3_1と名づけられる。
図28に示されているレイヤ10の使用において、レイヤ10が、状態14がアクティブになる状態にある場合に、取扱関数ポインタFUNC#2又はFUNC#3に対応するプロトコルメッセージが想定可能である。図28に示されている場合において、関数FUNC#2を実行させるプロトコルメッセージの受信は状態の遷移をもたらさない。反対に、関数FUNC#3の呼び出しはconnect_pending14から接続状態16への遷移をもたらす。connect_pending#2状態の拡張子を定義する更新モジュール46によって、レイヤ10がconnect_pending状態14内にある場合に、拡張子46はオリジナル状態メッセージ取扱関数に取って代わり、プロトコルメッセージを受信するように動作可能である。使用中に、取扱関数FUNC#2に対応するプロトコルメッセージはリダイレクト関数ポインタ50によって捕捉され、これはconnect_pending状態14のオリジナル関数ポインタFUNC#2に対応する。
他方で、メッセージ取扱関数FUNC#3に対応するプロトコルメッセージが受信されると、更新関数ユニットFUNC#3_1(図33の参照番号52)はメッセージを捕捉し、モジュール46内の新たなメッセージ処理コードを実行させる。このように、元々提供されている状態で定義されている機能性が強化されることが可能である。そして、関数ポインタFUN-C#3_1を介する更新コードの実行は、connect_pending状態14から接続状態16への状態の遷移をもたらす。
状態の遷移は、上記の共通の共有構成データによって達成される。構成データは(任意のプロトコルレイヤ特徴の構成を定義するパラメータに加えて)、プロトコルレイヤ状態マシンインスタンスの状態ごとのメッセージ取扱関数に対応するエントリを有する関数ポインタテーブルを保持している。新たなレイヤインスタンスが作成される場合、構成データはバインドメッセージのレイヤインスタンスに送られるべきである。従って、モジュール(例えばモジュール46)に送られた構成データが既存のレイヤ2のインスタンスの構成データに基づいている場合、(バインドハンドラ関数の)モジュールは(必要ならば)エントリを、新たなモジュールが取り扱うメッセージに対応する関数取扱ポインタ情報に重畳及び付加することができる。この場合、FUNC#1_1及びFUNC#3_1は既存のFUNC#1及びFUNC#3にそれぞれ重畳する。しかし、エントリは削除不可能である。以下の表はこのような関数ポインタテーブルの例を示している。
Figure 0004271234
構成データはまた、テーブルにおいて実行する信号取扱関数を決定するのに使用されるCurrentStateポインタを保持している。信号取扱関数自体を実現するコードは、それぞれ、上記のオペレーティングシステム及び仮想オペレーティングシステムの使用のおかげでプログラミング言語及びオペレーティングシステムとは無関係である。
オペレーティングシステム(又は仮想オペレーティングシステム)のテーブルコンセプトを使用する再構成可能な状態マシンの実現を達成するためには2つの主要な方法がある。1つはスレッド/レイヤインスタンスアプローチであり、全着信メッセージに対処する論理レイヤインスタンスごとの実行スレッドがあるとする。そしてスレッドは、(例えばVOS関数コールget_message_typeを介して得られるような)メッセージタイプに対応する、対応するメッセージ取扱関数を呼び出す。そしてレイヤインスタンスに対応するテーブルを使用して、(CurrentState属性から得られるような)現在の状態についての対応する関数を実行可能である。状態変更は、次の状態名(つまり、属性を変更後に現在の状態になる状態)に対応する構成データテーブルから得られたポインタレファレンスにCurrentState属性を変更するための適切な関数を呼び出すことによって簡単に達成される。
第2のアプローチは、メッセージ取扱関数ごとに論理スレッドを有することである。これは必ずしも真のオペレーティングシステムスレッドに対応するわけではないが、(VOS実現が用いられていれば)VOSスレッドである可能性がある。状態遷移が開始されるたびに、VOS関数chnage_state(new_state_name)を呼び出すことによって、change_state関数は、論理レイヤインスタンスに対応する構成データテーブルにおけるメッセージ取扱関数についての新たなVOSスレッドを開始する。メッセージ取扱関数が実行する第1の動作は、特定のメッセージタイプについてのVOS receive_message関数である。このように、VOSは必要なメッセージのみをメッセージ取扱関数に転送する。このアプローチはまた、もはや現在の状態に対応していないメッセージ取扱スレッドが終了又は停止されることを必要とする。
図34は、作業メモリ36において、プロトコルスタックのレイヤ2と関連した動作についてモジュール強化ユニット48を検索する通信ユニット20を示している。モジュール強化ユニット48を内蔵するプロトコルスタックの動作について、図35を参照して次に説明する。
図35は、更新切断状態disconnected#2 54と、更新connect_pending状態connect_pending#2 56と、2つのモード(又はネットワーク)を同時に使用するハイブリッドネットワークシステムについて第2の接続を確立するのに使用される新たなsubs_connect_pending状態58と、subs_connected_pending状態58によって提供されている追加のシステム機能性の導入に関して既存の接続状態16の機能性を高めるのに使用されるconnected#2状態モジュール59と、を備えるものとしてモジュール強化ユニット48を示している。
disconnected#2状態は、強化connect_REQ関数にポインティングする関数ポインタFUNC#1_1を含んでおり、connect_pending#2状態拡張子56は、元々実現されているconnect_pending状態のオリジナル関数ポインタFUNC#2に対応するリダイレクト関数ポインタ62と、元々実現されているconnect_pending状態40におけるオリジナル関数ポインタFUNC#3の代わりにメッセージを捕捉する強化関数FUNC#3_1(図35の参照番号64)へのポインタとを含んでいる。
さらに、subs_connect_pending条件を記述する新たな状態モジュール58は、使用中に、connected#2状態強化において定義されているような第1の接続と関連して使用される第2のネットワークへの次の接続の起動が、新たな関数FUNC#7に含まれているロード共有機能性を実現できる関数FUNC#6へのポインタ66を含む。
新たなconnected#2状態モジュール59は、既存の関数FUNC#4及びFUNC#5へのメッセージ対処ポインタ67、68と、新たなロード共有関数FUNC#7へのメッセージ取扱ポインタ69とを含む。
新たに導入された関数ポインタ60、64、66及び69は、レイヤ内の別の状態への修正された遷移を備える。関数FUNC#1_1は、connect_pending#2を定義する際に、更新状態54のdisconnected#2からアップグレードされた状態56への遷移に対する状態を提供する。新たな関数ポインタFUNC#3_1は、connect_pending状態14におけるFUNC#3によって既に占められている状態遷移を接続状態16に継承する。さらに、新たな状態subs_connect_pending58は関数ポインタFUNC#6を有しており、これは接続状態16にも状態遷移を提供し、またFUNC#7はdata_transferメッセージを取り扱い、2つのネットワーク接続間の動的ロード共有を可能にする機能性を内蔵している。これらの状態遷移は図36に示されている。
モジュール48に提供されている強化機能性は、汎用関数ポインタテーブル(マッピングオブジェクト)をサポートするというVOSコンセプトを使用することによって、オリジナルの機能性とは異なる実行環境(例えば、異なるJVM又はオペレーティングシステム環境)において実行可能である。また同様に、強化モジュールで使用されているプログラミング言語はオリジナルコードと異なっていてもよい。
当業者は、上記の装置及び方法は、例えばディスク、CD又はDVD−ROM、ROM(ファームウェア)などのプログラムメモリなどのキャリア媒体上、あるいは光学又は電気信号キャリアなどのデータキャリア上でプロセッサコントロールコードとして具現化されてもよいことはいうまでもない。多数のアプリケーションについて、本発明の実施形態はDSP(ディジタル信号プロセッサ)、ASIC(アプリケーション特定用途向け集積回路)又はFPGA(フィールドプログラマブルゲートアレイ)上で実現される。従って、コードは従来のプログラムコードやマイクロコード、あるいは例えばASICやFPGAをセットアップ又はコントロールするためのコードを備えていてもよい。コードはまたリプログラマブル論理ゲートアレイなどの再設定可能装置を動的に構成するためのコードを備えていてもよい。同様に、コードはVerilog(商標)やVHDL(超高速集積回路ハードウェア記述言語)などのハードウェア記述言語のコードを備えていてもよい。当業者は理解するように、コードは相互に通信している複数の結合されたコンポーネント間に分配されてもよい。適切ならば、実施形態はまた、アナログハードウェアを構成するためにフィールド(リ)プログラマブルアナログアレイや類似のデバイス上で稼動するコードを使用して実現可能である。
当業者はまた、種々の実施形態及び、これらに関して説明されている具体的な特徴は、上記の教示に一般的に従って、他の実施形態又はこれの具体的に説明されている特徴と自由に組み合わせ可能である点を理解するであろう。当業者はまた、種々の変更及び修正が、添付の請求項の範囲を逸脱することなく、説明されている具体例に対して成されてもよいことを理解するであろう。
上記の例示的な背景例の通信プロトコルスタックを示す図である。 上記の図1の通信スタックの概念レイヤを示す図である。 上記の動的に再構成可能な通信プロトコルスタックを実現するための既知のアーキテクチャを示す図である。 上記の例示的な背景例に従って動的に再構成可能なプロトコルスタックのアーキテクチャを示す図である。 上記のバインドメッセージを示す図である。 上記の関数ポインタテーブルを示す図である。 上記のプロトコルメッセージを示す図である。 上記のレイヤソフトウェア及びオペレーティングシステム固有のマッピングオブジェクトの複数の例を示す図である。 上記のレイヤソフトウェア及びオペレーティングシステム固有のマッピングオブジェクトの複数の例を示す図である。 上記のレイヤソフトウェア及びオペレーティングシステム固有のマッピングオブジェクトの複数の例を示す図である。 上記のレイヤソフトウェア及びオペレーティングシステム固有のマッピングオブジェクトの複数の例を示す図である。 上記の例示的な例に従ったレイヤの複数のインスタンス作成を示す図である。 上記の例示的な例に従った、プロトコルスタックにおけるソフトウェアレイヤのインスタンス作成及びバインドを示す図である。 上記の例示的な例を示すブロックコードを示す図である。 上記の例示的な例に従った仮想オペレーティングシステムを示す図である。 上記のCコードについて、既知の動的リンク付け方法を示す図である。 上記のCコードについて、オペレーティングシステム関数テーブルパス方法を示す図である。 上記のJavaコードについて、既知の動的リンク付け方法を示す図である。 上記のJavaコードについて、オペレーティングシステム関数テーブルパス方法を示す図である。 上記のメッセージプロトコルスタックアーキテクチャごとの既知のスレッドを示す図である。 上記の図10の例の概略メモリアーキテクチャを示す図である。 上記の例示的な例に従ったレイヤアーキテクチャごとのスレッドを示す図である。 上記の図20の例の概略メモリアーキテクチャを示す図である。 上記の例における使用について高レベルのソースコードをモジュールにコンパイルするための方法を示す図である。 上記の例における使用について高レベルのソースコードをモジュールにコンパイルするための方法を示す図である。 Bluetooth(商標)コンプレックスプロトコルスタックの例示的実現を示す図である。 上記の例示的な例のアップグレードされたBluetooth(商標)プロトコルスタックを示す図である。 状態ベースの機能性の上記説明のコンテクストにおいて、上記のプロトコルスタックのレイヤを示す図である。 図28に示されているレイヤの関数ルックアップテーブルを示す図である。 図28に示されているレイヤを含むレイヤベースのプロトコルスタックによって構成された通信デバイスの概略図である。 プロトコルスタックの更新はダウンロードに使用可能である、図30の通信デバイスを含むシステムの概略図である。 プロトコルスタックのレイヤの第1のアップグレードを内蔵している、図30に示されている通信デバイスの別の図である。 図32に示されている通信デバイスを構成するプロトコルスタックのレイヤの第1のアップグレードされた状態モジュールを示す図である。 通信デバイスを構成するプロトコルスタックのレイヤの第2のアップグレードを含む、図30に示されている通信デバイスを示す図である。 図34に示されている通信デバイスに内蔵されている第2のアップグレードモジュール強化を示す図である。 図35に示されているモジュール強化を含む、図28に示されているレイヤの強化状態遷移図である。

Claims (20)

  1. プロセッサ及びメモリを有する処理装置に設けられる、信号を処理するための通信プロトコルを修正するための方法であって、前記プロトコルは複数のプロトコルレイヤによって定義され、少なくとも1つのレイヤは各状態が他の状態のうちの1つへの前記レイヤのメッセージ依存性遷移を含む所定の機能性を有し、該レイヤと関連していた複数の所定の状態のうちの1つを使用時に占有できる、前記方法において、
    ソフトウェア更新モジュールをメモリにロードすることを含み、前記モジュールは前記レイヤのうちの1つの前記状態のうちの1つに対応する1つ以上のメッセージを受信し、処理するように配置され、前記モジュールは前記レイヤを別の状態に遷移させるように動作可能な少なくとも1つのメッセージ依存性遷移ユニットを備える、方法。
  2. 前記モジュールは前記対応する状態を実現する前記所定の機能性を意図しているメッセージを傍受し、前記メッセージ依存性遷移ユニットに関係しない前記所定の機能性メッセージに移行するように動作できる、請求項1に記載の方法。
  3. 前記更新モジュールはメッセージを受信し、処理し、且つ前記レイヤを他の状態に遷移させるように動作可能であり、前記メッセージは前記モジュールをロードする前に前記レイヤに遷移を生じさせるようには動作不可能である、請求項1または2に記載の方法。
  4. 前記信号に対応するプロトコルメッセージと他のモジュールとを交換する前記更新モジュールを構成することであって、前記他のモジュールは、前記他のレイヤに対応する1セットの汎用関数に従って前記信号を処理するように構成されていることを含む、請求項1乃至請求項3のいずれか1項に記載の方法。
  5. 前記他のソフトウェアモジュールを前記メモリにロードすることであって、前記他のモジュールは関数マッピングオブジェクトにおける前記汎用関数に対応する汎用関数ポインタを備えること、
    他のモジュールごとに前記関数マッピングオブジェクトを前記メモリにロードすることであって、前記オブジェクトは、前記汎用関数を1つ以上の装置特定関数にマッピングするために、前記汎用関数に対応する装置特定関数ポインタを備えること、
    受信信号を前記プロトコルレイヤに従って処理するために前記マッピングされた装置特定関数に従って前記他のモジュールを実行することをさらに含む、請求項1乃至請求項4のいずれか1項に記載の方法。
  6. 第2のソフトウェアモジュールを前記メモリにロードすることであって、前記第2のモジュールは前記第2のレイヤに対応する1セットの汎用関数に従って前記信号を受信し、処理するように構成されており、前記第2のモジュールは第2の関数マッピングオブジェクトにおける前記汎用関数に対応する汎用関数ポインタを備えること、
    前記第2の関数マッピングオブジェクトを前記メモリにロードすることであって、前記オブジェクトは、前記汎用関数を1つ以上の第2の装置特定関数にマッピングするために前記汎用関数に対応する第2の装置特定関数ポインタを備えること、
    前記プロトコルレイヤに従って受信信号を処理するために前記マッピングされた第2の装置特定関数に従って前記第2のモジュールを実行して、前記第1及び第2のモジュールは異なる実行または装置固有の環境において実行されることをさらに含む、請求項1乃至請求項5のいずれか1項に記載の方法。
  7. 前記更新モジュールは言語独立型である、請求項1乃至請求項6のいずれか1項に記載の方法。
  8. 前記レイヤに対応する前記1セットの汎用関数に従って前記信号を処理するための高レベルソフトウェア言語コードを提供すること、
    前記言語独立型ソフトウェアモジュールに前記コードをコンパイルすることを含む、請求項1乃至請求項7のいずれか1項に記載の方法。
  9. 請求項1乃至請求項8のいずれか1項に記載の方法を実行するための処理装置をコントロールするためのプログラム。
  10. 構成可能な装置にロードされている場合に、前記構成可能な装置に請求項1乃至請求項9のいずれか1項に記載の方法を実行させるためのプログラムを実行可能なデータを有する記憶媒体。
  11. 構成可能な装置にロードされている場合に、前記構成可能な装置に請求項1乃至請求項10のいずれか1項に記載の方法を実行させるためのプログラムを実行可能なデータを有する信号。
  12. プロセッサ及びメモリを有する処理装置に設けられる、信号を処理するための通信プロトコルを修正するための装置であって、前記プロトコルは複数のプロトコルレイヤによって定義され、少なくとも1つのレイヤは各状態が他の状態のうちの1つへの前記レイヤのメッセージ依存性遷移を含む所定の機能性を有し、該レイヤと関連していた複数の所定の状態のうちの1つを使用時に占有できる、前記装置において、
    ソフトウェア更新モジュールをメモリにロードすることを含み、前記モジュールは前記レイヤのうちの1つの前記状態のうちの1つに対応する1つ以上のメッセージを受信し、処理するように配置され、前記モジュールは前記レイヤを別の状態に遷移させるように動作可能な少なくとも1つのメッセージ依存性遷移ユニットを備える、装置。
  13. 前記更新モジュールは、更新された機能性を与える前記状態の前記所定の機能性から言語独立方法で機能するように動作可能である、請求項12に記載の装置。
  14. 前記更新モジュールは、このモジュールにロードされているレイヤが少なくとも1つの追加状態を占有できるようにする装置を構成するように動作可能であり、またさらに、前記少なくとも1つの追加状態への、及びからのメッセージ依存性遷移を含む前記少なくとも1つの追加状態と所定の機能性を関連付ける前記装置を構成するように動作可能である、請求項12又は請求項13に記載の装置。
  15. 請求項12に記載の装置として構成された構造化可能装置。
  16. プロセッサ及びメモリを有する処理装置に設けられる、信号を処理するための通信プロトコルを修正するための更新モジュールであって、前記プロトコルは複数のプロトコルレイヤによって定義され、少なくとも1つのレイヤは各状態が他の状態のうちの1つへの前記レイヤのメッセージ依存性遷移を含む所定の機能性を有し、該レイヤと関連していた複数の所定の状態のうちの1つを使用時に占有できる、前記更新モジュールにおいて、
    前記更新モジュールは前記レイヤのうちの1つの前記状態のうちの1つに対応する1つ以上のメッセージを受信し、処理するように前記装置におけるメモリにロード可能であり、前記更新モジュールは前記レイヤを別の状態に遷移させるように動作可能な少なくとも1つのメッセージ依存性遷移ユニットを備える、更新モジュール。
  17. 前記更新モジュールは、更新された機能性を与える前記状態の前記所定の機能性から言語独立機能するように動作可能である、請求項16に記載の更新モジュール。
  18. 前記更新モジュールは、このモジュールにロードされているレイヤが少なくとも1つの追加状態を占有できるようにする装置を構成するように動作可能であり、またさらに、前記少なくとも1つの追加状態への、及びからのメッセージ依存性遷移を含む前記少なくとも1つの追加状態と所定の機能性を関連付ける前記装置を構成するように動作可能である、請求項16又は請求項17に記載のモジュール。
  19. 請求項16乃至請求項18のいずれか1項に記載の更新モジュールが、プロセッサ手段及びメモリを含む処理装置のメモリにロードされるようにするプロセッサ読み取り可能な命令を記憶する記憶媒体。
  20. 請求項16乃至請求項18のいずれか1項に記載の更新モジュールが、プロセッサ手段及びメモリを含む処理装置のメモリにロードされるようにするプロセッサ読み取り可能な命令を有する信号。
JP2006526479A 2004-02-27 2005-02-25 修正関数を有するプロトコルスタック Expired - Fee Related JP4271234B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB0404407A GB2411494B (en) 2004-02-27 2004-02-27 Protocol stack with modification facility
PCT/JP2005/003668 WO2005083984A1 (en) 2004-02-27 2005-02-25 Protocol stack with modification facility

Publications (2)

Publication Number Publication Date
JP2007523505A JP2007523505A (ja) 2007-08-16
JP4271234B2 true JP4271234B2 (ja) 2009-06-03

Family

ID=32051006

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006526479A Expired - Fee Related JP4271234B2 (ja) 2004-02-27 2005-02-25 修正関数を有するプロトコルスタック

Country Status (7)

Country Link
US (1) US20050193137A1 (ja)
EP (1) EP1571805B1 (ja)
JP (1) JP4271234B2 (ja)
CN (1) CN1765105A (ja)
DE (1) DE602005010768D1 (ja)
GB (1) GB2411494B (ja)
WO (1) WO2005083984A1 (ja)

Families Citing this family (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7477913B2 (en) * 2005-04-04 2009-01-13 Research In Motion Limited Determining a target transmit power of a wireless transmission according to security requirements
TW200727174A (en) * 2006-01-03 2007-07-16 Tatung Co Ltd Method of testing a hardware circuit block written in a hardware description language
EP1977571A2 (en) * 2006-01-12 2008-10-08 Broadcom Israel R&D Method and system for protocol offload and direct i/o with i/o sharing in a virtualized network environment
US8521912B2 (en) * 2006-01-12 2013-08-27 Broadcom Corporation Method and system for direct device access
US7650406B2 (en) * 2006-04-26 2010-01-19 Microsoft Corporation Termination of a security association between devices
US8806601B2 (en) * 2008-02-29 2014-08-12 International Business Machines Corporation Non-interactive entity application proxy method and system
US8930550B2 (en) * 2008-03-11 2015-01-06 International Business Machines Corporation Selectable non-interactive entity application proxy method and system
BRPI0916392A2 (pt) * 2008-07-30 2018-02-06 Telcordia Tech Inc sistema e método para a unificação de múltiplos ambientes de serviços para a otimização do fornecimento de serviços de telecomunicações
CN101441566B (zh) * 2008-11-18 2012-04-25 腾讯科技(深圳)有限公司 一种在嵌入式平台上动态链接程序的方法
US10110631B2 (en) 2009-02-12 2018-10-23 International Business Machines Corporation Introducing encryption, authentication, and authorization into a publication and subscription engine
GB0919253D0 (en) 2009-11-03 2009-12-16 Cullimore Ian Atto 1
US8875276B2 (en) * 2011-09-02 2014-10-28 Iota Computing, Inc. Ultra-low power single-chip firewall security device, system and method
US9223618B2 (en) * 2011-09-20 2015-12-29 Intel Corporation Multi-threaded queuing system for pattern matching
US8990619B1 (en) * 2012-02-21 2015-03-24 Cisco Technology, Inc. Method and systems to perform a rolling stack upgrade
US9471514B1 (en) * 2012-08-23 2016-10-18 Palo Alto Networks, Inc. Mitigation of cyber attacks by pointer obfuscation
US9730268B2 (en) 2013-06-07 2017-08-08 Apple Inc. Communication between host and accessory devices using accessory protocols via wireless transport
CN104519074B (zh) * 2013-09-26 2018-05-29 安凯(广州)微电子技术有限公司 一种节省内存的方法及装置
US9118809B2 (en) 2013-10-11 2015-08-25 Edifire LLC Methods and systems for multi-factor authentication in secure media-based conferencing
US9131112B1 (en) 2014-09-29 2015-09-08 Edifire LLC Dynamic signaling and resource allocation in secure media-based conferencing
US9282130B1 (en) * 2014-09-29 2016-03-08 Edifire LLC Dynamic media negotiation in secure media-based conferencing
US9137187B1 (en) 2014-09-29 2015-09-15 Edifire LLC Dynamic conference session state management in secure media-based conferencing
US9167098B1 (en) 2014-09-29 2015-10-20 Edifire LLC Dynamic conference session re-routing in secure media-based conferencing
US9626171B2 (en) 2015-07-24 2017-04-18 Oracle International Corporation Composing a module system and a non-module system
US10078497B2 (en) 2015-07-24 2018-09-18 Oracle International Corporation Bridging a module system and a non-module system
US10104090B2 (en) * 2015-08-25 2018-10-16 Oracle International Corporation Restrictive access control for modular reflection
US10394528B2 (en) 2016-03-30 2019-08-27 Oracle International Corporation Returning a runtime type loaded from an archive in a module system
US10191753B2 (en) 2016-03-30 2019-01-29 Oracle International Corporation Generating verification metadata and verifying a runtime type based on verification metadata
CN106293808B (zh) * 2016-07-26 2019-10-29 北京北森云计算股份有限公司 多语言云编译实现系统功能动态拦截扩展的方法及系统
US10360008B2 (en) 2016-09-16 2019-07-23 Oracle International Corporation Metadata application constraints within a module system based on modular encapsulation
US10387142B2 (en) 2016-09-16 2019-08-20 Oracle International Corporation Using annotation processors defined by modules with annotation processors defined by non-module code
US10848410B2 (en) 2017-03-29 2020-11-24 Oracle International Corporation Ranking service implementations for a service interface
FR3070775B1 (fr) * 2017-09-04 2019-08-23 Vsora Allocation dynamique utilisant plusieurs piles
US10853094B2 (en) * 2018-10-23 2020-12-01 EMC IP Holding Company, LLC Dynamically downloadable distributed data deduplication library

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5903754A (en) * 1994-06-21 1999-05-11 Microsoft Corporation Dynamic layered protocol stack
US5812819A (en) * 1995-06-05 1998-09-22 Shiva Corporation Remote access apparatus and method which allow dynamic internet protocol (IP) address management
US5938733A (en) * 1996-03-08 1999-08-17 International Business Machines Corporation Object oriented representation of network requests in a client server model
EP0852448A1 (en) * 1997-01-02 1998-07-08 Nokia Mobile Phones Ltd. User terminal for mobile communications
US6353614B1 (en) * 1998-03-05 2002-03-05 3Com Corporation Method and protocol for distributed network address translation
JP3161599B2 (ja) * 1998-07-10 2001-04-25 日本電気株式会社 移動電話システム
WO2000019681A2 (en) * 1998-09-30 2000-04-06 Xbind, Inc. System for building and dynamically reconfiguring protocol stacks
GB2355139B (en) * 1999-10-05 2003-05-21 Ericsson Telefon Ab L M Signalling over the Gs interface in a mobile telecommunications network
US20020012329A1 (en) * 2000-06-02 2002-01-31 Timothy Atkinson Communications apparatus interface and method for discovery of remote devices
AU2001275333A1 (en) * 2000-08-11 2002-02-25 Zucotto Wireless, Inc. Communications apparatus interface and method for discovery of remote devices
WO2002084484A2 (en) * 2001-04-18 2002-10-24 Domosys Corporation Method of remotely upgrading firmware in field-deployed devices
US7287079B2 (en) * 2001-06-29 2007-10-23 Qualcomm Incorporated Implementing and coordinating configuration of protocol processes
AU2003234667A1 (en) * 2002-06-06 2003-12-22 Thomson Licensing S.A. Wlan as a logical support node (sgsn) for interworking between the wlan and a mobile communications system
DE10255474A1 (de) * 2002-11-28 2004-06-09 Philips Intellectual Property & Standards Gmbh Aufbau eines mobilen Endgeräts für unterschiedliche Kommunikationssysteme

Also Published As

Publication number Publication date
DE602005010768D1 (de) 2008-12-18
GB2411494B (en) 2006-04-12
JP2007523505A (ja) 2007-08-16
WO2005083984A1 (en) 2005-09-09
GB0404407D0 (en) 2004-03-31
GB2411494A (en) 2005-08-31
CN1765105A (zh) 2006-04-26
EP1571805B1 (en) 2008-11-05
US20050193137A1 (en) 2005-09-01
EP1571805A1 (en) 2005-09-07

Similar Documents

Publication Publication Date Title
JP4271234B2 (ja) 修正関数を有するプロトコルスタック
US20050120122A1 (en) Flexible protocol stack
US11146665B2 (en) Methods and apparatus for sharing and arbitration of host stack information with user space communication stacks
US20220053027A1 (en) Dividing a data processing device into separate security domains
Decasper et al. A scalable high-performance active network node
RU2536347C2 (ru) Способы и системы реализации физического устройства для дифференциации множества виртуальных машин системы хост-компьютера
US7840700B2 (en) Dynamically adding application logic and protocol adapters to a programmable network element
US7187660B2 (en) System and method for continuously provisioning a mobile device
EP1680900B1 (en) Configurable protocol engine
RU2496278C2 (ru) Способ связи между платформами
JP2005518015A (ja) 移動体端末用プラットフォーム・システムのミドルウエア・サービス・レイヤ
US20060187849A1 (en) Interpreter engine
CN116917853A (zh) 网络接口设备
US8447880B2 (en) Network stack instance architecture with selection of transport layers
Hata A study of requirements for SDN switch platform
Tennenhouse et al. Toward an active network architecture
US12096351B2 (en) Method for managing an attachment of a communication device to an operator network
Braden et al. The ASP EE: An active network execution environment
CN116965004A (zh) 网络接口设备
Chan et al. Gaia microserver: An extendable mobile middleware platform
US8327389B2 (en) Interface module
Fernando et al. A new dynamic architecture for an active network
Chiu et al. The Proteus multiprotocol message library
Ricciulli Anetd: Active networks daemon (v1. 0)
Kawashima et al. FreeNA: A multi-platform framework for inserting upper-layer network services

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20090217

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20090224

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120306

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120306

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees