(57)【要約】【課題】複数同時に到着するパケットを処理する。【解決手段】振分部は、複数のパケットが入力インタフェースに到着した順に、各パケットを各分散処理部に振り分け、各分散処理部は、当該分散処理部において受信した各パケットの処理に関する情報を集中処理部に転送し、集中処理部は、受信した複数のパケットのうち分散処理部から同時に受信した同一フローの複数のパケットの演算結果を集約して、テーブルに保持する対応するフローの演算結果を更新する。【選択図】図１Ｂ
2015032970.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークに接続される通信装置であって、
前記ネットワークから送信される複数のパケットを受信する入力インタフェースと
前記複数のパケットに関する処理を複数の分散処理部へ振り分ける振分部と、
前記複数のパケットに関する処理を実行する前記複数の分散処理部と、
前記複数のパケットに関する処理を集約して実行する集中処理部と、
前記複数のパケットに関する処理の演算結果を示す値をフロー毎に保持するテーブルと、を備え、
前記振分部は、
前記複数のパケットが前記入力インタフェースに到着した順に、前記各パケットを前記各分散処理部に振り分け、
前記各分散処理部は、
当該分散処理部において受信した前記各パケットの処理に関する情報を前記集中処理部に転送し、
前記集中処理部は、
前記受信した複数のパケットのうち前記分散処理部から同時に受信した同一フローの複数のパケットの演算結果を集約して、前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信装置。
【請求項２】
請求項１に記載の通信装置であって、
前記集中処理部は、
前記パケットに関する処理を実行する複数の演算部と、
前記分散処理部から同時に受信した複数のパケットのうち同一フローのパケットがあるか否かを判定し、前記同一フローのパケットが複数ある場合、同一フローの複数のパケットに関する情報を集約した情報を含む情報を１つの前記演算部に通知する調停部と、を備え、
前記１つの演算部は、前記通知された集約された情報に基づいて、前記同一フローの複数のパケットに関する演算処理を実行し、演算結果を前記調停部に通知し、
前記調停部は、前記通知された演算結果を用いて、前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信装置。
【請求項３】
請求項２に記載の通信装置であって、
前記調停部は、
前記同一フローの複数のパケットに関するパケット数、及び、パケット長の合計値を含む情報を前記１つの演算部に通知し、
前記１つの演算部は、
前記通知されたパケット数、及び、パケット長の合計値を含む情報に基づいて統計処理を実行し、演算結果を前記調停部に通知することを特徴とする通信装置。
【請求項４】
請求項１に記載の通信装置であって、
前記パケットを格納する帯域監視バッファと
前記パケットの入力帯域を監視し、前記振分部がパケットに関する処理を振り分ける分散処理部の数を前記帯域監視バッファに格納された前記パケットの蓄積量に応じて変更する帯域監視部と、を備え、
前記振分部は、前記帯域監視部から通知された分散処理部の数に基づいて、前記パケットを各分散処理部に振り分けることを特徴とする通信装置。
【請求項５】
請求項１に記載の通信装置であって、
前記集中処理部は、
前記パケットに関する処理を実行する複数の演算部と、
前記分散処理部から同時に受信した複数のパケットのうち同一フローのパケットがあるか否かを判定し、前記同一フローのパケットが複数ある場合、前記演算結果を補正するための補正量を決定し、前記各演算部に各パケットの演算処理を割り当てる調停部と、を備え、
前記各演算部は、前記同一フローの複数のパケットに関する演算結果を前記補正量に基づいて補正し、
前記調停部は、前記各演算部から前記補正した演算結果のいずれかを選択し、選択した演算結果に基づいて前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信装置。
【請求項６】
請求項５に記載の通信装置であって、
前記フロー識別子と、前記フローに対応するトークンバケツに追加される単位時間あたりのトークン量、及び、前記トークンバケツに蓄積されるトークンの最大量と、を含む設定用テーブルを備え、
前記テーブルは、フロー識別子、前回パケット到着時刻、及び、保持トークン値と、を含む演算結果を保持し、
前記調停部は、前記分散処理部から同時に受信した複数のパケットのうち同一フローの第１のパケットと第２のパケットについて、第１のパケットと同時に受信した第２のパケットのトークン補正量を前記第１のパケットのパケット長とすることを特徴とする通信装置。
【請求項７】
請求項６に記載の通信装置であって、
前記複数の演算部のうち第１のパケットに関する処理を実行する演算部は、
前記第１のパケットに関する処理を実行した結果、前記第１のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量が、前記第１のパケットのパケット長を下回ると判定された場合、前記第１のパケットの送信が保証外であることを示す帯域制御情報、及び、前記第１のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量を出力し、
前記第１のパケットに関する処理を実行した結果、前記第１のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量が、前記第１のパケットのパケット長以上と判定された場合、前記第１のパケットの送信が保証内であることを示す帯域制御情報、及び、前記第１のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量から前記第１のパケット長分のトークンを減算したトークン量を出力し、
前記複数の演算部のうち第２のパケットに関する処理を実行する演算部は、
前記第１のパケットに関する処理分を補正した前記第２のパケットに関する処理を実行した結果、前記第２のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量から前記第１のパケット長分を減算したトークン量が、前記第２のパケットのパケット長を下回ると判定された場合、前記第１のパケットの送信が保証外であることを示す帯域制御情報、及び、前記第２のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量から前記第１のパケット長分のトークンを減算したトークン量を出力し、
前記第１のパケットに関する処理分を補正した前記第２のパケットに関する処理を実行した結果、前記第２のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量から前記第１のパケット長分を減算したトークン量が、前記第２のパケットのパケット長以上と判定された場合、前記第１のパケットの送信が保証内であることを示す帯域制御情報、及び、前記第２のパケットを受信するまでに前記トークンバケツに蓄積されたトークン量から前記第１のパケット長分及び前記第２のパケット長分のトークンを減算したトークン量を出力し、
前記調停部は、
前記第１のパケットの帯域制御情報が保証外である場合、前記第１のパケットに関する処理を実行した演算部が出力したトークン量を前記テーブルの保持トークン値に更新し、
前記第１のパケットの帯域制御情報が保証内であり、前記第２のパケットの帯域制御情報が保証外である場合、前記第１のパケットに関する処理を実行した演算部が出力したトークン量を前記テーブルの保持トークン値に更新し、
前記第２のパケットの帯域制御情報が保証内である場合、前記第２のパケットに関する処理を実行した演算部が出力したトークン量を前記テーブルの保持トークン値に更新し、
さらに、前記通信装置は、
前記演算部から出力された前記第１及び第２の帯域制御情報に基づいて、前記第１のパケット及び第２のパケットのヘッダを書き換える出力判定処理部を備えることを特徴とする通信装置。
【請求項８】
請求項１に記載の通信装置であって、
前記集中処理部は、
前記パケットに関する処理を実行する複数の演算部と、
前記各演算部が処理を実行するパケットのフロー識別子と、前記各演算部におけるパケットの処理の状況を示す情報と、を含む管理リストと、を備え、
前記管理リストを参照して、受信したパケットのフローと同一のフローのパケットが前記複数の演算部のいずれかの演算部で処理中の場合、該演算部に前記受信したフローの処理を割り当て、
該フローを割り当てられた演算部は、
前記処理中のパケットの演算を終了すると、該演算結果を保持し、
該保持した演算結果を用いて、前記受信したパケットの演算を実行することを特徴とする通信装置。
【請求項９】
請求項１に記載の通信装置であって、
前記振分部は、前記パケットを断片化して前記各分散処理部に振り分けることを特徴とする通信装置。
【請求項１０】
請求項１に記載の通信装置であって、
前記振分部は、前記パケットのヘッダ部分を前記各分散処理部に振り分けることを特徴とする通信装置。
【請求項１１】
ネットワークに接続される通信装置による通信方法であって
前記通信装置は、
前記ネットワークから送信される複数のパケットを受信する入力インタフェースと
前記複数のパケットに関する処理を複数の分散処理部へ振り分ける振分部と、
前記複数のパケットに関する処理を実行する前記複数の分散処理部と、
前記複数のパケットに関する処理を集約して実行する集中処理部と、
前記複数のパケットに関する処理の演算結果を示す値をフロー毎に保持するテーブルと、を備え、
前記振分部は、
前記複数のパケットが前記入力インタフェースに到着した順に、前記各パケットを前記各分散処理部に振り分け、
前記各分散処理部は、
当該分散処理部において受信した前記各パケットの処理に関する情報を前記集中処理部に転送し、
前記集中処理部は、
前記受信した複数のパケットのうち前記分散処理部から同時に受信した同一フローの複数のパケットの演算結果を集約して、前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信方法。
【請求項１２】
請求項１１に記載の通信方法であって、
前記集中処理部は、
前記パケットに関する処理を実行する複数の演算部と、
前記分散処理部から同時に受信した複数のパケットのうち同一フローのパケットがあるか否かを判定し、前記同一フローのパケットが複数ある場合、同一フローの複数のパケットに関する情報を集約した情報を含む情報を１つの前記演算部に通知する調停部と、を備え、
前記１つの演算部は、前記通知された集約された情報に基づいて、前記同一フローの複数のパケットに関する演算処理を実行し、演算結果を前記調停部に通知し、
前記調停部は、前記通知された演算結果を用いて、前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信方法。
【請求項１３】
請求項１２に記載の通信方法であって、
前記調停部は、
前記同一フローの複数のパケットに関するパケット数、及び、パケット長の合計値を含む情報を前記１つの演算部に通知し、
前記１つの演算部は、前記通知されたパケット数、及び、パケット長の合計値を含む情報に基づいて統計処理を実行し、演算結果を前記調停部に通知することを特徴とする通信方法。
【請求項１４】
請求項１１に記載の通信方法であって、
前記パケットを格納する帯域監視バッファと
前記パケットの入力帯域を監視し、前記振分部がパケットに関する処理を振り分ける分散処理部の数を前記帯域監視バッファに格納された前記パケットの蓄積量に応じて変更する帯域監視部と、を備え、
前記振分部は、前記帯域監視部から通知された分散処理部の数に基づいて、前記パケットを各分散処理部に振り分けることを特徴とする通信方法。
【請求項１５】
請求項１１に記載の通信方法であって、
前記集中処理部は、
前記パケットに関する処理を実行する複数の演算部と、
前記分散処理部から同時に受信した複数のパケットのうち同一フローのパケットがあるか否かを判定し、前記同一フローのパケットが複数ある場合、前記演算結果を補正するための補正量を決定し、前記各演算部に各パケットの演算処理を割り当てる調停部と、を備え、
前記各演算部は、前記同一フローの複数のパケットに関する演算結果を前記補正量に基づいて補正し、
前記調停部は、前記各演算部から前記補正した演算結果のいずれかを選択し、選択した演算結果に基づいて前記テーブルに保持する対応するフローの演算結果を更新することを特徴とする通信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信装置に関し、特に、パケットに対して処理を行う通信装置に関する。
【背景技術】
【０００２】
近年、テレビコンテンツのデジタル化又はスマートフォンの普及等によりネットワークシステムにおけるトラヒックが大容量化している。そして、これにより、１００Ｇｂｐｓ超の回線の需要が高まっている。
【０００３】
現在のパケット処理ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）は、シングルコアで１パケット毎にシーケンシャルにパケットを処理している。これまでのＦＰＧＡ開発では、トラヒック増加に対応するためにはＦＰＧＡ内部の動作周波数を高くし、並列展開ビット数を増加することでシングルコアのパケット処理を高速化してきた。しかし、動作周波数が頭打ちになっており、１００Ｇｂｐｓ超級のパケット処理を実現するためには更に並列展開ビット数を増加する必要がある。具体的には、Ｅｔｈｅｒｎｅｔ（登録商標）の最少サイズ６４バイト（５１２ビット）以上に並列展開する必要があり、１ｃｌｋ以内に複数パケット分の情報がＦＰＧＡに到着する。従来のシングルコアの１パケット毎のシーケンシャル処理ができないため、パケット処理エンジンのマルチコア化への大きな流れがある。
【０００４】
帯域制御機能又は統計カウント機能などのパケット管理機能を、ＦＰＧＡに実装する場合、ＦＰＧＡは、フロー毎のパケットの情報を一つの情報記憶媒体（以後、テーブルと記載）に格納し、到着したパケットに対応するフロー毎のテーブルの値を、パケットが到着する毎に更新する。
【０００５】
例えば、統計カウント機能を実現する場合、ＦＰＧＡは、各フローの統計情報をテーブルで管理する。具体的には、ＦＰＧＡは、パケット到着毎に該当フローのテーブルから受信パケット数及び受信バイト数を読み出し、受信パケット数及び受信バイト数を更新、及び、受信パケット数及び受信バイト数の更新結果のテーブルへの書込みを実行する。
【０００６】
本技術分野の背景技術として、特開２０００−３５８０６６号公報（特許文献１）がある。この公報には、「到着パケットごとに、同じソースからの前のパケットが処理エレメントに係属中であるかどうかをチェックし、チェックにより、そのようなパケットが係属中であることが明らかになった場合に、この到着パケットを前のパケットと同じ処理エレメントに転送する」ことが記載されている（要約参照）。すなわち、特許文献１には、複数の分散処理部によって、複数のフローのパケットを処理する分散処理技術が提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０００−３５８０６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１に記載された技術によれば、パケットはフロー毎に複数の分散処理部に振り分けられ、各分散処理部によってパケット処理が実行される。このため、特許文献１に記載された技術では、同一フローを同じ分散処理部へ振分けるためのＨａｓｈ関数などの複雑な処理が必要である。
【０００９】
さらに、二つ以上の同じフローのパケットが同時に到着した場合、上記パケット振分けにより、１つの分散処理部に、１パケットを処理するために必要な時間間隔よりも短い時間間隔内に、二つのパケットが転送される。分散処理部に、前に到着したパケット処理が終了しないうちに、次に処理すべきパケットが到着するため、分散処理部は、同時に到着するパケット処理を正常に実行できず、オーバーフローが発生する場合がある。すなわち、同一フローのパケットの処理速度は、１つの分散処理部の処理速度が限界になるという問題がある。
【００１０】
本発明は、前述の問題を鑑みてなされたものであり、マルチコア化されたパケット処理エンジンにおいて、分散処理部へのパケットの振分け処理を簡素化する。さらに、統計カウント機能などパケット到着毎に同じフローの情報を更新する必要がある場合でも、同時に到着するパケットを処理することができる方法の提供を目的とする。
【課題を解決するための手段】
【００１１】
振分部は、複数のパケットが入力インタフェースに到着した順に、各パケットを各分散処理部に振り分け、各分散処理部は、当該分散処理部において受信した各パケットの処理に関する情報を集中処理部に転送し、集中処理部は、受信した複数のパケットのうち分散処理部から同時に受信した同一フローの複数のパケットの演算結果を集約して、テーブルに保持する対応するフローの演算結果を更新する。
【発明の効果】
【００１２】
本発明の一実施形態によれば、マルチコア化されたパケット処理エンジンにおいて、１つの分散処理部への負荷集中による性能劣化を抑えることができる。さらに、統計カウント機能などパケット到着毎に同じフローの情報を更新する必要がある場合でも、同時に到着するパケットを処理することができる。
【図面の簡単な説明】
【００１３】
【図１Ａ】従来のフローを識別してパケットを分散処理部に振り分ける場合のパケット処理の概要を示す説明図である。
【図１Ｂ】本実施例１のパケット処理の概要を示す説明図である。
【図２】本実施例１のパケット通信装置の物理的な構成及び論理回路を示すブロック図である。
【図３】本実施例１のパケットに付加される装置内ヘッダのフォーマットを示す説明図である。
【図４】本実施例１の通信において用いられるパケットのフォーマットを示す説明図である。
【図５】本実施例１の入力パケット制御部の論理的な構成を示すブロック図である。
【図６】本実施例１の分散処理部の論理的な構成を示すブロック図である。
【図７】本実施例１の集中処理部の論理的な構成を示すブロック図である。
【図８】本実施例１の統計情報テーブルを示す説明図である。
【図９】本実施例１の振分部が実行する振分け処理を示すフローチャートである。
【図１０】本実施例１の入力ヘッダ解析部が実行するヘッダ解析処理を示すフローチャートである。
【図１１】本実施例１の出力判定処理部が実行する出力判定処理を示すフローチャートである。
【図１２】本実施例１の調停部が実行する演算部選定調停処理を示すフローチャートである。
【図１３】本実施例１の演算フロー管理リストを示す説明図である。
【図１４】本実施例１の調停部が実行する演算フロー管理処理を示すフローチャートである。
【図１５】本実施例１の演算部が実行する統計情報処理を示すフローチャートである。
【図１６】本実施例１の調停部が実行する更新調停処理を示すフローチャートである。
【図１７】本実施例１のパケットに付加されるフラグメントヘッダのフォーマットを示す説明図である。
【図１８】本実施例１のパケットのフラグメント処理の概要を示す説明図である。
【図１９】本実施例２の入力パケット制御部の論理的な構成を示すブロック図である。
【図２０】本実施例２の帯域監視部が実行する帯域監視バッファ書込み処理を示すフローチャートである。
【図２１】本実施例２の帯域監視バッファのパケット蓄積量と利用分散処理部の数の関係を示す説明図である。
【図２２】本実施例２の帯域監視部が実行する帯域監視バッファ読出し処理を示すフローチャートである。
【図２３】本実施例２の振分部が実行する振分け処理を示すフローチャートである。
【図２４】本実施例２の分散処理部管理リストを示す説明図である。
【図２５】本実施例３の集中処理部の論理的な構成を示すブロック図である。
【図２６】本実施例３の帯域設定テーブルを示す説明図である。
【図２７】本実施例３の演算結果保持テーブルを示す説明図である。
【図２８】本実施例３の調停部が実行する演算部選定調停処理を示すフローチャートである。
【図２９Ａ】本実施例３の演算部が実行する帯域演算処理のうち、入力パケットを受信するまでに蓄積されるべきトークン量を算出する処理を示すフローチャートである。
【図２９Ｂ】本実施例３の演算部が実行する帯域演算処理のうち、入力パケットが保証内であるか否かを判定する処理を示すフローチャートである。
【図３０】本実施例３の調停部が実行する更新調停処理を示すフローチャートである。
【図３１Ａ】本実施例３の調停部が実行する更新調停処理における演算結果保持テーブルに更新する結果の選択において、同一ＩＤを処理する複数の演算部から同時に通知される帯域制御結果が全て保証内であった場合の例を示す説明図である。
【図３１Ｂ】本実施例３の調停部が実行する更新調停処理における演算結果保持テーブルに更新する結果の選択において、同一ＩＤを処理する複数の演算部から同時に通知される帯域制御結果が全て保証外であった場合の例を示す説明図である。
【図３１Ｃ】本実施例３の調停部が実行する更新調停処理における演算結果保持テーブルに更新する結果の選択において、同一ＩＤを処理する複数の演算部から同時に通知される帯域制御結果が保証内と保証外を含んだ場合の例を示す説明図である。
【図３２】本実施例３の出力判定処理部が実行する出力判定処理を示すフローチャートである。
【図３３Ａ】従来のフローを識別してパケットを分散処理部に振り分ける場合のパケット処理において、同一フローのパケットが複数同時に到着する際のパケット処理のタイミングを示す説明図である。
【図３３Ｂ】本実施例１のパケット処理において、同一フローのパケットが複数同時に到着する際のパケット処理のタイミングを示す説明図である。
【図３３Ｃ】本実施例３のパケット処理において、同一フローのパケットが複数同時に到着する際のパケット処理のタイミングを示す説明図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施例について、図面を参照して説明する。
【実施例１】
【００１５】
本実施例におけるパケット処理の概要を以下に示す。
【００１６】
図１Ａは、従来のフローを識別してパケットを分散処理部に振り分ける場合のパケット処理の概要を示す説明図である。
【００１７】
例えば、同一フローのパケットが到着した場合、パケット通信装置の振分処理はパケットのフローを識別して、同一のフローは同じ分散処理をするようパケットを振分ける。この場合、同一フローのパケット処理の性能は分散処理（例えば＃１）の性能に依存する。
【００１８】
図１Ｂは、本実施例１のパケット処理の概要を示す説明図である。
【００１９】
例えば、同一フローのパケットが到着した場合、本実施例のパケット通信装置は、振分処理がフローを識別せず到着順にラウンドロビンでパケットを分散処理（＃１〜＃Ｋ）に振分ける。本実施例のパケット通信装置は、各分散処理（＃１〜＃Ｋ）に振分けられたパケットの情報を集中処理部に集約し、同一フローのパケットを纏めて処理する。
【００２０】
本実施例におけるパケット到着間隔とパケット処理時間（タイミング）との関係の概要を、図３３Ａ及び図３３Ｂを用いて以下に示す。
【００２１】
図３３Ａは、従来技術のフローを識別してパケットを分散処理部に振り分ける場合のパケット処理において、同一フローのパケットが複数同時に振分処理に到着する際のパケット処理のタイミングを示す説明図である。
【００２２】
簡単化のため、例として図３３Ａでは、振分処理は複数のパケットのヘッダを同時に解析してフローを特定し、１つの分散処理部は１パケット毎にパケットを１ｃｌｋで処理（本実施例では統計処理）可能とした場合において、振分処理に同一フローのパケットが２つずつ同時に到着する例を示す。
【００２３】
また、図３３Ａ、及び、後述する図３３Ｂと図３３Ｃにおいて、振分処理部が最初に受信する入力パケットを第１のパケット（Ｓ１）、第１のパケットと同時に受信する入力パケットを第２のパケット（Ｓ２）、第２のパケットよりも１ｃｌｋ後に受信する入力パケットを第３のパケット（Ｓ３）、第３のパケットと同時に受信する入力パケットを第４のパケット（Ｓ４）と記載する。図３３において、第１のパケット、第２のパケット、第３のパケット、及び第４のパケットのフローＩＤの値は、いずれも“１０”である。
【００２４】
従来技術では、図３３Ａに示すように、振分処理は、第１のパケットと第２のパケットを同時に受信すると、ヘッダを解析してフローを識別する（Ｔ３３０１）。第１のパケットと第２のパケットは、いずれもフローＩＤの値が“１０”であるため、同じ分散処理部（例えば＃１）に振分けられる。従来技術の分散処理部は、１ｃｌｋで１パケット毎にパケットを処理するため、振分処理は１パケット毎に第１のパケットと第２のパケットをＴ３３０２及びＴ３３０３のタイミングで分散処理部（＃１）へ振分ける。分散処理部は、Ｔ３３０２において、第１パケットの統計処理を開始し、Ｔ３３０３において第２パケットの統計処理を開始する。また、振分処理は、第３のパケットと第４のパケットを受信すると、ヘッダを解析してフローを識別する（Ｔ３３０２）。第３のパケットと第４のパケットは、いずれもフローＩＤの値が“１０”であるため、第１パケット及び第２パケットと同じ分散処理部（例えば＃１）に振分けられるが、第１のパケット及び第２のパケットの処理の待ち合わせのため、振分処理は、第３のパケットと第４のパケットをＴ３３０４及びＴ３３０５のタイミングで分散処理部（＃１）へ振分ける。（第３のパケットのヘッダ解析の処理タイミングＴ３３０２の１クロック後のＴ３３０３では、第２パケットの統計処理を実行中であるため、第３のパケットの統計処理は実行出来ない。）分散処理部は、Ｔ３３０４において、第３パケットの統計処理を開始し、Ｔ３３０５において第４パケットの統計処理を開始する。従って、従来では、同一フローのパケットが複数同時に到着すると、前に到着したパケット処理が終了しないうちに、次に処理すべきパケットが到着するため、パケット処理を正常に実行できずオーバーフローが発生する場合がある。
【００２５】
図３３Ｂは、本実施例１のパケット処理において、複数の同一フローのパケットが同時に到着する際のパケット処理のタイミングを示す説明図である。
【００２６】
本実施例では、振分処理は、第１のパケットと第２のパケットを受信すると、第１のパケットと第２のパケットをそれぞれ別の分散処理部（例えば＃１と＃２）に振分ける（Ｔ３３０１）。フローを識別しないため、ここでは処理遅延なしとする。
【００２７】
Ｔ３３０１のタイミングにおいて、分散処理部（＃１）は第１のパケットのヘッダを解析してフローを識別し、分散処理部（＃２）は第２のパケットのヘッダを解析してフローを識別する。その後、各分散処理部は、識別したフローＩＤやパケット長などの情報を集中処理部に転送する。集中処理部は、各分散処理部（＃１と＃２）から取得した情報をもとに、第１のパケットと第２のパケットに関する統計処理を纏めて実行する（Ｔ３３０２）。例えば、第１のパケット長、第２のパケット長とも１００バイトの場合、受信バイト数として２００バイトをカウントする。図３３Ａの分散処理部は、１パケット毎にパケットを処理しているため、１パケット分を１クロックで統計処理していたが、図３３Ｂの集中処理部は、第１のパケットと第２のパケットに関する統計処理を纏めて実行するため、第１のパケットと第２のパケットの統計処理を１クロックで実行できる。
【００２８】
また、振分処理は、第３のパケットと第４のパケットを受信すると、振分処理は同様に、第３のパケットと第４のパケットをそれぞれ別の分散処理部（例えば＃３と＃４）に振分ける（Ｔ３３０２）。
【００２９】
Ｔ３３０２のタイミングにおいて、分散処理部（＃３）は第３のパケットのヘッダを解析してフローを識別し、分散処理部（＃４）は第４のパケットのヘッダを解析してフローを識別する。その後、各分散処理部は、識別したフローＩＤやパケット長などの情報を集中処理部に転送する。集中処理部は、各分散処理部（＃３と＃４）から取得した情報をもとに、第３のパケットと第４のパケットに関する統計処理を纏めて実行する（Ｔ３３０３）。図３３Ａにおいては、Ｔ３３０３のタイミングは第２のパケットの統計処理に割り当てられていたため、第３のパケットの統計処理はＴ３３０４に割り当てられていたところ、図３３Ｂにおいては、Ｔ３３０３のタイミングで第３のパケット及び第４のパケットの統計処理を実行できる。
【００３０】
従って、本実施例では、集中処理部にパケットの情報を集約し、振分処理に同時に到着した複数の同一フローのパケットを纏めて処理することで、同一フローの複数のパケットが同時に到着した場合でも、統計カウント機能のようにパケットが到着する毎に同じフローの情報を更新する必要がある機能をオーバーフローを発生させることなく実現することが出来る。
【００３１】
以下、本実施例１について図２から図１８を用いて説明する。なお、以下に述べる実施例１は本発明の実施例の一つであって、本発明を制限するものではない。
【００３２】
実施例１では、統計カウント機能に本発明を適用する。実施例１では、統計カウント機能の統計情報として、受信パケット数、及び、受信バイト数をカウントする。
【００３３】
図２は、本実施例１のパケット通信装置２の物理的な構成及び論理回路２０２を示すブロック図である。
【００３４】
本実施例のパケット通信装置２は、パケットを他のパケット通信装置へ転送する装置である。パケット通信装置２は、複数のネットワークインタフェースボード（ＮＩＦ）（２００−１〜２００−Ｍ）、及び、スイッチ部２０６を備える。
【００３５】
ＮＩＦ２００は、ネットワークからパケットを受信し、ネットワークへパケットを送信するためのインタフェースである。スイッチ部２０６は、各ＮＩＦ２００に接続される装置であり、ＮＩＦ２００から受信したパケットを、パケットを送信すべきＮＩＦ２００に振り分ける装置である。
【００３６】
各ＮＩＦ２００は、入出力回線インタフェース２０１、論理回路２０２、ＳＷインタフェース２０５、及びＮＩＦ管理部２０８を備える。
【００３７】
入出力回線インタフェース２０１は、通信ポートである。パケット通信装置２は、入出力回線インタフェース２０１及びネットワークを介して、他のパケット通信装置と接続する。実施例１における入出力回線インタフェース２０１は、イーサネット（登録商標）用の回線インタフェースである。
【００３８】
ＳＷインタフェース２０５は、スイッチ部２０６に接続するための装置である。
【００３９】
ＮＩＦ管理部２０８は、例えば、ＣＰＵ等のプロセッサである。ＮＩＦ管理部２０８は、論理回路２０２における処理を制御する。
【００４０】
論理回路２０２は、本実施例のパケットに対する処理を行う回路である。論理回路２０２は、少なくとも一つのメモリ及び少なくとも一つの演算装置（例えば、プロセッサ）を備える。
【００４１】
論理回路２０２は、入力パケット制御部２０３、出力パケット制御部２０４等のパケット処理部を有し、設定レジスタ２０７を備える。
【００４２】
パケット通信装置２が受信したパケットは、入出力回線インタフェース２０１、入力パケット制御部２０３、ＳＷインタフェース２０５、スイッチ部２０６、ＳＷインタフェース２０５、出力パケット制御部２０４、及び、入出力回線インタフェース２０１の順に送信される。
【００４３】
論理回路２０２が有する各処理部は、集積回路等の物理的な装置によって実装されてもよいし、少なくとも一つのプロセッサによって実行されるプログラムによって実装されてもよい。また、複数の処理部（例えば、入力パケット制御部２０３及び出力パケット制御部２０４）が一つの装置又はプログラムによって実装されてもよいし、一つの処理部が複数の装置又は複数のプログラムによって実装されてもよい。
【００４４】
ＮＩＦ管理部２０８は、設定レジスタ２０７を制御する。設定レジスタ２０７は、データを一時的に格納する記憶領域を有し、論理回路２０２に備わる各処理部のレジスタ値を保持する。
【００４５】
設定レジスタ２０７は論理回路２０２を介して論理回路２０２に備わる全ての処理部と接続する。なお、以下において、設定レジスタ２０７の処理内容についての説明を省略するが、論理回路２０２が有する全ての処理部は、設定レジスタ２０７を用いて処理を実行する。
【００４６】
入出力回線インタフェース２０１は、受信したパケット４に後述する装置内ヘッダ３を付加する。
【００４７】
図４は、本実施例１の通信において用いられるパケット４のフォーマットを示す説明図である。図４に示すパケット４のフォーマットは一例であり、本実施例において用いられるパケットは、いかなる情報を含んでもよい。例えば、ＭＡＣアドレスの代わりに、ＩＰアドレスを含んでもよい。パケット４は、宛先ＭＡＣアドレス４０１、送信元ＭＡＣアドレス４０２、ＶＬＡＮヘッダ４０３、イーサタイプ値４０４、ペイロード４０５、及び、フレームチェックシーケンス（ＦＣＳ）４０６を含む。宛先ＭＡＣアドレス４０１、又は、送信元ＭＡＣアドレス４０２には、パケット通信装置２のＭＡＣアドレスが設定される。ＶＬＡＮヘッダ４０３には、フローの識別子となるＶＬＡＮ  ＩＤが設定される。
【００４８】
なお、ペイロード４０５にＭＰＬＳヘッダ又は他のプロトコルのヘッダが設定され、ＭＰＬＳラベル値などをフローの識別子として設定されてもよい。フレームチェックシーケンス（ＦＣＳ）４０６には、フレームの誤りを検出するための値が設定される。
【００４９】
図３は、本実施例１のパケット４に付加される装置内ヘッダ３のフォーマットを示す説明図である。装置内ヘッダ３は、出力ネットワークインタフェースボード識別子（出力ＮＩＦ  ＩＤ）３０１、フローＩＤ３０２、及び、パケット長３０３を含む。出力ＮＩＦ  ＩＤ３０１は、内部ルーティング情報である。本実施例の内部ルーティング情報とは、パケット通信装置２が受信したパケット４を、パケット通信装置２のいずれのＮＩＦ２００のポートから出力するかを示す情報である。スイッチ部２０６は、内部ルーティング情報に従い、スイッチ部２０６に送信された入力パケットを特定のＮＩＦ２００の特定のＳＷインタフェース２０５に転送する。
【００５０】
入出力回線インタフェース２０１は、受信したパケット４をパケット通信装置２において処理するため、受信したパケット４に装置内ヘッダ３を付加する。装置内ヘッダ３が付加され、入出力回線インタフェース２０１からスイッチ部２０６に向けて送信されるパケット４を、以降において、入力パケットと記載する。
【００５１】
入出力回線インタフェース２０１は、受信したパケット４に装置内ヘッダ３を付加する際、出力ＮＩＦ  ＩＤ３０１、及び、フローＩＤ３０２にｎｕｌｌ値等の値を格納する。すなわち、入出力回線インタフェース２０１は、出力ＮＩＦ  ＩＤ３０１、及び、フローＩＤ３０２に格納される値を決定しない。出力ＮＩＦ  ＩＤ３０１、及び、フローＩＤ３０２には、入力パケット制御部２０３によって値が格納される。
【００５２】
入出力回線インタフェース２０１は、受信したパケット４のパケット長を取得し、装置内ヘッダ３のフレーム長３０３に、取得されたパケット長を格納する。その後、入出力回線インタフェース２０１は、パケット４を入力パケット制御部２０３に送信する。
【００５３】
入力パケット制御部２０３は、入出力回線インタフェース２０１から受信したパケット４に関して、後述するパケット処理を実行する。本パケット処理時に、装置内ヘッダ３の出力ＮＩＦ  ＩＤ３０１及びフローＩＤ３０２を追加する。
【００５４】
パケット処理後、入力パケット制御部２０３は、入力パケットをＳＷインタフェース２０５に送信する。ＳＷインタフェース２０５は、受信した入力パケットをスイッチ部２０６に転送する。
【００５５】
スイッチ部２０６は、各ＮＩＦ２００のＳＷインタフェース２０５から入力パケットを受信した後、入力パケットの出力ＮＩＦ  ＩＤ３０１を参照することによって、受信した入力パケットの転送先であるＮＩＦ２００を特定する。次に、スイッチ部２０６は、特定されたＮＩＦ２００に対応するＳＷインタフェース２０５に、受信した入力パケットを、出力パケットとして転送する。
【００５６】
なお、本実施例において、スイッチ部２０６から入出力回線インタフェース２０１へ送信されるパケット４を出力パケットと記載する。
【００５７】
ＳＷインタフェース２０５は、受信した出力パケットを出力パケット制御部２０４に転送する。
【００５８】
前述の例では、入力パケット制御部２０３がパケット処理を実行した。しかし、出力パケット制御部２０４が、入力パケット制御部２０３の代わりにパケット処理を実行してもよい。
【００５９】
出力パケット制御部２０４がパケット処理を実行する場合、パケット処理後、出力パケット制御部２０４は、出力パケットを入出力回線インタフェース２０１に送信する。
【００６０】
出力パケット制御部２０４がパケット処理を実施しない場合、出力パケット制御部２０８は、ＳＷインタフェース２０５から受信した出力パケットを、そのまま入出力回線インタフェース２０１に転送する。
【００６１】
入出力回線インタフェース２０１は、受信した出力パケットから装置内ヘッダ３を除去する。その後、入出力回線インタフェース２０１は、図４に示すパケット４のフォーマットによって、出力パケットを他の装置へ転送する。
【００６２】
図５は、本実施例１の入力パケット制御部２０３の論理的な構成を示すブロック図である。
【００６３】
入力パケット制御部２０３は、振分部５０２、複数の分散処理部５０３（５０３−１〜５０３−Ｎ）（Ｎは任意の自然数）、多重部５０４、及び、集中処理部５０５を備える。
【００６４】
振分部５０２は、入力パケット制御部２０３が入出力回線インタフェース２０１から入力パケットを受信した場合、後述する振分け処理Ｓ９５０を実行する処理部である。振分部５０２は、振分け処理Ｓ９５０において、パケット処理を実行する分散処理部５０３を、分散処理部５０３−１〜分散処理部５０３−Ｎから決定する。
【００６５】
分散処理部５０３は、後述するパケット処理を実行する。分散処理部５０３は、本パケット処理時に、集中処理部５０５にフローＩＤやパケット長などのパケット情報を転送する。パケット処理後、分散処理部５０３は、入力パケットを多重部５０４に送信する。
【００６６】
集中処理部５０５は、後述するパケット処理を実行する。複数の分散処理部５０３（５０３−１〜５０３−Ｎ）から転送されるパケット情報を集約して処理し、後述する統計情報テーブル７０４を更新する。
【００６７】
多重部５０４は、各分散処理部５０３から受信したパケットを多重し、到着順にＳＷインタフェース２０５に送信する。
【００６８】
本実施例において、入力パケット制御部２０３がパケット処理に要する時間はあらかじめ定められる。
【００６９】
さらに、本実施例において、分散処理部５０３の数Ｎは、入力パケット制御部２０３において受信するパケット到着間隔（複数のパケットが１ｃｌｋ以内に同時到着する場合はそのパケット数）と分散処理部５０３のパケット処理時間とに基づいて決定される。なお、最短パケット到着間隔は、パケット通信装置２が接続される回線に従って、あらかじめ定められる値である。
【００７０】
例えば、入力パケット制御部２０３に１ｃｌｋ以内に２つのパケットが同時に到着し、分散処理部５０３のパケット処理時間が２０ｃｌｋである場合、同時到着パケット数に分散処理部５０３のパケット処理時間を乗算（余りは繰上げ）した結果は“４０”である。このため、分散処理部５０３の数Ｎは“４０”にあらかじめ決定される。
【００７１】
図６は、本実施例１の分散処理部５０３の論理的な構成を示すブロック図である。
【００７２】
分散処理部５０３は、入力ヘッダ解析部６０１、入力ヘッダ処理部６０２、及び、出力判定処理部６０３を備える。
【００７３】
入力ヘッダ解析部６０１は、振分部５０２から入力パケットを受信した場合、後述するヘッダ解析処理Ｓ１０５０を実行する処理部である。入力ヘッダ解析部６０１は、ヘッダ解析処理Ｓ１０５０において、パケット４のフローを識別し、集中処理部５０５が処理する時に必要となるパケット情報を転送し、ヘッダ処理部６０２へパケットを転送する。
【００７４】
入力ヘッダ処理部６０２は、入力ヘッダ解析部６０１から入力パケットを受信した場合、入力ヘッダ解析部６０１で識別されたフローに従ってＶＬＡＮタグの処理を実行する。ＶＬＡＮタグの処理とは、例えば、ＶＬＡＮタグの透過、変換、付与及び削除である。すなわち、ＶＬＡＮタグの処理とは、入力パケットのＶＬＡＮヘッダを、パケット通信装置２から出力されるパケットのＶＬＡＮヘッダに変換する処理である。入力ヘッダ処理部６０２は、ＶＬＡＮタグの処理において、宛先ＭＡＣアドレス４０１及び送信元ＭＡＣアドレス４０２を、入出力回線インタフェース２０１に設定される値によって上書きしてもよいし、あらかじめ登録されていたフロー毎の値によって上書きしてもよい。ＶＬＡＮタグを処理した後、入力ヘッダ処理部６０２は、入力パケットを出力判定処理部６０３に送信する。この時、入力ヘッダ処理部６０２は、後述する集中処理部５０５の演算終了通知のタイミングと同じタイミングでパケットを出力判定処理部６０３に送信する。
【００７５】
出力判定処理部６０３は、入力ヘッダ処理部６０２から入力パケットを受信した場合、後述する出力判定処理Ｓ１１５０を実行する処理部である。出力判定処理部６０３は、出力判定処理Ｓ１１５０において、集中処理部５０５の演算終了と同時に、多重部５０４へパケットを転送する。
【００７６】
図７は、本実施例１の集中処理部５０５の論理的な構成を示すブロック図である。
【００７７】
集中処理部５０５は、調停部７０１、演算フロー管理リスト７０２、演算部７０３（７０３−１〜７０３−Ｎ）（Ｎは任意の自然数）、統計情報テーブル７０４を備える。
【００７８】
調停部７０１は、分散処理部５０３（５０３−１〜５０３−Ｎ）から処理要求を受信した場合、後述する演算部選定調停処理Ｓ１２５０を実行する処理部である。調停部７０１は、分散処理部５０３から受信するフローＩＤによりフローを識別し、さらに、演算フロー管理リスト７０２を参照する。そして、これによって、入力パケットに関する統計カウント処理を実行する演算部７０３を、演算部７０３−１〜演算部７０３−Ｎから決定する。
【００７９】
また、調停部７０１は、演算フロー管理リスト７０２を、論理回路２１０に備わるメモリ等に保持する。そして、調停部７０１は、演算部選定調停処理Ｓ１２５０及び演算フロー管理処理Ｓ１４５０において、演算フロー管理リスト７０２を更新する。
【００８０】
さらに、調停部７０１は、演算部７０３から演算終了通知を受信した場合、後述する更新調停処理Ｓ１６５０を実行する処理部である。調停部７０１は、演算部７０３が更新した統計情報を統計情報テーブル７０４に書き戻し、処理要求を送信してきた分散処理部５０３に演算終了通知を転送する。
【００８１】
演算フロー管理リスト７０２は、演算部７０３が処理する入力パケットのフローＩＤと、演算部７０３の処理状況とを示す。
【００８２】
演算部７０３は、後述する統計情報処理Ｓ１５５０において、統計情報テーブル７０４４に含まれる各フローの情報を更新する。また、演算部７０３は、統計情報処理Ｓ１５５０において更新した結果を、調停部７０１に送信する。演算部７０３は、集中処理部５０５にＮ個（Ｎは任意の自然数）備わる。
【００８３】
図８は、本実施例１の統計情報テーブル７０４を示す説明図である。
【００８４】
統計情報テーブル７０４は、パケット通信装置２が受信したパケットについての情報を有するテーブルである。統計情報テーブル７０４は、フローＩＤ８０１、受信パケット数８０２、及び、受信バイト数８０３を含む。
【００８５】
フローＩＤ８０１は、入力パケットのフローＩＤを含む。受信パケット数８０２は、振分部５０２が受信した入力パケットの数を含む。受信バイト数８０３は、振分部５０２が受信した入力パケットのバイト数の合計値を示す。
【００８６】
図１３は、本実施例１の演算フロー管理リスト７０２を示す説明図である。
【００８７】
演算フロー管理リスト７０２は、演算部１３０１、フローＩＤ１３０２、及び、処理状況カウンタ１３０３を含む。
【００８８】
演算部１３０１は、演算部７０３−１〜７０３−Ｎを一意に示す識別子を含む。本実施例の演算部１３０１は、演算部７０３を数値によって識別する値を含む。演算部１３０１に格納される値は、管理者等によってあらかじめ設定される。フローＩＤ１３０２は、演算部７０３が処理する入力パケットに割り当てられたフローを一意に示すフローＩＤを含む。フローＩＤ１３０２に格納される値は、調停部７０１によって更新される。また、フローＩＤ１３０２に格納される値は、入力ヘッダ解析部６０１において識別したフローＩＤの値に対応する。
【００８９】
処理状況カウンタ１３０３は、演算部７０３における演算処理（統計情報処理）の状況を示す値を含む。本実施例の処理状況カウンタ１３０３は、演算処理が開始されてから経過した実行時間に関する値を含む。
【００９０】
以下に示す処理状況カウンタ１３０３は、減算カウンタによって、演算処理が終了するまでの残り時間を示す。具体的には、演算処理が開始された場合、処理状況カウンタ１３０３には演算時間が格納される。そして、調停部７０１が単位時間（本実施例において１ｃｌｋ）毎に処理状況カウンタ１３０３の値を減算する。処理状況カウンタ１３０３に“０”が格納されるエントリは、演算部１３０１が示す演算部７０３は演算処理を終了したことを示す。また、処理状況カウンタ１３０３に“０”以外の正の数が格納されるエントリは、演算部１３０１が示す演算部７０３は演算処理中であることを示す。
【００９１】
以下において、処理状況カウンタ１３０３が減算カウンタである場合の処理を記載するが、処理状況カウンタ１３０３は加算カウンタによって、演算処理が開始されてから経過した時間を示してもよい。この場合、調停部７０１は、所定の演算時間と処理状況カウンタ１３０３とを比較することによって、演算処理の状況を取得しても良い。
【００９２】
以下に、振分部５０２が実行する振分け処理Ｓ９５０について説明する。図９は、本実施例１の振分部５０２が実行する振分け処理Ｓ９５０を示すフローチャートである。
【００９３】
振分部５０２は、入出力回線インタフェース２０１から入力パケットを受信した場合（複数の入力パケットを同時に受信する場合もある）（Ｓ９００）、内部カウンタの値（本カウンタは１〜Ｎの値を取り、Ｎの次は１に戻る）が示す番号から、パケットを受信した順番に分散処理部５０３（５０３−１〜５０３−Ｎ）にパケットを転送する（Ｓ９０１）。Ｓ９０１の後、振分部５０２は、内部カウンタの値を受信したパケット数分カウントアップし（Ｓ９０２）、図９に示す振分け処理Ｓ９５０を終了する（Ｓ９０３）。
【００９４】
以下に、入力ヘッダ解析部６０１が実行するヘッダ解析処理Ｓ１０５０について説明する。図１０は、本実施例１の入力ヘッダ解析部６０１が実行するヘッダ解析処理Ｓ１０５０を示すフローチャートである。
【００９５】
入力ヘッダ解析部６０１は、振分部５０２から入力パケットを受信した場合（Ｓ１０００）、入力パケットに含まれる装置内ヘッダ３からパケット長３０３の値を取得する（Ｓ１００１）。Ｓ１００１の後、受信した入力パケットの４０３に基づいて、パケット４のフローを識別し、これによって、出力ＮＩＦ  ＩＤを決定する（Ｓ１００２）。Ｓ１００２の後、入力ヘッダ解析部６０１は、処理開始トリガ、フローＩＤ、及び、取得パケット長を集中処理部５０５へ出力する（Ｓ１００３）。Ｓ１００３の後、入力ヘッダ解析部６０１は、入力パケットの装置内ヘッダ３の出力ＮＩＦ  ＩＤ３０１、及び、フローＩＤ３０２に値を格納し、入力ヘッダ処理部６０２へパケットを転送し（Ｓ１００４）、図１０に示すヘッダ解析処理Ｓ１０５０を終了する（Ｓ１００５）。
【００９６】
以下に、本実施例１の出力判定処理部６０３が実行する出力判定処理Ｓ１１５０について説明する。図１１は、本実施例１の出力判定処理部６０３が実行する出力判定処理Ｓ１１５０を示すフローチャートである。
【００９７】
出力判定処理部６０３は、入力ヘッダ処理部６０２から入力パケットを受信した場合（Ｓ１１００）、集中処理部５０５から演算終了通知があるか否かを判定する（Ｓ１１０１）。Ｓ１１０１において、演算終了通知があると判定された場合、多重部５０４へパケットを転送し（Ｓ１１０２）、図１１に示す出力判定処理Ｓ１１５０を終了する（Ｓ１１０４）。また、Ｓ１１０１において、演算終了通知がないと判定された場合、入力パケットを廃棄し（Ｓ１１０３）、図１１に示す出力判定処理Ｓ１１５０を終了する（Ｓ１１０４）。
【００９８】
以下に、本実施例１の調停部７０１が実行する演算部選定調停処理Ｓ１２５０について説明する。図１２は、本実施例１の調停部７０１が実行する演算部選定調停処理Ｓ１２５０を示すフローチャートである。
【００９９】
調停部７０１は、分散処理部５０３（５０３−１〜５０３−Ｎ）から処理開始トリガを受信した場合（複数の処理開始トリガを同時に受信する場合もある）（Ｓ１２００）、処理開始トリガと同時に受信するフローＩＤ、及び、パケット長を取得し、処理開始トリガの到着順を保持する（Ｓ１２０１）。Ｓ１２０１の後、調停部７０１は、演算フロー管理リスト７０２の全てのエントリの処理状況カウンタ１３０３の値が“０”と異なるか否かを判定する（Ｓ１２０２）。
【０１００】
Ｓ１２０２において、演算フロー管理リスト７０２の全てのエントリの処理状況カウンタが“０”と異なると判定された場合、全ての演算部７０３（７０３−１〜７０３−Ｎ）は、演算処理を実行中である。新規フローの場合の演算処理を受け付けることが出来ないため、調停部７０１は、入力パケットを廃棄判定し（Ｓ１２０３）、図１２に示す演算部選定調停処理Ｓ１２５０を終了する（Ｓ１２１０）。
【０１０１】
また、Ｓ１２０２において、演算フロー管理リスト７０２のエントリのうち、処理状況カウンタ１３０３が“０”であるエントリが少なくとも１以上ある場合、全ての演算部７０３（７０３−１〜７０３−Ｎ）のうち少なくとも一つの演算部７０３は、演算処理を実行していない。このため、調停部７０１は、Ｓ１２０１において取得したフローＩＤの値を検索キー（フローＩＤ８０１）として統計情報テーブル７０４を検索し、受信パケット数８０２、及び、受信バイト数８０３の情報を取得する（Ｓ１２０４）。
【０１０２】
なお、Ｓ１２０２において、Ｓ１２００で複数の処理開始トリガを同時に受信した場合は、調停部７０１は、演算部７０３において、処理開始トリガを受信したフロー分の数の演算部が処理可能かどうかを確認する。調停部７０１は、演算フロー管理リスト７０２のエントリのうち、処理状況カウンタ１３０３が“０”であるエントリがＳ１２００で調停部７０１が同時に処理開始トリガを受信した複数フロー分ある場合、Ｓ１２０４の処理に進む。調停部７０１は、処理状況カウンタ１３０３が“０”であるエントリが、Ｓ１２００で同時に処理開始トリガを受信した複数フロー分ない場合、Ｓ１２０３の処理に進む。また、処理状況カウンタ１３０３が“０”であるエントリがＳ１２００で同時に処理開始トリガを受信した複数フロー分ない場合は、処理状況カウンタ１３０３が“０”であるエントリ分のフローについての処理はＳ１２０４の処理に進み、残りのフローの処理はＳ１２０３に進んでも良い。
【０１０３】
Ｓ１２０４の後、Ｓ１２０１において取得したフローＩＤの値と処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致するか否かを判定する（Ｓ１２０５）。
【０１０４】
なお、Ｓ１２０５において、調停部７０１は、Ｓ１２０１において取得したフローＩＤの値に対応する値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致する場合、取得したフローＩＤの値に対応する値と処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値とが一致していると判定してもよい。
【０１０５】
Ｓ１２０５において、Ｓ１２０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致しないと判定された場合、調停部７０１は、演算処理を実行していない演算部に、入力パケットに関する演算処理を新規に実行させるため、Ｓ１２０８の処理を実行する。
【０１０６】
また、Ｓ１２０５において、Ｓ１２０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致すると判定された場合、入力パケットのフローＩＤに対応する演算部７０３は、入力パケットに関する演算処理を継続して実行できる。このため、調停部７０１は、取得したフローＩＤの値とフローＩＤ１３０２とが一致したエントリの演算部１３０１が示す演算部７０３を、入力パケットに関する演算処理を継続して実行する演算部７０３に決定する。
【０１０７】
そして、調停部７０１は、取得されたフローＩＤの値とフローＩＤ１３０２とが一致したエントリの処理状況カウンタ１３０３の値を、演算時間を示す値に更新する（Ｓ１２０６）。例えば、調停部７０１は、演算時間が１０ｃｌｋの場合、取得されたフローＩＤの値とフローＩＤ１３０２とが一致したエントリの処理状況カウンタ１３０３の値を“１０”に更新する。
【０１０８】
Ｓ１２０６において処理状況カウンタ１３０３を更新することによって、調停部７０１は、各演算部７０３が演算処理を終了するまで実行していることを示す。
【０１０９】
Ｓ１２０６の後、調停部７０１は、Ｓ１２０１において処理開始トリガと同時に取得したフローのうち、フローＩＤが同じであった数、同じフローＩＤのパケット長の合算値を、それぞれ取得パケット数、取得パケット長としてフロー毎に保持する（Ｓ１２１１）。取得パケット数は、Ｓ１２０１において取得したフローＩＤが同じであった数、すなわち、同一フローＩＤの同時入力パケット数である。取得パケット長は、Ｓ１２０１において取得した同じフローＩＤのパケット長の合算値、すなわち、同一フローＩＤの同時入力パケットの合計パケット長である。
Ｓ１２１１の後、調停部７０１は、取得したフローＩＤの値とフローＩＤ１３０２の値とが一致した演算フロー管理リスト７０２のエントリの演算部１３０１が示す演算部７０３へ、処理開始トリガ、新規／継続パラメータ、取得パケット数、取得パケット長、受信パケット数、及び、受信バイト数を含む演算通知を出力する（Ｓ１２０７）。
【０１１０】
Ｓ１２０７において、調停部７０１は、新規／継続パラメータを、継続を示す値に決定し、継続を示す新規／継続パラメータ（本実施例において“１”）を、演算通知に含める。本実施例における新規／継続パラメータとは、各演算部７０３にどのような演算処理を実行するかを通知するための値である。Ｓ１２０７の後、図１２に示す演算部選定調停処理Ｓ１２５０を終了する（Ｓ１２１０）。
【０１１１】
Ｓ１２０５において、Ｓ１２０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致しないと判定された場合、調停部７０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト１３０２のエントリのうち、演算部１３０１の値が最も若い番号のエントリを抽出する。調停部７０１は、抽出されたエントリの演算部１３０１が示す演算部７０３を、入力パケットに関する演算処理を新規に実行する演算部７０３に決定する。
【０１１２】
そして、調停部７０１は、抽出されたエントリのフローＩＤ１３０２を、Ｓ１２０１で取得したフローＩＤの値によって更新する。また、調停部７０１は、抽出されたエントリの処理状況カウンタ１３０３を、演算時間を示す値に更新する（Ｓ１２０８）。
【０１１３】
なお、前述のＳ１２０８において、調停部７０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト１３０２のエントリのうち、演算部１３０１の値が最も若い番号（小さい番号）のエントリを抽出したが、調停部７０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト７０２のエントリのうちのいずれかであれば、いかなる規則に従ってエントリを抽出してもよい。例えば、調停部７０１は、最も値が大きい番号のエントリを抽出してもよいし、管理者によってあらかじめ抽出するエントリの順番を定められていてもよい。
Ｓ１２０８の後、調停部７０１は、Ｓ１２０１において取得したフローＩＤが同じであった数、Ｓ１２０１において取得した同じフローＩＤのパケット長の合算値を、それぞれ取得パケット数、取得パケット長として保持する（Ｓ１２１２）。
Ｓ１２１２の後、調停部７０１は、Ｓ１２０７及びＳ１２０９において決定された演算部７０３へ、処理開始トリガ、新規／継続パラメータ、取得パケット数、取得パケット長、受信パケット数、及び、受信バイト数を含む演算通知を出力する（Ｓ１２０９）。Ｓ１２０９において調停部７０１は、新規／継続パラメータを新規を示す値に決定し、新規を示す新規／継続パラメータ（本実施例において“０”）を、演算通知に含める。
【０１１４】
Ｓ１２０７及びＳ１２０９において、出力される演算通知に含まれる処理開始トリガは、演算部７０３が後述する統計情報処理Ｓ１５５０を開始することを示す値である。また、演算通知に含まれる取得パケット数は、Ｓ１２１１あるいはＳ１２１２において保持した取得パケット数である。また、演算通知に含まれる取得パケット長は、Ｓ１２１１あるいはＳ１２１２において保持した取得パケット長である。また、受信パケット数、及び、受信バイト数は、Ｓ１２０４において取得した受信パケット数、及び、受信バイト数である。
【０１１５】
また、Ｓ１２０７及びＳ１２０９において、同時に処理開始トリガを受信した同じフローＩＤのフローの入力パケット数、及び、その合計パケット長を、取得パケット数、及び、取得パケット長として一つの演算部７０３に出力する。よって、同じフローＩＤの入力パケットの処理開始トリガを集中処理部５０５で同時に受信しても、オーバーフローを発生することなく統計情報処理を実行可能である。
【０１１６】
Ｓ１２０９の後、図１２に示す演算部選定調停処理Ｓ１２５０を終了する（Ｓ１２１０）。
【０１１７】
以下に、調停部７０１が実行する演算フロー管理処理Ｓ１４５０について説明する。
【０１１８】
図１４は、本実施例１の調停部７０１が実行する演算フロー管理処理Ｓ１４５０を示すフローチャートである。
【０１１９】
調停部７０１は、１クロック毎に（Ｓ１４００）、演算フロー管理リスト７０２の全てのエントリの処理状況カウンタ１３０３が０であるか否かを判定する（Ｓ１４０１）。
【０１２０】
演算フロー管理リスト７０２の全てのエントリの処理状況カウンタ１３０３が０であると、Ｓ１４０１において判定された場合、調停部７０１は、演算フロー管理処理Ｓ１４５０を終了する（Ｓ１４０３）。
【０１２１】
また、演算フロー管理リスト７０２のエントリに処理状況カウンタ１３０３が０でないエントリがあるとＳ１４０１において判定された場合、調停部７０１は、処理状況カウンタ１３０３の列に含まれる０以外の値から１を減算する（Ｓ１４０２）。Ｓ１４０２の後、調停部７０１は、演算フロー管理処理Ｓ１４５０を終了する（Ｓ１４０３）。
【０１２２】
以下に、演算部７０３（７０３−１〜７０３−Ｎ）が実行する統計情報処理Ｓ１５５０について説明する。
【０１２３】
図１５は、本実施例１の演算部７０３が実行する統計情報処理Ｓ１５５０を示すフローチャートである。
【０１２４】
演算部７０３は、調停部７０１から処理開始トリガを含む演算通知を受信した場合（Ｓ１５００）、受信した演算通知に含まれる新規／継続パラメータ、取得パケット数、取得パケット長、受信パケット数、及び、受信バイト数を取得する（Ｓ１５０１）。
【０１２５】
Ｓ１５０１の後、演算部７０３は、新規／継続パラメータが“０”であるか否か、すなわち、新規／継続パラメータが新規を示すか否かを判定する（Ｓ１５０２）。
【０１２６】
新規／継続パラメータが“０”である場合、すなわち、新規／継続パラメータが新規を示すとＳ１５０２において判定された場合、演算部７０３は、Ｓ１５０４の処理へ進む。
【０１２７】
新規／継続パラメータが“０”ではない場合、すなわち、新規／継続パラメータが継続を示すとＳ１５０２において判定された場合、演算部７０３は、演算部７０３が継続処理用に内部保持する前回演算結果（前回受信パケット数、及び、前回受信バイト数）を取得する（Ｓ１５０３）。継続処理用に内部保持される前回演算結果とは、統計情報処理が全て終了する前に次の統計情報処理を継続して実行するために、演算部７０３が、論理回路２０２に保持する演算結果である。Ｓ１５０３において、内部保持される前回演算結果を取得することによって、演算部７０３は、Ｓ１５０１において受信した演算通知に含まれる受信パケット数、及び、受信バイト数を更新し、Ｓ１５０４の処理へ進む。調停部が、同一フローを処理している演算部に処理を割り当て、演算部の内部に保持される前回演算結果を用いることによって、同じフローの入力パケットを連続して受信しても、オーバフローを発生することなく、正常に統計情報処理を実行可能である。
【０１２８】
Ｓ１５０２（新規／継続パラメータが“０”である場合）又はＳ１５０３の後、演算部７０３は、受信パケット数（Ｓ１５０１において演算通知と同時に取得した受信パケット数、又は、Ｓ１５０３において取得した前回受信パケット数）に、Ｓ１５０１において演算通知と同時に取得した取得パケット数分を加算する。また、演算部７０３は、受信バイト数（Ｓ１５０１において取得した受信バイト数、又は、Ｓ１５０３において取得した前回受信バイト数）に、Ｓ１５０１において演算通知と同時に取得した取得パケット長分を加算する。
【０１２９】
そして、演算部７０３は、加算結果を、更新された受信パケット数、及び、受信バイト数として取得し、取得した、更新された受信パケット数、及び、受信バイト数を含む演算終了通知を調停部７０１に転送する（Ｓ１５０４）。
【０１３０】
Ｓ１５０４の後、演算部７０３は、更新した受信パケット数、及び、更新した受信バイト数を、前回受信パケット数及び前回受信バイト数として次パケットの継続処理用に内部保持する（Ｓ１５０５）。
【０１３１】
Ｓ１５０５の後、演算部７０３は、統計情報処理Ｓ１５５０を終了する（Ｓ１５０６）。
【０１３２】
以下に、調停部７０１が実行する更新調停処理Ｓ１６５０について説明する。
【０１３３】
図１６は、本実施例１の調停部７０１が実行する更新調停処理Ｓ１６５０を示すフローチャートである。
【０１３４】
調停部７０１は、演算部７０３（７０３−１〜７０３−Ｎ）から演算終了通知を受信した場合（Ｓ１６００）、受信した演算終了通知に含まれる受信パケット数、及び、受信バイト数を取得し、統計情報テーブル７０４に書き戻す（Ｓ１６０１）。ここで、従来技術では、受信したフロー数の回数分、統計情報テーブルへの書き戻しを行うが、本実施例では、同時に処理開始トリガを受信した同じフローＩＤのフローの取得パケット数、及び、取得パケット長の合計値を用いて一つの演算部７０３で統計情報処理を行う。従って、従来技術よりも書き戻しの回数を削減することが出来る。
【０１３５】
Ｓ１６０１の後、調停部７０１は、演算部選定調停処理Ｓ１２５０において保持した処理開始トリガの到着順から、処理開始トリガの送信元の分散処理部５０３（５０３−１〜５０３−Ｎ）を特定し、特定した分散処理部５０３へ演算終了通知を転送する（Ｓ１６０２）。
【０１３６】
Ｓ１６０２の後、調停部７０１は、更新調停処理Ｓ１６５０を終了する（Ｓ１６０３）。
【０１３７】
前述のとおり、実施例１によれば、パケット通信装置２は、調停部７０１において、ラウンドロビンで各分散処理部５０３（５０３−１〜５０３−Ｎ）に振分けられたパケットの情報を集約し、演算部７０３（７０３−１〜７０３−Ｎ）へ通知する。これによって、実施例１の演算部７０３は、同一フローのパケットに関する統計カウント処理を同時に実行することが可能である。
【０１３８】
従って、実施例１によれば、マルチコア化されたパケット処理エンジンにおいて、１つの分散処理部への負荷集中による性能劣化を抑えることができる。さらに、分散処理部を増設することでスケーラブルにパケット処理エンジンの高速化が可能となる。
【０１３９】
なお、実施例１では、振分部５０２は、入力パケット単位で分散処理部５０３（５０３−１〜５０３−Ｎ）へ入力パケットを振分けたが、後述するフラグメントヘッダ５を付与し、入力パケットを断片化して分散処理部５０３へ入力パケットを振分けても良い。
【０１４０】
図１７は、本実施例１のパケットに付加されるフラグメントヘッダ５のフォーマットを示す説明図である。
【０１４１】
図１７に示すフラグメントヘッダ５のフォーマットは一例であり、本実施例において用いられるフラグメントヘッダは、いかなる情報を含んでもよい。
【０１４２】
フラグメントヘッダ５は、総フラグメント数１７０１、シーケンス番号１７０２、及び、フラグメント長１７０３を含む。
【０１４３】
総フラグメント数１７０１は、入力パケット（装置内ヘッダ３が付与されたパケット４）が断片化された総数が設定される。シーケンス番号１７０２は、断片化された入力パケットの順番が設定される。フラグメント長１７０３は、断片化された入力パケットの長さが設定される。
【０１４４】
図１８は、本実施例１のパケットのフラグメント処理の概要を示す説明図である。
【０１４５】
振分部７０２は、受信した入力パケットを断片化し、フラグメントヘッダ５を付加して分散処理部５０３（５０３−１〜５０３−Ｎ）に転送する。
【０１４６】
多重部５０４は、分散処理部５０３（５０３−１〜５０３−Ｎ）から断片化された入力パケットを受信した場合、装置内ヘッダ５の総フラグメント数１７０１、シーケンス番号１７０２、及び、フラグメント長１７０３を参照し、入力パケットを再構築しても良い。
【０１４７】
また、振分部５０２は、入力パケットのヘッダ部分（例えば、宛先ＭＡＣアドレス４０１からイーサタイプ値４０４まで）のみを分散処理部５０３へ振分け、残りのペイロード部分は多重部５０４へ転送し、分散処理部５０３の処理が終了するまで待合せておいても良い。
【０１４８】
多重部５０４は、分散処理部５０３（５０３−１〜５０３−Ｎ）から入力パケットのヘッダ部分を受信した場合、待合せておいた残りのペイロード部分を受信し、入力パケットを再構築しても良い。
【実施例２】
【０１４９】
以下、本実施例２について図１９から図２４を用いて説明する。なお、以下に述べる実施例２は本発明の実施例の一つであって、本発明を制限するものではない。
【０１５０】
実施例１におけるパケット通信装置２は、本発明の集中・分散処理方法を実装し、統計カウント処理を実行した。実施例２におけるパケット通信装置は、さらに、入力パケットの帯域に応じて利用する分散処理部の数を変更する。実施例２において、入力パケットの帯域を監視するため、パケット通信装置の入力パケット制御部は、帯域監視部を備える。
【０１５１】
図１９は、本実施例２の入力パケット制御部１９００の論理的な構成を示すブロック図である。
【０１５２】
実施例２の入力パケット制御部１９００は、帯域監視バッファ１９、帯域監視部１９０１、振分部１９０２、分散処理部管理リスト１１９、複数の分散処理部５０３（５０３−１〜５０３−Ｎ）（Ｎは任意の自然数）、多重部１９０４、及び、集中処理部５０５を備える。
【０１５３】
実施例２における、分散処理部５０３、及び、集中処理部５０５は、実施例１における、分散処理部５０３、及び、集中処理部５０５と同じである。
【０１５４】
帯域監視バッファ１９は、入力パケットを格納するために使用される。
【０１５５】
帯域監視部１９０１は、入力パケット制御部１９００が入出力回線インタフェース２０１から入力パケットを受信した場合、後述する帯域監視バッファ書込み処理Ｓ２０５０を実行し、入力パケットを帯域監視バッファ１９に格納する処理部である。
【０１５６】
また、帯域監視部１９０１は、振分部１９０２からパケット読出し要求を受信した場合、後述する帯域監視バッファ読出し処理Ｓ２２５０を実行し、帯域監視バッファ１９から入力パケットを読出し、入力パケットを振分部１９０２へ転送する処理部である。
【０１５７】
さらに、帯域監視部１９０１は、帯域監視バッファ１９に蓄積されたパケット量に応じて、利用する分散処理部の数（後述するＸ）（Ｘは１〜Ｎの任意の自然数）を決定する。
【０１５８】
振分部１９０２は、帯域監視部１９０１からパケット送信要求を受信した場合、後述する振分け処理Ｓ２３５０を実行する処理部である。振分部１９０２は、振分け処理Ｓ２３５０において、パケット処理を実行する分散処理部５０３を、分散処理部５０３−１〜分散処理部５０３−Ｘから決定する。なお、Ｘは、帯域監視部１９０１により決定される。
【０１５９】
分散処理部管理リスト１１９は、振分部１９０２が入力パケットを振分けた分散処理部５０３（５０３−１〜５０３−Ｎ）のＩＤと、分散処理部５０３の処理状況とを示す。
【０１６０】
多重部１９０４は、各分散処理部５０３から受信したパケットを多重し、到着順にＳＷインタフェース２０５に送信する。また、多重部１９０４は、帯域監視部１９０１により決定される利用する分散処理部の数Ｘに応じて、多重するパケットが、利用している分散処理部から受信しているかどうか、到着順を管理する。
【０１６１】
図２４は、本実施例２の分散処理部管理リスト１１９を示す説明図である。
【０１６２】
分散処理部管理リスト１１９は、分散処理部２４０１、及び、処理状況カウンタ２４０２を含む。
【０１６３】
分散処理部２４０１は、分散処理部５０３−１〜５０３−Ｎを一意に示す識別子を含む。本実施例の分散処理部２４０１は、分散処理部５０３を数値によって識別する値を含む。分散処理部２４０１に格納される値は、管理者等によってあらかじめ設定される。
【０１６４】
処理状況カウンタ２４０２は、分散処理部５０３におけるパケット処理の状況を示す値を含む。本実施例の処理状況カウンタ２４０２は、パケット処理が開始されてから経過した実行時間に関する値を含む。
【０１６５】
以下に示す処理状況カウンタ２４０２は、実施例１の演算フロー管理処理Ｓ１４５０と同様に、減算カウンタによって、パケット処理が終了するまでの残り時間を示す。具体的には、パケット処理が開始された場合、処理状況カウンタ２４０２にはパケット処理時間が格納される。そして、振分部１９０２が単位時間（本実施例において１ｃｌｋ）毎に処理状況カウンタ２４０２の値を減算する。
【０１６６】
処理状況カウンタ２４０２に“０”が格納されるエントリは、分散処理部２４０１が示す分散処理部５０３はパケット処理を終了したことを示す。また、処理状況カウンタ２４０２に“０”以外の正の数が格納されるエントリは、分散処理部２４０１が示す分散処理部５０３はパケット処理中であることを示す。
【０１６７】
以下において、処理状況カウンタ２４０２が減算カウンタである場合の処理を記載するが、処理状況カウンタ２４０２は加算カウンタによって、パケット処理が開始されてから経過した時間を示してもよい。この場合、振分部１９０２は、所定のパケット処理時間と処理状況カウンタ２４０２とを比較することによって、パケット処理の状況を取得しても良い。
【０１６８】
以下に、帯域監視部１９０１が実行する帯域監視バッファ書込み処理Ｓ２０５０について説明する。
【０１６９】
図２０は、本実施例２の帯域監視部１９０１が実行する帯域監視バッファ書込み処理Ｓ２０５０を示すフローチャートである。
【０１７０】
帯域監視部１９０１は、入出力回線インタフェース２０１から入力パケットを受信した場合（複数の入力パケットを同時に受信する場合もある）（Ｓ２０００）、装置内ヘッダ３からパケット長３０３を取得する（Ｓ２００１）。
【０１７１】
Ｓ２００１の後、帯域監視部１９０１は、Ｓ２００１で取得したパケット長と帯域監視バッファ１９の蓄積量（後述するパケット蓄積量２１）の合計が、帯域監視バッファ１９のバッファサイズ以下であるか否かを判定する（Ｓ２００２）。
【０１７２】
Ｓ２００２において、Ｓ２００１で取得したパケット長と帯域監視バッファ１９の蓄積量の合計が、帯域監視バッファ１９のバッファサイズ以下である場合、帯域監視部１９０１は、蓄積パケット数に受信したパケット数分を加算し、パケット蓄積量２１に取得したパケット長を加算して更新し、帯域監視バッファ１９に受信したパケットを格納する（Ｓ２００３）。
【０１７３】
Ｓ２００５の後、帯域監視部１９０１は、帯域監視バッファ書込み処理Ｓ２０５０を終了する（Ｓ２００５）。
【０１７４】
また、Ｓ２００２において、Ｓ２００１で取得したパケット長と帯域監視バッファ１９の蓄積量の合計が、帯域監視バッファ１９のバッファサイズ以下でない場合、帯域監視部１９０１は、パケットを廃棄し（Ｓ２００４）、帯域監視バッファ書込み処理Ｓ２０５０を終了する（Ｓ２００５）。
【０１７５】
図２１は、本実施例２の帯域監視バッファ１９のパケット蓄積量２１と利用分散処理部の数の関係を示す説明図である。
【０１７６】
帯域監視部１９０１は、帯域監視バッファ１９に蓄積されたパケット数が１以上の時、振分部１９０２にパケット送信要求を通知する。
【０１７７】
また、帯域監視部１９０１は、帯域監視バッファ１９のパケット蓄積量２１に応じて、利用する分散処理部５０３の数を示すＸ（Ｘは１〜Ｎの任意の自然数）を決定し、振分部１９０２、及び、多重部１９０４に利用分散処理部の数Ｘを通知する。帯域監視部１９０１は、パケット蓄積量２１が少ない時は、Ｘの値を小さく（例えばＮ／４）し、パケット蓄積量２１が多く、バッファサイズに近づいてきた時は、Ｘの値を大きく（例えばＮ）とする。
【０１７８】
以下に、帯域監視部１９０１が実行する帯域監視バッファ読出し処理Ｓ２２５０について説明する。
【０１７９】
図２２は、本実施例２の帯域監視部１９０１が実行する帯域監視バッファ読出し処理Ｓ２２５０を示すフローチャートである。
【０１８０】
帯域監視部１９０１は、振分部１９０２からパケット読出し要求を受信した場合（Ｓ２２００）、蓄積パケット数から読み出したパケット数分を減算し、パケット蓄積量２１から読み出したパケットのパケット長を減算して更新し、帯域監視バッファ１９からパケットを読み出して振分部１９０２に送出する（Ｓ２２０１）。
【０１８１】
Ｓ２２０１の後、帯域監視部１９０１は、帯域監視バッファ読出し処理Ｓ２２５０を終了する（Ｓ２２０２）。
以下に、振分部１９０２が実行する振分け処理Ｓ２３５０について説明する。
【０１８２】
図２３は、本実施例２の振分部１９０２が実行する振分け処理Ｓ２３５０を示すフローチャートである。
【０１８３】
振分部１９０２は、帯域監視部１９０１からパケット送信要求を受信した場合（Ｓ２３００）、分散処理部管理リスト１１９の＃１〜＃Ｘの全てのエントリの処理状況カウンタ２４０２の値が“０”と異なるか否かを判定する（Ｓ２３０１）。
【０１８４】
Ｓ２３０１において、分散処理部管理リスト１１９の＃１〜＃Ｘの全てのエントリの処理状況カウンタ２４０２が“０”と異なると判定された場合、＃１〜＃Ｘの全ての分散処理部５０３（５０３−１〜５０３−Ｘ）は、パケット処理を実行中である。新規パケット処理を受け付けることが出来ないため、振分部１９０２は、Ｓ２３０１の処理に戻り、＃１〜＃Ｘのいずれかの分散処理部５０３の処理が終了するのを待つ。
【０１８５】
また、Ｓ２３０１において、分散処理部管理リスト１１９の＃１〜＃Ｘのエントリのうち、処理状況カウンタ２４０２が“０”であるエントリが少なくともひとつある場合、＃１〜＃Ｘの全ての分散処理部５０３（５０３−１〜５０３−Ｘ）のうち少なくとも一つの分散処理部５０３は、パケット処理を受け付けられる状態にある。このため、振分部１９０２は、帯域監視部１９０１にパケット読出し要求を通知し、帯域監視部１９０１からパケットを受信する（Ｓ２３０２）。
【０１８６】
Ｓ２３０２の後、内部カウンタの値（本カウンタは１〜Ｘの値を取り、Ｘの次は１に戻る）が示す番号から、パケットを受信した順番に分散処理部５０３（５０３−１〜５０３−Ｘ）にパケットを転送する（Ｓ２３０３）。
【０１８７】
Ｓ２３０３の後、振分部１９０２は、内部カウンタの値を受信したパケット数分カウントアップする（Ｓ２３０４）。
【０１８８】
なお、Ｘは、帯域監視部１９０１から通知される利用分散処理部の数により決定される値であり、帯域監視バッファ１９のパケット蓄積量２１に応じて変動する。振分け処理Ｓ２３５０においては、Ｘの値の変更を反映するタイミングを、後述する内部カウンタの値がＸから１にもどる（ラップアラウンドする）時としても良い。また、多重部１９０４も、振分部１９０２と同様に内部カウンタ（本カウンタは１〜Ｘの値を取り、Ｘの次は１に戻る）を具備し、内部カウンタの番号が示す分散処理部５０３（５０３−１〜５０３−Ｘ）から順番にパケットを多重し、Ｘの値の変更を反映するタイミングを、後述する内部カウンタの値がＸから１にもどる（ラップアラウンドする）時としても良い。また、多重部１９０４は、内部カウンタの番号が示す分散処理部と異なる分散処理部からパケットを受信した場合、パケットを廃棄しても良い。
【０１８９】
Ｓ２３０４の後、帯域監視部１９０１からのパケット送信要求が終了しているか否かを判定する（Ｓ２３０５）。
【０１９０】
Ｓ２３０５において、帯域監視部１９０１からのパケット送信要求が終了していない場合、振分部１９０２は、Ｓ２３０１の処理に戻る。
【０１９１】
また、Ｓ２３０５において、帯域監視部１９０１からのパケット送信要求が終了している場合、振分部１９０２は、図２３に示す振分け処理Ｓ２３５０を終了する（Ｓ２３０６）。
【０１９２】
前述のとおり、実施例２によれば、パケット通信装置２は、帯域監視部１９０１において、振分部１９０２がラウンドロビンでパケットを振分ける分散処理部５０３（５０３−１〜５０３−Ｘ）（Ｘは１〜Ｎの任意の自然数）の数を変更し、決定した分散処理部５０３の数を振分部１９０２、及び、多重部１９０４へ通知する。これによって、実施例２の入力パケット制御部１９００は、入力パケットの帯域に応じて利用する分散処理部の数を変更しつつ、演算部７０３は、同一フローのパケットに関する統計カウント処理を同時に実行することが可能である。
【０１９３】
従って、実施例２によれば、マルチコア化されたパケット処理エンジンにおいて、１つの分散処理部への負荷集中による性能劣化を抑えることができる。さらに、分散処理部を増設することでスケーラブルにパケット処理エンジンの高速化が可能となる。さらに、入力帯域が小さい時は、利用する分散処理部の数を減らすことで、消費電力を低減することが可能となる。
【実施例３】
【０１９４】
実施例１におけるパケット通信装置２は、本発明の集中・分散処理方法を実装し、統計カウント処理を実行した。実施例３におけるパケット通信装置は、各入力パケットに基づいて帯域制御を行う。実施例３において、帯域制御機能を実現するため、パケット通信装置は、トークンバケツアルゴリズムを使用する。
【０１９５】
以下に、トークンバケツアルゴリズムの動作概要を説明する。
【０１９６】
トークンバケツアルゴリズムを使用する場合、パケット通信装置は、設定された帯域に対応する速度でトークンバケツ（メモリに保持された所定の領域）にトークンを加算する。そして、パケット通信装置は、パケット通信装置が送信する予定のパケットのパケット長分のトークンがトークンバケツに蓄積されている場合、保証帯域内と判定し、パケット長分のトークンをトークンバケツから減算する。また、パケット通信装置は、パケット通信装置が送信する予定のパケットのパケット長分のトークンがトークンバケツに蓄積されていない場合、保証帯域外であると判定し、トークンは保持し、パケット長分のトークンをトークンバケツから減算しない。
【０１９７】
本実施例におけるパケット到着間隔とパケット処理時間（タイミング）との関係の概要を以下に示す。
【０１９８】
図３３Ｃは、本実施例３のパケット処理において、同一フローのパケットが振分処理に複数同時に到着する際のパケット処理のタイミングを示す説明図である。
【０１９９】
本実施例３では、本実施例１の図３３Ｂと比較し、集中処理部の処理が異なる。
【０２００】
集中処理部は、各分散処理部（＃１と＃２）から取得した情報をもとに、第１のパケットに関する帯域演算と、第２のパケットに関する帯域演算とを同時に実行する（Ｔ３３０２）。ここで、本実施例では、１パケット毎にトークンバケツアルゴリズムを使用して帯域演算するため、第２のパケットに関する帯域演算は、第１のパケットのパケット長分のトークンを減算し、トークンを補正して計算する。この補正に関する詳細は後述する。
【０２０１】
また、集中処理部は、各分散処理部（＃３と＃４）から取得した情報をもとに、第３のパケットに関する帯域演算と、第４のパケットに関する帯域演算とを同時に実行する（Ｔ３３０３）。
【０２０２】
従って、本実施例では、集中処理部にパケットの情報を集約し、同一フローのパケットを纏めて処理することで、複数の同一フローのパケットが振分処理に同時に到着した場合でも、帯域制御機能のようにパケット到着毎に同じフローの情報を更新する必要がある機能を実現することが出来る。
【０２０３】
以下、本実施例３について図２５から図３１を用いて説明する。なお、以下に述べる実施例３は本発明の実施例の一つであって、本発明を制限するものではない。
【０２０４】
図２５は、本実施例３の集中処理部２５０５の論理的な構成を示すブロック図である。
【０２０５】
実施例３の集中処理部２５０５は、調停部２５０１、演算フロー管理リスト７０２、複数の演算部２５０３（２５０３−１〜２５０３−Ｎ）（Ｎは任意の自然数）、帯域設定テーブル２５０４、及び、演算結果保持テーブル２５１４を備える。
【０２０６】
実施例３における、演算フロー管理リスト７０２は、処理状況カウンタ１３０３に保持する実行時間（実施例１における統計情報処理と、実施例３における帯域制御処理の実行時間の差）を除き、実施例１における演算フロー管理リスト７０２と同じである。
【０２０７】
調停部２５０１は、分散処理部５５０３（５５０３−１〜５５０３−Ｎ）から処理要求を受信した場合、後述する演算部選定調停処理Ｓ２８５０を実行する処理部である。調停部２５０１は、分散処理部５５０３から受信するフローＩＤによりフローを識別し、さらに、演算フロー管理リスト７０２を参照する。そして、これによって、入力パケットに関する帯域制御処理を実行する演算部２５０３を、演算部２５０３−１〜演算部２５０３−Ｎから決定する。
【０２０８】
また、調停部２５０１は、演算フロー管理リスト７０２を、論理回路２１０に備わるメモリ等に保持する。そして、調停部２５０１は、演算部選定調停処理Ｓ２８５０及び演算フロー管理処理Ｓ１４５０において、演算フロー管理リスト７０２を更新する。
【０２０９】
さらに、調停部２５０１は、演算部２５０３から演算終了通知を受信した場合、後述する更新調停処理Ｓ３０５０を実行する処理部である。調停部２５０１は、演算部２５０３が更新した帯域制御情報から演算結果保持テーブル２５１４に書き戻す情報を選択し、処理要求を送信してきた分散処理部５５０３に演算終了通知を転送する。
【０２１０】
演算部２５０３は、後述する帯域演算処理Ｓ２９５０において、演算結果保持テーブル２５１４に含まれる各フローの情報を更新する。また、演算部２５０３は、帯域演算処理Ｓ２９５０において更新した結果を、調停部２５０１に送信する。演算部２５０３は、集中処理部２５０５にＮ個（Ｎは任意の自然数）備わる。
【０２１１】
図２６は、本実施例３の帯域設定テーブル２５０４を示す説明図である。
【０２１２】
帯域設定テーブル２５０４に格納される値は、演算部２５０３がトークンアルゴリズムを実行するために用いる設定値であり、管理者等によってあらかじめ定められる値である。帯域設定テーブル２５０４は、フローＩＤ２６０１、周期加算トークン値２６０２、及び、トークンバケツの深さ２６０３を含む。
【０２１３】
フローＩＤ２６０１は、入力パケットに割り当てられたフローを一意に示す識別子を含む。周期加算トークン値２６０２は、単位時間あたりにトークンバケツに追加されるトークン量（単位時間あたりに蓄積される保証帯域に相当）を示す。トークンバケツの深さ２６０３は、トークンバケツが保持できる最大のトークン量を示す。
【０２１４】
図２７は、本実施例３の演算結果保持テーブル２５１４を示す説明図である。
【０２１５】
演算結果保持テーブル２５１４は、パケットを保証帯域によって送信できるか否かを判定するための演算結果を保持するテーブルである。演算結果保持テーブル２５１４は、フローＩＤ２７０１、前回パケット到着時刻２７０２、及び、保持トークン値２７０３を含む。フローＩＤ２７０１は、入力パケットに割り当てられたフローを一意に示すフローＩＤを含む。前回パケット到着時刻２７０２は、演算部２５０３において前回実行された帯域演算処理が実行された時刻を示す。保持トークン値２７０３は、前回実行された帯域演算処理によって算出された、トークンバケツに蓄積されるトークン量を示す。すなわち、前回パケット到着時刻２７０２は、保持トークン値２７０３に格納される値を算出した時刻を示す。
【０２１６】
以下に、調停部２５０１が実行する演算部選定調停処理Ｓ２８５０について説明する。
【０２１７】
図２８は、本実施例３の調停部２５０１が実行する演算部選定調停処理Ｓ２８５０を示すフローチャートである。
【０２１８】
調停部２５０１は、分散処理部５５０３（５５０３−１〜５５０３−Ｎ）から処理開始トリガを受信した場合（複数の処理開始トリガを同時に受信する場合もある）（Ｓ２８００）、処理開始トリガと同時に受信するフローＩＤ、及び、パケット長を取得し、処理開始トリガの到着順を保持する（Ｓ２８０１）。
【０２１９】
Ｓ２８０１の後、調停部２５０１は、演算フロー管理リスト７０２の全てのエントリの処理状況カウンタ１３０３の値が“０”と異なるか否かを判定する（Ｓ２８０２）。
【０２２０】
Ｓ２８０２において、演算フロー管理リスト７０２の全てのエントリの処理状況カウンタが“０”と異なると判定された場合、全ての演算部２５０３（２５０３−１〜２５０３−Ｎ）は、演算処理を実行中である。新規フローの場合の演算処理を受け付けることが出来ないため、調停部２５０１は、入力パケットを廃棄判定し（Ｓ２８０３）、図２８に示す演算部選定調停処理Ｓ２８５０を終了する（Ｓ２８１１）。
【０２２１】
また、Ｓ２８０２において、演算フロー管理リスト７０２のエントリのうち、処理状況カウンタ１３０３が“０”であるエントリが少なくとも一つある場合、全ての演算部２５０３（２５０３−１〜２５０３−Ｎ）のうち少なくとも一つの演算部２５０３は、演算処理を実行していない。このため、調停部２５０１は、Ｓ２８０１において取得したフローＩＤの値を検索キー（フローＩＤ２６０１）として帯域設定テーブル２５０４を検索し、周期加算トークン値２６０２、及び、トークンバケツの深さ２６０３の情報を取得する（Ｓ２８０４）。
【０２２２】
Ｓ２８０４の後、調停部２５０１は、Ｓ２８０１において取得したフローＩＤの値を検索キー（フローＩＤ２７０１）として演算結果保持テーブル２５１４を検索し、前回パケット到着時刻２７０２、及び、保持トークン値２７０３の情報を取得する（Ｓ２８０５）。
【０２２３】
なお、Ｓ２８０２において、調停部２５０１がＳ２８００で複数の処理開始トリガを同時に受信した場合は、その複数フロー分の演算が可能かどうかを確認する。演算フロー管理リスト７０２のエントリのうち、処理状況カウンタ１３０３が“０”ではないエントリが、Ｓ２８００で同時に処理開始トリガを受信した数分ある場合、Ｓ２８０４の処理に進む。処理状況カウンタ１３０３が“０”であるエントリがＳ２８００で同時に処理開始トリガを受信した複数フロー分ない場合、Ｓ２８０３の処理に進む。また、処理状況カウンタ１３０３が“０”であるエントリがＳ２８０１で同時に受信した処理開始トリガの数分ない場合は、処理状況カウンタ１３０３が“０”であるエントリ分はＳ２８０４の処理に進み、残りのフローはＳ２８０３に進んでも良い。
【０２２４】
Ｓ２８０５の後、Ｓ２８０１において取得したフローＩＤの値が処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致するか否かを判定する（Ｓ２８０６）。
【０２２５】
なお、Ｓ２８０６において、調停部２５０１は、Ｓ２８０１において取得したフローＩＤの値に対応する値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致する場合、取得したフローＩＤの値に対応する値と処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値とが一致していると判定してもよい。
【０２２６】
Ｓ２８０６において、Ｓ２８０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致しないと判定された場合、調停部２５０１は、演算処理を実行していない演算部に、入力パケットに関する演算処理を新規に実行させるため、Ｓ２８０９の処理を実行する。
【０２２７】
Ｓ２８０６において、Ｓ２８０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致しないと判定された場合、調停部２５０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト７０２のエントリのうち、演算部１３０１の値が若い番号から順番にエントリを抽出する。調停部２５０１は、抽出されたエントリの演算部１３０１が示す演算部２５０３を、入力パケットに関する演算処理を新規に実行する演算部２５０３に決定する。
【０２２８】
本実施例においては、１パケット毎の帯域制御結果を取得するため、同じフローＩＤの複数のパケットを調停部２５０１が同時に取得した場合、それぞれのパケットを別々の演算部２５０３で処理する。このため、調停部２５０１は、同時に取得した同じフローＩＤのそれぞれのパケットを演算フロー管理リスト７０２の別々のエントリで管理する。
【０２２９】
例えば、調停部２５０１は、同じフローＩＤの第１のパケット及び第２のパケットに関する処理トリガを同時に取得し、演算処理を新規に実行すると判定した場合、演算フロー管理リスト７０２から２つのエントリを抽出し、抽出されたエントリの演算部１３０１が示す演算部２５０３を、それぞれ第１のパケットあるいは第２のパケットに関する演算処理を新規に実行する演算部２５０３に決定する。そして、調停部２５０１は、抽出されたエントリのフローＩＤ１３０２を、Ｓ２８０１で取得したフローＩＤの値によって更新する。また、調停部２５０１は、抽出されたエントリの処理状況カウンタ１３０３を、演算時間を示す値に更新する（Ｓ２８０９）。例えば、調停部２５０１は、演算時間が１０ｃｌｋの場合、取得されたフローＩＤの値とフローＩＤ１３０２とが一致したエントリの処理状況カウンタ１３０３の値を“１０”に更新する。
【０２３０】
Ｓ２８０９において処理状況カウンタ１３０３を更新することによって、調停部２５０１は、各演算部２５０３が演算処理を終了するまで実行していることを示す。
【０２３１】
なお、前述のＳ２８０９において、調停部２５０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト１３０２のエントリのうち、演算部１３０１の値が若い番号（小さい番号）から順番にエントリを抽出したが、調停部２５０１は、処理状況カウンタ１３０３が“０”である演算フロー管理リスト７０２のエントリのうちのいずれかであれば、いかなる規則に従ってエントリを抽出してもよい。例えば、調停部２５０１は、値が大きい番号から順番にエントリを抽出してもよいし、管理者によってあらかじめ抽出するエントリの順番を定められていてもよい。
Ｓ２８０９の後、調停部２５０１は、同じフローＩＤの複数の処理開始トリガを同時に取得した場合に使用するトークン補正量を決定して保持する（Ｓ２８１３）。トークン補正量は、調停部２５０１で同じフローＩＤの複数のパケットを同時に取得した場合に使用され、後述する帯域演算処理Ｓ２９５０を用いて、入力パケットの到着毎にトークン演算を実施したように計算するために補正するための値である。
【０２３２】
例えば、調停部２５０１は、同じフローＩＤの複数のパケットに関する処理開始トリガを同時に取得しない場合は、トークン補正量を０とする。同じフローＩＤの複数のパケット（第１のパケット及び第２のパケットとする。）に関する処理開始トリガを同時に取得した場合は、調停部２５０１は、第１のパケットに関する処理をすると決定された演算部２５０３向けのトークン補正量を０とし、第２のパケットに関する処理をすると決定された演算部２５０３向けのトークン補正量を第１のパケットのパケット長とする。さらに、同じフローＩＤの複数のパケット（第１のパケット、第２のパケット、及び第３のパケット、とする）に関する処理トリガを同時に取得した場合は、調停部２５０１は、第３のパケットに関する処理をすると決定された演算部２５０３向けのトークン補正量を第１のパケットのパケット長に第２のパケットのパケット長を加算した値とする。以下、同様に、同じフローＩＤの複数のパケット（第１のパケット、第２のパケット、第３のパケット、及び第４のパケット、とする）に関する処理トリガを同時に取得した場合は、調停部２５０１は、第４のパケットに関する処理をすると決定された演算部２５０３向けのトークン補正量を第１のパケットのパケット長に第２のパケットのパケット長と第３のパケットのパケット長を加算した値とする。
【０２３３】
Ｓ２８１３の後、調停部２５０１は、決定された演算部２５０３へ、処理開始トリガ、新規／継続パラメータ、取得パケット長、テーブル取得結果、及び、トークン補正量を含む演算通知を出力する（Ｓ２８１０）。
【０２３４】
Ｓ２８１０において、調停部２５０１は、新規／継続パラメータを新規を示す値に決定し、新規を示す新規／継続パラメータ（本実施例において“０”）を、演算通知に含める。本実施例における新規／継続パラメータとは、各演算部２５０３にどのような演算処理を実行するかを通知するための値である。
【０２３５】
また、Ｓ２８１０において、出力される演算通知に含まれる処理開始トリガは、演算部２５０３が後述する帯域演算処理Ｓ２９５０を開始することを示す値である。また、演算通知に含まれる取得パケット長は、Ｓ２８０１において取得したパケット長である。なお、本実施例では、同じフローＩＤの複数のパケットを同時に取得した場合でも、別々の演算部で処理を実行させるため、実施例１のようにパケット長を合算しない。
【０２３６】
また、Ｓ２８１０において、演算通知に含まれるテーブル取得結果は、Ｓ２８０４及びＳ２８０５において取得した周期加算トークン値、トークンバケツの深さ、前回パケット到着時刻、及び、保持トークン値である。また、Ｓ２８１０において、演算通知に含まれるトークン補正量は、Ｓ２８１３において保持したトークン補正量である。
【０２３７】
調停部２５０１がトークン補正量を演算部２５０３に出力することによって、同じフローＩＤの入力パケットを同時に受信した場合でも、複数の各演算部２５０３が１パケット毎のトークン計算を実施することができ、正常に帯域演算処理を実行可能である。
【０２３８】
Ｓ２８１０の後、図２８に示す演算部選定調停処理Ｓ２８５０を終了する（Ｓ２８１１）。
【０２３９】
また、Ｓ２８０６において、Ｓ２８０１で取得したフローＩＤの値が、処理状況カウンタ１３０３が“０”と異なるエントリのフローＩＤ１３０２の値と一致すると判定された場合、入力パケットのフローＩＤに対応する演算部２５０３は、入力パケットに関する演算処理を継続して実行できる。このため、調停部２５０１は、取得したフローＩＤの値とフローＩＤ１３０２とが一致したエントリの演算部１３０１が示す演算部２５０３を、入力パケットに関する演算処理を継続して実行する演算部２５０３に決定する。
【０２４０】
そして、調停部２５０１は、取得されたフローＩＤの値とフローＩＤ１３０２とが一致したエントリの処理状況カウンタ１３０３の値を、演算時間を示す値に更新する（Ｓ２８０７）。
【０２４１】
Ｓ２８０７の後、調停部２５０１は、Ｓ２８１３の処理と同様に、同じフローＩＤの処理開始トリガを複数同時に取得した場合に使用するトークン補正量を決定して保持する（Ｓ２８１２）。
Ｓ２８１２の後、調停部２５０１は、取得したフローＩＤの値とフローＩＤ１３０２の値とが一致した演算フロー管理リスト７０２のエントリの演算部１３０１が示す演算部２５０３へ、処理開始トリガ、新規／継続パラメータ、取得パケット長、テーブル取得結果、及び、トークン補正量を含む演算通知を出力する（Ｓ２８０８）。
【０２４２】
Ｓ２８０８において、調停部２５０１は、同じフローＩＤのパケットに関する処理トリガが複数同時に到着した場合、Ｓ２８１２において保持したトークン補正量を出力することにより、複数の演算部２５０３が並行して１パケット毎のトークン計算を実施することができ、オーバーフローを発生することなく帯域演算処理を実行可能である。
【０２４３】
Ｓ２８０８の後、図２８に示す演算部選定調停処理Ｓ２８５０を終了する（Ｓ２８１１）。
【０２４４】
以下、図２９Ａ及び図２９Ｂによって、演算部２５０３（２５０３−１〜２５０３−Ｎ）が実行する帯域演算処理Ｓ２９５０について説明する。
【０２４５】
図２９Ａは、本実施例３の演算部２５０３が実行する帯域演算処理Ｓ２９５０のうち、入力パケットを受信するまでに蓄積されるべきトークン量を算出する処理を示すフローチャートである。
演算部２５０３は、調停部２５０１から処理開始トリガを含む振分け通知を受信した場合（Ｓ２９００）、演算通知に含まれる新規／継続パラメータ、取得パケット長、テーブル取得結果（周期加算トークン量、トークンバケツの深さ、前回パケット到着時刻、及び、保持トークン値を含む）、及び、トークン補正量を取得する（Ｓ２９０１）。
【０２４６】
Ｓ２９０１の後、演算部２５０３は、新規／継続パラメータが“０”であるか否か、すなわち、新規／継続パラメータが新規を示すか否かを判定する（Ｓ２９０２）。
【０２４７】
新規／継続パラメータが“０”である場合、すなわち、新規／継続パラメータが新規を示すとＳ２９０２において判定された場合、演算部２５０３は、Ｓ２９０５の処理に進む。
【０２４８】
Ｓ２９０２において、新規／継続パラメータが“０”ではないと判定された場合、すなわち、新規／継続パラメータが継続を示すと判定された場合、演算部２５０３は、継続処理用に内部保持する前回テーブル更新時間を、前回パケット到着時刻として取得する（Ｓ２９０３）。
【０２４９】
Ｓ２９０３の後、演算部２５０３は、調停部２５０１から受信する継続処理用の保持トークン値を、保持トークン値として取得し（Ｓ２９０４）、Ｓ２９０５の処理に進む。
【０２５０】
Ｓ２９０５において、演算部２５０３は、調停部２５０１の演算部選定調停処理Ｓ２８５０において帯域設定テーブル２５０４を検索した時刻を、Ｓ２９００において受信した処理開始トリガとの時間差より算出し、前回テーブル更新時間として次に受信する入力パケットの継続処理用に内部保持する（Ｓ２９０５）。
【０２５１】
Ｓ２９０５の後、演算部２５０３は、Ｓ２９０５において算出した帯域設定テーブル２５０４を検索した時刻と、Ｓ２９０１において取得した前回パケット到着時刻との差を、パケット到着間隔として算出する。そして、演算部２５０３は、算出されたパケット到着間隔と、Ｓ２９０１において取得した周期加算トークン値とを乗算することによって、加算トークン量を算出する（Ｓ２９０６）。
【０２５２】
Ｓ２９０６の後、演算部２５０３は、Ｓ２９０６において算出された加算トークン量を、Ｓ２９０１において取得した保持トークン値の値に加算し（Ｓ２９０７）、図２９Ｂに示すＳ２９０８の処理に進む。
【０２５３】
Ｓ２９０７における加算結果は、入力パケットを受信するまでにトークンバケツに蓄積されていたトークン量である。
【０２５４】
Ｓ２９０２〜Ｓ２９０７の処理に他に、実施例３の演算部２５０３は、新規／継続パラメータの値に従って、異なる処理を行ってもよい。例えば、新規／継続パラメータが新規を示す場合、演算部２５０３は、Ｓ２９０７の結果である加算結果に、ユーザによってあらかじめ与えられた値を加算してもよい。
【０２５５】
図２９Ｂは、本実施例３の演算部２５０３が実行する帯域演算処理Ｓ２９５０のうち、入力パケットが保証内であるか否かを判定する処理を示すフローチャートである。
【０２５６】
Ｓ２９０７の後、演算部２５０３は、Ｓ２９０７における加算結果が、Ｓ２９０１において取得したトークンバケツの深さの値を超過するか否かを判定する（Ｓ２９０８）。
【０２５７】
Ｓ２９０８において、Ｓ２９０７における加算結果がトークンバケツの深さの値以下であると判定された場合、演算部２５０３は、Ｓ２９０７における加算結果からＳ２９０１において取得したトークン補正量を減算した値を、現在トークン量として保持する（Ｓ２９０９）。Ｓ２９０９の後、演算部２５０３は、Ｓ２９１１の処理に進む。
【０２５８】
またＳ２９０８において、Ｓ２９０７における加算結果がトークンバケツの深さの値を超過していると判定された場合、演算部２５０３は、トークンバケツの深さからＳ２９０１において取得したトークン補正量を減算した値を、現在トークン量として保持する（Ｓ２９１０）。Ｓ２９１０の後、演算部２５０３は、Ｓ２９１１の処理に進む。
【０２５９】
Ｓ２９０９及びＳ２９１０におけるトークン補正量によって、同一フローＩＤの入力パケットを同時に受信する場合において、更新するトークン量の値を入力パケットの到着順に従って計算することができる。
【０２６０】
Ｓ２９０９又はＳ２９１０の後、演算部２５０３は、Ｓ２９０９又はＳ２９１０において保持された現在トークン量が、Ｓ２９０１において取得した取得パケット長の値以上であるか否かを判定する（Ｓ２９１１）。
【０２６１】
Ｓ２９１１において、現在トークン量が取得パケット長の値以上であると判定された場合、演算部２５０３は、現在トークン量から取得パケット長分を減算した値を、更新保持トークン値として算出する（Ｓ２９１２）。更新保持トークン値は、入力パケットを送信した後のトークンバケツに残るトークン量を示す。
【０２６２】
Ｓ２９１２の後、演算部２５０３は、帯域が保証内であることを示す帯域制御結果を生成し、生成された帯域制御結果を調停部２５０１へ送信する（Ｓ２９１３）。
【０２６３】
Ｓ２９１３の後、演算部２５０３は、Ｓ２９１６の処理に進む。
【０２６４】
Ｓ２９１１において、現在トークン量が取得パケット長の値未満であると判定された場合、演算部２５０３は、現在トークン量と同じ値を、更新保持トークン値として保持する（Ｓ２９１４）。
【０２６５】
Ｓ２９１４の後、演算部２５０３は、帯域が保証外であることを示す帯域制御結果を生成し、生成された帯域制御結果を調停部２５０１へ送信する（Ｓ２９１５）。
【０２６６】
Ｓ２９１５の後、演算部２５０３は、Ｓ２９１６の処理に進む。
【０２６７】
なお、演算部２５０３は、Ｓ２９１３又はＳ２９１４において、帯域が保証内又は保証外であることを示す帯域制御結果を生成し、後述するＳ２９１６において、生成された帯域制御結果と演算終了を示す通知とを、調停部２５０１へ送信してもよい。
【０２６８】
Ｓ２９１３及びＳ２９１４において、帯域制御結果を送信又は生成することによって、演算部２５０３は、後述する出力判定処理Ｓ３１５０において、帯域制御結果に従った処理を入力パケットに行わせることが可能となる。
【０２６９】
Ｓ２９１３又はＳ２９１４の後、演算部２５０３は、演算終了を示す通知を生成し、帯域設定テーブル２５０４を検索した時刻を前回パケット到着時刻、及び、更新保持トークン値を保持トークン値として、生成された通知とともに調停部２５０１へ送信する（Ｓ２９１６）。
【０２７０】
Ｓ２９１６の後、図２９Ａ及び図２９Ｂに示す処理を終了する（Ｓ２９１７）。
【０２７１】
以下に、調停部２５０１が実行する更新調停処理Ｓ３０５０について説明する。
【０２７２】
図３０は、本実施例３の調停部２５０１が実行する更新調停処理Ｓ３０５０を示すフローチャートである。
【０２７３】
調停部２５０１は、演算部２５０３（２５０３−１〜２５０３−Ｎ）から演算終了通知を受信した場合（Ｓ３０００）、受信した演算終了通知に含まれる帯域制御結果、前回パケット到着時刻、及び、保持トークン値を取得する（Ｓ３００１）。
【０２７４】
Ｓ３００１の後、調停部２５０１は、同一フローを処理している複数の演算部２５０３から演算終了通知を受信しているか否かを判定する（Ｓ３００２）。
【０２７５】
Ｓ３００２において、同一フローを処理している複数の演算部２５０３から演算終了通知を受信していないと判定した場合、調停部２５０１は、Ｓ３００４の処理に進む。
【０２７６】
また、Ｓ３００２において、同一フローを処理している複数の演算部２５０３から演算終了通知を受信していると判定した場合、調停部２５０１は、演算結果保持テーブル２５１４に更新する結果を選択する（Ｓ３００３）。Ｓ３００３における演算結果保持テーブル２５１４に更新する結果の選択方法は、後述する図３１Ａから図３１Ｃを用いて説明する。
【０２７７】
Ｓ３００３の後、調停部２５０１は、Ｓ３００４の処理に進む。
【０２７８】
Ｓ３００４において、調停部２５０１は、演算結果保持テーブル２５１４に前回パケット到着時刻及び保持トークン値を書き戻す。
【０２７９】
Ｓ３００４の後、調停部２５０１は、次に受信する入力パケットの継続処理のために、演算結果保持テーブル２５１４に書き戻した保持トークン値を前回保持トークン値として、演算終了通知を受信した演算部２５０３へ通知する（Ｓ３００５）。
【０２８０】
Ｓ３００５の後、調停部２５０１は、演算部選定調停処理Ｓ２８５０において保持した処理開始トリガの到着順から、処理開始トリガの送信元の分散処理部５５０３（５５０３−１〜５５０３−Ｎ）を特定し、特定した分散処理部５５０３へ演算終了通知、及び、帯域制御結果を転送する（Ｓ３００６）。
【０２８１】
Ｓ３００６の後、調停部２５０１は、更新調停処理Ｓ３０５０を終了する（Ｓ３００７）。
【０２８２】
以下、図３１Ａから図３１Ｃを用いて前回パケット到着時刻、及び、保持トークン値の選択例について説明する。
【０２８３】
図３１Ａは、本実施例３の調停部２５０１が実行する更新調停処理Ｓ３０５０における演算結果保持テーブル２５１４に更新する結果の選択において、同一フローＩＤを処理する複数の演算部から同時に通知される帯域制御結果が全て保証内であった場合の例を示す説明図である。
【０２８４】
図３１Ａでは、４つの入力パケットが同時に到着し、演算部（１）から演算部（４）は、４つの入力パケットの第一パケットから第四パケットを順番に処理し、その帯域制御結果が全て保証内であった例を示す。帯域制御結果が保証内であった場合、演算部（（１）〜（４））は、帯域演算処理Ｓ２９５０において、更新保持トークン値は現在トークン量からパケット長分のトークンを減算した値とする。このため、調停部２５０１は、演算部（（１）〜（４））から出力される保持トークン値の値が最も小さい、第四パケットを処理した演算部（４）の前回パケット到着時刻、及び、保持トークン値を選択する。なお、いづれの演算部（（１）〜（４））でも前回パケット到着時刻は同じとなるため、調停部２５０１は、演算部（１）から演算部（３）が出力する前回パケット到着時刻を選択しても良い。
【０２８５】
図３１Ｂは、本実施例３の調停部２５０１が実行する更新調停処理Ｓ３０５０における演算結果保持テーブル２５１４に更新する結果の選択において、同一フローＩＤを処理する複数の演算部から同時に通知される帯域制御結果が全て保証外であった場合の例を示す説明図である。
図３１Ｂでは、４つの入力パケットが同時に到着し、演算部（１）から演算部（４）は、４つの入力パケットの第一パケットから第四パケットを順番に処理し、その帯域制御結果が全て保証外であった例を示す。帯域制御結果が保証外であった場合、演算部（（１）〜（４））は、帯域演算処理Ｓ２９５０において、更新保持トークン値は現在トークン量と同じ値とする。演算部（（１）〜（４））から出力される保持トークン値の値が全て同じであるため、調停部２５０１は、第一パケットを処理した演算部（１）の前回パケット到着時刻、及び、保持トークン値を選択する。調停部２５０１は、演算部（２）から演算部（４）が出力する前回パケット到着時刻、及び、保持トークン値を選択しても良い。
【０２８６】
図３１Ｃは、本実施例３の調停部２５０１が実行する更新調停処理Ｓ３０５０における演算結果保持テーブル２５１４に更新する結果の選択において、同一フローＩＤを処理する複数の演算部から同時に通知される帯域制御結果が保証内と保証外を含んだ場合の例を示す説明図である。
【０２８７】
図３１Ｃでは、４つの入力パケットが同時に到着し、演算部（１）から演算部（４）は、４つの入力パケットの第一パケットから第四パケットを順番に処理し、演算部（１）及び演算部（２）の帯域制御結果が保証内、演算部（３）及び演算部（４）の帯域制御結果が保証外であった例を示す。この場合、演算部（１）及び演算部（２）は、パケット長分のトークンを減算する。演算部（３）及び演算部（４）はパケット長分のトークンは減算せず、演算部（３）及び演算部（４）の更新保持トークン値は演算（２）の更新保持トークン値と同じになる。このため、調停部２５０１は、第二パケットを処理した演算部（２）の前回パケット到着時刻、及び、保持トークン値を選択する。調停部２５０１は、演算部（３）から演算部（４）が出力する前回パケット到着時刻、及び、保持トークン値を選択しても良い。また、前回パケット到着時刻は同じとなるため、調停部２５０１は、演算部（１）が出力する前回パケット到着時刻を選択しても良い。
【０２８８】
これによって、調停部２５０１は、同一フローＩＤの入力パケットの処理開始トリガを同時に受信する場合において、入力パケットの到着順に従って計算した各保持トークンの計算値の値から更新するべき値を選択することができ、その値を演算結果保持テーブル２５１４に更新する。よって、従来技術では、演算処理通知を受信した回数分、演算結果保持テーブル２５１４を更新する必要があったが、本願では、同一フローの演算処理通知を集約して演算結果保持テーブル２５１４を更新することが出来る。
【０２８９】
以下に、分散処理部５５０３（５５０３−１〜５５０３−Ｎ）の出力判定処理部６０３が実行する出力判定処理Ｓ３２５０について説明する。
【０２９０】
実施例３における出力判定処理部６０３は、集中処理部２５０５から受信する各入力パケットの帯域制御結果に基づいて、ペイロードを書き換える。
【０２９１】
図３２は、本実施例３の出力判定処理部６０３が実行する出力判定処理Ｓ３２５０を示すフローチャートである。
【０２９２】
出力判定処理部６０３は、入力ヘッダ処理部６０２から入力パケットを受信した場合（Ｓ３２００）、集中処理部２５０５から演算終了通知があるか否かを判定する（Ｓ３２０１）。
【０２９３】
Ｓ３２０１において、演算終了通知があると判定された場合、演算終了通知と同時に受信した帯域制御結果（保証内、保証外）に応じて、パケットのペイロード（例えばＶＬＡＮヘッダ４０３のＣｏＳ値）を上書きする（Ｓ３２０２）。
【０２９４】
Ｓ３２０２の後、多重部５０４へパケットを転送し（Ｓ３２０３）、図３２に示す出力判定処理Ｓ３２５０を終了する（Ｓ３２０５）。
【０２９５】
また、Ｓ３２０１において、演算終了通知がないと判定された場合、入力パケットを廃棄し（Ｓ３２０４）、図３２に示す出力判定処理Ｓ３２５０を終了する（Ｓ３２０５）。
【０２９６】
前述のとおり、実施例３によれば、パケット通信装置２は、調停部２５０１において、ラウンドロビンで各分散処理部５５０３（５５０３−１〜５５０３−Ｎ）に振分けられたパケットの情報を集約し、演算部２５０３（２５０３−１〜２５０３−Ｎ）へ通知する。これによって、実施例３の演算部２５０３は、同一フローのパケットに関する帯域制御処理を同時に実行することが可能である。
【０２９７】
従って、実施例３によれば、実施例１及び実施例２と同様に、マルチコア化されたパケット処理エンジンにおいて、１つの分散処理部への負荷集中による性能劣化を抑えることができる。さらに、分散処理部を増設することでスケーラブルにパケット処理エンジンの高速化が可能となる。
【符号の説明】
【０２９８】
２  パケット通信装置
３  装置内ヘッダ
４  通信パケット
５  フラグメントヘッダ
１９  帯域監視バッファ
２１  パケット蓄積量
１１９  分散処理部管理リスト
２００  ネットワークインタフェースボード
２０１  入出力回線インタフェース
２０２  論理回路
２０３  入力パケット制御部
２０４  出力パケット制御部
２０５  ＳＷインタフェース
２０６  スイッチ部
２０７  設定レジスタ
２０８  ＮＩＦ管理部
３０１  出力ネットワークインタフェースボード識別子
３０２  フローＩＤ
３０３  パケット長
４０１  宛先ＭＡＣアドレス
４０２  送信元ＭＡＣアドレス
４０３  ＶＬＡＮヘッダ
４０４  イーサタイプ値
４０５  ペイロード
４０６  フレームチェックシーケンス
５０２  振分部
５０３  分散処理部
５０４  多重部
５０５  集中処理部
６０１  入力ヘッダ解析部
６０２  入力ヘッダ処理部
６０３  出力判定処理部
７０１  調停部
７０２  演算フロー管理リスト
７０３  演算部
７０４  統計情報テーブル
１７０１  総フラグメント数
１７０２  シーケンス番号
１７０３  フラグメント長
１９００  入力パケット制御部
１９０１  帯域監視部
１９０２  振分部
１９０４  多重部
２５０１  調停部
２５０３  演算部
２５０４  帯域設定テーブル
２５０５  集中処理部
２５１４  演算結果保持テーブル
５５０３  分散処理部
【図１Ａ】
2015032970.tif 000003
【図１Ｂ】
2015032970.tif 000004
【図２】
2015032970.tif 000005
【図３】
2015032970.tif 000006
【図４】
2015032970.tif 000007
【図５】
2015032970.tif 000008
【図６】
2015032970.tif 000009
【図７】
2015032970.tif 000010
【図８】
2015032970.tif 000011
【図９】
2015032970.tif 000012
【図１０】
2015032970.tif 000013
【図１１】
2015032970.tif 000014
【図１２】
2015032970.tif 000015
【図１３】
2015032970.tif 000016
【図１４】
2015032970.tif 000017
【図１５】
2015032970.tif 000018
【図１６】
2015032970.tif 000019
【図１７】
2015032970.tif 000020
【図１８】
2015032970.tif 000021
【図１９】
2015032970.tif 000022
【図２０】
2015032970.tif 000023
【図２１】
2015032970.tif 000024
【図２２】
2015032970.tif 000025
【図２３】
2015032970.tif 000026
【図２４】
2015032970.tif 000027
【図２５】
2015032970.tif 000028
【図２６】
2015032970.tif 000029
【図２７】
2015032970.tif 000030
【図２８】
2015032970.tif 000031
【図２９Ａ】
2015032970.tif 000032
【図２９Ｂ】
2015032970.tif 000033
【図３０】
2015032970.tif 000034
【図３１Ａ】
2015032970.tif 000035
【図３１Ｂ】
2015032970.tif 000036
【図３１Ｃ】
2015032970.tif 000037
【図３２】
2015032970.tif 000038
【図３３Ａ】
2015032970.tif 000039
【図３３Ｂ】
2015032970.tif 000040
【図３３Ｃ】
2015032970.tif 000041