以下に添付図面を参照して、通信装置、通信方法及びプログラムの実施形態を詳細に説明する。
産業用システムや車載システムにおいては、仮想計算機技術の適用が進んでいる。1台の物理計算機上に複数の仮想マシンを集約することでコスト低減などの効果が見込まれる。このような背景から仮想マシン間の通信処理を担うソフトウェアスイッチもリアルタイムイーサネットに対応することが求められるが、ソフトウェア処理によって実現する場合、決定論的な(Deterministic)動作を実現することが難しい。別の言い方をすると、リアルタイムシステムでは最悪実行時間(WCET、Worst Case Execution Time)を保証する必要がある。条件分岐による異なる処理が実行される場合は、最も処理時間が長い部分が全体性能を決定する。
ソフトウェアスイッチを用いて仮想マシン間でフレーム転送を実現する場合、多くの場合はユニキャストフレームの転送処理となるが、一部のフレームはマルチキャスト(ブロードキャスト)処理となる。マルチキャストの場合は最大で(スイッチに接続されるノード数−1)回、宛先仮想マシン(ネットワークインタフェース)のバッファへのフレームコピーが発生する。データコピーは、処理時間が大きく、全体性能に大きく影響を与えるため、可能な限り削除したい。
<仮想マシンとソフトウェアスイッチの説明>
次に、産業用システム及び車載システムなどに仮想化技術などのソフトウェア技術を適用する場合の例について説明する。例えば、仮想マシン間を接続するスイッチ(仮想スイッチ)をソフトウェアで実現することが考えられる。
図1は、複数の仮想マシン1a〜1cが動作する通信装置100の例を示す概略図である。図1の例では、ホストプロセッサ10上で動作する仮想マシン1aによりスイッチ機能を実現する場合を示す。通信装置100は、ホストプロセッサ10、NIC(Network Interface Card)20a及び20bを備える。以下、NIC20a及び20bを区別しない場合は、単にNIC20という。
ホストプロセッサ10は、通信装置100を制御する装置である。NIC20は、通信装置100の物理インタフェースである。仮想マシンモニタ2は、仮想マシン1a〜1cを制御する。仮想マシンモニタ2はホストプロセッサ10によって実現される。仮想マシン1a〜1cは、仮想マシンモニタ2上で動作する。
仮想マシン1aは、ソフトウェアスイッチ3を備える。ソフトウェアスイッチ3は、ネットワークドライバ4a〜4b、フォワーディング処理部5、FDB(forwarding/filtering database)6及びバックエンド仮想ネットワークドライバ7b〜7cを備える。
ネットワークドライバ4a〜4bは、NIC20とフォワーディング処理部5との間の通信を制御する。ネットワークドライバ4a〜4bは、NIC20が受信したフレーム(データ)を読み出し、フォワーディング処理部5へ入力する。また、ネットワークドライバ4a〜4bは、フォワーディング処理部5から受け取ったフレームをNIC20へ書き込む。
フォワーディング処理部5は、FDB6を参照して、フレームの転送先を制御する。
バックエンド仮想ネットワークドライバ7b〜7cは、ソフトウェアスイッチ3が動作する仮想マシン1aと、その他の仮想マシン1b〜1c(ゲストOS)との間の通信を制御する。
仮想マシン1bは、フロントエンド仮想ネットワークドライバ8b及びアプリケーション/ネットワークスタック(アプリ/スタック)9bを備える。フロントエンド仮想ネットワークドライバ8bは、アプリ/スタック9bとソフトウェアスイッチ3の間の通信を制御する。
仮想マシン1cは、フロントエンド仮想ネットワークドライバ8c及びアプリケーション/ネットワークスタック(アプリ/スタック)9cを備える。フロントエンド仮想ネットワークドライバ8cは、アプリ/スタック9cとソフトウェアスイッチ3の間の通信を制御する。
<仮想マシン間のデータ受け渡しに関する説明>
図2は仮想マシン1l及び1m間のデータ受け渡しについて説明するための図である。
仮想マシン1lは、アプリケーション41l及びカーネル42lを備える。アプリケーション41lでは、仮想メモリ(Virtual memory)43lによってデータの記憶制御が行われる。カーネル42lでは、疑似物理メモリ(Pseudo−physical memory)44lによってデータの記憶制御が行われる。同様に、アプリケーション41mでは、仮想メモリ43mによってデータの記憶制御が行われる。カーネル42mでは、疑似物理メモリ44mによってデータの記憶制御が行われる。
以下、仮想マシン1l及び1mを区別しない場合は、単に仮想マシン1という。同様に、仮想メモリ43l及び43mを区別しない場合は、単に仮想メモリ43という。同様に、疑似物理メモリ44l及び44mを区別しない場合は、単に疑似物理メモリ44という。
セキュリティなどの観点から各仮想マシン1は自身以外の仮想マシン1が管理するリソースには直接アクセスできないように、ゲストOS(仮想マシン1)へ提供される機能は制限されている。例えば、物理メモリ45へのアクセスやNICやストレージデバイスなどのハードウェア制御、特権命令の発行といった処理は、仮想マシンモニタ2が担う。仮想マシン1はhypercallやVMExitといった命令を発行することで、仮想マシンモニタ2が、hypercallやVMExitに応じた処理を実行する(以降は、hypercallを用いて説明する)。
仮想マシン1間のデータ受け渡しは、上記のhypercallを発行することで実現する。図2の例では、複数の仮想マシン1l及び1mで同一物理メモリ領域46を共有することによるデータ受け渡しの例を示す。各仮想マシン1は、仮想メモリ43と疑似物理メモリ44へ直接アクセスでき、仮想メモリ43と疑似物理メモリ44のマップ情報(対応関係)を管理する。仮想マシンモニタ2は、物理メモリ(Machine memory)45と疑似物理メモリ44のマップ情報を管理する。
メモリマップ情報は、ページ単位(4KBや64KBといったサイズ)で管理される。MMU(Memory Management Unit)によって、仮想メモリアドレスや疑似物理アドレスと、物理アドレスとの変換を行い、仮想メモリアドレスや疑似物理アドレスから、物理メモリへアクセスできる。通常は、物理メモリ45の1つの領域(ページ)は、仮想メモリ43及び疑似物理メモリ44と1対1でマッピングされる。
仮想マシン1間でデータ受け渡しをする方法の1つとして、物理メモリ領域46のように、複数の仮想マシン1から同一の物理メモリ45へアクセス可能にする方法がある。仮想マシン1lの疑似物理メモリ領域47l(仮想メモリ領域48l)と、仮想マシン1mの疑似物理メモリ領域47m(仮想メモリ領域48m)とを同一物理メモリ領域46へ対応付ける動作の一例を示す(動作はこれに限定されるものではない)。
仮想マシン1lは、メモリマップを指示するhypercall(setup)を発行して、疑似物理メモリ領域47lを仮想マシン1mからマップ可能にするよう仮想マシンモニタ2へ通知する。通知する情報としては、疑似物理メモリ領域47lのアドレスや、マップを許可する仮想マシン1の情報(図2の場合、仮想マシン1m)、アクセス制限(Read OnlyやRead/Writeなど)などである。
仮想マシンモニタ2は、hypercallを受け、疑似物理メモリ領域47lにマップされた物理メモリ領域46を仮想マシン1mからもマップ可能にし、該当するメモリマップ情報の識別子を仮想マシン1lへ返す。仮想マシン1lは、仮想マシンモニタ2が提供する制御用インタフェース等を用いて受け取った識別子を仮想マシン1mに通知する。
仮想マシン1mは、hypercall(map)を発行して、疑似物理メモリ領域47lと疑似物理メモリ領域47mをマップするように仮想マシンモニタ2へ指示する。通知される情報としては、疑似メモリ領域47mのアドレスや、仮想マシン1lから通知された識別子、マップ先の仮想マシン情報などである。仮想マシンモニタ2は、通知された識別子から物理メモリアドレス領域46を特定し、疑似物理メモリ領域47mをマップする。
仮想マシン1lから仮想マシン1mへデータを受け渡すには、仮想マシン1lがデータを書き込んだページ(仮想メモリ領域48lまたは疑似物理メモリ領域47l)を仮想マシン1mのページとマップすることで、仮想マシン1mからデータを参照可能とする。データの受け渡しが完了した(仮想マシン1mがデータを読み出した)後は、疑似物理メモリ領域47mと物理メモリ領域46のマップを解除するように仮想マシン1mがhypercall(unmap)を発行する。
以上が、同一物理メモリ領域46のマップによるデータ受け渡し処理である。
同一物理メモリ領域46へのマップ(map)以外にも、コピー(copy)や転送(Transfer)などの方法で、データを受け渡す方法もある。コピーは、仮想マシンモニタ2が指定された2つの仮想メモリ領域(疑似物理メモリ領域)が参照する物理メモリ領域間でデータをコピーする。転送は、仮想マシンモニタ2が指定された2つの仮想メモリ領域(疑似物理メモリ領域)が参照する2つの物理メモリ領域のマッピングを入れ替える。どちらも物理メモリ45を制御するため、仮想マシン1は仮想マシンモニタ2にhypercallを発行する必要がある。
<マルチキャストとブロードキャストについての説明>
次に、ユニキャスト処理、マルチキャスト処理、及び、ブロードキャスト処理について説明する。
上記のフォワーディング処理部5は、FDB6を参照して、フレームの宛先MACアドレス及びVLAN IDの組み合わせと一致するエントリが存在し、かつ、宛先インタフェースが1つの場合はユニキャスト処理を実施する。ユニキャスト処理の場合は、フォワーディング処理部5は、FDB6のエントリに記載された1つのインタフェースへフレームを転送する。
FDB6にフレームの宛先MACアドレス及びVLAN IDの組み合わせと一致するエントリが存在し、かつ、宛先インタフェースが複数存在する場合、フォワーディング処理部5は、マルチキャスト処理を実施する。マルチキャスト処理の場合は、フォワーディング処理部5は、FDB6のエントリに記載された2つ以上のインタフェースへフレーム(マルチキャストフレーム)を転送する。この時、各インタフェースのバッファへフレームを複製して書き込むことになる。つまり、マルチキャストの場合、宛先インタフェースの数だけフレームのコピーが発生する。
FDB6にフレームの宛先MACアドレス及びVLAN IDの組み合わせに一致するエントリが存在しない場合、フォワーディング処理部5は、ブロードキャスト処理を実施する。ブロードキャスト処理の場合は、フォワーディング処理部5は、ソフトウェアスイッチに接続された送信元インタフェース以外の全インタフェースへフレーム(ブロードキャストフレーム)を転送する。ソフトウェアスイッチのインタフェース数がn個の場合、(n−1)回のフレームコピーが発生する。
なお、ブロードキャストフレームは、複数の宛先に送信されるマルチキャストフレームの特別な場合(全ての宛先に送信される場合)として扱ってもよい。
前述のように、リアルタイムシステムでは最悪実行時間を保証する必要がある。データコピーは処理時間が、他の処理に比べて比較的大きいことから、マルチキャスト処理やブロードキャスト処理は、ユニキャスト処理よりも処理時間が大きくなる。つまり、マルチキャスト処理やブロードキャスト処理の処理時間が最悪実行時間になる可能性が高く、システムの全体性能に大きく影響を与える。
通常、大多数のフレームがユニキャスト処理になり、少ない一部のフレームがマルチキャスト処理やブロードキャスト処理となる。実行頻度が少ないマルチキャスト処理やブロードキャスト処理に合わせて、全体性能が決まってしまうのは望ましくない。
(第1実施形態)
このような背景から、第1実施形態では、マルチキャスト(ブロードキャスト)処理用に、全ての仮想マシン(宛先インタフェース)から参照可能なバッファ領域を用意し、転送制御部(ソフトウェアスイッチ)は記述子のみを各仮想マシンに通知する。
[機能構成の例]
図3は第1実施形態の通信装置300の機能構成の例を示す図である。第1実施形態の通信装置300は、仮想マシン1−1〜1−n、転送制御部20及び記憶部30を備える。
以下、仮想マシン1−1〜1−nを区別しない場合、単に仮想マシン1という。なお、複数ある他の構成についても、区別しない場合は、仮想マシン1−1〜1−nを仮想マシン1と称呼する場合と同様に省略して称呼する。
図3の例では、n個の仮想マシン1が転送制御部(ソフトウェアスイッチ)に接続されている。転送制御部20は、仮想マシン1で動作しても良いし、仮想マシンモニタ2で動作しても良い。
図3の例では、仮想マシン1からマルチキャスト(ブロードキャスト)フレームを送信する場合の例を示している。送信元の仮想マシン1は、フレーム出力部15を備える。フレーム出力部15は、アプリケーションやネットワークスタックからフレームを受け付け、フレームを転送制御部20へ入力する。
転送制御部20は、仮想マシン1間でフレームの転送制御処理を実施する。転送制御部20は、転送先決定部21、FDB6、転送部22、マルチキャスト転送仮想記憶領域23、記憶制御部24及び記述子出力部25を備える。
宛先の仮想マシン1−2は、記述子受信部11−2、通知部12−2、マルチキャスト受信仮想記憶領域13−2及び読み出し部14−2を備える。仮想マシン1−3〜1−nの構成も、仮想マシン1−2の構成と同じである。
マルチキャスト転送仮想記憶領域23及びマルチキャスト受信仮想記憶領域13について説明する。マルチキャスト転送仮想記憶領域23は、転送制御部20により管理される仮想メモリ領域43(疑似物理メモリ領域44)の一部である。マルチキャスト受信仮想記憶領域13は、宛先の仮想マシン1により管理される仮想メモリ領域43(疑似物理メモリ領域44)の一部である。
あるマルチキャストグループに属するフレーム転送に利用されるマルチキャスト転送仮想記憶領域23とマルチキャスト受信仮想記憶領域13とは、記憶部30(物理メモリ45)の同じ領域(マルチキャスト記憶領域31)にマップされる。マルチキャスト記憶領域31は、マルチキャストグループ毎に定められ、マルチキャストグループに属する仮想マシン1宛てのマルチキャストフレームを記憶する。
また、ブロードキャストフレームで、マルチキャスト転送仮想記憶領域23及びマルチキャスト受信仮想記憶領域13が利用される場合も同様に、記憶部30(物理メモリ45)の同じ領域(マルチキャスト記憶領域31)にマップされる。第1実施形態では、マルチキャスト転送仮想記憶領域23及びマルチキャスト受信仮想記憶領域13は、複数のフレームが格納できるように複数のバッファ領域から構成される。
図4Aは第1実施形態のマルチキャスト記憶領域31−1のマップの例1を示す図である。マルチキャスト記憶領域31−1は、マルチキャスト記憶領域31の一部の記憶領域である。マルチキャスト記憶領域31−1には、x個のバッファ(Buffer 1〜Buffer x)が存在し、同時にx個のフレームの転送に利用できる。図4Aの例では、仮想マシン1−2、1−3及び1−5を含むマルチキャストグループにマルチキャストフレームを送信する場合を示す。図4Aの例では、マルチキャスト記憶領域31−1は、マルチキャスト転送仮想記憶領域23−1にマップされる。マルチキャスト転送仮想記憶領域23−1は、マルチキャスト転送仮想記憶領域23の一部の記憶領域である。また、マルチキャスト記憶領域31−1は、仮想マシン1−2のマルチキャスト受信仮想記憶領域13−2、仮想マシン1−3のマルチキャスト受信仮想記憶領域13−3、及び、仮想マシン1−5のマルチキャスト受信仮想記憶領域13−5にマップされる。
図4Bは第1実施形態のマルチキャスト記憶領域31−2のマップの例2を示す図である。マルチキャスト記憶領域31−2は、マルチキャスト記憶領域31の一部の記憶領域である。マルチキャスト記憶領域31−2には、y個のバッファ(Buffer 1〜Buffer y)が存在し、同時にy個のフレームの転送に利用できる。図4Bの例では、仮想マシン1−7、1−8及び1−9を含むマルチキャストグループにマルチキャストフレームを送信する場合を示す。図4Bの例では、マルチキャスト記憶領域31−2は、マルチキャスト転送仮想記憶領域23−2にマップされる。マルチキャスト転送仮想記憶領域23−2は、マルチキャスト転送仮想記憶領域23の一部の記憶領域である。また、マルチキャスト記憶領域31−2は、仮想マシン1−7のマルチキャスト受信仮想記憶領域13−7、仮想マシン1−8のマルチキャスト受信仮想記憶領域13−8、及び、仮想マシン1−9のマルチキャスト受信仮想記憶領域13−9にマップされる。
なお、ブロードキャストフレームの場合は、全ての仮想マシン1のマルチキャスト受信仮想記憶領域13が、記憶部30(物理メモリ45)の同じ領域(マルチキャスト記憶領域31)にマップされる。
次に、第1実施形態の動作について説明する。
はじめに、転送制御部20について説明する。まず、転送先決定部21は、フレーム出力部15から受け取ったフレームのヘッダ情報と、FDB6とを参照してフレームの転送先インタフェース(宛先の仮想マシン1)を決定する。
例えば、転送先決定部21は、図5のようにFDB6のエントリに、マルチキャストやユニキャストなどを示す属性を保持し、この属性を基に転送方法を判定しても良い。
<FDBの例>
図5は第1実施形態のFDB6の例を示す図である。第1実施形態のFDB6は、宛先MACアドレス、VLAN ID、転送先インタフェース、マルチキャスト転送仮想記憶領域ID及び属性を含む。宛先MACアドレスは、転送対象のフレームの宛先MACアドレスと比較される。VLAN IDは、VLANの識別情報である。
転送先インタフェースは、宛先の仮想マシン1に対応する。例えば、転送先インタフェース#2は、宛先の仮想マシン1−2に対応する。
マルチキャスト転送仮想記憶領域IDは、マルチキャスト転送仮想記憶領域23を識別する情報である。マルチキャスト転送仮想記憶領域ID#1は、マルチキャスト転送仮想記憶領域23−1を識別する識別情報である。マルチキャスト転送仮想記憶領域23−1は、物理メモリ45では、マルチキャスト記憶領域31−1に対応する。マルチキャスト転送仮想記憶領域ID#2は、マルチキャスト転送仮想記憶領域23−2を識別する識別情報である。マルチキャスト転送仮想記憶領域23−2は、物理メモリ45では、マルチキャスト記憶領域31−2に対応する。
属性は、フレームの転送方法を示す。属性には、ユニキャスト又はマルチキャストが設定される。なお、転送先決定部21は、FDB6に、転送対象のフレームの宛先MACアドレス及びVLAN IDの組み合わせに一致するエントリが存在しない場合、または、宛先アドレスがブロードキャストアドレスの場合、当該フレームをブロードキャストすることを決定する。
また例えば、転送先決定部21は、フレームのMACアドレスのI/G(Individual/Group)ビットを見てマルチキャストか否かを判定しても良い。
また例えば、転送先決定部21は、宛先MACアドレスからブロードキャストか否かを判定しても良い。転送先決定部21は、フレームの宛先MACアドレスに該当するエントリがFDB6に存在し、当該エントリに含まれる転送先インタフェースが1つである場合は、フレームをユニキャストで転送することを決定する。また、転送先決定部21は、フレームの宛先MACアドレスに該当するエントリがFDB6に存在し、当該エントリに含まれる転送先インタフェースが複数ある場合は、フレームをマルチキャストで転送することを決定する。また、転送先決定部21は、フレームの宛先MACアドレスに該当するエントリが存在しない場合、または、宛先アドレスがブロードキャストアドレスの場合は、フレームをブロードキャストで転送することを決定する。
転送先決定部21は、転送先制御情報を転送部22へ通知する。転送先制御情報は、例えば属性(ユニキャスト/マルチキャスト/ブロードキャスト)や、宛先IF(図5の転送先インタフェース)、及び、利用されるマルチキャスト転送仮想記憶領域23の識別子(図5のマルチキャスト転送仮想記憶領域ID)などを含む。第1実施形態の動作は、マルチキャスト処理またはブロードキャスト処理に係わるので、以降は、マルチキャスト処理及びブロードキャスト処理と判定された場合の動作を説明する。
次に、転送部22について説明する。マルチキャスト(ブロードキャスト)の場合、転送部22は、記憶制御部24が保持するマルチキャストバッファ情報を参照して、マルチキャスト転送仮想記憶領域23のフレーム格納位置(利用されるバッファ)を選択する。
ここでマルチキャストバッファ情報について説明する。マルチキャストバッファ情報は、マルチキャスト記憶領域31(マルチキャストグループ)毎に記憶される。
図6Aは、図4Aのマルチキャスト記憶領域31−1のマルチキャストバッファ情報50−1の例を示す図である。マルチキャストバッファ情報50−1は、マルチキャスト記憶領域31−1に含まれるバッファ毎に、ビットマップ(nビット)、及び、空き状態を有する。
ビットマップは、各ビットがそれぞれインタフェース(仮想マシン1)に対応している。例えば、1ビット目(左から1番目)が仮想マシン1−1に対応し、2ビット目(左から2番目)が仮想マシン1−2に対応し、以下、順番に、nビット目が仮想マシン1−nに対応する。ビットが0の場合、バッファが参照済み(読み出し済み)である状態、又は、宛先の仮想マシン1ではないことを示す。ビットが1の場合、バッファが参照されていない状態(転送が完了していない状態)を示す。
空き状態は、各バッファの空き状態(1:空き状態、0:利用中)を示す。
図6Bは、図4Bのマルチキャスト記憶領域31−2のマルチキャストバッファ情報50−2の例を示す図である。マルチキャストバッファ情報50−2は、マルチキャスト記憶領域31−2に含まれるバッファ毎に、ビットマップ(nビット)、及び、空き状態を有する。ビットマップ(nビット)、及び、空き状態の説明は、図6Aと同様なので省略する。
転送部22の動作の説明に戻る。転送部22は、転送先決定部21から通知されたマルチキャスト転送仮想記憶領域ID(図5)により識別されるマルチキャスト転送仮想記憶領域23にマップされたマルチキャスト記憶領域31のマルチキャストバッファ情報50を参照し、空き状態が1のバッファを選択する。
次に、転送部22は、選択したバッファにフレームを書き込む。次に、転送部22は、マルチキャストバッファ情報の空き状態を0(利用中)にし、ビットマップ中の宛先仮想マシンに該当するビットを1(フレーム未参照状態)、それ以外のビットを0にする。
最後に、転送部22は、記述子出力部25へフレームを書き込んだことを通知する。
次に、記述子出力部25について説明する。記述子出力部25は、転送部22から通知を受け取ると、転送対象のフレームの情報を格納した記述子を、宛先の仮想マシン1の記述子受信部11に出力する。記述子は、例えばフレームが書き込まれたバッファの情報(アドレス等)や、属性(ユニキャスト/マルチキャスト/ブロードキャスト)などを含む。記述子出力部25は、例えばマルチキャストフレームの記述子を、マルチキャストグループに属する複数の仮想マシン1に出力する。
最後に、記憶制御部24について説明する。記憶制御部24は、転送対象の全ての仮想マシン1への記述子の出力を完了すると、通知部12からの読み出し完了通知を待つ。通知される情報は、例えば該当フレームのマルチキャストグループの情報や、読み出しを完了したバッファの識別子や、読み出しを完了したインタフェース(宛先仮想マシン)の識別子などを含む。記憶制御部24は、通知部12から読み出し完了通知を受け取ると、該当するマルチキャストバッファ情報のエントリの情報を更新する。記憶制御部24は、例えば、仮想マシン1−2から読み出し完了通知を受け取った場合は、ビットマップの左から2ビット目を1(未参照)から0(参照済み)に変更する。
記憶制御部24は、転送対象の全て仮想マシン1から読み出し完了通知を受け取った場合(選択されたバッファに対応するビットマップに含まれる全てのビットが0の場合)は、マルチキャストバッファ情報の空き状態を1にして、バッファを解放する。
以上が、転送制御部20の動作である。
次に、宛先の仮想マシン1のマルチキャスト(ブロードキャスト)フレームの受信動作について説明する。
まず、記述子受信部11が、記述子出力部25から記述子を受信すると、読み出し部14へ記述子に記載されたバッファの識別子を通知する。
読み出し部14は、通知されたバッファの識別子を基にマルチキャスト受信仮想記憶領域13(マルチキャスト記憶領域31)からフレームを読み出して、アプリケーションやネットワークスタックへ入力する。読み出し部14は、フレームの読み出し(受信)が完了すると、通知部12へ通知する。
最後に、通知部12は、転送制御部20の記憶制御部24へフレームの読み出しが完了したことを示す読み出し完了通知を送信する。
以上が、宛先の仮想マシン1の動作である。
<マルチキャストバッファ情報についての補足>
マルチキャストバッファ情報50について補足する。第1実施形態(図6A及びB)では、ビットマップで各宛先の仮想マシン1がフレーム受信済みであるか否かを管理したが、これに限定されるものではない。一例として、カウンタ値を用いる方法が考えられる。例えば、記憶制御部24は、フレームの送信時に、宛先のインタフェース数を示す値をカウンタ値として設定し、通知部12から読み出し完了通知を受け取るたびにカウンタ値を1減算する。記憶制御部24は、カウンタ値が0になった場合に、全ての宛先の仮想マシン1がフレームを受信したと判定し、マルチキャスト記憶領域31のバッファを解放する。
<マルチキャスト記憶領域のマップタイミングについての補足>
マルチキャスト記憶領域31のマップに関して補足をする。図4A及びBに示した通り、仮想メモリ43(疑似物理メモリ44)であるマルチキャスト転送仮想記憶領域23とマルチキャスト受信仮想記憶領域13とは、それぞれマルチキャストグループごとに同一の物理メモリ45(マルチキャスト記憶領域31−1及び31−2)にマップされる。仮想メモリ43/疑似物理メモリ44と、物理メモリ45とをマップするタイミングについて説明する。
1つ目は、静的にFDB6へマルチキャスト属性のエントリが登録されたタイミングでマップする方法が考えられる。静的にFDB6へエントリが登録される例としては、オペレータの手動設定や通信装置300(スイッチ)の初期化時(初期設定で登録されるエントリ)などが考えられる。この時、転送制御部20(記憶制御部24)は、自身のマルチキャスト転送仮想記憶領域23(仮想メモリ43/疑似物理メモリ44)が参照するマルチキャスト記憶領域31(物理メモリ45)を、宛先となる全て仮想マシン1のマルチキャスト受信仮想記憶領域13とマップする。
すなわち、1つ目の例では、通信装置300の動作は、例えば次のようになる。記憶制御部24が、FDB6(転送先情報)にマルチキャストフレームのエントリが登録されたときに、マルチキャスト受信仮想記録領域13をマルチキャスト記憶領域31にマップする。読み出し部14は、記述子受信部11により記述子が受け付けられた場合、記述子に基づいて特定されたマルチキャスト記憶領域31にマップされたマルチキャスト受信仮想記録領域13から、マルチキャストフレームを読み出す。そして、記憶制御部24は、FDB6(転送先情報)からマルチキャストフレームのエントリが削除されたときに、マルチキャスト受信仮想記録領域13とマルチキャスト記憶領域31とのマップを解除する。
2つ目は、IGMP/MLD Snoopingなどによる動的にFDB6へエントリが登録されたタイミングでマップする方法が考えられる。ある仮想マシン1がマルチキャストグループXに参加するために、IGMP join messageやMLDv1/v2 Report messageを送信したとする。転送制御部20(転送先決定部21)は、これらのメッセージを監視(snooping)し、FDB6のマルチキャストエントリの宛先インタフェースに仮想マシン1を登録する。この時、転送制御部20(記憶制御部24)は、自身のマルチキャスト転送仮想記憶領域23(仮想メモリ43/疑似物理メモリ44)を、IGMP join messageやMLDv1/v2 Report messageを送信した仮想マシン1のマルチキャスト受信仮想記憶領域13とマップする。
また、転送制御部20(記憶制御部24)は、一定期間フレームの転送が発生せずにFDB6からエントリが削除されるタイミングで、該当のマルチキャスト受信仮想記憶領域13のマップを解除する。例えば、転送制御部20(記憶制御部24)は、IGMP/MLDの離脱(leave)メッセージを検知した場合に、該当のマルチキャスト受信仮想記憶領域13のマップを解除する。
すなわち、2つ目の例では、通信装置300の動作は、例えば次のようになる。記憶制御部24が、マルチキャストグループへの参加通知を受信した場合に、マルチキャスト受信仮想記録領域13をマルチキャスト記憶領域にマップする。読み出し部14は、記述子受信部11により記述子が受け付けられた場合、記述子に基づいて特定されたマルチキャスト記憶領域31にマップされたマルチキャスト受信仮想記録領域13から、マルチキャストフレームを読み出す。そして、記憶制御部24が、マルチキャストグループからの離脱通知を受信した場合に、マルチキャスト受信仮想記録領域13とマルチキャスト記憶領域31とのマップを解除する。
3つ目は、仮想マシン1の起動時(転送制御部20とのbind時)に、転送制御部20(記憶制御部24)が、ブロードキャストに使用されるマルチキャスト転送仮想記憶領域23(仮想メモリ43/疑似物理メモリ44)が参照する物理メモリ45を、起動された仮想マシン1のマルチキャスト受信仮想記憶領域13(仮想メモリ43/疑似物理メモリ44)とマップする方法が考えられる。転送制御部20(記憶制御部24)は、仮想マシン1が削除された場合(仮想マシン1と転送制御部20との接続が切断された場合)に、仮想マシン1の起動時に作成されたマップを解除する。
<通信方法の例>
図7は第1実施形態の通信方法の例の例を示すフローチャートである。はじめに、転送部22が、マルチキャスト記憶領域31にマップされたマルチキャスト転送仮想記憶領域23に、マルチキャストフレームを書き込む(ステップS1)。次に、記述子出力部25が、ステップS1の処理により書き込まれたマルチキャストフレームの記述子を、マルチキャストグループに属する仮想マシン1に出力する(ステップS2)。
次に、マルチキャストグループに属する仮想マシン1の記述子受信部11が、ステップS2の処理により送信された記述子を受信したか否かを判定する(ステップS3)。
記述子を受信した場合(ステップS3,Yes)、読み出し部14が、マルチキャスト記憶領域31から、ステップS1の処理により書き込まれたマルチキャストフレームを読み出す(ステップS4)。具体的には、読み出し部14は、マルチキャスト記憶領域31にマップされたマルチキャスト受信仮想記録領域13から、マルチキャストフレームを読み出す。
次に、記憶制御部24が、マルチキャストグループに属する全ての仮想マシン1の読み出し部14によってマルチキャストフレームが読み出された後に、マルチキャスト記憶領域31を解放する(ステップS5)。
以上説明したように、第1実施形態の通信装置300では、記憶部30は、マルチキャストグループ毎に定められ、マルチキャストグループに属する仮想マシン宛てのマルチキャストフレームを記憶するマルチキャスト記憶領域31を有する。転送部22は、マルチキャスト記憶領域31にマップされたマルチキャスト転送仮想記憶領域23に、マルチキャストフレームを書き込む。記述子出力部25は、マルチキャストフレームの記述子を、マルチキャストグループに属する仮想マシン1に出力する。記述子受信部11は、記述子を受け付ける。そして、読み出し部14は、記述子受信部11により記述子が受け付けられた場合、前記記述子に基づいて特定されたマルチキャスト受信仮想記憶領域13から、マルチキャストフレームを読み出す。
これにより第1実施形態の通信装置300によれば、リアルタイム通信で要求されるマルチキャスト転送処理の最悪実行時間をより小さくすることができる。具体的には、記憶部30(物理メモリ45)に、マルチキャスト(ブロードキャスト)用のバッファ領域(マルチキャスト記憶領域31)を用意し、各宛先の仮想マシン1が、同一の物理メモリ45へアクセスすることで、マルチキャスト(ブロードキャスト)フレームのコピー回数を削減することができる。
(第2実施形態)
次に第2実施形態について説明する。第2実施形態の説明では、第1実施形態と同様の説明については省略し、第1実施形態と異なる箇所について説明する。
第1実施形態では、転送制御部20(ソフトウェアスイッチ)内で全ての転送処理を実施していた。第2実施形態では、送信側の仮想マシン1で転送先を決定し、フレームは直接、宛先の仮想マシン1へ受け渡す。つまり、第1実施形態では、転送制御部20から宛先の仮想マシン1へのコピー回数を削減したのに対し、第2実施形態では、送信元の仮想マシン1から宛先の仮想マシン1へのコピー回数を削減する。
<TSNの説明>
はじめに、高いリアルタイム性が求められる産業用ネットワーク及び車載ネットワークなどの分野で利用されている規格の例について説明する。
例えば、イーサネット(登録商標)上でリアルタイム性を実現する規格として、TSN(Time−Sensitive Networking)の規格化が、IEEE 802.1 TSN Taskで進んでいる。TSNは複数の規格から構成される。TSNは、プロオーディオなどで用いられている低遅延性を実現するAVB(Audio/Video Bridging)を拡張した規格である。TSNは、産業用ネットワーク及び車載ネットワークなどにも適用できるようにするため、AVBよりも高いリアルタイム性に加えて、高信頼性の実現を目指す規格である。
TSN規格の1つにIEEE 802.1Qbvがある。IEEE 802.1Qbvは、優先度が異なる複数の送信バッファ(IEEE 802.1Qbvでは、送信キュー)を事前に設定したスケジュール情報(ゲートコントロールリスト)に従って制御することで、優先度(トラフィッククラス)ごとにデータ(フレーム)の送信タイミングを厳密に制御することが可能になる。各送信バッファにはデータの送信を許可するゲートを設ける。ゲートが開いている場合(オープン状態)は、データの送信が許可され、閉じている場合(クローズ状態)はデータの送信は禁止される。
<ソフトウェアスイッチでIEEE 802.1Qbvを実現する説明>
IEEE 802.1Qbvのような各フレームの送信タイミングを厳密に制御する通信処理をソフトウェアスイッチで実現する場合について説明する。
図8は通常のハードウェアを用いたQbv対応のTSNスイッチ200の例を示す。図8では、TSNスイッチ200は3つのネットワークインタフェース71a〜71cを持つ。各ネットワークインタフェース71a〜71cは、ノード81a〜81cのネットワークインタフェース82a〜82cと接続している。各ネットワークインタフェース71a〜71c、82a〜82cは、送信処理(Tx)と受信処理(Rx)とを実施する。送信処理(Tx)は、IEEE 802.1Qbvに対応しており、事前に設定されたスケジュール情報に従ってフレームの送信タイミングを決定する(Qbv)。
図9は仮想マシン1dを用いたQbv対応のソフトウェアTSNスイッチ200−2の例を示す図である。図9の例は、図8のノード81a〜81cを仮想マシン1e〜1gとして1台の物理マシンに集約し、それらの仮想マシン1e〜1gを仮想マシン1dで実現したTSNスイッチ(ソフトウェアTSNスイッチ200−2)で接続した場合を示す。
図9のように、単純にTSNスイッチを仮想化するとゲストOS(仮想マシン1e〜1g)のフロントエンド仮想ネットワークドライバ8e〜8gと、ソフトウェアTSNスイッチ200−2のバックエンド仮想ネットワークドライバ7e〜7gがそれぞれQbv処理を実施する。
この場合、以下の2つの問題が発生する。
(1)仮想マシン間の時刻同期
(2)ゲストOSの処理オーバヘッド
まず、(1)に関して説明する。TSN(Qbv)では各ネットワークノードが時刻同期し、同期された時刻とスケジュール情報とを参照して、フレームの送信タイミングを制御する。このため、図9の構成においても、各仮想マシン1d〜1gが持つシステムクロックやRTC(Real Time Clock)などの時刻を同期する必要がある。同期方法としては、通常のネットワーク処理と同じようにPTP(Precision Time Protocol)を用いる方法や、仮想マシンモニタやドライバが時刻同期機能を提供する方法が考えられるが、どの場合も処理オーバヘッドとなる。
次に、(2)に関して説明する。TSNのようなリアルタイム通信をソフトウェアで実現する場合、RTOS(Real Time OS)を用いるなどして、処理時間や処理時間の揺らぎ(ジッタ)を小さくすることが望ましい。しかしながら、仮想マシン1e〜1g(各ネットワークノード)で動作するOSは、アプリケーションによっては汎用OSが用いられる。汎用OSのタスクスケジューリングでは、CPU(Central Processing Unit)の利用効率や省電力化などのために複雑な制御が発生する。これは実行時間が見積困難となる要因となり、リアルタイム処理(リアルタイム通信)で要求される決定論的な(Deterministic)動作を実現できなくなる。
上記の問題を解決する方法として、Qbvに係わる処理を1つの仮想マシン1dに集約することが考えらえる。
図10はQbvに関わる処理を1つの仮想マシン1hに集約する場合の例を示す図である。図10では、図9のフロントエンド仮想ネットワークドライバ8e〜8gの処理を、TSNに係わるバックエンド処理部(Tx_be、Rx_be)と、それ以外のフロントエンド処理部(Tx_fe、Rx_fe)とに分離している。TSNに係わる部分はソフトウェアTSNスイッチ200−3のバックエンド仮想ネットワークドライバ7i〜7kで処理する。
Tx_beは、各仮想マシン1i〜1kのQbv処理を含む送信処理を実施する。Qbv処理の他には、IEEE 802.1QavやStrict Priority(キューの優先度制御)、IEEE802.1CB(冗長化処理)などが考えられるが、これらに限定されるものではない。
Rx_beは、各仮想マシン1i〜1kの受信処理を実施する。Rx_beでは、IEEE 802.1Qci(フィルタリング処理)、IEEE802.1CB(冗長化処理)などが考えられるが、これらに限定されるものではない。
Tx_fe及びRx_feは、各仮想マシン1i〜1kとソフトウェアTSNスイッチ200−3の間のフレーム受け渡し処理を実施する。
以上のように、図10の構成により、TSNに係わる処理を1つの仮想マシン1h(ソフトウェアTSNスイッチ200−3)に集約する。これにより、TSN処理で参照する時刻は1つに集約でき、図10のような複数仮想マシン1i〜1k間での時刻同期処理をする必要がない。また、各仮想マシン1i〜1kで汎用OSを利用したとしても、TSN処理に係わる部分は汎用OSのタスクスケジューリングなどの影響を受けなくなる。
<ソフトウェアTSNスイッチの動作説明>
上記の同一物理メモリ領域46のマップによるデータ受け渡しを利用した場合のソフトウェアTSNスイッチ200−3の動作を説明する。以下の説明では、ソフトウェアTSNスイッチ200−3をフレーム転送部200−3という。
図11はソフトウェアTSNスイッチ200−3の動作例を説明するための図である。フレーム転送部200−3は、仮想マシン1hで動作するが、仮想マシン1hではなく仮想マシンモニタ2で実現しても良い。図11の例では、仮想マシン1iから仮想マシン1jへフレームを転送する。
仮想マシン1iは、フレームの送信処理を実施する送信部51(フロントエンド仮想ネットワークドライバ8i、Tx_fe)と第一仮想記憶領域52とを備える。
送信部51は、フレームを第一仮想記憶領域52に書き込み、フレーム転送処理部200−3へ通知する。第一仮想記憶領域52は、仮想マシン1iが管理する疑似物理メモリ、または仮想メモリの一部である。第一仮想記憶領域52は、フレーム転送部200−3への送信バッファとして利用される。
仮想マシン1jは、フレーム受信処理を実施する受信部55(フロントエンド仮想ネットワークドライバ8j、Rx_fe)と、第二仮想記憶領域56とを備える。受信部55は、フレーム転送部200−3からのフレーム転送通知を受けて、第二仮想記憶領域56からフレームを読み出す。第二仮想記憶領域56は、仮想マシン1jが管理する疑似物理メモリ、または仮想メモリの一部である。第二仮想記憶領域56は、フレーム転送部200−3からの受信バッファとして利用される。
仮想マシン1hは、フレーム転送部200−3、第三仮想記憶領域54及び第四仮想記憶領域58を備える。第三仮想記憶領域54及び第四仮想記憶領域58は、仮想マシン1hが管理する疑似物理メモリ、または仮想メモリの一部である。第三仮想記憶領域54は、仮想マシン1iからの受信バッファとして利用される。第四仮想記憶領域58は、仮想マシン1jへの送信バッファとして利用される。フレーム転送部200−3は、仮想マシン1間のフレーム転送処理を実施する。
第一記憶領域53及び第二記憶領域57は、仮想マシンモニタ2が管理する物理メモリ45の一部である。
以下、仮想マシン1iから仮想マシン1jへフレームを転送する時の動作の詳細を説明する。
はじめに送信部51の動作について説明する。まず、送信部51は、アプリケーションやネットワークスタックから受け取ったフレームを第一仮想記憶領域52へ書き込む。次に、送信部51は第一仮想記憶領域52が参照する第一記憶領域53を仮想マシン1hからもマップ可能にするように、hypercall(setup)を発行する。次に、送信部51はフレーム転送部200−3へフレーム転送通知を発行する。
フレーム転送通知では、転送フレームの情報としてhypercallによって取得された第一記憶領域53のマップ情報などを通知する。最後に、送信部51は、フレーム転送部200−3から転送完了通知を受け取ると、送信バッファの開放等を実施してフレームの転送処理を終了する。
次に、受信部55の動作について説明する。受信部55は、事前にhypercall(setup)を発行して空の状態の受信バッファ(第二仮想記憶領域56)がマップされた第二記憶領域57を仮想マシン1hからもマップ可能にしておく。受信部55は、フレーム転送部200−3からフレーム転送通知を受け取ると、フレーム転送通知によって受け取った情報から、フレームが書き込まれた受信バッファを特定する。受信部55は、特定された受信バッファからフレームをアプリケーションやネットワークスタックへ受け渡す。受信部55は、最後に受信バッファの開放し、空き領域となった受信バッファを仮想マシン1hからマップ可能にしておく。
最後に、フレーム転送部200−3の動作について説明する。フレーム転送部200−3は、送信部51からフレーム転送通知を受け取ると転送処理を実施する。まず、フレーム転送部200−3は、hypercall(map)を発行してマップ情報で通知された第一記憶領域53を受信バッファ(図11の例では第三仮想記憶領域54)とマップする。
フレーム転送部200−3は、第三仮想記憶領域54(第一記憶領域53)からフレームを読み出し、フレームのヘッダ情報とFDB6を参照して宛先を決定する(図11の例では仮想マシン1jが宛先になる)。フレーム転送部200−3は、宛先仮想マシン用の送信バッファ(図11の例では第四仮想記憶領域58。事前にhypercall(map)を発行して第二記憶領域57とマップしてあるものとする。)にフレームをコピーし、仮想マシン1jの受信部55へフレーム転送通知を発行する。フレーム転送部200−3は、コピーが完了したらhypercall(unmap)を発行して第三仮想記憶領域54と第一記憶領域53のマップを解除し、仮想マシン1iの送信部51へ転送完了通知を発行する。また、フレーム転送部200−3は、仮想マシン1jへの送信が完了すると、hypercall(unmap)を発行して第四仮想記憶領域58と第二記憶領域57のマップを解除する。
以上が、仮想マシン1iから仮想マシン1jへのフレーム転送処理である。上記の例では、仮想マシン1iと仮想マシン1jがhypercall(setup)を、仮想マシン1hがhypercall(map/unmap)を発行したが、逆でも良い。
また、上記の例ではフレームの転送の度にmap/unmapを実施したが、起動時にmapした領域を使いまわす構成でも良い。
また、上記の例ではデータの受け渡しにhypercall(map)を用いたが、コピー(hypercall(copy))や転送(hypercall(Transfer))を用いても良い。
図11の例では、下記のようにデータコピー1回、hypercall6回発生している。
データコピー:1回
第三仮想記憶領域54(第一記憶領域53)から第四仮想記憶領域58(第二記憶領域57)へのデータコピー
hypercall:5回
第一仮想記憶領域52(第一記憶領域53)のsetup(アクセス権限等の変更)
第一記憶領域53と第三仮想記憶領域54のmap
第一記憶領域53と第三仮想記憶領域54のunmap
第二仮想記憶領域56(第二記憶領域57)のsetup(アクセス権限等の変更)
第二記憶領域57と第四仮想記憶領域58のmap
第二記憶領域57と第四仮想記憶領域58のunmap
一般的にメモリ間のデータコピーや、hypercall(仮想マシン1と仮想マシンモニタ2の切替)は、処理時間が大きい。また、処理時間の揺らぎ(ジッタ)も大きい。データコピーはメモリアクセスの競合によって処理時間の見積もりが困難となる。hypercallは特権命令の発行や仮想マシンモニタのスケジューラの影響などによって処理時間の見積が困難となる。
上記のような問題から、可能な限りデータコピーとhypercallの回数を減らすことが望ましい。データコピーとhypercallの回数を減らす1つの手段として、図12に示すようにスイッチを用いず、送信側の仮想マシン1n及び1oと、受信側の仮想マシン1p及び1qのペア毎に専用のネットワークを利用することが考えられる。
図12の場合、送信側の仮想マシン1の送信バッファと、受信側の仮想マシン1の受信バッファとの対応が一意に決まる(マップ先が一意に決まる)ため、転送のためのコピーやhypercallの回数が減らせる。具体的には、データコピーは発生せず、hypercallは3回(送信バッファと受信バッファのsetup/map/unmap)となる。
しかしながら、図12は、TSNのようなリアルタイム通信処理では問題になる。図12では、各専用ネットワークの処理が独立している。前述の通り、TSNでは各ネットワークノードは時刻同期して動作する必要がある。例えば、仮想マシン1pへ仮想マシン1nと仮想マシン1oからそれぞれフレームとする。正しく、Qbv処理が実行されれば、事前のスケジューリングで指定された順番で仮想マシン1pへフレームが到達する。しかし、図12のように各ネットワークが独立して動作すると、フレーム到達順が保証することができなくなってしまう。
以下、IEEE 802.1Qbvに対応させた第2実施形態の通信装置について説明する。
[機能構成の例]
図13A及びBは、第2実施形態の通信装置300−2の機能構成の例を示す図である。図13A及びBでは、n個の仮想マシン1が転送制御部20−2に接続されている。
仮想マシン1−1は、フレーム出力部91−1及びフレーム入力部92−1を備える。仮想マシン1−2〜1−nの構成についても、仮想マシン1−1の構成と同じである。
以下、仮想マシン1−1〜1−nを区別しない場合、単に仮想マシン1という。なお、複数ある他の構成についても、区別しない場合は、仮想マシン1−1〜1−nを仮想マシン1と称呼する場合と同様に省略して称呼する。
<フレーム出力部の説明>
フレーム出力部91は、書き込み部61、ユニキャスト送信仮想記憶領域121、マルチキャスト送信仮想記憶領域122、ブロードキャスト送信仮想記憶領域123、仮想FDB93、仮想マルチキャストバッファ情報96、記述子送信部62、記述子送信バッファ94を備える。
書き込み部61はアプリケーションやネットワークスタックから転送対象のフレームを受け取る。書き込み部61は、受け取ったフレームのヘッダ情報と、仮想FDB93とを参照し、フレームの転送先を決定する。
書き込み部61は、フレームの転送先が1つ(ユニキャスト)の場合、ユニキャスト転送仮想記憶領域121にフレームを書き込む。
ここで、フレーム出力部91のユニキャスト転送仮想記憶領域121と、フレーム入力部92のユニキャスト受信仮想記憶領域124との関係について説明する。ユニキャスト転送仮想記憶領域121は、フレーム出力部91の送信バッファ、ユニキャスト受信仮想記憶領域124は、フレーム入力部92の受信バッファとして利用される。ユニキャスト転送仮想記憶領域121及びユニキャスト受信仮想記憶領域124は、転送元の仮想マシン1及び宛先の仮想マシン1のペア毎に領域が分かれている。例えば、転送元が仮想マシン1、宛先が仮想マシン3のフレームが転送される場合は、1−3Tx Ubufと1−3Rx Ubufとが利用される。
図14Aは、第2実施形態の1−3Tx Ubuf記憶領域、及び、1−3Rx Ubuf記憶領域の例を示す図である。図14Bは、図14Aの記憶領域の構造の例を示す図である。
1−3Tx Ubuf記憶領域、及び、1−3Rx Ubuf記憶領域は、同一の物理メモリ領域46にマップされる。
1−3Tx Ubuf記憶領域、及び、1−3Rx Ubuf記憶領域は、例えば図14Bのリングバッファのように管理され、複数のフレームを同時に読み書きできることを想定するが、これに限定されない。
図13A及びBに戻り、フレームの転送先が複数(マルチキャスト)の場合、書き込み部61は、マルチキャスト転送仮想記憶領域122にフレームを書き込む。また、書き込み部61は、フレームの転送先が全ての宛先(ブロードキャスト)の場合、ブロードキャスト転送仮想記憶領域123にフレームを書き込む。
なお、ブロードキャストをマルチキャストの特別な場合と捉えて、マルチキャスト転送仮想記憶領域122及びブロードキャスト転送仮想記憶領域123を区別しなくてもよい。
次に、書き込み部61が、マルチキャスト/ブロードキャストのフレームを処理する場合について説明する。はじめに、書き込み部61は、仮想FDB93を参照し、フレームの宛先を判定する。
ここで、仮想FDB93について説明する。各仮想マシン1の仮想FDB93を記憶する疑似物理メモリ(仮想メモリ)は、転送制御部20−2のFDB120を記憶する記憶部(物理メモリ)にマップされている。つまり、各仮想マシン1は同一のFDB120を参照することになる。仮想FDB93とFDB120のマップは、例えば通信装置300−2(スイッチ)の初期化時などに実行される。
また、図13A及びBの例では、FDB120の更新は転送制御部20−2(FDB更新部105)によって実行され、フレーム出力部91は読み出しを実行する(Read−Only)。FDB120(仮想FDB93)には、フレームの転送先を決定するための情報が含まれる。具体的には、転送先を決定するための情報は、転送先のネットワークポート(ネットワークインタフェース、または仮想マシン1)の識別子、MACアドレス、VLAN ID、及び最終送信時刻などの情報を含む。
書き込み部61は、マルチキャスト/ブロードキャストのフレームと判定した場合、FDB93のエントリに含まれるマルチキャスト転送仮想記憶領域IDによって、書き込み先のマルチキャスト転送仮想記憶領域122/ブロードキャスト転送仮想記憶領域123を特定する。
次に、書き込み部61は、特定されたマルチキャスト転送仮想記憶領域122/ブロードキャスト転送仮想記憶領域123に対応する仮想マルチキャストバッファ情報96を参照する。
仮想マルチキャストバッファ情報96は、後述の転送制御部20−2により管理されるマルチキャストバッファ情報50が記憶される記録領域(物理メモリ45)にマップされた仮想メモリ43(疑似物理メモリ)に記憶される。
書き込み部61は、仮想マルチキャストバッファ情報96から、マルチキャスト転送仮想記憶領域122/ブロードキャスト転送仮想記憶領域123にマップされたマルチキャスト記憶領域31の空き状態のバッファを特定し、当該空き状態のバッファを選択する。
次に、書き込み部61は、選択されたバッファにフレームを書き込む。そして、書き込み部61は、フレームを書き込んだのち、マルチキャストバッファ情報50のビットマップ及び空き状態を更新し、記述子送信部62へ通知する。
記述子送信部62は、記述子送信バッファ94に、転送対象のフレームの記述子を書き込む。
記述子送信バッファ94及び記述子入力バッファ102は、通信装置20−2(スイッチ)の初期化時などに予め同一の物理メモリ領域をマップする。記述子送信バッファ94及び記述子入力バッファ102は、フレーム出力部91と入力処理部111間の記述子の受け渡しに利用される。
記述子送信バッファ94及び記述子入力バッファ102は、フレームのトラフィッククラス(TC)毎にキュー(FIFO)が分かれている。IEEE 802.1Qのヘッダに含まれるPCP(Priority Code Point)とトラフィッククラスの対応関係は事前に指定される。
記述子送信バッファ94は、仮想マシン1が管理する仮想メモリ領域(疑似物理メモリ領域)である。記述子入力バッファ102は、転送制御部20−2が管理するメモリ領域である。
記述子送信部62は、受け取ったフレーム書き込み通知に含まれるPCPやTCから、記述子を書き込む記述子送信バッファ94の位置を決定する。記述子送信部62は、書き込み部61から受け取った情報を記述子に格納し、記述子送信バッファ94へ書き込む。記述子には、書き込み部61から受け取ったフレーム書き込み通知に含まれる情報の他に、送信時刻や統計情報などを含めても良い。
また例えば、記述子送信部62は、書き込み部61からフレームが書き込まれた送信仮想記憶領域のバッファアドレスのみを受け取り、記述子送信部62がバッファからフレームのヘッダ情報等を参照して記述子の生成、書き込みをしても良い。前述の通り、記述子送信バッファ94は、転送制御部60−2の記述子入力バッファ102と同一物理メモリにマップされているため、後述の送信制御部103から参照可能になる。
以上が、フレーム出力部91の説明である。
<転送制御部の説明>
転送制御部20−2は、転送処理部101−1〜101−n、FDB120、マルチキャストバッファ情報50及び記憶制御部141を備える。転送処理部101−1〜101−nは、対応する仮想マシン1−1〜1−nに接続される。なお、転送制御部20−2は、ソフトウェアではなく、専用HWにより実現されていてもよい。
転送処理部101−1は、入力処理部111−1、出力処理部112−1及び完了通知受信バッファ131−1を備える。
入力処理部111−1は、記述子入力バッファ102−1、送信制御部103−1、転送先決定部104−1、FDB更新部105−1、転送部106−1及びスケジュール情報110−11を備える。
出力処理部112−1は、記述子出力バッファ107−1、送信制御部108−1、記述子転送バッファ109−1及びスケジュール情報110−12を備える。
転送処理部101−2〜101−nの構成も、転送処理部101−1の構成と同じである。
まず、送信制御部103の動作について説明する。まず、送信制御部103は、現在時刻とスケジュール情報110(ゲートコントロールリスト)とから、送信が許可されているトラフィッククラスを確認する。次に、送信制御部103は、送信が許可されているトラフィッククラスのキュー(記述子入力バッファ102)から転送対象のフレームの記述子を読み出す。複数のトラフィッククラスのフレーム(記述子)が送信可能な場合は、送信制御部103は、優先度順(Strict Priority)やCredit Based Shaper(IEEE 802.1Qav)等の手法によって決定する。送信制御部103は、読み出した記述子を転送先決定部104へ入力する。送信可能なフレームが存在しない場合は、処理を終了し次のフレーム送信処理に移る(記述子が新たに書き込まれるまで待機する、スケジュール状態が変わるまで待機する等)。
以上が送信制御部103の動作である。上記の処理以外に、送信制御部103は、読み出した記述子に格納されたフレームサイズと現在時刻、スケジュール情報から、ガードバンド等を考慮してスケジュールで許可された時間内でフレームが送信可能かどうかの判定処理などを実施しても良い。また、第2実施形態ではIEEE802.1 Qbvの処理を想定しているが、これに限定されるものではない。
次に、転送先決定部104の動作について説明する。転送先決定部104は、記述子に記載された転送先の仮想マシン1の識別子を参照し、記述子を書き込む記述子転送バッファ109を決定する。例えば、転送先が仮想マシン1−3の場合、転送処理部101−3の記述子転送バッファ109−3が書き込み先となる。
次に、FDB更新部105の動作について説明する。まず、FDB更新部105は、送信元の仮想マシン1のエントリ(MACアドレス、VLAN ID)がFDB120に存在するか否かを確認する。存在しない場合は、FDB更新部105は、エントリを登録し、ネットワークインタフェース、MACアドレスやVLAN ID、最終送信時刻等を書き込む。存在する場合は、エントリの最終時刻の更新等を実施する。
最後に、転送部106の動作について説明する。転送部106は、転送先決定部104によって決定された記述子転送バッファ109の該当するトラフィッククラスのキューに記述子を書き込む。マルチキャスト/ブロードキャストの場合は、複数の記述子転送バッファへ記述子を書き込むことになる。シングルタスクで動作する場合(CPU1コアで動作する場合等)、各仮想マシン1の入力処理部111が順番に実行されるため、記述子転送バッファ109で記述子の入力がシリアライズされる。一方、マルチタスクで動作する場合(マルチコアで動作する場合、HWで並列処理する場合等)、各仮想マシン1の入力処理が並列で複数実行されることになるため、記述子転送バッファ109への書き込みは、ロックを取るなどしてアクセス競合が発生しないようにして、記述子の転送順をシリアライズ必要がある。
以上が入力処理部111の動作である。入力処理部111により、各仮想マシン1から送信されたフレーム(記述子)を、IEEE802.1 Qbvの送信タイミングに従って宛先の仮想マシン1用の出力処理部112へ転送することができる。これは、送信元の仮想マシン1のネットワークインタフェースのQbv処理が実施されたことになる(図10のTx_beに該当)。
次に、出力処理部112の動作について説明する。送信制御部108の動作は基本的に入力処理部111の送信制御部103と同様の処理を実施する。出力処理部112の送信制御部108では、読み出し元のバッファが記述子転送バッファ109となり、書き込み先が記述子出力バッファ107(記述子受信バッファ95)となる。ここで、図13A及びBの記述子出力バッファ107(記述子受信バッファ95)は1つのキュー(FIFO)を提供しているが、記述子入力バッファ102や記述子転送バッファ109のようにトラフィッククラス毎にキューを分けても良い。
以上が出力処理部112の説明である。出力処理部112により、IEEE802.1 Qbvの送信タイミングに従って宛先の仮想マシン1へ、記述子を転送することができる。これは、転送制御部20−2(スイッチ)のネットワークインタフェースのQbv処理が実施されたことになる(図10のTxに該当)。
最後に、記憶制御部141の動作について説明する。記憶制御部141は、完了通知受信バッファ131から完了通知を受け取ると、マルチキャストバッファ情報50を更新する。記憶制御部141は、完了通知を送信したインタフェースに対応するビットを参照済み状態(読み出し済み状態)にする。この時、記憶制御部141は、マルチキャストグループに属するすべてのインタフェースが、参照済み状態であれば、バッファの状態を空き状態に設定して、当該バッファを開放する。
以上が、転送制御部20−2の説明である。
<フレーム入力部の説明>
フレーム入力部92は、読み込み部63、ユニキャスト受信仮想記憶領域124、マルチキャスト受信仮想記憶領域125、ブロードキャスト受信仮想記憶領域126、記述子受信バッファ95、記述子受信部64及び完了通知送信バッファ97を備える。
記述子受信バッファ95は、仮想マシン1が管理する仮想メモリ領域(疑似物理メモリ領域)である。記述子出力バッファ107は、転送制御部60−2が管理するメモリ領域である。
記述子受信バッファ95及び記述子出力バッファ107は、通信装置20−2(スイッチ)の初期化時などに予め同一の物理メモリ領域をマップする。記述子受信バッファ95及び記述子出力バッファ107は、フレーム入力部92と出力処理部112間の記述子の受け渡しに利用される。
まず、記述子受信部64が記述子受信バッファ95のキュー(FIFO)から記述子を読み出す。記述子受信部64は、ユニキャストの場合、記述子からフレームが格納されたRx Ubuf(Tx Ubuf)記憶領域を特定して読み出し部63へ通知する。また、記述子受信部64は、マルチキャスト(ブロードキャスト)の場合、記述子からフレームが格納されたマルチキャスト受信仮想記憶領域125(ブロードキャスト受信仮想記憶領域126)を特定して読み出し部63へ通知する。
読み出し部63は、ユニキャストの場合、通知されたRx Ubuf(Tx Ubuf)記憶領域のバッファ情報を参照し(図14B)、先頭のフレーム(Tail位置に書き込まれたフレーム)を読み出す。また、読み出し部63は、マルチキャスト(ブロードキャスト)の場合、通知された記憶領域からマルチキャストフレーム(ブロードキャストフレーム)を読み出す。読み出し部は、読み出されたフレームをアプリケーションやネットワークスタックへ受け渡す。読み出し部63は、フレームの受け渡しが完了したら、読み出し完了通知を完了通知送信バッファ97に入力する。
完了通知送信バッファ97は、読み込み部63がフレームを読みだしたことを転送制御部20−2の記憶制御部141へ通知するための情報の受け渡しに利用される。図13A及びBの例では、完了通知送信バッファ97を、転送制御部20−2の完了通知受信バッファ131を記憶する物理メモリ45の記憶領域にマップすることで完了通知の受け渡しを実現している。
記憶制御部141は、完了通知受信バッファ131から読み出し完了通知を読み出すと、読み出しが完了したバッファを解放する。記憶制御部141は、ユニキャストの場合、Tail(図14B)を+1加算する。
マルチキャスト(ブロードキャスト)の場合の完了通知には、受信したフレームのマルチキャストバッファ情報5を識別するマルチキャスト転送仮想記憶領域ID(図5)やバッファ領域を識別するバッファID(図6A及びB)などを含む。
ここで、ユニキャストについて補足する。第2実施形態では、ユニキャスト処理については、バッファ情報をリングバッファのように管理したが、ユニキャストの場合もマルチキャストやブロードキャストと同じような管理にしてもよい。この場合、ユニキャストフレームに関してもマルチキャストバッファ情報50を参照して転送を制御する。この場合は、宛先が1つなので、転送制御部20−2でビットマップの1ビットだけが、フレームが読み出されたか否かを管理する情報として使用される。
以上、説明したように、第2実施形態の通信装置300−2は、複数の仮想マシン1と、転送制御部20−2と、を備える。
仮想マシン1では、記憶部(仮想メモリ43または擬似物理メモリ44)は、マルチキャストグループ毎に定められ、マルチキャスト記憶領域31にマップされたマルチキャスト転送仮想記憶領域122を有する。マルチキャスト記憶領域31は、マルチキャストグループに属する仮想マシン1宛てのマルチキャストフレームを記憶する。書き込み部61は、マルチキャストフレームを、マルチキャスト転送仮想記憶領域122に書き込む。記述子送信部62は、マルチキャストフレームの記述子を、マルチキャストグループに属する複数の仮想マシン1に出力する。記述子受信部64は、マルチキャストフレームの記述子を受け付ける。読み出し部63は、記述子受信部64により記述子が受け付けられた場合、記述子に基づいて特定されたマルチキャスト記憶領域31にマップされたマルチキャスト受信仮想記憶領域125から、マルチキャストフレームを読み出す。
転送制御部20−2では、入力処理部111が、スケジュール情報110に基づいて、マルチキャストフレームの記述子を出力処理部112に入力するタイミングを制御する。そして、出力処理部112が、入力処理部111から記述子を受け付けると、スケジュール情報110に基づいて、記述子を、マルチキャストグループに属する複数の仮想マシンに出力するタイミングを制御する。
これにより第2実施形態の通信装置300−2によれば、第1実施形態の通信装置300と同様の効果が得られる。
最後に、第1及び第2実施形態の通信装置300〜300−2のハードウェア構成の例について説明する。
[ハードウェア構成の例]
図20は第1及び第2実施形態の通信装置300〜300−2のハードウェア構成の例を示す図である。
通信装置300〜300−2は、制御装置301、主記憶装置302、補助記憶装置303、表示装置304、入力装置305及び通信IF306を備える。制御装置301、主記憶装置302、補助記憶装置303、表示装置304、入力装置305及び通信IF306は、バス310を介して接続されている。
制御装置301は、補助記憶装置303から主記憶装置302に読み出されたプログラムを実行する。主記憶装置302は、ROM(Read Only Memory)、及び、RAM(Random Access Memory)等のメモリである。補助記憶装置303は、HDD(Hard Disk Drive)、SSD(Solid State Drive)、及び、メモリカード等である。
表示装置304は表示情報を表示する。表示装置304は、例えば液晶ディスプレイ等である。入力装置305は、通信装置300として動作させるコンピュータを操作するためのインタフェースである。入力装置305は、例えばキーボードやマウス等である。なお、表示装置304及び入力装置305は、通信装置300〜300−2と接続可能な外部の管理端末等の表示機能及び入力機能を利用してもよい。
通信IF306は、他の装置と通信するためのインタフェースである。
コンピュータで実行されるプログラムは、インストール可能な形式又は実行可能な形式のファイルでCD−ROM、メモリカード、CD−R及びDVD(Digital Versatile Disc)等のコンピュータで読み取り可能な記憶媒体に記録されてコンピュータ・プログラム・プロダクトとして提供される。
またコンピュータで実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。またコンピュータで実行されるプログラムをダウンロードさせずにインターネット等のネットワーク経由で提供するように構成してもよい。
またコンピュータで実行されるプログラムを、ROM等に予め組み込んで提供するように構成してもよい。
コンピュータで実行されるプログラムは、上述の通信装置300の機能構成(機能ブロック)のうち、プログラムによっても実現可能な機能ブロックを含むモジュール構成となっている。当該各機能ブロックは、実際のハードウェアとしては、制御装置301が記憶媒体からプログラムを読み出して実行することにより、上記各機能ブロックが主記憶装置302上にロードされる。すなわち上記各機能ブロックは主記憶装置302上に生成される。
なお上述した各機能ブロックの一部又は全部をソフトウェアにより実現せずに、IC(Integrated Circuit)等のハードウェアにより実現してもよい。
また複数のプロセッサを用いて各機能を実現する場合、各プロセッサは、各機能のうち1つを実現してもよいし、各機能のうち2つ以上を実現してもよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。