(57)【要約】【課題】複雑なＱｏＳ制御と、正確な時刻にパケットを送信することを両立させる。【解決手段】パケット種別識別部１０１は、パケットの種別を識別し、対応する種別に応じてＱｏＳ設定値が設定されているキュー１０２−１〜１０２−ｎのうちで識別した種別に対応するキューにパケットをエンキューする。スケジューラ部１０３は、各キュー内の各パケットに対して、当該キューのＱｏＳ設定値に基づいて送信予定時刻を算出し、当該パケットをデキューし、当該パケットを、送信予定時刻を示す時刻情報とともにハードウェア制御部２００へ出力する。バッファ格納処理部２１０は、スケジューラ部１０３から出力される各パケットを、送信予定時刻の順にソートしてバッファ部２２０に格納する。送信処理部２３０は、バッファ部２２０に格納された各パケットを、当該パケットの送信予定時刻に送信する。【選択図】図１
2011024027.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアにしたがって動作するソフトウェア制御部と、ハードウェア回路にしたがって動作するハードウェア制御部とを備え、
前記ソフトウェア制御部は、
格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、当該キューに設定された前記ＱｏＳ設定値に基づいて当該パケットの送信予定時刻を算出し、当該パケットをデキューし、前記送信予定時刻を示す時刻情報とともに前記ハードウェア制御部へ出力する、というスケジューリング処理を行うスケジューラ部を備え、
前記ハードウェア制御部は、
バッファ部と、
前記スケジューラ部から出力される各パケットを、各パケットの前記時刻情報に基づいて前記送信予定時刻の順にソートして前記バッファ部に格納するバッファ格納処理部と、
前記バッファ部に格納された各パケットを、当該パケットの前記送信予定時刻に送信する送信処理部を備える、
ことを特徴とするパケット送信制御装置。
【請求項２】
前記スケジューラ部は、前記複数のキューのうち第１のキューからデキュー対象のすべてのパケットを前記ハードウェア制御部に出力してから、前記複数のキューのうち第２のキューから前記ハードウェア制御部へのパケットの出力を行うことを特徴とする請求項１に記載のパケット送信制御装置。
【請求項３】
前記時刻情報は相対時刻で表されており、
前記送信処理部は、前記スケジューラ部からの送信開始指示があるまで待ってから各パケットの送信を開始する、
ことを特徴とする請求項１または２に記載のパケット送信制御装置。
【請求項４】
パケット送信制御装置で用いられるハードウェア回路であって、
バッファ部と、
複数のパケットを、各パケットの送信予定時刻を示す時刻情報とともに受け取り、前記時刻情報に基づいて前記複数のパケットを前記送信予定時刻の順にソートして前記バッファ部に格納するバッファ格納処理部と、
前記バッファ部に格納された前記複数のパケットの各々を、当該パケットの前記送信予定時刻に送信する送信処理部と、
を備えることを特徴とするハードウェア回路。
【請求項５】
格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、当該キューに設定された前記ＱｏＳ設定値に基づいて当該パケットの送信予定時刻を算出する処理と、
当該パケットをデキューし、前記送信予定時刻を示す時刻情報とともに出力するスケジューリング処理を、
コンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パケットの送信を制御する技術に関する。
【背景技術】
【０００２】
多くのコンピュータネットワークでは、データ通信、音声通話、映像配信などの多様な種類の通信が、同じネットワーク上に流れている。そこで、通信の種類に応じた適切な通信品質を確保するために、端末機、サーバ、または通信経路上にある中継装置もしくはゲートウェイ装置などが、ＱｏＳ（Quality of Service）制御を行うことがある。
【０００３】
ＱｏＳ制御を行う一方式によれば、ＱｏＳ制御を行う装置に複数のキューが用意され、通信の種類に応じて、パケットをエンキューするキューが割り当てられる。また、各キューには、通信品質に応じた優先度または帯域などが設定されている。そして、ＱｏＳ制御を行う装置は、スケジューリング処理を行う。すなわち、ＱｏＳ制御を行う装置は、各キューの設定に応じて、全キューの中から次に送信するパケットを選ぶとともに、パケットを送信するタイミングを調整する。
【０００４】
ＱｏＳ制御のための具体的な技術としては、様々なものが知られているが、例えば、パケットに対する遅延時間を定量的かつ動的に制御することを可能とすることを目的とした、次のようなデータ通信システムが開示されている。
【０００５】
データ通信システムにおいて、パケット管理処理部は、遅延時間制御対象となるパケット群に対応する送信候補キューの配置対象区間を要求遅延時間に基づいて決定する。当該配置対象区間にキュー群が既存し、かつ当該キュー群における間隙の総和が、当該送信候補キューのバーストサイズ以上となる場合に、パケット管理処理部は次のように動作する。すなわち、パケット管理処理部は、当該配置対象区間の末尾位置から送信キューの先頭までの区間に存する間隙を除外して整列し、当該送信候補キューを挿入して再配列する。
【０００６】
また、このデータ通信システムにおいて、送信処理部は、送信キューにスケジューリングされた各キューの配列に基づいて、次のように動作する。すなわち、送信処理部は、遅延時間制御の対象となる送信候補キュー群、帯域制御のみの帯域制御キュー群、通信品質保証の対象外となるデフォルトキュー群、の優先順位で、対応するパケット群の送信を行う。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１１−２４３４２０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ネットワークサービスの多様化にしたがい、ＱｏＳ制御が複雑化することが予測される。他方で、近年の大容量化したネットワーク回線においてジッタを抑制するためには、ＱｏＳ制御を行う装置が、正確な時刻にパケットを送信することが望ましい。
【０００９】
そこで本発明は、複雑なＱｏＳ制御と、正確な時刻にパケットを送信することを両立させることが可能な技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
一態様によればパケット送信制御装置が提供される。前記パケット送信制御装置は、ソフトウェアにしたがって動作するソフトウェア制御部と、ハードウェア回路にしたがって動作するハードウェア制御部とを備える。
【００１１】
前記ソフトウェア制御部はスケジューラ部を備える。また、前記ハードウェア制御部は、バッファ部とバッファ格納処理部と送信処理部を備える。
前記スケジューラ部はスケジューリング処理を行う。前記スケジューリング処理は、格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、当該キューに設定された前記ＱｏＳ設定値に基づいて当該パケットの送信予定時刻を算出し、当該パケットをデキューし、前記送信予定時刻を示す時刻情報とともに前記ハードウェア制御部へ出力する、という処理である。
【００１２】
前記バッファ格納処理部は、前記スケジューラ部から出力される各パケットを、各パケットの前記時刻情報に基づいて前記送信予定時刻の順にソートして前記バッファ部に格納する。
【００１３】
前記送信処理部は、前記バッファ部に格納された各パケットを、当該パケットの前記送信予定時刻に送信する。
【発明の効果】
【００１４】
上記パケット送信制御装置によれば、スケジューリング処理のように、ソフトウェアに適した複雑な処理は、ソフトウェア制御部によって行われる。また、ハードウェア制御部は、予め各パケットとともに受け取った時刻情報を利用して、各パケットを送信予定時刻どおりに正確に送信することができる。したがって、上記パケット送信制御装置によれば、複雑なＱｏＳ制御と、正確な時刻にパケットを送信することを両立させることが可能である。
【図面の簡単な説明】
【００１５】
【図１】パケット送信制御装置のブロック図である。
【図２】パケット送信制御装置のハードウェア構成図である。
【図３】ソフトウェア制御部およびバッファ格納処理部の詳細を示す図である。
【図４】バッファ部の詳細を示す図である。
【図５】送信処理部の詳細を示す図である。
【図６】スケジューラ部によるスケジューリング処理を説明するフローチャートである。
【図７】バッファ格納処理部による相対時刻カウント開始処理を説明するフローチャートである。
【図８】バッファ格納処理部による送信開始指示処理を説明するフローチャートである。
【図９】バッファ格納処理部によるパケット送信依頼処理を説明するフローチャートである。
【図１０】パケット送信依頼処理によるバッファ部の状態遷移の例を説明する図である。
【図１１】送信処理部による送信処理を説明するフローチャートである。
【図１２】送信処理によるバッファ部の状態遷移の例を説明する図である。
【発明を実施するための形態】
【００１６】
以下、実施形態について、図面を参照しながら詳細に説明する。説明の順序は次のとおりである。
まず、一実施形態によるパケット送信制御装置の構成と動作の概要を、図１および図２を参照して説明する。あわせて、本実施形態によるソフトウェアとハードウェアの連携の利点についても簡単に説明する。
【００１７】
その後、図３〜図５を参照して図１の各部の詳細な構成を説明し、図６〜図１２を参照してパケット送信制御装置の動作の詳細を説明する。その後、これらの詳細をふまえて、ソフトウェアとハードウェアの連携の利点について、より詳しく説明する。また、最後に、他の実施形態についても説明する。
【００１８】
なお、本明細書において、「パケット」という用語は、ＰＤＵ（Protocol Data Unit）（すなわち、プロトコルに応じた形式を有するデータの送信単位）という一般的な意味を示す。以下では特に限定する場合を除いて、「パケット」という用語は、プロトコル自体やプロトコルが属するレイヤを限定しない意味で用いる。
【００１９】
本明細書における「パケット」の具体例は、例えば、一般に「フレーム」、「パケット」、「セル」、「データグラム」、「セグメント」などと呼ばれる各種のＰＤＵであり、より具体的には例えば以下のものを含むが、以下の例に限定されない。
【００２０】
・データリンク層のＭＡＣ（Media Access Control）フレーム、ＡＴＭ（Asynchronous Transfer Mode）セル
・ネットワーク層のＩＰ（Internet Protocol）データグラム
・トランスポート層のＴＣＰ（Transmission Control Protocol）セグメント、ＵＤＰ（User Datagram Protocol）データグラム、ＲＴＰ（Real-time Transport Protocol）パケット
図１は、本実施形態によるパケット送信制御装置のブロック図である。図１のパケット送信制御装置１は、ＱｏＳ制御システムが組み込まれた装置であり、パケットを中継する中継装置である。本実施形態は、例えば、Ｌ２（layer 2）スイッチ、Ｌ３（layer 3）スイッチ、ルータ、ゲートウェイ装置などの各種中継装置に適用可能である。換言すれば、パケット送信制御装置１は、これら各種中継装置の任意の１種として実装することができる。同様に、パケット送信制御装置１は、端末機やサーバにも適用可能である。
【００２１】
図１に示すように、パケット送信制御装置１は、ソフトウェアにしたがって動作し、各種制御を行うソフトウェア制御部１００と、ハードウェア回路にしたがって動作し、各種制御を行うハードウェア制御部２００を備える。
【００２２】
ソフトウェア制御部１００は、パケット種別識別部１０１とキュー群１０２とスケジューラ部１０３を備え、キュー群１０２は、ｎ本のキュー１０２−１〜１０２−ｎを含む（ｎ＞１）。また、ハードウェア制御部２００は、バッファ格納処理部２１０とバッファ部２２０と送信処理部２３０を備え、バッファ部２２０は、パケット格納部２２１と時刻情報格納部２２２を含む。
【００２３】
パケット送信制御装置１によるＱｏＳ制御の概要は次のとおりである。
まず、パケット送信制御装置１が中継あるいは送信しようとするパケットは、ソフトウェア制御部１００に入力され、パケット種別識別部１０１に渡される。パケット種別識別部１０１は、キューイング処理を行う。すなわち、パケット種別識別部１０１は、パケットを解析してパケットの種別を識別し、キュー群１０２のキュー１０２−１〜１０２−ｎのうちどのキューにパケットをエンキューするかを決定し、決定したキューへパケットをエンキューする。なお、種別は任意に定義されていてよい。
【００２４】
なお、各キュー１０２−１〜１０２−ｎには予め、対応する種別に応じてＱｏＳ設定値が設定されている。ＱｏＳ設定値の例は、優先度、帯域、または両者の組み合わせである。パケット種別識別部１０１は、パケットを解析することでパケットの種別を識別する。換言すれば、パケット種別識別部１０１は、入力されたパケットがどのＱｏＳ設定値に適合するのかを認識する。そして、パケット種別識別部１０１は、適合するＱｏＳ設定値が設定されたキューに、パケットをエンキューする。
【００２５】
パケット種別識別部１０１は、公知のアルゴリズムにしたがって動作してもよい。パケットの解析には、パケットヘッダ内のＱｏＳ制御用の所定のフィールドの内容、パケットヘッダ内のその他のフィールドの内容、または、パケットのペイロードに含まれる上位層のプロトコルのヘッダの内容などが利用される。
【００２６】
例えば、パケット送信制御装置１が具体的にはＬ２スイッチである場合は、パケット種別識別部１０１は、パケットのＬ２ヘッダの内容を解析してもよい。例えば、受け取ったパケットがＶＬＡＮ（Virtual Local Area Network）タグ付きのＭＡＣフレームである場合、パケット種別識別部１０１は、ＶＬＡＮタグ中のプライオリティ・フィールドの値に応じて、パケットをエンキューするキューを決定してもよい。
【００２７】
あるいは、パケット送信制御装置１が具体的にはＬ３スイッチやルータである場合は、パケット種別識別部１０１は、キューの決定のためにパケットのＬ３ヘッダの内容を解析してもよい。例えば、受け取ったパケットがＩＰパケットである場合、パケット種別識別部１０１は、ＩＰヘッダ中のＴｏＳ（Type of Service）フィールドの値に応じてキューを決定してもよい。なお、実施形態に応じて、キューの決定のために、送信元ＩＰアドレス、宛先ＩＰアドレスなどのＩＰヘッダ中の他のフィールドが使われてもよく、トランスポート層（Ｌ４）やアプリケーション層（Ｌ７）などの上位層のプロトコルのヘッダが使われてもよい。
【００２８】
上記の例示に限らず、パケット種別識別部１０１は、実施形態に応じたアルゴリズムにしたがって、パケットを解析し、パケットの種別を識別し、識別した種別に対応するキューをキュー群１０２の中から選択し、選択したキューにパケットをエンキューする。
【００２９】
キュー群１０２の各キュー１０２−１〜１０２−ｎは、エンキューされたパケットを格納するＦＩＦＯ（First In First Out）キューである。図１では、ｈ番目（１≦ｈ≦ｎ）のキュー１０２−ｈ内のｇ番目に格納されているパケットを「Ｑｈｇ」という参照符号で示している。また、各キュー１０２−１〜１０２−ｎ内にエンキューされたパケットは、後にスケジューラ部１０３によりデキューされる。
【００３０】
スケジューラ部１０３は、所定の間隔でスケジューリング処理を繰り返し行う。具体的には、スケジューラ部１０３は、次にパケットをデキューするキューを決定し、決定したキューからパケットをデキューしてハードウェア制御部２００に出力し、出力したパケットの送信をハードウェア制御部２００に依頼する。
【００３１】
詳しくは後述するが、スケジューラ部１０３は、ハードウェア制御部２００がパケットを外部へ送信するタイミング（以下「送信予定時刻」という）を示す情報（以下「時刻情報」という）をパケットと関連付ける。そして、スケジューラ部１０３は、時刻情報を付したパケットをハードウェア制御部２００に出力し、パケットの送信をハードウェア制御部２００に依頼する。また、スケジューラ部１０３は、複数のパケットをまとめて一度にハードウェア制御部２００に出力し、それら複数のパケットの送信をハードウェア制御部２００に依頼してもよい。
【００３２】
ハードウェア制御部２００では、時刻情報が付されてスケジューラ部１０３から出力された各パケットを、バッファ格納処理部２１０が受け取る。そして、バッファ格納処理部２１０は、受け取った各パケットと各パケットに付随する時刻情報を、バッファ部２２０のパケット格納部２２１と時刻情報格納部２２２にそれぞれ格納する。
【００３３】
なお、本実施形態では、バッファ部２２０は、パケットと時刻情報の組をエントリとして持つ１種のキューであるが、単純なＦＩＦＯキューではない。バッファ部２２０への格納（すなわちエンキュー操作）の際には、キュー内でエントリが送信予定時刻順にソートされて並ぶように、新たなパケットと時刻情報の組が適切な位置に挿入される。
【００３４】
詳しくは図９と図１０を参照して後述するが、バッファ格納処理部２１０は、バッファ部２２０内でエントリが送信予定時刻順にソートされて並ぶようにするため、次のように動作する。
【００３５】
すなわち、バッファ格納処理部２１０は、バッファ部２２０のキューの先頭から順に、エンキューしようとするパケットに付された時刻情報と、キュー内のエントリに含まれる時刻情報とを比較する。そして、バッファ格納処理部２１０は、エンキューしようとするパケットの送信予定時刻以降の時刻が最初に見つかったエントリの直前に新たなエントリを挿入することにより、エンキュー操作を行う。
【００３６】
なお、バッファ部２２０がキューであるという観点から換言すると、パケット格納部２２１は、キューの各エントリのうちパケットを格納する領域である。また、時刻情報格納部２２２は、各エントリのうち時刻情報を格納する領域である。
【００３７】
バッファ部２２０からのデキュー操作は、送信処理部２３０により行われる。送信処理部２３０は、送信予定時刻順にソートされたエントリをキューの先頭から順に１つずつデキューし、デキューしたエントリの時刻情報と現在時刻とに基づいて送信予定時刻まで待ってから、デキューしたエントリのパケットを送信する。なお、詳しくは後述するが、送信処理部２３０は、現在時刻を絶対時刻または相対時刻で表して利用することができる。
【００３８】
以上のようにして、ソフトウェア制御部１００に入力されたパケットはハードウェア制御部２００から送信され、パケット送信制御装置１はＱｏＳ制御を行いながらパケットの中継を行う。
【００３９】
図２は、本実施形態によるパケット送信制御装置１のハードウェア構成図である。図１のパケット送信制御装置１は、具体的には図２に示すような各ハードウェア部品を有する。
【００４０】
すなわち、パケット送信制御装置１は、ＣＰＵ（Central Processing Unit）３０１とメモリユニット３０２とＲＴＣ（Real Time Clock）３０３を備える。また、パケット送信制御装置１は、それぞれｍ個（ｍ＞１）のＭＡＣチップ３０４−１〜３０４−ｍとＰＨＹ（PHYsical layer）チップ３０５−１〜３０５−ｍとポート３０６−１〜３０６−ｍを備える。
【００４１】
メモリユニット３０２、ＲＴＣ３０３およびＭＡＣチップ３０４−１〜３０４−ｍは、バス３０７に接続されている。ｉ番目（１≦ｉ≦ｍ）のＭＡＣチップ３０４−ｉとＰＨＹチップ３０５−ｉの間は、例えばＭＩＩ（Media Independent Interface）などのインタフェースで接続されている。ＰＨＹチップ３０５−ｉはポート３０６−ｉに接続されており、両者の間には不図示のトランスが設けられていてもよい。
【００４２】
メモリユニット３０２は、図２では１つのブロックとして簡略化して図示してあるが、ワークエリア用のＲＡＭ（Dynamic Random Access Memory）と、フラッシュメモリなどの不揮発性メモリ装置と、両者にそれぞれ対応するメモリコントローラとを含む。また、実施形態に応じて、メモリユニット３０２はさらに、例えばルーティングテーブル用にＣＡＭ（Content-Addressable Memory）などの他の種類のメモリ装置を含んでもよい。
【００４３】
メモリユニット３０２内の不揮発性メモリ装置には、プログラムや予め設定された各種のデータなどが格納される。ＣＰＵ３０１は、不揮発性メモリ装置からＲＡＭへプログラムをロードし、ＲＡＭをワークエリアとして利用しながら、ロードしたプログラムを実行する。
【００４４】
ＣＰＵ３０１とメモリユニット３０２の間の矢印は、ＣＰＵ３０１がメモリコントローラを介してＲＡＭおよび不揮発性メモリ装置にアクセスすることを示している。また、図３〜図５とともに後述するように、ＭＡＣチップ３０４−１〜３０４−ｍにはレジスタ領域やメモリ領域が実装されている。ＣＰＵ３０１は、メモリユニット３０２のメモリコントローラとバス３０７を介して、ＭＡＣチップ３０４−１〜３０４−ｍ内のレジスタ領域やメモリ領域を、ＣＰＵ３０１のメモリ空間の一部として認識し、アクセスすることができる。
【００４５】
ＲＴＣ３０３は、不図示のバッテリーによりバックアップされている回路であり、時刻を刻み続ける。メモリユニット３０２とＭＡＣチップ３０４−１〜３０４−ｍは、バス３０７を介してＲＴＣ３０３を参照し、現在時刻を認識することができる。本実施形態では、ＣＰＵ３０１はＲＴＣ３０３と直接接続されているが、ＣＰＵ３０１がバス３０７を介してＲＴＣ３０３に接続されていてもよい。
【００４６】
また、ＣＰＵ３０１やＭＡＣチップ３０４−１〜３０４−ｍは、例えばパケット送信制御装置１の起動時にＲＴＣ３０３を参照して現在時刻を認識し、認識した時刻に基づき内部クロックを設定し、その後は内部クロックが刻む時刻を現在時刻として認識してもよい。
【００４７】
ＭＡＣチップ３０４−１〜３０４−ｍはデータリンク層の処理を行い、ＰＨＹチップ３０５−１〜３０５−ｍは物理層の処理を行う。また、ポート３０６−１〜３０６−ｍにはケーブルが接続されている。ＭＡＣチップ３０４−１〜３０４−ｍとＰＨＹチップ３０５−１〜３０５−ｍは、例えばＡＳＩＣ（Application Specific Integrated Circuit）でもよいし、ＦＰＧＡ（Field Programmable Gate Array）などのリコンフィギュラブル回路を利用したものでもよい。
【００４８】
なお、図２では一例として、ポートとＰＨＹチップとＭＡＣチップが１対１対１に対応する単純な場合を示したが、例えば、複数のポートについての処理を１つのＰＨＹチップが行うなど、「１対１対１」以外の対応関係を有する実施形態も可能である。
【００４９】
上記のような各ハードウェア部品により、図１の各部が以下のようにして実現される。
ＣＰＵ３０１が、必要に応じてＲＴＣ３０３を参照し、メモリユニット３０２内のＲＡＭをワークエリアとして利用しながらプログラムを実行することで、パケット種別識別部１０１とスケジューラ部１０３が実現される。また、キュー群１０２はメモリユニット３０２内の記憶装置であるＲＡＭにより実現される。そして、ハードウェア制御部２００は、ハードウェア回路の１種である各ＭＡＣチップ３０４−ｉ（１≦ｉ≦ｍ）により実現される。
【００５０】
なお、パケット送信制御装置１は、以下のようにしてパケットを中継する。
例えば、ポート３０６−ｉ（１≦ｉ≦ｍ）から入力される電気信号や光信号などの物理的信号は、ポート３０６−ｉに接続されているＰＨＹチップ３０５−ｉで論理的信号に変換される。変換後の論理的信号すなわちビット列は、ＰＨＹチップ３０５−ｉに接続されているＭＡＣチップ３０４−ｉに出力される。
【００５１】
ＭＡＣチップ３０４−ｉは、入力されたビット列からＬ２パケット（例えばイーサネット（登録商標）フレーム）を認識し、バス３０７を介してＬ２パケットをメモリユニット３０２に出力する。実施形態に応じて、Ｌ２パケットはＣＰＵ３０１によりさらに処理を施されることもある。
【００５２】
例えば、Ｌ２パケットにペイロードとして含まれるＩＰパケットのＴＴＬ（Time to Live）フィールドの値を、ＣＰＵ３０１がデクリメントしてもよい。また、パケット送信制御装置１がルータの場合は、Ｌ２パケットのヘッダに含まれるＭＡＣアドレスなどをＣＰＵ３０１が付け替えてもよい。これらの処理は、ＦＣＳ（Frame Check Sequence）などの再計算をともなう。実施形態に応じて、ＣＰＵ３０１は、ソフトウェア制御部１００として行う一連の処理の前・途中・後のうち適宜のタイミングで、中継にともなう上記のような処理を行うことができる。
【００５３】
また、ＣＰＵ３０１は、パケットの送信先ポートを決定する。例えばパケット送信制御装置１がＬ２スイッチの場合は、不図示のＭＡＣアドレス学習テーブルに基づいて、パケット送信制御装置１がルータの場合は、不図示のルーティングテーブルに基づいて、ＣＰＵ３０１は送信先ポートを決定する。ＭＡＣアドレス学習テーブルやルーティングテーブルは、メモリユニット３０２に格納される。
【００５４】
ここで、送信先ポートが例えばポート３０６−ｊ（１≦ｊ≦ｍ）に決定されるとする。この場合、パケット種別識別部１０１としてのＣＰＵ３０１は、パケットを解析し、ポート３０６−ｊ用のｎ本のキュー１０２−１〜１０２−ｎのいずれかにパケットをエンキューする。そして、スケジューラ部１０３としてのＣＰＵ３０１がスケジューリング処理を実行する。
【００５５】
その結果、パケットは、ポート３０６−ｊに対応するハードウェア制御部２００としてのＭＡＣチップ３０４−ｊへと出力される。
なお、ＭＡＣチップ３０４−ｊへの出力の際、パケットには上記のとおり時刻情報が付される。また、実施形態に応じて必要ならばソフトウェア制御部１００としてのＣＰＵ３０１がＬ２パケットへのカプセル化を行うので、ＭＡＣチップ３０４−ｊへはＬ２パケットが出力される。
【００５６】
ハードウェア制御部２００としてのＭＡＣチップ３０４−ｊは、送信予定時刻まで待機してから、Ｌ２パケットをＰＨＹチップ３０５−ｊへと出力する。ＰＨＹチップ３０５−ｊは、受け取ったＬ２パケットを物理的信号に変換し、ポート３０６−ｊから送信する。
【００５７】
以上のようにしてパケット送信制御装置１は、ＱｏＳ制御を行いつつ、ポート３０６−ｉからポート３０６−ｊへとパケットを中継する。
続いて、本実施形態によるソフトウェアとハードウェアの連携の利点についても説明する。本実施形態では、各々の特長を活かしたソフトウェアとハードウェアの連携により、複雑なＱｏＳ制御と、正確な時刻にパケットを送信することを両立させることができる。理由は次のとおりである。
【００５８】
パケット種別識別部１０１とスケジューラ部１０３は、プログラム（すなわちソフトウェア）にしたがって動作する。また、一般に、ソフトウェアによる処理はハードウェアによる処理に比べて、柔軟かつ複雑な制御をより容易に実現することができ、アルゴリズムの頻繁な変更にも対応しやすい。つまり、パケット種別識別部１０１とスケジューラ部１０３によるキューイング処理とスケジューリング処理においては、柔軟かつ複雑な制御を実現することも、新たなネットワークサービスの発展にあわせてアルゴリズムを随時変更することも、比較的容易である。
【００５９】
他方で、ハードウェア制御部２００はハードウェアチップ（すなわちＭＡＣチップ３０４−１〜３０４−ｍの各々）により実現されている。一般に、ハードウェアによる処理は、ソフトウェアによる処理に比べて、高速であり、厳密なタイミング制御によるリアルタイム性を実現することも比較的容易である。
【００６０】
本実施形態でハードウェア制御部２００が行う処理は、送信予定時刻順にソートしながらのキューイング処理と、指定された送信予定時刻まで待機してパケットを送信するという処理であり、それほど複雑ではない。よって、ハードウェア制御部２００は、ハードウェアの特長を活かして、それぞれの送信予定時刻を厳密に守りながら複数のパケットを次々に送信することができる。
【００６１】
したがって、本実施形態によれば、各々の特長を活かしたソフトウェアとハードウェアの連携により、複雑できめ細やかなＱｏＳ制御と、リアルタイム性を実現するための短い間隔での正確なパケットの送信とを両立させることができる。
【００６２】
また、本実施形態によれば、将来新たなネットワークサービスが出現しても、ソフトウェアの書き換えによってソフトウェア制御部１００の動作を変更することにより、新たなネットワークサービスに適したＱｏＳ制御に切り換えることが比較的容易にできる。すなわち、本実施形態によれば、リアルタイム性を犠牲にすることなく、拡張性にも優れたＱｏＳ制御が実現される。
【００６３】
続いて、本実施形態の詳細について、図３〜図１２を参照して説明する。図３〜図５は、それぞれ図１の一部について詳細を示す図である。なお、図３〜図５に関しては、図１と共通部分についての説明は省略し、また、動作についての説明は図６〜図１２とともに後述する。
【００６４】
図３は、ソフトウェア制御部１００およびバッファ格納処理部２１０の詳細を示す図である。なお、図示の都合上、図３では、ソフトウェア制御部１００中のキュー群１０２は省略されており、図１に示したバッファ部２２０の内部構造も省略されている。
【００６５】
上記のように、ソフトウェア制御部１００は、図２のメモリユニット３０２とＣＰＵ３０１の協働により実現されるが、図３ではメモリユニット３０２により実現されるソフトウェア制御部１００内のメモリ領域１０４の詳細が示されている。
【００６６】
メモリ領域１０４上には、時刻指定フラグＦと送信パケットリスト１０５が記憶される。また、メモリ領域１０４はパケットバッファ１０６としても利用される。
時刻指定フラグＦは、「絶対時刻」または「相対時刻」を表す。時刻指定フラグＦと送信パケットリスト１０５は、スケジューラ部１０３が内部で保持するデータの１つである。パケットバッファ１０６は、複数のパケットを格納することができるバッファ領域であり、静的または動的にメモリユニット３０２上に確保され、キュー群１０２および送信パケットリスト１０５のために使われる。
【００６７】
本実施形態の送信パケットリスト１０５は、ノードＬ１〜Ｌｅを有する線形リストとして実装される。また、先頭のノードＬ１の前にはダミーノードＬ０が設けられている。
各ノードＬｉ（０≦ｉ＜ｅ）は、次のノードＬｉ＋１を指すポインタを含む。また、各ノードＬｉ（１≦ｉ≦ｅ）は、パケットバッファ１０６に格納されているパケットを指すポインタと、図３には不図示の時刻情報を含む。
【００６８】
また、図３に示すように、バッファ格納処理部２１０は、図７〜図９に示す後述の各処理を実行するハードウェア回路である制御回路２１１と、１つ以上のレジスタを含むレジスタ領域２１２とを備える。
【００６９】
以下、レジスタ領域２１２内の所定のレジスタＲ１が保持する制御情報を「送信パケットリスト先頭ポインタ」という。送信パケットリスト先頭ポインタとして、ダミーノードＬ０のアドレスが記憶される。
【００７０】
なお、レジスタＲ１は、スケジューラ部１０３からもアクセス可能なレジスタである。同様に、メモリ領域１０４中の送信パケットリスト１０５とパケットバッファ１０６も、バッファ格納処理部２１０の制御回路２１１からアクセス可能である。
【００７１】
図４は、バッファ部２２０の詳細を示す図である。図４ではソフトウェア制御部１００の内部は省略されている。
図４に示すように、バッファ部２２０は、メモリ領域２２３とレジスタ領域２２４を備える。メモリ領域２２３は、図１に示したパケット格納部２２１および時刻情報格納部２２２として利用される。また、本実施形態におけるレジスタ領域２２４は、５つ以上のレジスタを含み、バッファ格納処理部２１０および送信処理部２３０からアクセス可能であり、バッファ格納処理部２１０を介してソフトウェア制御部１００からもアクセス可能である。
【００７２】
レジスタ領域２２４内の所定の５つのレジスタＲ２〜Ｒ６が、それぞれ、時刻指定フラグ、バッファ探索開始位置、エンキュー位置、バッファ部ポインタ、および送信開始指示の格納のために用いられる。レジスタＲ２〜Ｒ６に格納されるこれらの制御情報の意味については後述する。
【００７３】
図５は、送信処理部２３０の詳細を示す図である。図４ではソフトウェア制御部１００の内部は省略されている。また、送信処理部２３０との関連を示すため、図２のＲＴＣ３０３が図５にも図示されている。
【００７４】
図５に示すように、送信処理部２３０は、図１１に示す後述の処理を実行するハードウェア回路である制御回路２３１と、１つ以上のレジスタを含むレジスタ領域２３２と、ＲＴＣ３０３を参照可能な内部カウンタ２３３とを備える。送信処理部２３０は、バッファ部２２０からデキューしたパケットに付随する時刻情報を、レジスタ領域２３２内の所定のレジスタＲ７にコピーして格納する。
【００７５】
続いて、図６〜図１２を参照して、図１〜図５に構成を示した各部の動作の詳細を説明する。なお、以下では説明の便宜上、次の（ａ１）〜（ａ４）のように仮定するが、仮定（ａ１）〜（ａ４）により一般性が失われないことは明らかである。
【００７６】
（ａ１）本実施形態のパケット送信制御装置１は、各ポート３０６−１〜３０６−ｍからのトラフィックについて、それぞれＱｏＳ制御を行う。
仮定（ａ１）は、１≦ｊ≦ｍを満たす各ｊについて、ＣＰＵ３０１とメモリユニット３０２とＲＴＣ３０３によりソフトウェア制御部１００が実現されるとともに、ＭＡＣチップ３０４−ｊによりハードウェア制御部２００が実現されることを意味する。つまり、ＣＰＵ３０１とメモリユニット３０２とＲＴＣ３０３は、ｍ個のポート３０６−１〜３０６−ｍに対応するそれぞれのソフトウェア制御部１００を兼ねる。
【００７７】
なお、以下では、送信先ポートがポート３０６−ｊである場合、すなわちハードウェア制御部２００がＭＡＣチップ３０４−ｊである場合を具体例として説明する。つまり、以下の説明においては、図１のソフトウェア制御部１００に入力されるパケットは、送信先ポートがポート３０６−ｊであるパケットであり、ハードウェア制御部２００からはＰＨＹチップ３０５−ｊを介してポート３０６−ｊへとパケットが出力される。
【００７８】
（ａ２）ポート３０６−ｊから送信しようとするパケットに関して、本実施形態では、キュー群１０２がｎ本のキュー１０２−１〜１０２−ｎを含む。
ここで、ｊ≠ｋかつ１≦ｋ≦ｍを満たすｋについて、ポート３０６−ｋに対応するソフトウェア制御部内のキュー群に含まれるキューの本数をｎ’とする。実施形態により、ポート３０６−ｋに対応してメモリユニット３０２上に実現されるキューの本数ｎ’と、ポート３０６−ｊに対応してメモリユニット３０２上に実現されるキューの本数ｎは、異なっていてもよいし、同じでもよい。すべてのポート３０６−１〜３０６−ｍについて、同じようにキュー群１０２が設けられていれば、送信先のポートが決定される前にパケット種別識別部１０１が種別の識別を行うこともできる。
【００７９】
（ａ３）本実施形態では、キュー群１０２内のキュー１０２−１〜１０２−ｎの各々には、ＱｏＳ設定値として帯域が設定されている。
なお、実施形態によっては、各キュー１０２−１〜１０２−ｎに優先度、または帯域と優先度の組み合わせが設定されていてもよい。
【００８０】
（ａ４）本実施形態では、パケット送信制御装置１が備える不図示の入力指示部（例えばボタンや操作パネルなど）を介して、ＱｏＳ制御の動作モードが、予め「絶対時刻」モードまたは「相対時刻」モードのいずれか一方に設定されている。そして、動作モードの設定値は、図３の時刻指定フラグＦに保持される。
【００８１】
なお、このように動作モードが選択可能ではなく、いずれか一方の動作モードに固定されている実施形態も可能である。
以上のように仮定（ａ１）〜（ａ４）を設けたうえで、続いて、パケット送信制御装置１の動作の詳細を説明する。
【００８２】
図６は、スケジューラ部１０３によるスケジューリング処理を説明するフローチャートである。スケジューリング処理は、タイマ割り込み等により一定間隔Δτで呼び出される。
【００８３】
間隔Δτは、パケット送信制御装置１の仕様に応じて適宜決めることができ、例えば１０ｍｓ程度でもよい。なお、間隔Δτは、図６の一連の処理が時間Δτの間に終わるように決められる。
【００８４】
スケジューリング処理が呼び出されると、ステップＳ１０１でスケジューラ部１０３は、図３の時刻指定フラグＦを参照する。そして、スケジューラ部１０３は、バッファ格納処理部２１０を介して、バッファ部２２０内の図４のレジスタＲ２に、時刻指定フラグＦの値をコピーする。
【００８５】
仮定（ａ４）より、時刻指定フラグＦには「絶対時刻」または「相対時刻」のいずれかを示す値が保持されている。時刻指定フラグＦが「相対時刻」を示すとき、処理はステップＳ１０２に移行し、時刻指定フラグＦが「絶対時刻」を示すとき、処理はステップＳ１０３に移行する。
【００８６】
ステップＳ１０２でスケジューラ部１０３は、ハードウェア制御部２００に、相対時刻のカウント開始を指示する。指示を受けたときのハードウェア制御部２００の動作は、図７とともに後述する。ステップＳ１０２の実行後、処理はステップＳ１０３に移行する。
【００８７】
ステップＳ１０３でスケジューラ部１０３は初期設定を行う。具体的には、スケジューラ部１０３は、デキュー対象すなわちスケジューリング対象のキューとして１番目のキュー１０２−１を指定する。
【００８８】
次にステップＳ１０４でスケジューラ部１０３は、デキュー対象のキューにパケットがあるか否かを確認する。デキュー対象のキューにパケットがあれば、処理はステップＳ１０５に移行する。デキュー対象のキューにパケットがなければ、現在のデキュー対象のキューに関するスケジューリング処理が終了し、処理はステップＳ１０８に移行する。以下では説明の便宜上、デキュー対象のキューがキュー１０２−ｈ（１≦ｈ≦ｎ）であるとする。
【００８９】
なお、キュー１０２−ｈにパケットがあるか否かは、例えばキュー１０２−ｈの実装に用いられるポインタの値により判断することが可能である。
例えば、本実施形態では、次のような実装を採用することができる。すなわち、送信先ポートがポート３０６−ｊと判断されたパケットが、ソフトウェア制御部１００に入力されると、パケット種別識別部１０１が図３のパケットバッファ１０６上に領域を確保し、確保した領域にパケットを格納する。そして、パケット種別識別部１０１は、パケットの種別を判定して、どのキューにパケットをエンキューするかを決定する。例えば、パケット種別識別部１０１は、当該パケットをキュー１０２−ｈにエンキューすると決定する。
【００９０】
ここで、各キュー１０２−１〜１０２−ｎは、単純なＦＩＦＯキューであり、パケットバッファ１０６内の個々のパケットを指すポインタの配列、あるいはそのようなポインタを含むノードによる線形リストとして、メモリ領域１０４に実装することができる。説明の便宜上、仮に線形リストにより各キュー１０２−１〜１０２−ｎが実装されており、送信パケットリスト１０５と同様に先頭にはダミーノードがあるとする。
【００９１】
この場合、パケット種別識別部１０１は、キュー１０２−ｈの線形リストの末尾に新たなノードを追加し、追加したノードのポインタが、パケットバッファ１０６に新たに格納したパケットを指すように設定する。その結果、ＦＩＦＯキューへのエンキュー操作が実現される。上記の実装例では、ステップＳ１０４でスケジューラ部１０３は、「デキュー対象のキュー１０２−ｈを実装する線形リストの先頭のダミーノードのポインタがヌルポインタならば、キュー１０２−ｈにはパケットがない」と判断することができる。
【００９２】
もちろん、以上の説明は例示にすぎず、キュー１０２−１〜１０２−ｎの実装方法や、デキュー対象のキュー１０２−ｈにパケットがあるか否かの具体的な判断方法は任意である。
【００９３】
ステップＳ１０５は、デキュー対象のキュー１０２−ｈにパケットがあると確認された場合に実行される。ステップＳ１０５でスケジューラ部１０３は、キュー１０２−ｈに設定されている帯域にしたがい、キュー１０２−ｈの先頭のパケットの送信予定時刻を計算する。送信予定時刻を計算するアルゴリズムは実施形態に応じて任意だが、例えば、トラフィック・シェーピング・アルゴリズムの１つであるリーキ・バケット（leaky bucket）アルゴリズムが利用されてもよい。
【００９４】
例えば、リーキ・バケット・アルゴリズムにおけるバケツの深さをＣＤＶ（Cell Delay Variation）と表すことにすると、ＣＤＶはバーストしてよいパケット長を表す。また、バケツの穴の大きさが転送レートに対応する。ここで、デキュー対象のキュー１０２−ｈに設定されている帯域をＢｈ［ｂｐｓ］と表し、スケジューリング間隔を上記のとおりΔτ［ｓ］と表す。すると、１回のスケジューリング処理においてキュー１０２−ｈからデキューされるパケットの量は、トラフィック・シェーピングの結果として式（１）のＡｈ［ｂｙｔｅ］に制限される。
【００９５】
Ａｈ＝Ｂｈ×Δτ÷８                                    （１）
ここで、キュー１０２−ｈに関してステップＳ１０５がｆ回目（ｆ≧１）に実行されたときにキュー１０２−ｈの先頭にあるパケットの長さをＬｆとする。スケジューラ部１０３は、時刻指定フラグＦの値に応じて、例えば以下の例示のように送信予定時刻を計算してもよい。
【００９６】
（ｂ１）時刻指定フラグＦが「相対時刻」を示す場合
キュー１０２−ｈに関してステップＳ１０５がｇ回目（ｇ≧１）に実行される場合、スケジューラ部１０３は、例えば次の式（２）で表される送信予定時刻ＴｈｇをステップＳ１０５で計算してもよい。式（２）で表される送信予定時刻Ｔｈｇは、後述の図１１のステップＳ５０３で初期化されてゼロとして表される基準時刻に対する、相対時刻である。
【００９７】
【数１】
2011024027.tif 000003
（ｂ２）時刻指定フラグＦが「絶対時刻」を示す場合
キュー１０２−ｈに関してステップＳ１０５がｇ回目（ｇ≧１）に実行される場合、スケジューラ部１０３は、例えば次の式（３）で表される送信予定時刻ＴｈｇをステップＳ１０５で計算してもよい。
【００９８】
【数２】
2011024027.tif 000004
なお、式（３）中の時刻τ０は、図６の処理が呼び出された時刻を示す。また、後述の理由から式（３）中のτｍａｒｇｉｎには、予め間隔Δτ以上の長さが設定されている。時刻指定フラグＦが「絶対時刻」を示す場合、スケジューラ部１０３は、式（３）より、例えばｇ＝１の場合にはステップＳ１０５においてＴｈｇ＝Ｔｈ１＝τ０＋τｍａｒｇｉｎと計算することができる。
【００９９】
続いてステップＳ１０６でスケジューラ部１０３は、ステップＳ１０５で計算した送信予定時刻Ｔｈｇが送信対象の時刻であるか否かを判断する。
ステップＳ１０６において、「あるパケットＱｈｇの送信予定時刻Ｔｈｇが送信対象の時刻である」とは、「パケットＱｈｇは、今回の図６のスケジューリング処理においてハードウェア制御部２００へ送信を依頼する対象である」という意味である。換言すれば、「パケットＱｈｇの送信予定時刻Ｔｈｇが送信対象の時刻ではない」とは、「送信予定時刻Ｔｈｇは遅いので、パケットＱｈｇに関しては、次に図６のスケジューリング処理が呼び出されたときに送信予定時刻を計算しなおせばよい」という意味である。
【０１００】
そのため、ステップＳ１０６での判断は、図６のスケジューリング処理が呼び出される割り込み間隔Δτに依存する。なお、ＣＰＵ３０１上で動作するＯＳ（Operating System）の割り込み間隔の最小単位が例えば１０ｍｓの場合、間隔Δτ＝１０［ｍｓ］でもよい。
【０１０１】
具体的には、時刻指定フラグＦの値に応じて、スケジューラ部１０３は、例えば次のように判断してもよい。
（ｃ１）時刻指定フラグＦが「相対時刻」を示す場合
この場合、スケジューラ部１０３は、「送信予定時刻Ｔｈｇが式（４）を満たすときのみ、送信予定時刻Ｔｈｇは送信対象の時刻である」と判断してもよい。
【０１０２】
Ｔｈｇ＜Δτ                                            （４）
（ｃ２）時刻指定フラグＦが「絶対時刻」を示す場合
この場合、スケジューラ部１０３は、「送信予定時刻Ｔｈｇが式（５）を満たすときのみ、送信予定時刻Ｔｈｇは送信対象の時刻である」と判断してもよい。
【０１０３】
Ｔｈｇ＜τ０＋τｍａｒｇｉｎ＋Δτ                      （５）
例えば上記の式（４）または（５）に基づいて、スケジューラ部１０３が「送信予定時刻Ｔｈｇが送信対象の時刻である」と判断すると、キュー１０２−ｈについての処理を続行するため、処理はステップＳ１０７に移行する。逆に、スケジューラ部１０３が「送信予定時刻Ｔｈｇが送信対象の時刻ではない」と判断すると、現在のデキュー対象のキュー１０２−ｈに関する処理を完了させるため、処理はステップＳ１０８に移行する。
【０１０４】
ステップＳ１０７でスケジューラ部１０３は、現在のデキュー対象のキュー１０２−ｈの先頭のパケットをキュー１０２−ｈからデキューする。そして、スケジューラ部１０３は、デキューしたパケットと、ステップＳ１０５で計算した送信予定時刻Ｔｈｇを表す時刻情報とを、スケジューラ部１０３内部に保持する。そして処理はステップＳ１０４に戻る。
【０１０５】
なお、ステップＳ１０４〜Ｓ１０７の繰り返しにより、ステップＳ１０７が２回目以降に実行される場合、スケジューラ部１０３は既に、送信予定のパケットと時刻情報の組を１組以上、既に保持している。よって、この場合は、ステップＳ１０７でスケジューラ部１０３は、既に保持している内容に加えて、新たにデキューしたパケットとその送信予定時刻を示す時刻情報を保持することになる。
【０１０６】
なお、ステップＳ１０７は、具体的には、図３の送信パケットリスト１０５のノードを増やす操作であり、詳述すれば以下のとおりである。
ステップＳ１０７でスケジューラ部１０３は、送信パケットリスト１０５の末尾に新たなノードを追加する。なお、スケジューラ部１０３の内部データである送信パケットリスト１０５は、ステップＳ１０３または後述のステップＳ１１０でスケジューラ部１０３がデキュー対象のキューをキュー１０２−ｈに決定するごとに、初期化される。送信パケットリスト１０５は、初期状態において、ヌルポインタを有するダミーノードＬ０のみを持つ。
【０１０７】
ここで、前述のようにキュー１０２−ｈは、パケットバッファ１０６中のパケットを指すポインタを使って実装されている。例えば、ステップＳ１０７において注目しているキュー１０２−ｈの先頭のパケットとは、パケットバッファ１０６中のいずれかの領域に格納されているパケットＱｊｈｇである。そして、キュー１０２−ｈの実装に使われている線形リスト（不図示）の、ダミーノードを除いて先頭のノードのポインタが、このパケットバッファ１０６内のパケットＱｊｈｇを指している。
【０１０８】
例えば、ステップＳ１０７においてスケジューラ部１０３は、パケットＱｊｈｇを指すポインタの値を、送信パケットリスト１０５に新たに追加した末尾のノードが持つポインタにコピーする。また、スケジューラ部１０３は、キュー１０２−ｈの実装に使われている線形リストの、ダミーノードを除いて先頭のノードを削除する。その結果として、パケットＱｊｈｇの実体はパケットバッファ１０６中で何ら変化することなく、キュー１０２−ｈからのパケットＱｊｈｇのデキューと、送信パケットリスト１０５へのパケットＱｊｈｇの追加が実現される。
【０１０９】
もちろん、実施形態に応じて、上記に例示した線形リストとは異なる実装によりステップＳ１０７の操作が実現されてもよい。
なお、ステップＳ１０７においてスケジューラ部１０３はさらに、ステップＳ１０５で計算した送信予定時刻Ｔｈｇを示す時刻情報を、新たに送信パケットリスト１０５に追加した末尾のノードに格納する。そして、現在のデキュー対象であるキュー１０２−ｈに関するスケジューリング処理を続行するため、処理はステップＳ１０４に戻る。
【０１１０】
なお、このようにしてステップＳ１０４〜Ｓ１０７の処理をスケジューラ部１０３が繰り返す理由は、次のとおりである。すなわち、今回の割り込みにより開始した図６の処理でキュー１０２−ｈからデキューする対象の全パケットを、後述のステップＳ１０９でまとめてハードウェア制御部２００へとデキューして、一括してハードウェア制御部２００に送信を依頼するためである。
【０１１１】
他方で、デキュー対象のキュー１０２−ｈにパケットが存在しないとステップＳ１０４で判断された場合、または計算した送信予定時刻が今回のスケジューリング処理では送信対象の時刻に当たらないとＳ１０６で判断された場合、ステップＳ１０８が実行される。つまり、ステップＳ１０８が実行されるのは、現在のデキュー対象のキュー１０２−ｈに関するスケジューリング処理を完了する条件が整った場合である。
【０１１２】
よって、ステップＳ１０８においてスケジューラ部１０３は、デキュー対象のキュー１０２−ｈに対応して保持している図３の送信パケットリスト１０５を参照し、送信対象のパケットをスケジューラ部１０３自身の内部で保持しているか否かを判断する。
【０１１３】
具体的には、送信パケットリスト１０５の先頭のダミーノードＬ０のポインタがヌルポインタであれば、スケジューラ部１０３は送信対象のパケットを保持していないので、処理はステップＳ１１０に移行する。逆に、ダミーノードＬ０のポインタがヌルポインタではなく、ノードＬ１を指していれば、スケジューラ部１０３は送信対象のパケットを少なくとも１つは保持しているので、処理はステップＳ１０９に移行する。
【０１１４】
ステップＳ１０９でスケジューラ部１０３は、自身の内部に送信対象として保持しているパケット群（すなわち１つ以上のパケット）のすべてについて、一括してハードウェア制御部２００に送信を依頼する。具体的には、スケジューラ部１０３は、送信パケットリスト１０５のダミーノードＬ０のアドレスを、送信パケットリスト先頭ポインタとして図３のレジスタＲ１に書き込むことで、パケットの送信を依頼する。
【０１１５】
なお、ハードウェア制御部２００は、レジスタＲ１への値の書き込みを検出することで、パケットの送信が依頼されたと認識し、後述の図９の処理を開始する。
このように、本実施形態ではスケジューラ部１０３がバッファ格納処理部２１０内のレジスタ領域２１２にアクセス可能であり、かつ後述するとおりバッファ格納処理部２１０はソフトウェア制御部１００内のメモリ領域１０４にアクセス可能である。換言すれば、ＣＰＵ３０１はＭＡＣチップ３０４−ｊ内のレジスタ領域２１２にアクセス可能であり、ＭＡＣチップ３０４−ｊはメモリユニット３０２内のＲＡＭにアクセス可能である。
【０１１６】
以上のようにしてステップＳ１０９が実行されると、処理はステップＳ１１０に移行する。
ステップＳ１１０でスケジューラ部１０３は、スケジューリング処理の対象すなわちデキュー対象のキューとして、次のキュー１０２−（ｈ＋１）を選択する。つまり、スケジューラ部１０３は注目するキュー番号を１インクリメントする。
【０１１７】
そして、ステップＳ１１１でスケジューラ部１０３は、ステップＳ１１０で更新されたキュー番号（ｈ＋１）が、キュー群１０２のキューの本数ｎを超えているか否かを判断する。
【０１１８】
もし、ｎ≧ｈ＋１であれば、未処理のキュー１０２−（ｈ＋１）がキュー群１０２内に残っているので、処理はステップＳ１０４に戻る。他方、ｎ＜ｈ＋１であれば、キュー群１０２のすべてのキュー１０２−１〜１０２−ｎについてスケジューリング処理が完了しているので、処理はステップＳ１１２へ移行する。
【０１１９】
ステップＳ１１２でスケジューラ部１０３は、図３の時刻指定フラグＦを参照する。時刻指定フラグＦが「相対時刻」を示すとき、処理はステップＳ１１３に移行し、時刻指定フラグＦが「絶対時刻」を示すとき、図６の処理は終了する。
【０１２０】
ステップＳ１１３でスケジューラ部１０３は、ハードウェア制御部２００に送信開始を指示する。具体的には、スケジューラ部１０３は、図８の処理を行うようハードウェア制御部２００に指示し、図６の処理を終了する。
【０１２１】
続いて、図７〜図９を参照して、バッファ格納処理部２１０の動作を説明する。上記の図６に関する説明のとおり、バッファ格納処理部２１０に対して、スケジューラ部１０３は以下の３種類の指示を出す。
【０１２２】
（ｄ１）パケット送信制御装置１が相対時刻モードで動作している場合のステップＳ１０２における相対時刻のカウント開始の指示
（ｄ２）パケット送信制御装置１が相対時刻モードで動作している場合のステップＳ１１３における送信開始の指示
（ｄ３）ステップＳ１０９での１つ以上のパケットについての送信の指示
すなわち、パケット送信制御装置１が絶対時刻モードで動作している場合、１回のスケジューリング処理ごとに、ハードウェア制御部２００はスケジューラ部１０３から、（ｄ３）の指示をＵ回受け取る。ここで、Ｕはキュー群１０２のうち、今回のスケジューリング処理における送信対象のパケットを有するキューの数であり、０≦Ｕ≦ｎである。また、パケット送信制御装置１が相対時刻モードで動作している場合、１回のスケジューリング処理ごとに、ハードウェア制御部２００はスケジューラ部１０３から、（ｄ１）の指示を１回受け、（ｄ３）の指示をＵ回受け、（ｄ２）の指示を１回受ける。
【０１２３】
以下では、ハードウェア制御部２００が（ｄ１）、（ｄ２）、（ｄ３）の指示を受けたことを契機として行う動作について、それぞれ図７、図８、図９を参照して説明する。
図７は、バッファ格納処理部２１０による相対時刻カウント開始処理を説明するフローチャートである。
【０１２４】
ステップＳ２０１でバッファ格納処理部２１０は、図４に示すようにバッファ部２２０がレジスタＲ６に記憶している送信開始指示の値を上書きして、「停止」を示す値を設定する。
【０１２５】
そして、ステップＳ２０２でバッファ格納処理部２１０は、バッファ部２２０のメモリ領域２２３に実装されているキューの最後の位置を獲得する。図７の説明における「最後の位置」とは、次にパケットをエンキューする位置であり、図４のレジスタＲ４に記憶されるエンキュー位置により表される。そして、バッファ格納処理部２１０は、レジスタＲ４から読み取って獲得したエンキュー位置の値を、バッファ探索開始位置としてレジスタＲ３にコピーして設定する。
【０１２６】
なお、以上のステップＳ２０１とＳ２０２の動作によって相対時刻のカウントが開始される理由は、図１１とあわせて後述する。
図８は、バッファ格納処理部２１０による送信開始指示処理を説明するフローチャートである。
【０１２７】
ステップＳ３０１でバッファ格納処理部２１０は、バッファ部２２０が図４のレジスタＲ６に記憶している送信開始指示の値を上書きして、「送信」を示す値を設定し、図８の処理を終了する。
【０１２８】
図９は、バッファ格納処理部２１０によるパケット送信依頼処理を説明するフローチャートである。また、図１０は、パケット送信依頼処理によるバッファ部２２０の状態遷移の例を説明する図である。
【０１２９】
ステップＳ４０１でバッファ格納処理部２１０の制御回路２１１は、図４のレジスタＲ２に記憶されている時刻指定フラグの値を参照する。そして、時刻指定フラグが相対時刻を表していれば、処理はステップＳ４０２に移行し、時刻指定フラグが絶対時刻を表していれば、処理はステップＳ４０３に移行する。なお、図６のステップＳ１０１に関して説明したとおり、時刻指定フラグには相対時刻または絶対時刻のいずれかを示す値が既に設定されている。
【０１３０】
ステップＳ４０２で制御回路２１１は、バッファ部２２０のレジスタＲ３に格納されているバッファ探索開始位置の値を獲得する。そして、制御回路２１１は、獲得した値を、レジスタＲ５にバッファ部ポインタとして書き込み、保持する。バッファ部ポインタは、バッファ格納処理部２１０がバッファ部２２０にパケットをエンキューする位置を検索するために利用するポインタであり、バッファ格納処理部２１０が現在検索している位置を表す。
【０１３１】
なお、バッファ探索開始位置の値は、図６のステップＳ１０２を契機として呼び出される図７の処理のステップＳ２０２において設定済みである。ステップＳ４０２の実行直後では、バッファ探索開始位置は、所定間隔Δτで繰り返される図６のスケジューリング処理のうちの今回のスケジューリング処理が開始された時点で、バッファ部２２０にエンキュー済みの最後のエントリの次のエントリを示す。
【０１３２】
図１０（Ａ）は、ステップＳ４０２の実行後のバッファ部２２０を、バッファ部ポインタを示す矢印とともに表している。
ステップＳ４０２の実行時には、前回のスケジューリング処理の結果としてエンキューされたエントリが１個以上バッファ部２２０に残っている可能性もあるし、１個も残っていない可能性もある。したがって、図１０（Ａ）において０≦ｅである。説明の便宜上、前回のスケジューリング処理の結果としてエンキューされた、各々パケットＰｋと時刻情報Ｔｋ（１≦ｋ≦ｅ）を含むｅ個（０≦ｅ）のエントリが、ステップＳ４０２の実行時にバッファ部２２０に残っているとする。すると、ステップＳ４０２の実行結果として、バッファ部ポインタは、（ｅ＋１）番目のエントリを指すように設定される。
【０１３３】
なお、バッファ部２２０のキュー内の個々のエントリには一意にパケットが対応するので、以下では「バッファ部ポインタが指すエントリ」のかわりに「バッファ部ポインタが指すパケット」のような表現をすることもある。
【０１３４】
また、図６のスケジューリング処理の１回の実行につき、図６のステップＳ１０９は複数回実行される場合があり、図９の処理はステップＳ１０９の実行のたびに呼び出される。したがって、以下に説明する図９の処理から、下記（ｅ１）と（ｅ２）が成り立つ。
【０１３５】
（ｅ１）ある１回のスケジューリング処理に対応して図９の処理が初めて呼び出されたときのステップＳ４０２の実行時には、バッファ探索開始位置以降にはエントリが存在しない。よって、図１０（Ａ）において矢印で表されるバッファ部ポインタは、空のエントリを指す。
【０１３６】
（ｅ２）ある１回のスケジューリング処理に対応して図９の処理が２回目以降に呼び出されたときのステップＳ４０２の実行時には、バッファ部２２０は、図９の処理が前回呼び出されたときにエンキューされたエントリをバッファ探索開始位置以降に有する。よって、図１０（Ａ）において矢印で表されるバッファ部ポインタが指すエントリは、空ではない。
【０１３７】
上記（ｅ１）と（ｅ２）のいずれの場合でも、時刻指定フラグが「相対時刻」を表す場合は、送信予定時刻の比較対象の範囲を示すため、上記のようにバッファ部ポインタにバッファ探索開始位置の値がコピーされる。
【０１３８】
他方、時刻指定フラグが「絶対時刻」を示す場合には、ステップＳ４０３で制御回路２１１が、バッファ部２２０からキューの先頭位置を獲得する。そして、制御回路２１１は、獲得した値を、図４のレジスタＲ５にバッファ部ポインタとして書き込み、保持する。
【０１３９】
図１０（Ｂ）は、ステップＳ４０３の実行後のバッファ部２２０を、バッファ部ポインタを示す矢印とともに表している。なお、前回のスケジューリング処理の結果としてエンキューされたエントリが、ステップＳ４０３の実行時点でバッファ部２２０に残っているか否かとは関係なく、バッファ部ポインタは、図１０（Ｂ）に示すとおり、バッファ部２２０の先頭のエントリを指すように設定される。
【０１４０】
そして、ステップＳ４０２またはＳ４０３においてバッファ部ポインタが設定されると、処理はステップＳ４０４に移行する。ステップＳ４０４で制御回路２１１は、送信予定の１つ以上のパケットを含むパケット群の先頭のパケットの時刻情報を獲得し、先頭のパケットの送信予定時刻を認識する。なお、上記パケット群は、換言すれば、図６のステップＳ１０９でスケジューラ部１０３がハードウェア制御部２００に送信を依頼したパケット群である。
【０１４１】
具体的には、スケジューラ部１０３が図３の送信パケットリスト１０５を使って管理しているパケット群のうち、ダミーノードＬ０を除く先頭のノードＬ１が保持している時刻情報を、制御回路２１１がステップＳ４０４で獲得する。以下では、ステップＳ４０４で獲得された時刻情報が表す送信予定時刻を便宜的に「送信パケット時刻」という。なお、ステップＳ４０４の前提として、図３においてバッファ格納処理部２１０の制御回路２１１は、スケジューラ部１０３が利用するメモリ領域１０４を参照することができるようになっている。
【０１４２】
続いて、ステップＳ４０５で制御回路２１１は、レジスタＲ５に格納されているバッファ部ポインタが指すパケットの時刻情報を時刻情報格納部２２２から獲得し、獲得した時刻情報が表す送信予定時刻を認識する。以下では、認識された送信予定時刻を便宜的に「バッファ部時刻」という。
【０１４３】
そして、ステップＳ４０６で制御回路２１１は、送信パケット時刻とバッファ部時刻を比較する。送信パケット時刻よりもバッファ部時刻の方が早ければ、処理はステップＳ４０７に移行する。両者が同時刻か、または送信パケット時刻よりもバッファ部時刻の方が遅ければ、処理はステップＳ４１０に移行する。
【０１４４】
ステップＳ４０７で制御回路２１１は、レジスタＲ５に格納されているバッファ部ポインタを、バッファ部２２０における次のパケットを指すように変更する。
そしてステップＳ４０８で制御回路２１１は、ステップＳ４０７で変更したバッファ部ポインタが指す位置にパケットがあるか否かを判断する。
【０１４５】
ステップＳ４０８で「変更後のバッファ部ポインタが指す位置にパケットがある」と判断されるのは、まだステップＳ４０６の比較の対象となっていないパケットがバッファ部２２０のパケット格納部２２１内に存在する場合である。したがって、次のパケットについて比較を行うために、処理はステップＳ４０５に戻る。
【０１４６】
図１０（Ｃ）は、ステップＳ４０７でのバッファ部ポインタの変更の後、ステップＳ４０８で「変更後のバッファ部ポインタが指す位置にパケットがある」と判断される場合の例を示す。すなわち、図１０（Ｃ）に示すように、ステップＳ４０７の処理の実行前にバッファ部ポインタが指すエントリがパケットＰｊと時刻情報Ｔｊを含むとすると、ステップＳ４０７によりバッファ部ポインタは次のエントリを指すように変更される。そして、図１０（Ｃ）のように、変更後のバッファ部ポインタが指すエントリが、空ではなくパケットＰｊ＋１と時刻情報Ｔｊ＋１を有する場合、処理はステップＳ４０８からステップＳ４０５に戻る。
【０１４７】
逆に、ステップＳ４０８で「変更後のバッファ部ポインタが指す位置にパケットがない」と判断されるのは、ステップＳ４０７で変更する前のバッファ部ポインタが指していたパケットが、バッファ部２２０内の最後のパケットである場合である。この場合、ステップＳ４０４で得た送信パケット時刻は、バッファ部２２０の時刻情報格納部２２２に格納されている最も遅い送信予定時刻より遅いので、処理はステップＳ４０９に移行する。
【０１４８】
ステップＳ４０９で制御回路２１１は、送信予定のパケット（より正確には、１組以上の、送信予定のパケットと時刻情報の組であって、まだバッファ部２２０に格納されていないもの）をすべて、バッファ部２２０の最後尾の位置に順に挿入する。そして制御回路２１１は、図４のレジスタＲ４に格納されているエンキュー位置の値を、ステップＳ４０９での挿入処理後のキューの最後の位置を示すように、更新する。ステップＳ４０９の実行後、図９の処理は終了する。
【０１４９】
なお、本実施形態において、ステップＳ４０９での挿入処理（すなわちエンキュー処理）は、ＤＭＡ（Direct Memory Access）により行われる。すなわち、制御回路２１１が実装されているＭＡＣチップ３０４−ｊは、ソフトウェア制御部１００を実現するＣＰＵ３０１を介さずに、直接メモリユニット３０２内のメモリ領域１０４にアクセスする。具体的には、制御回路２１１は、レジスタＲ１の送信パケットリスト先頭ポインタを用いてメモリ領域１０４上の送信パケットリスト１０５をたどりながら、順にパケットと時刻情報を取得してバッファ部２２０に挿入する。
【０１５０】
図１０（Ｄ）は、ステップＳ４０７、Ｓ４０８、Ｓ４０９の順に処理が進む場合の例を示す。すなわち、図１０（Ｄ）に示すように、ステップＳ４０７の処理の実行前にバッファ部ポインタが指すエントリがパケットＰｊと時刻情報Ｔｊを含むとすると、ステップＳ４０７によりバッファ部ポインタは次のエントリを指すように変更される。そして、図１０（Ｄ）のように、変更後のバッファ部ポインタが指すエントリが空である場合、処理はステップＳ４０８からステップＳ４０９に移行する。
【０１５１】
ここで、ステップＳ４０９の時点で、まだバッファ部２２０に格納されていないパケットと時刻情報の組がａ（１≦ａ）個残っているとする。ａ個のパケットを「Ｐｎｅｗ−１」〜「Ｐｎｅｗ−ａ」という参照符号で表し、パケットＰｎｅｗ−１〜Ｐｎｅｗ−ａそれぞれに対応する時刻情報を「Ｔｎｅｗ−１」〜「Ｔｎｅｗ−ａ」という参照符号で表す。なお、パケットＰｎｅｗ−１〜Ｐｎｅｗ−ａそのものは図３のパケットバッファ１０６に格納されており、時刻情報Ｔｎｅｗ−１〜Ｔｎｅｗ−ａの各々は送信パケットリスト１０５内の各ノードに格納されている。
【０１５２】
ここで、キュー１０２−ｈ（１≦ｈ≦ｎ）はＦＩＦＯキューである。よって、キュー１０２−ｈに関して図６のステップＳ１０９が実行され、図９の処理が呼び出される場合、図６の処理から明らかに、１≦ｇ＜ａを満たすすべてのｇについて、時刻情報Ｔｎｅｗ−ｇが表す時刻は時刻情報Ｔｎｅｗ−（ｇ＋１）が表す時刻以前の時刻である。
【０１５３】
また、ステップＳ４０９が実行される場合、ステップＳ４０６の判断結果のとおり、送信パケット時刻（すなわち時刻情報Ｔｎｅｗ−１が示す時刻）よりも、バッファ部時刻（すなわち図１０（Ｄ）の時刻情報Ｔｊが表す時刻）の方が早い。つまり、１≦ｇ≦ａを満たすすべてのｇについて、時刻情報Ｔｎｅｗ−ｇが表す時刻よりも、時刻情報Ｔｊが表す時刻の方が早い。
【０１５４】
したがって、ステップＳ４０９において制御回路２１１は、図１０（Ｄ）に示すように、時刻情報Ｔｎｅｗ−１〜Ｔｎｅｗ−ａとともにパケットＰｎｅｗ−１〜Ｐｎｅｗ−ａをバッファ部２２０の最後に順にエンキューする。その結果、ステップＳ４０９の実行後のバッファ部２２０は、時刻情報格納部２２２に格納された各時刻情報によりソートされた状態でエントリを保持することとなる。
【０１５５】
さて、ここでステップＳ４０６の分岐の説明に戻ると、上記のとおり、バッファ部時刻が送信パケット時刻以降であれば、処理はステップＳ４１０に移行する。ステップＳ４１０では、ステップＳ４０４で注目している送信予定のパケットとその時刻情報を有するエントリを、現在のバッファ部ポインタが指すエントリの直前に挿入する処理が行われる。
【０１５６】
具体的には、ステップＳ４１０で制御回路２１１は、バッファ部ポインタの指す位置に、送信予定のパケット群の先頭のパケットおよび当該パケットの時刻情報を挿入する。すなわち、パケットはパケット格納部２２１に、時刻情報は時刻情報格納部２２２に格納される。なお、ステップＳ４０９と同様に、ステップＳ４１０でもＤＭＡによりバッファ部２２０への挿入処理が行われる。
【０１５７】
続いてステップＳ４１１で制御回路２１１は、バッファ部ポインタの値を更新する。すなわち、制御回路２１１は、図４のレジスタＲ５に格納されているバッファ部ポインタの値を、今ステップＳ４１０で挿入したパケットの次のパケット（すなわちステップＳ４１０の実行直前にバッファ部ポインタが指していたパケット）を指すように変更する。
【０１５８】
図１０（Ｅ）は、ステップＳ４０６、Ｓ４１０、Ｓ４１１の順に処理が進む場合の例を示す。図１０（Ｅ）の例では、バッファ部時刻は、ステップＳ４０６でバッファ部ポインタが指すエントリの時刻情報Ｔｊが表す時刻である。ここで、ステップＳ４０４で注目している送信予定のパケットを「Ｐｎｅｗ」という参照符号で表し、パケットＰｎｅｗの送信予定時刻を「Ｔｎｅｗ」という参照符号で表す。
【０１５９】
つまり、図１０（Ｅ）の例ではステップＳ４０６において、時刻情報Ｔｎｅｗの示す時刻が、時刻情報Ｔｊの示す時刻以前であると判断される。そこで、図１０（Ｅ）に示すように、パケットＰｎｅｗと時刻情報Ｔｎｅｗを含むエントリが、パケットＰｊと時刻情報Ｔｊを含むエントリの直前に挿入されるようにするための処理（すなわち上記のステップＳ４１０とＳ４１１の処理）が行われる。
【０１６０】
そして、次のステップＳ４１２で制御回路２１１は、送信予定のパケット群の先頭のパケットを削除する。
ここで、制御回路２１１は、図３のレジスタＲ１に格納されている送信パケットリスト先頭ポインタを利用して、送信パケットリスト１０５のダミーノードＬ０を参照することができるので、送信パケットリスト１０５をたどることができる。
【０１６１】
例えば図３の具体例を参照して説明すると、ステップＳ４１２で制御回路２１１は、送信パケットリスト１０５の先頭のノードＬ１を削除し、ダミーノードＬ０のポインタを、次のノードＬ２を指すように変更する。なお、送信パケットリスト１０５がダミーノードＬ０と先頭のノードＬ１しか含まない場合は、ステップＳ４１２で制御回路２１１は、ノードＬ１を削除し、ダミーノードＬ０のポインタにヌルポインタを設定する。また、制御回路２１１は、ノードＬ１のポインタが指していたパケットＱｊｈ１が占めていたパケットバッファ１０６中の領域を明示的に解放してもよい。
【０１６２】
以上の処理により、ステップＳ４１２の実行後は、送信パケットリスト１０５中の次のパケット（図３を参照する上記の例では、今まで先頭から２番目だったノードＬ２のポインタが指すパケットＱｊｈ２）が、新たな「送信予定のパケット群の先頭のパケット」となる。
【０１６３】
そして、次のステップＳ４１３において、制御回路２１１は、送信予定のパケットがまだあるか否かを判断する。すなわち、制御回路２１１は、ステップＳ４１２の変更の結果、ダミーノードＬ０のポインタが、新たな先頭のノードＬ２を指すか、それともヌルポインタであるかを判定する。送信予定のパケットがまだ送信パケットリスト１０５内に残っていれば、次の送信予定のパケットをバッファ部２２０にエンキューするため、処理はステップＳ４０４に戻る。他方、送信予定のパケットがもう残っていなければ、図９の処理は終了する。
【０１６４】
以上説明した図９の処理により、図６においてスケジューラ部１０３がデキュー対象のキュー１０２−ｈに関して送信パケットリスト１０５により管理していた１個以上のパケットは、各々の送信予定時刻とともにバッファ部２２０内の適切な位置に挿入される。
【０１６５】
すなわち、上記「適切な位置」とは、時刻情報格納部２２２内の時刻情報が示す時刻の順に、バッファ部２２０内のエントリがソートされた状態となるような位置である。なお、図９の処理によるソートは、具体的には、最も早い時刻を表す時刻情報がバッファ部２２０の先頭のエントリに含まれるような、昇順ソートである。
【０１６６】
また、ソートされる範囲は、レジスタＲ２の時刻指定フラグが「絶対時刻」を示す場合は、バッファ部２２０の全体である。他方、時刻指定フラグが「相対時刻」を示す場合は、レジスタＲ３のバッファ探索開始位置が示す位置以降の範囲でソートされるように、パケットと時刻情報の組がバッファ部２２０に挿入される。
【０１６７】
ここで、上記のようにバッファ部ポインタは、バッファ部２２０の先頭から末尾へ向かう方向に合わせて順次更新されるだけで、逆方向にバッファ部ポインタを戻す必要はない。つまり、１度の（one-pass）バッファ部２２０の検索により、効率的に、送信予定時刻順にソートしつつバッファ部２２０へのエンキューを行うことが可能である。
【０１６８】
このような効率的なソート処理が可能な理由は、第１に、送信パケットリスト１０５内でパケットが送信予定時刻順にソートされて管理されているからである。第２の理由は、図９の処理が呼び出された時点でたとえバッファ部２２０内にパケットが残っているとしても、残っているパケットは以前に図９の処理が呼び出されたときの結果として、送信予定時刻順にソートされているからである。
【０１６９】
ところで、ハードウェア制御部２００内の送信処理部２３０は、図７〜図１０を参照して説明したバッファ格納処理部２１０による上記の処理と並行して、バッファ部２２０から各パケットを各送信予定時刻にデキューしてＰＨＹチップ３０５−ｊに出力する。
【０１７０】
図１１は、送信処理部２３０による送信処理を説明するフローチャートである。また、図１２は、送信処理によるバッファ部２２０の状態遷移の例を説明する図である。図１２の表記法は図１０と同様であるが、図１２ではバッファ部ポインタではなくバッファ探索開始位置が矢印で表されている。
【０１７１】
なお、パケット送信制御装置１に電源が入れられると、各ＭＡＣチップ３０４−１〜３０４−ｎが図１１の処理を開始する。図示のとおり、図１１の処理は、パケット送信制御装置１の起動中は永久にループして繰り返される。以下では説明の便宜上、ＭＡＣチップ３０４−ｊにより実現されるハードウェア制御部２００中の送信処理部２３０が図１１の処理を行う場合を例とする。
【０１７２】
ステップＳ５０１で、図５に示す送信処理部２３０の制御回路２３１は、図４のレジスタＲ２に格納されている時刻指定フラグの値を参照する。そして、時刻指定フラグが相対時刻を表していれば、処理はステップＳ５０２に移行し、時刻指定フラグが相対時刻を表していれば、処理はステップＳ５０３に移行する。
【０１７３】
ステップＳ５０２で制御回路２３１は、図５に示す送信処理部２３０の内部カウンタ２３３を、ＲＴＣ３０３が示す絶対時刻で初期化する。内部カウンタ２３３は内部クロックの一例である。初期化された内部カウンタ２３３は、以後、時刻のカウントを継続的に実施し続ける。ステップＳ５０２の初期化の後、処理はステップＳ５１１に移行し、後述のステップＳ５１１〜Ｓ５１４の処理が繰り返される。
【０１７４】
他方、時刻指定フラグが相対時刻を表すときは、ステップＳ５０３〜Ｓ５１０の処理が繰り返される。
ステップＳ５０３で制御回路２３１は、内部クロックとしての内部カウンタ２３３が表す相対時刻を、０に初期化する（すなわちリセットする）。初期化された内部カウンタ２３３は、以後、時刻のカウントを継続的に実施し続ける。ステップＳ５０３の初期化の後、処理はステップＳ５０４に移行する。
【０１７５】
ステップＳ５０４で制御回路２３１は、図４に示すバッファ部２２０内のレジスタＲ６に記憶されている送信開始指示の値を参照する。送信開始指示の値が「停止」を示す場合、処理はステップＳ５０５に移行し、送信開始指示の値が「送信」を示す場合、処理はステップＳ５０７に移行する。
【０１７６】
ここで、送信開始指示の値は、図７のステップＳ２０１の実行後、図８のステップＳ３０１が実行されるまでは、「停止」を示す。換言すれば、スケジューラ部１０３によるある１回のスケジューリング処理に関して、図６のステップＳ１０２を契機として図７の処理が実行された後、ステップＳ１１３を契機として図８の処理が実行されるまで、送信開始指示の値は「停止」を示す。
【０１７７】
したがって、送信開始指示の値が「停止」を示す場合、バッファ部２２０中のパケットのうち、前回のスケジューリング処理の結果としてバッファ部２２０にエンキューされたものは、ＰＨＹチップ３０５−ｊへ出力して問題ない。しかし、今回のスケジューリング処理においてバッファ部２２０にエンキューされたパケットは、まだＰＨＹチップ３０５−ｊへ出力せず、バッファ部２２０に保持し続けることが適切である。
【０１７８】
換言すれば、送信開始指示の値が「停止」を示す場合、ＰＨＹチップ３０５−ｊへ出力してよいパケットとは、バッファ部２２０において、図７のステップＳ２０２でレジスタＲ３に設定されたバッファ探索開始位置よりも前の位置に保持されているものである。すなわち、制御回路２３１はバッファ探索開始位置よりも前の位置に保持されているパケットをバッファ部２２０からデキューして、ＰＨＹチップ３０５−ｊを介してポート３０６−ｊから送信してから、パケットの送信を止めればよい。
【０１７９】
そこで、制御回路２３１はステップＳ５０５において、バッファ部２２０のレジスタＲ３に格納されているバッファ探索開始位置の値を獲得する。
そして、制御回路２３１はステップＳ５０６で、バッファ部２２０のキューの先頭位置の値が、獲得したバッファ探索開始位置の値と同一か否かを判断する。図９の処理により、バッファ部２２０中では送信予定時刻順にパケットがソートされているので、キューの先頭のパケットとは、すなわち次に送信する予定のパケットである。
【０１８０】
ステップＳ５０６において２つの値が同一であれば、前回のスケジューリング処理の結果としてバッファ部２２０にエンキューされたパケットはすべてＰＨＹチップ３０５−ｊに出力済みである。換言すれば、バッファ探索開始位置より前の位置にあるパケットのデキューは完了しており、バッファ探索開始位置の値によらずＰＨＹチップ３０５−ｊに出力してよいパケットはもう存在しない。
【０１８１】
よって、この場合は処理がステップＳ５０３に戻り、制御回路２３１は再度ステップＳ５０３で内部カウンタ２３３を０に初期化する。そして、送信開始指示の値が「停止」を示す間、待機のためにステップＳ５０３〜Ｓ５０６が繰り返される。送信開始指示の値が「送信」を示す値に変化すると、処理はステップＳ５０４からステップＳ５０７へと移行する。
【０１８２】
他方、ステップＳ５０６で２つの値が異なると判断された場合、前回のスケジューリング処理の結果としてバッファ部２２０にエンキューされたパケットが、まだ１つ以上バッファ部２２０に残っている。よって、この場合は、残っているパケットをＰＨＹチップ３０５−ｊに出力するため、処理がステップＳ５０７に移行する。
【０１８３】
ステップＳ５０７〜Ｓ５１０は、バッファ部２２０からパケットをデキューしてＰＨＹチップ３０５−ｊに出力することで、パケット送信制御装置１のポート３０６−ｊからパケットを送信するための処理である。
【０１８４】
ステップＳ５０７で制御回路２３１は、バッファ部２２０のキューの先頭にパケットが存在するか否かを判断する。キューの先頭にパケットが存在すれば処理はステップＳ５０８に移行する。他方、キューの先頭にパケットが存在しなければ、送信対象が存在しないということなので、処理はステップＳ５０４に戻る。例えばバッファ部２２０のキューが線形リストにより実現されている場合、ダミーノードのポインタの値に基づいて、制御回路２３１はステップＳ５０７の判断を行うことができる。
【０１８５】
なお、送信開始指示が「停止」を示している場合は、ステップＳ５０６からステップＳ５０７へと処理が移行したという経緯から明らかなとおり、必ずステップＳ５０７においてキューの先頭にパケットが存在する。よって、処理はステップＳ５０６、Ｓ５０７、Ｓ５０８の順に進む。
【０１８６】
他方、送信開始指示が「送信」を示している場合は、今回のスケジューリング処理の結果としてバッファ部２２０にエンキューされたすべてのパケットがＰＨＹチップ３０５−ｊへ出力された後、ステップＳ５０４とＳ５０７が交互に繰り返される。そして、次回のスケジューリング処理の開始を契機として送信開始指示の値が変更されると、処理はステップＳ５０４からＳ５０５に移行する。
【０１８７】
さて、バッファ部２２０のキューの先頭にパケットが存在する場合、ステップＳ５０７に続いてステップＳ５０８が実行される。ステップＳ５０８で制御回路２３１は、バッファ部２２０のキューの先頭のパケットと時刻情報をデキューして獲得する。例えば、バッファ部２２０のキューが線形リストを使って実装されている場合、ステップＳ５０８は、具体的には次のように実行されてもよい。
【０１８８】
すなわち、制御回路２３１は、キューの先頭のエントリの時刻情報を、図５のレジスタＲ７に時刻情報として格納する。また、制御回路２３１は、例えば図５のレジスタ領域２３２中の不図示のレジスタに、バッファ部２２０のキューを実装するための上記線形リストの、ダミーノードを除く先頭ノードのポインタ（すなわち図４のメモリ領域２２３中に格納されているパケットを指すポインタ）の値をコピーする。
【０１８９】
そして、制御回路２３１は、線形リストの先頭ノードを削除し、ダミーノードのポインタを、先頭ノードの次のノードを指すように更新する。なお、もし「先頭ノードの次のノード」が存在しなければ、制御回路２３１は、ダミーノードのポインタにヌルポインタを設定すればよい。
【０１９０】
例えば上記の処理により、制御回路２３１は、バッファ部２２０のキューの先頭のパケットと時刻情報をデキューし、デキューしたパケットと時刻情報を送信処理部２３０が一時的に管理するようにすることができる。
【０１９１】
続いて、ステップＳ５０９で制御回路２３１は、図５のレジスタＲ７に格納されている時刻情報と、内部クロックすなわち内部カウンタ２３３の示す時刻とを読み取り、２つの時刻を比較する。内部カウンタ２３３が示す時刻が、パケットの送信予定時刻（すなわちレジスタＲ７に格納されている時刻情報が示す時刻）に達していれば、処理はステップＳ５１０に移行する。つまり、２つの時刻が同じか、またはレジスタＲ７の時刻情報が示す時刻の方が内部カウンタ２３３の示す時刻よりも早ければ、処理はステップＳ５１０に移行する。
【０１９２】
他方、内部カウンタ２３３が示す時刻がパケットの送信予定時刻に達していなければ、処理はステップＳ５０９に戻る。すなわち、制御回路２３１は、内部カウンタ２３３の示す時刻がパケットの送信予定時刻に達するまで待機する。
【０１９３】
なお、図１１にはステップＳ５０９の処理の繰り返しとして待機が表現されているが、実施形態によっては、必ずしもステップＳ５０９での比較を繰り返す必要はない。例えば、内部カウンタ２３３は、時刻のカウントアップを行うだけでなく、指定された時刻に割り込み信号を発生させる機能を有するものであってもよい。その場合、ステップＳ５０８で制御回路２３１がデキューした時刻情報を内部カウンタ２３３に指定することで、パケットの送信予定時刻になると内部カウンタ２３３が割り込み信号を発生させる。そして、割り込み信号を契機として、処理がステップＳ５０９からステップＳ５１０に移行してもよい。
【０１９４】
いずれにしろ、送信処理部２３０は、時刻に基づく信号（例えば、時刻のカウント値を示す信号や割り込み信号など）を発生させる回路（例えば内部カウンタ２３３）を使って、パケットの送信を送信予定時刻まで遅延させることができる。
【０１９５】
そして、ステップＳ５１０で制御回路２３１は、ステップＳ５０８でデキューしたパケットの送信を実施する。例えば、制御回路２３１は、ステップＳ５０８に関して説明した上記不図示のレジスタが指すパケットを図４のメモリ領域２２３から読み出し、ＭＩＩなどのインタフェースを介してＰＨＹチップ３０５−ｊへと出力する。
【０１９６】
その結果、パケットは、スケジューラ部１０３によってスケジューリングされた送信予定時刻どおりに、ＰＨＹチップ３０５−ｊを介してポート３０６−ｊから送信される。ステップＳ５１０の実行後、処理はステップＳ５０４に戻る。
【０１９７】
なお、送信開始指示の値が「送信」を示す場合、制御回路２３１は、バッファ探索開始位置とは関係なくパケットのデキューと送信を継続してよい。しかし、ステップＳ５１０での１つのパケットの送信のたびに、処理はステップＳ５０４に戻り、逐一、送信開始指示の値が確認される。その理由は次のとおりである。
【０１９８】
送信処理部２３０による図１１の処理とは独立に、かつ並行して、スケジューラ部１０３がスケジューリング処理を行っている。そのため、制御回路２３１がパケットのデキューと送信を継続する途中で送信開始指示の値が変化する可能性がある。送信開始指示の値が変化しても、スケジューラ部１０３によるスケジューリング結果のとおりに正しくパケットの送信を行うことができるようにするため、本実施形態では、ステップＳ５１０の後で処理がステップＳ５０４に戻り、送信開始指示の値が再確認される。
【０１９９】
なお、以上説明したステップＳ５０３〜Ｓ５１０の処理により、例えば図１２に示すようにバッファ部２２０の状態が遷移する。
図１２は、前回のスケジューリング処理の結果バッファ部２２０にエンキューされたパケットと時刻情報がまだバッファ部２２０に残っているうちに、スケジューラ部１０３が今回のスケジューリング処理を開始した例を示す。この場合、図１２に矢印で示すようにバッファ探索開始位置は、前回のスケジューリング処理の結果エンキューされた最後のエントリ（パケットＰｒと時刻情報Ｔｒを含むエントリ）の次のエントリを指す（１≦ｒ）。また、今回のスケジューリング処理を契機として、送信開始指示の値は「停止」を示す値に変化する。
【０２００】
さらに、今回のスケジューリング処理の進行につれて、バッファ格納処理部２１０が図９の処理を行う。したがって、バッファ探索開始位置が指すエントリ以降にもパケット（例えばパケットＰｒ＋１）と時刻情報（例えば時刻情報Ｔｒ＋１）が順次エンキューされていく。
【０２０１】
例えば、バッファ部２２０は、前回のスケジューリング処理の結果エンキューされたパケットＰ１〜Ｐｒと時刻情報Ｔ１〜Ｔｒと、さらに今回のスケジューリング処理の進行につれてエンキューされたパケットＰｒ＋１と時刻情報Ｔｒ＋１を保持している。この状況で図１１のステップＳ５０４が実行され、処理がステップＳ５０５に移行し、図１２に矢印で示すバッファ探索開始位置の値が獲得されるとする。
【０２０２】
すると、バッファ探索開始位置の値はバッファ部２２０の先頭位置の値とは異なるので、処理はステップＳ５０７、Ｓ５０８、Ｓ５０９と進む。そして、ステップＳ５０９での適宜の待機の後、ステップＳ５１０でパケットＰ１がパケット送信制御装置１から送信される。そして処理はステップＳ５０４に戻る。
【０２０３】
上記と同様の一連の処理を制御回路２３１が繰り返すことで、パケットＰ２〜Ｐｒも順次パケット送信制御装置１から送信されていく。すると、パケットＰｒ＋１と時刻情報Ｔｒ＋１のエントリがバッファ部２２０の先頭に位置するようになる。
【０２０４】
この状況でステップＳ５０４が実行されると、処理はステップＳ５０５、Ｓ５０６と進んだ後、ステップＳ５０３に戻る。そして、送信開始指示の値が「送信」を示す値に更新されるまで、ステップＳ５０３〜Ｓ５０６が繰り返される。
【０２０５】
その後、今回のスケジューリング処理の終了にともなって、図８の処理により送信開始指示の値が「送信」を示す値に更新されると、処理はステップＳ５０４からステップＳ５０７へ移行する。そして、今回のスケジューリング処理の結果としてバッファ部２２０にエンキューされたパケットを送信するためのステップＳ５０７〜Ｓ５１０の処理が行われる。
【０２０６】
なお、図１２ではバッファ部２２０の４つの状態を例示したが、説明の簡略化のため、どの状態においてもパケットＰｒの次にはパケットＰｒ＋１が保持されている場合を示してある。しかし、実際には、図９の処理に関して説明したとおり、バッファ部２２０へのエンキュー処理はソート処理をともなう。
【０２０７】
よって、図１１の処理と並行して、時刻情報Ｔｒ＋１よりも早い送信予定時刻のパケットが、バッファ探索開始位置に挿入されることもあり、その結果、パケットＰｒ＋１と時刻情報Ｔｒ＋１が次のエントリに繰り下がることもある。つまり、図１２において、矢印が示すバッファ探索開始位置のパケットは、途中でパケットＰｒ＋１から他のパケットＰ’ｒ＋１となり、パケットＰｒ＋１がバッファ探索開始位置よりも後ろの位置に移動することもある。
【０２０８】
ここで、ステップＳ５０１の分岐の説明に戻る。時刻指定フラグが絶対時刻を示すとステップＳ５０１で判断された場合、上記ステップＳ５０２の実行後に、制御回路２３１はステップＳ５１１〜Ｓ５１４を繰り返し実行する。時刻指定フラグが絶対時刻を示す場合は、バッファ探索開始位置とは無関係に、時刻にのみ基づく処理により、スケジューリングされたとおりのパケット送信が可能となる。
【０２０９】
ステップＳ５１１で制御回路２３１は、バッファ部２２０のキューの先頭にパケットが存在するか否かを、ステップＳ５０７と同様の仕方で判断する。キューの先頭にパケットが存在すれば、処理はステップＳ５１２に移行する。他方、キューの先頭にパケットが存在しなければ、制御回路２３１はステップＳ５１１を繰り返し、パケットがバッファ部２２０にエンキューされるまで待機する。
【０２１０】
ステップＳ５１２で制御回路２３１は、バッファ部２２０のキューの先頭のパケットと時刻情報をデキューして獲得する。ステップＳ５１２の詳細は、ステップＳ５０８と同様である。
【０２１１】
そして、ステップＳ５１３で制御回路２３１は、図５のレジスタＲ７に格納されている時刻情報と、内部クロックすなわち内部カウンタ２３３の示す時刻とを読み取り、２つの時刻を比較する。内部カウンタ２３３が示す時刻が、パケットの送信予定時刻（すなわちレジスタＲ７に格納されている時刻情報が示す時刻）に達していれば、処理はステップＳ５１４に移行する。
【０２１２】
他方、内部カウンタ２３３が示す時刻がパケットの送信予定時刻に達していなければ、処理はステップＳ５１３に戻る。すなわち、制御回路２３１は、内部カウンタ２３３の示す時刻がパケットの送信予定時刻に達するまで待機する。ステップＳ５０９と同様に、ステップＳ５１３の処理には、割り込みが利用可能である。
【０２１３】
そして、ステップＳ５１４で制御回路２３１は、ステップＳ５１２でデキューしたパケットの送信を実施する。ステップＳ５１４の詳細は、ステップＳ５１０と同様である。ステップＳ５１４の実行後、処理はステップＳ５１１に戻る。
【０２１４】
ところで、以上詳細に説明した本実施形態の利点は、図２に関する説明の後に簡単に述べたとおりであるが、より詳細に考察すれば下記のごとくである。以下、本実施形態の利点を明らかにするため、第１比較例としてハードウェア単独でのＱｏＳ制御の例を取り上げ、第２比較例としてソフトウェア単独でのＱｏＳ制御の例を取り上げる。本実施形態は、上記のとおり、ソフトウェアとハードウェアが連携するハイブリッド方式を採用している。
【０２１５】
第１比較例では、下記（ｆ１）と（ｆ２）の問題が生じる。
（ｆ１）キューイング処理における困難
パケットの種類を識別し適切なキューにパケットをエンキューするキューイング処理をハードウェアで実現することは困難である。その理由は、種類を識別する処理が複雑であり、新たなネットワークサービスの出現などにともなってキューイング処理への機能追加が求められることも多々あるからである。
【０２１６】
一般に、ソフトウェアを使わずにハードウェア回路により複雑な処理を実装するのは困難であり、たとえ実装可能だとしても、開発コストなどが嵩む。また、機能追加が求められると、種別を識別する処理ロジックの変更にともなってハードウェア回路の設計をやり直すことになる。よって、第１比較例において頻繁な機能追加に対応することは、コストの面から非現実的である。
【０２１７】
また、従来のＱｏＳ制御では、パケットに含まれる低位レイヤ（例えばＬ２またはＬ３）のヘッダ中の特定のフィールドの値に応じてキューを割り当てることが行われていたが、近年では、ＱｏＳ制御により多くのことが望まれる。具体的には、Ｌ４ないしＬ７といった高位レイヤのヘッダに含まれる情報まで用いてパケットの種別を識別することにより、よりきめ細やかなＱｏＳ制御を実現することが望まれるようになりつつある。
【０２１８】
高位レイヤの情報は、低位レイヤのヘッダ（と、場合によってはトレイラ）によってカプセル化されているので、高位レイヤの情報を得るにはパケットを深く調べなくてはならない。しかし、仮に、ハードウェア回路によってパケットを深く調べ、高位レイヤの情報を使ったＱｏＳ制御を実現しようとすれば、回路の規模も複雑さも増大し、その結果として、回路の開発段階で不具合の発生も増える。その結果、不具合を克服して製造段階に至ること自体が、非常に困難である。
【０２１９】
さらに、近年は次々と新しいアプリケーションが増えている。これらの新たなアプリケーションに逐一対応してＱｏＳ制御の処理ロジックを頻繁に変更することは、上記のとおり非現実的である。
【０２２０】
（ｆ２）スケジューリング処理における困難
一般にスケジューリング処理は、１つのポートに対応して用意されている複数のキューのすべてに対して、個々のパケットを実際に送信するタイミングを制御する処理や、キュー間での調停処理を含む。このようなスケジューリング処理をハードウェア回路により実現するのは困難であり、不具合の発生を防ぐことは非常に難しい。また、不具合に対処するためにも大変な注意と膨大な検証を要する。
【０２２１】
そこで、不具合の発生を抑えるための現実的な対策としては、キューの本数を８本程度の少ない本数に制限し、ＱｏＳ制御の機能も制限することが考えられる。しかし、その代償として、きめ細やかなＱｏＳ制御を達成することはできなくなる。
【０２２２】
以上のように第１比較例では（ｆ１）と（ｆ２）の問題が発生する一方で、第２比較例では、下記（ｆ３）の問題が生じる。
（ｆ３）スケジューリング処理における困難
第２比較例においては、第１比較例における（ｆ１）の問題は生じないか、または軽微である。すなわち、ソフトウェアによる制御では、処理アルゴリズムを柔軟に記述することが可能なので、高位レイヤの情報を用いてパケットの種別をきめ細やかに識別することが比較的容易であり、頻繁な更新にも比較的対応しやすい。しかし、第２比較例ではスケジューリング処理に問題がある。
【０２２３】
例えば帯域制御を実現するためには、スケジューリング処理は、１つのポートに対応して用意されている複数のキューのすべてに対して、個々のパケットを実際に送信するタイミングを制御する処理を含むことになる。また、優先制御を実現するためには、スケジューリング処理は、次にパケットをデキューするキューを選択する処理を含み、場合によっては同じ優先度の複数のキュー間での調停処理を含む。そして、キュー間の調停や送信のタイミングの制御には、時間的に非常にシビアな処理が求められる。
【０２２４】
しかし、ソフトウェアによる制御は一般にハードウェアによる制御に比べて速度で劣る。そのため、所望の精度で時間的に正確な送信を第２比較例において実現することは困難である。その理由は、以下のとおり、第２比較例において考えられる様々なアプローチそれぞれに欠点があるからである。
【０２２５】
第２比較例においては、例えば自然で単純な設計として、一定の間隔でスケジューリング処理を呼び出し、当該間隔の時間内でパケットを送信することが考えられる。説明の便宜上、例えば、上記間隔は１０ｍｓであり、あるキュー（以下、便宜的に「キューＸ」という）には「１秒間に１０００パケットを送信する」と示すＱｏＳ値が設定されているものとする。すると、
１０００［パケット］×１０［ｍｓ］／１０００［ｍｓ］＝１０［パケット］
なので、設定どおりの送信のためには、１回スケジューリング処理が呼び出されるごとにキューＸから１０パケットを送信することになる。１０ｍｓの間に１０パケットを送信することは、可能かもしれない。
【０２２６】
しかし、もしキューＸに「１秒間に１０００万パケットを送信する」と設定されていれば、１回スケジューリング処理が呼び出されるごとにキューＸから１０万パケットを送信することになる。１０ｍｓの間に１０万パケットを送信する制御をソフトウェアで実現することは非現実的である。
【０２２７】
なお、パケット数ではなくバイト数でＱｏＳ値が表されていても同様である。つまり、キューに低い帯域が設定されている場合は、１０ｍｓという期間内でスケジューリング処理とパケットの送信を完了することが可能であっても、帯域の設定値が大きい場合は。１０ｍｓという期間内で処理を完了することができない可能性が高い。なぜなら、帯域の設定値が大きい場合は、１回のスケジューリング処理における処理対象のパケットの数も多く、１０ｍｓあたりの処理量も多いからである。
【０２２８】
そこで、第２比較例においては、スケジューリング処理の呼び出し間隔を長くするというアプローチが考えられるが、下記の理由から、ジッタを大きくしてしまうという問題をはらんでおり、非実用的である。
【０２２９】
例えば、呼び出し間隔を１ｓとし、キューＸには上記と同じく「１秒間に１０００パケットを送信する」と設定されているものとする。すると、１０ｍｓを単位とした１０パケットずつの送信が繰り返されるかわりに、１ｓごとにバースト的に一気に１０００パケットが送信されることになる。この場合、受信側の装置からは、「回線速度で一気に１０００パケットの受信が続き、その後１ｓ近くパケットの受信が途絶える」というパターンの繰り返しにより、パケットが送信されている、と見える。
【０２３０】
ところで、近年では回線が広帯域化しており、１０Ｇｂｐｓ以上の回線も珍しくない。すると、上記の例では非常に短い時間の間に１０００パケットが受信される。よって、バッファ溢れ等でパケットロスに陥らないようにするには、受信側の装置は、１０００パケットを格納可能なバッファを備える必要がある。
【０２３１】
また、１ｓごとのバースト送信ではジッタが大きくなり、音声等のリアルタイム性が問われる通信では、品質が大きく劣化する。例えば、ジッタがあまりに大きいと、スムーズな会話ができなくなるといった不具合が生じる。
【０２３２】
このように、スケジューリング処理の呼び出し間隔を長くするというアプローチは、バッファ容量の面からもジッタの面からも問題がある。
そこで、第２比較例においては、逆に、スケジューリング処理の呼び出し間隔を短くするというアプローチも考えられる。しかし、上記のとおり、例えば１０ｍｓという間隔でも、キューに設定された帯域の値によっては、処理が完了しないかもしれない。また、一定間隔での処理の呼び出しには割り込みが使われることが多いが、呼び出し間隔を短くするほど割り込みの発生頻度が上がり、割り込みのオーバヘッドも無視することができなくなる。そのため、第２比較例では、スケジューリング処理の呼び出し間隔が長くても短くても、それぞれに問題が生じる。
【０２３３】
そこで第２比較例におけるさらに別のアプローチとして、複数のＣＰＵを利用してスケジューリング処理を分散して行うことも考えられる。しかし、一般のスケジューリング処理には分散することのできない調停処理が含まれるため、並列分散処理のメリットは限定的である。
【０２３４】
例えば、１０本のキューがあり、それぞれに帯域が設定されているとする。あるキューから１つパケットを送信した後、次にどのキューからパケットを送信するのかを決定するためには、１０本のキューすべてについて当該キュー内で次に送信する対象のパケットの送信予定時刻を計算し、１０個の時刻を比較することになる。
【０２３５】
例えば、送信予定時刻の計算は、各キューに対応する１０個のＣＰＵで分散して行うことも可能だが、１０個の時刻を比較する処理、すなわち１０本のキュー間での調停処理は、分散して実行するのが不適当である。したがって、複数のＣＰＵを利用したとしても、並列処理による処理時間の短縮はあまり期待できない。
【０２３６】
よって、いずれのアプローチを採用しても、第２比較例においては、スケジューリング処理の複雑性とリアルタイム性を両立させることが非常に困難である。
以上の第１および第２比較例と比べて再度本実施形態について検討すると、以下のとおり様々な利点がある。
【０２３７】
（ｇ１）きめ細やかで複雑なＱｏＳ制御と、優れた拡張性
本実施形態では、パケットの種別を識別するキューイング処理はパケット種別識別部１０１が行い、スケジューリング処理はスケジューラ部１０３が行う。また、本実施形態では（ｆ２）の問題がないので、キュー群１０２のキューの本数ｎを少なく制限する必要もない。
【０２３８】
よって、本実施形態によれば、キュー群１０２に多数のキューを設けて高位レイヤの情報を用いるなどして、きめ細やかで複雑なＱｏＳ制御を実現することが可能であり、（ｆ１）および（ｆ２）の問題が解決される。また、パケット種別識別部１０１とスケジューラ部１０３がソフトウェアを使って実現されるので、本実施形態は、キューイング処理やスケジューリング処理のアルゴリズムの頻繁な変更にも対応しやすく、拡張性に優れている。
【０２３９】
（ｇ２）高いリアルタイム性
本実施形態によれば、ハードウェア回路であるＭＡＣチップ３０４−ｊ（１≦ｊ≦ｍ）により実現されるハードウェア制御部２００は、図９と図１１の処理を実行するだけで、パケットの種別を識別するキューイング処理やスケジューリング処理は行わない。つまり、ハードウェア制御部２００は、予め指定された時刻情報にしたがって送信予定時刻になるまでパケットの送信を遅延させるという、比較的単純な処理を行っている。
【０２４０】
よって、本実施形態は、上記（ｆ１）と（ｆ２）の問題を避けることができ、ハードウェア制御部２００を実現するＭＡＣチップ３０４−１〜３０４−ｍの製作工数および開発コストを削減することもできる。
【０２４１】
そして、本実施形態によれば、内部カウンタ２３３という比較的単純なハードウェアを利用するだけで厳密なタイミング制御を実現することができ、パケットを送信予定時刻どおりに正確に送信することができる。したがって、上記（ｆ３）のようなジッタは、本実施形態においては生じない。その結果、高いリアルタイム性が実現される。
【０２４２】
（ｇ３）上記（ｇ１）と（ｇ２）の両立
上記（ｆ１）〜（ｆ３）の考察から明らかなように、第１または第２比較例においては、複雑なＱｏＳ制御とリアルタイム性とを両立させることが非常に困難であり、拡張性とリアルタイム性を両立させることも非常に困難である。それに対して本実施形態では、上記のとおり、ソフトウェアとハードウェアそれぞれの特長を活かしてソフトウェア制御部１００とハードウェア制御部２００が連携することにより、上記（ｇ１）と（ｇ２）をともに実現することができる。
【０２４３】
換言すれば、本実施形態では、ソフトウェア制御部１００とハードウェア制御部２００が、協働しながらも各々独立して並行に処理を進めるため、上記（ｇ１）と（ｇ２）の両立が可能となっている。
【０２４４】
つまり、ソフトウェア制御部１００でスケジューリング処理が呼び出される間隔Δτによらず、ハードウェア制御部２００は、ジッタのない正確な送信予定時刻どおりのパケットの送信を行うことができる。したがって、間隔Δτは、実際のパケットの送信間隔を考慮することなく、ソフトウェア制御部１００にとって適切な値に決めることができる。
【０２４５】
例えば、間隔Δτは、ソフトウェア制御部１００を実現するＣＰＵ３０１やメモリユニット３０２の仕様に基づいて、割り込み処理のオーバヘッドやキュー群１０２の容量などに応じた適切な値に決めることができる。なお、間隔Δτは、スケジューラ部１０３を実現するソフトウェアに予め定数としてプログラムされていてもよい。
【０２４６】
また、本実施形態は、第１および第２比較例に対する上記（ｇ１）〜（ｇ３）の利点を有するだけでなく、下記（ｇ４）の効果を奏し、（ｇ４）の効果は（ｇ５）の仕組みにより支えられている。したがって、本実施形態のパケット送信制御装置１は、今後ますます求められるようになるネットワーク上でのＱｏＳ処理における様々な要求に応えることができる。
【０２４７】
（ｇ４）複数のパケットの送信を一度にまとめて依頼することによる効率化
近年の広帯域化に適したＱｏＳ制御を実現するには、処理がなるべく効率化されていることが好ましい。本実施形態では、図６のステップＳ１０９のように複数のパケットの送信をスケジューラ部１０３がまとめてバッファ格納処理部２１０に依頼することで、効率化が達成されており、処理時間も短縮されている。本実施形態で効率化が可能な理由を、第３比較例と比べながら説明すれば以下のとおりである。
【０２４８】
以下に第３比較例として取り上げる、ある種のＱｏＳ制御装置では、ｎ本のキューが存在する場合、スケジューリング処理が呼び出されるたびに以下の一連の処理が行われる。
・すべてのｈ（１≦ｈ≦ｎ）について、ｈ番目のキューの設定値（例えば設定された帯域の値）を使ってｈ番目のキューの先頭のパケットの送信予定時刻を計算すること。
【０２４９】
・計算したｎ個の送信予定時刻の中で最も早いものを選択すること。
・選択した送信予定時刻に対応するキューから先頭のパケットをデキューすること。
・デキューしたパケットを、選択した送信予定時刻に送信するよう、後段の処理に依頼すること。
【０２５０】
つまり、第３比較例では、１つのパケットのデキューのためにｎ個の送信予定時刻が比較される。換言すれば、スケジューリング処理の呼び出し間隔（すなわち割り込み間隔）Δτの間に行われるｎ個の送信予定時刻間の比較処理の回数は、間隔Δτの間に出力されるパケットの数と同じである。
【０２５１】
このように第３比較例では、ジッタを抑制して送信予定時刻どおりにパケットを送信することを目的として、１つのパケットをデキューするたびに、毎回ｎ個の送信予定時刻間の比較処理が行われる。しかしキューに設定された帯域が大きい場合やキューの本数ｎが多い場合は、比較処理の処理量は、無視することができず、場合によっては厖大な量となる。
【０２５２】
他方、本実施形態では第３比較例のような比較処理が不要であり、処理が効率化されている。本実施形態において、毎回の比較処理が不要であり、図６のステップＳ１０９のようにあるキュー１０２−ｈにエンキューされた複数のパケットについてまとめて送信をバッファ格納処理部２１０に依頼することが可能な理由は、次のとおりである。
【０２５３】
すなわち、本実施形態では、スケジューラ部１０３がバッファ格納処理部２１０に送信を依頼する順序は、必ずしもパケットの送信予定時刻順ではない。なぜなら、スケジューラ部１０３は、キュー間での送信予定時刻の比較を行わないからである。
【０２５４】
しかし、本実施形態によれば、送信予定時刻順にパケットを処理するソート処理は、バッファ格納処理部２１０による図９の処理に含まれており、下記（ｇ５）の仕組みにより、送信順序が逆転しないことが保証される。よって、たとえスケジューラ部１０３がパケットの送信予定時刻順とは異なる順序でパケットの送信を依頼しても、「送信依頼の順序が送信予定時刻順でないためにパケットの送信順が狂い、ジッタが発生する」といった事態には陥らない。
【０２５５】
すなわち、本実施形態によれば、スケジューリング処理においてｎ個の送信予定時刻同士の比較を繰り返す必要がないので、スケジューラ部１０３によるスケジューリング処理の簡略化および効率化が達成されている。また、この効率化は、ソフトウェア制御部１００とハードウェア制御部２００の連携により、送信予定時刻どおりの正確な送信を犠牲にすることなく達成される。
【０２５６】
（ｇ５）送信の順序の逆転を防ぐ仕組み
上記（ｇ４）の効果は、パケットの送信依頼の順が送信予定時刻順と違っていても実際の送信の順序では逆転が生じないことが保証されてこそ、有効である。本実施形態では逆転を防ぐために以下の仕組みが利用される。
【０２５７】
絶対時刻モードにおいて逆転を防ぐ仕組みは、式（３）中のτｍａｒｇｉｎ（≧Δτ）である。実施形態によって図６のステップＳ１０５で用いられる計算式は任意であり、式（３）以外の式が用いられてもよい。しかし、絶対時刻モードにおいて送信の順序の逆転を防ぐために、スケジューラ部１０３は、ステップＳ１０５ではどのパケットに対しても送信予定時刻として（τ０＋τｍａｒｇｉｎ）以降の時刻を計算することが望ましい。
【０２５８】
例えば、スケジューリング処理の呼び出し間隔Δτが１０ｍｓであり、τｍａｒｇｉｎ＝Δτでもよい。なお、間隔Δτは、間隔Δτの間に受信可能な量のパケットについてのスケジューリング処理をスケジューラ部１０３が間隔Δτの間に終了することができるように（すなわちスケジューリング処理が破綻しないように）、予め決められている。
【０２５９】
間隔Δτの決定にあたっては、パケット送信制御装置１の各ポート３０６−１〜３０６−ｍに接続可能なケーブルの種類や割り込み処理のオーバヘッドなどが考慮されてもよい。また、間隔Δτでスケジューリング処理を行うのに十分な性能のＣＰＵ３０１が選ばれてパケット送信制御装置１に搭載されている。
【０２６０】
時刻τ０に呼び出された図６のスケジューリング処理において、スケジューラ部１０３がどのパケットに対しても送信予定時刻として（τ０＋τｍａｒｇｉｎ）以降の時刻を計算することで、送信の順序の逆転は防止される。理由は以下のとおりである。
【０２６１】
上記のとおり間隔Δτは、スケジューリング処理が破綻しないように予め適切に決められている。よって、時刻τ０に呼び出された今回のスケジューリング処理が完了する時刻は（τ０＋Δτ）以前である。
【０２６２】
また、どのパケットに対しても送信予定時刻として（τ０＋τｍａｒｇｉｎ）以降の時刻が計算されるとすると、τｍａｒｇｉｎ≧Δτなので、今回のスケジューリング処理において計算される送信予定時刻は、いずれも（τ０＋Δτ）以降である。よって、今回のスケジューリング処理で計算される送信予定時刻はいずれも、今回のスケジューリング処理の完了以降の時刻である。
【０２６３】
ここで、簡単のため、バッファ格納処理部２１０による図９の処理にかかる時間を無視することができるとする。
すると、今回のスケジューリング処理においてスケジューラ部１０３がバッファ格納処理部２１０に送信を依頼したすべてのパケットが、送信予定時刻以前に、送信予定時刻順にソートされた状態でバッファ部２２０に格納される。そして、バッファ部２２０に格納された複数のパケットは、送信予定時刻どおりに、順に送信処理部２３０によりＰＨＹチップ３０５−ｊ（１≦ｊ≦ｍ）へ出力され、ポート３０６−ｊから送信される。
【０２６４】
つまり、τｍａｒｇｉｎ≧Δτであれば、今回のスケジューリング処理における送信予定のパケットの送信順が逆転することがない、と保証される。
また、バッファ格納処理部２１０による図９の処理にかかる時間の最大値（τｓｏｒｔとする）を無視することができない場合についても同様である。すなわち、τｍａｒｇｉｎ≧Δτ＋τｓｏｒｔであれば、パケットの送信順が逆転することがない、と保証される。
【０２６５】
他方、相対時刻モードにおいて逆転を防ぐ仕組みは、図４のバッファ探索開始位置と送信開始指示を使った処理である。以下に、図６〜図１２の間の関連を補足しながら、送信順の逆転が生じない理由を説明する。
【０２６６】
説明の便宜上、例えば間隔Δτ＝１０［ｍｓ］とすると、相対時刻モードでは、送信予定時刻は、０ｍｓ以上１０ｍｓ以下の値で表される。送信予定時刻が１０ｍｓを超えないのは、スケジューリング処理のたびに内部カウンタ２３３が０にリセットされるからである。
【０２６７】
すなわち、スケジューラ部１０３は、図６のステップＳ１０２の処理により、時刻τ０に呼び出された今回のスケジューリング処理の開始をバッファ格納処理部２１０に通知する。すると、バッファ格納処理部２１０が図７の処理を実行する。そして、送信処理部２３０は、もし前回のスケジューリング処理の結果としてバッファ部２２０に残っているパケットがあれば、図１１のステップＳ５０４〜Ｓ５１０の処理を繰り返す。やがて、前回のスケジューリング処理の結果としてバッファ部２２０に残っているパケットがなくなると、ステップＳ５０３において内部カウンタ２３３がリセットされる。つまり、スケジューラ部１０３は、スケジューリング処理の開始を通知することで、送信開始指示の値の変化を引き起こし、間接的に、相対時刻のカウント開始をハードウェア制御部２００に指示している。
【０２６８】
その後、スケジューラ部１０３は、ステップＳ１１３の処理により、今回のスケジューリング処理の終了をバッファ格納処理部２１０に通知する。すると、バッファ格納処理部２１０が図８の処理を実行する。その結果、送信処理部２３０がステップＳ５０４の判断に続いてステップＳ５０７を実行し、今回のスケジューリング処理において送信予定時刻が計算されたパケットの送信が始まる。
【０２６９】
以上のようにして、スケジューリング処理のたびに内部カウンタ２３３が０にリセットされる。よって、相対時刻モードでは、送信予定時刻は、内部カウンタ２３３がリセットされた時点を基準時刻として、０以上Δτ以下の値で表される。
【０２７０】
また、図１２に例示したパケットＰ１〜Ｐｒのように、今回のスケジューリング処理が行われている期間中、バッファ部２２０には、時刻（τ０−Δτ）に呼び出された前回のスケジューリング処理の結果エンキューされたパケットが残っていることがある。
【０２７１】
例えば、パケットＰｒの時刻情報Ｔｒは、「９ｍｓ」という相対時刻を示すかもしれない。他方で、今回のスケジューリング処理の結果としてバッファ部２２０に新たにエンキューされるパケットＰｒ＋１の時刻情報Ｔｒ＋１は、「１ｍｓ」という相対時刻を示すかもしれない。ここで、時刻情報Ｔｒと時刻情報Ｔｒ＋１は異なる基準時刻に対する相対時刻なので、時刻情報Ｔｒが示す時刻の方が、時刻情報Ｔｒ＋１が示す時刻よりも早い。
【０２７２】
しかし、仮に、バッファ格納処理部２１０の制御回路２１１が単に「１」と「９」という値のみに基づいてソート処理を行うとすれば、制御回路２１１は誤って「時刻情報Ｔｒ＋１が示す時刻の方が、時刻情報Ｔｒが示す時刻よりも早い」と判断することになる。その結果、パケットＰｒ＋１がパケットＰｒより遥かに早く送信されてしまい、送信順序が守られず、ひいてはジッタが発生することになる。
【０２７３】
本実施形態では、図４のバッファ探索開始位置と送信開始指示を使うことで、送信順序の逆転が防止される。すなわち、ハードウェア制御部２００内の各部は、送信開始指示の値によって、スケジューラ部１０３によるスケジューリング処理の開始と終了を認識することができる。また、ハードウェア制御部２００は、バッファ探索開始位置の値から、前回のスケジューリング処理でバッファ部２２０にエンキューされたパケットと、今回のスケジューリング処理でバッファ部２２０にエンキューされたパケットとを区別することができる。
【０２７４】
よって、バッファ格納処理部２１０は、バッファ探索開始位置に基づいて、前回のスケジューリング処理でバッファ部２２０にエンキューされた時刻情報を、図９でのソート処理における時刻情報の比較対象から除外することができる。
【０２７５】
また、送信処理部２３０は、バッファ探索開始位置と送信開始指示に基づいて、今回のスケジューリング処理が行われている期間中には、今回のスケジューリング処理でバッファ部２２０にエンキューされたパケットを送信対象から除外することができる。すなわち、送信処理部２３０は、今回のスケジューリング処理の終了を認識してはじめて、今回のスケジューリング処理でバッファ部２２０にエンキューされたパケットの送信を開始する。そのため、スケジューラ部１０３がキュー間の調停を行わなくても、送信順が逆転することはない。
【０２７６】
例えば「５ｍｓ」を示す時刻情報が付されたパケットがキュー１０２−１に対応してバッファ部２２０にエンキューされ、その後、「１ｍｓ」を示す時刻情報が付されたパケットがキュー１０２−ｎに対応してバッファ部２２０にエンキューされるとする。しかし、前者のパケットがバッファ部２２０にエンキューされても、送信処理部２３０は、「停止」を示す送信開始指示の値に基づき、前者のパケットをすぐには送信せず、今回のスケジューリング処理が終了するまで待つ。よって、前者のパケットと後者のパケットの送信順が入れ替わることはない。
【０２７７】
なお、本発明は上記の実施形態に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
図１〜図５に示した構成は例示であり、適宜変更することができる。例えば、上記では線形リストを用いて送信パケットリスト１０５やバッファ部２２０を実装する例について説明したが、線形リスト以外のデータ構造を利用する実施形態も可能である。
【０２７８】
また、図３〜図５に別々のブロックとして示した各部は、理解を容易にするために便宜上分けてあるが、物理的な構成は任意に変更することができる。例えば、物理的にはＭＡＣチップ３０４−ｊ（１≦ｊ≦ｍ）上に実装されている１つのレジスタ領域が、レジスタ領域２１２とレジスタ領域２２４とレジスタ領域２３２を含んでいてもよい。
【０２７９】
また、ソフトウェア制御部１００とハードウェア制御部２００が制御情報を共有する方法は実施形態に応じて任意である。図３〜図５に示すハードウェア制御部２００内の各種レジスタ（すなわちＭＡＣチップ３０４−ｊ内のレジスタ）を使った制御情報の共有は、共有のための手法の一例にすぎない。例えば、ＣＰＵ３０１とＭＡＣチップ３０４−ｊを結ぶ特定の信号線を介して、制御情報の１つである送信開始指示の値がソフトウェア制御部１００からハードウェア制御部２００に通知されてもよい。
【０２８０】
また、図３には１つのＣＰＵ３０１が例示されているが、複数のＣＰＵをパケット送信制御装置１が含んでもよい。例えば、複数のＣＰＵまたはマルチコアＣＰＵを利用する実施形態も可能である。例えば、ポート３０６−１〜３０６−ｍにそれぞれ対応するｍ個のソフトウェア制御部１００としての処理を、複数のＣＰＵまたは複数のコアが分散して実行することができる。
【０２８１】
なお、本実施形態では、キュー１０２−１〜１０２−ｎ間での比較をスケジューラ部１０３が行う必要がないので、本実施形態のスケジューリング処理は並列処理との親和性が高い。したがって、上記のようなポートごとの並列分散処理よりもさらに粒度の細かい並列分散処理も可能である。
【０２８２】
例えば、ある１つのポート３０６−ｊ（１≦ｊ≦ｍ）に対応するスケジューラ部１０３は、各々が１本のキュー１０２−ｈ（１≦ｈ≦ｎ）について図６のステップＳ１０４〜Ｓ１０９を実行するｎ個のＣＰＵまたはｎ個のコアにより実現されてもよい。上記の例に限らず、パケット種別識別部１０１とスケジューラ部１０３が行う処理は、様々な仕方で分散することが可能である。
【０２８３】
また、上記実施形態では、ＱｏＳ制御の一例としてパケット送信制御装置１が帯域制御を行う場合を説明した。しかし、実施形態に応じて、パケット送信制御装置１は、帯域制御でなく、ＣｏＳ（Class of Service）などを利用した優先制御を行ってもよく、帯域制御と優先制御を組み合わせた制御を行ってもよい。
【０２８４】
優先制御の場合にスケジューラ部１０３は、例えば、「どのキューにも回線速度が帯域として割り当てられている」と見なして送信予定時刻を計算することもできる。また、優先制御においてスケジューラ部１０３は、「キューの番号（１〜ｎ）が若いほど優先度が高い」という前提にしたがってキュー１０２−１から順にスケジューリング処理を行ってもよい。また、低優先度のキューからパケットが全く送信されなくなるという事態を防ぐため、スケジューラ部１０３は、例えば重み付きラウンドロビンアルゴリズムにしたがって動作してもよい。
【０２８５】
最後に、さらに下記の付記を開示する。
（付記１）
ソフトウェアにしたがって動作するソフトウェア制御部と、ハードウェア回路にしたがって動作するハードウェア制御部とを備え、
前記ソフトウェア制御部は、
格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、当該キューに設定された前記ＱｏＳ設定値に基づいて当該パケットの送信予定時刻を算出し、当該パケットをデキューし、前記送信予定時刻を示す時刻情報とともに前記ハードウェア制御部へ出力する、というスケジューリング処理を行うスケジューラ部を備え、
前記ハードウェア制御部は、
バッファ部と、
前記スケジューラ部から出力される各パケットを、各パケットの前記時刻情報に基づいて前記送信予定時刻の順にソートして前記バッファ部に格納するバッファ格納処理部と、
前記バッファ部に格納された各パケットを、当該パケットの前記送信予定時刻に送信する送信処理部を備える、
ことを特徴とするパケット送信制御装置。
（付記２）
前記スケジューラ部は、前記複数のキューのうち第１のキューからデキュー対象のすべてのパケットを前記ハードウェア制御部に出力してから、前記複数のキューのうち第２のキューから前記ハードウェア制御部へのパケットの出力を行うことを特徴とする付記１に記載のパケット送信制御装置。
（付記３）
前記時刻情報は相対時刻で表されており、
前記送信処理部は、前記スケジューラ部からの送信開始指示があるまで待ってから各パケットの送信を開始する、
ことを特徴とする付記１または２に記載のパケット送信制御装置。
（付記４）
前記スケジューラ部は、前記スケジューリング処理の開始と終了を前記ハードウェア制御部に通知し、
前記送信処理部は、前記スケジューラ部から前記スケジューリング処理の開始が通知されると、前記送信開始指示として前記スケジューラ部が前記スケジューリング処理の終了を通知するまで、前記スケジューリング処理にともなって前記スケジューラ部から出力されて前記バッファ部に格納される各パケットの送信の開始を待つ、
ことを特徴とする付記３に記載のパケット送信制御装置。
（付記５）
前記スケジューラ部は所定の間隔で前記スケジューリング処理を繰り返し、
前記スケジューラ部が前記スケジューリング処理の開始を通知したときに前記バッファ部にパケットが残っている場合、前記送信処理部は、残っている前記パケットを前記送信開始指示がなくても送信する、
ことを特徴とする付記３または４に記載のパケット送信制御装置。
（付記６）
前記時刻情報は絶対時刻で表されており、
前記スケジューラ部は所定の間隔で前記スケジューリング処理を繰り返し、
前記スケジューラ部が算出する前記送信予定時刻は、前記スケジューリング処理を次に開始する時刻以降の時刻である、
ことを特徴とする付記１または２に記載のパケット送信制御装置。
（付記７）
前記ハードウェア制御部が、前記ソフトウェア制御部からアクセス可能なレジスタを備え、
前記レジスタを介して前記ソフトウェア制御部と前記ハードウェア制御部との間で制御情報が共有される
ことを特徴とする付記１から６のいずれか１項に記載のパケット送信制御装置。
（付記８）
パケット送信制御装置で用いられるハードウェア回路であって、
バッファ部と、
複数のパケットを、各パケットの送信予定時刻を示す時刻情報とともに受け取り、前記時刻情報に基づいて前記複数のパケットを前記送信予定時刻の順にソートして前記バッファ部に格納するバッファ格納処理部と、
前記バッファ部に格納された前記複数のパケットの各々を、当該パケットの前記送信予定時刻に送信する送信処理部と、
を備えることを特徴とするハードウェア回路。
（付記９）
前記時刻情報は相対時刻で表されており、
前記送信処理部は、前記コンピュータからの送信開始指示があるまで待ってから各パケットの送信を開始する、
ことを特徴とする付記８に記載のハードウェア回路。
（付記１０）
前記コンピュータとの間で共有する制御情報を格納する、前記コンピュータからアクセス可能なレジスタをさらに備える
ことを特徴とする付記８または９に記載のハードウェア回路。
（付記１１）
格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、当該キューに設定された前記ＱｏＳ設定値に基づいて当該パケットの送信予定時刻を算出する処理と、
当該パケットをデキューし、前記送信予定時刻を示す時刻情報とともに出力するスケジューリング処理を、
コンピュータに実行させることを特徴とするプログラム。
（付記１２）
前記プログラムは、
所定の間隔で前記スケジューリング処理を前記コンピュータに繰り返し実行させ、
前記送信予定時刻として、前記スケジューリング処理を次に開始する時刻以降の時刻を前記コンピュータに算出させる
ことを特徴とする付記１１に記載のプログラム。
（付記１３）
前記スケジューリング処理において前記コンピュータに、
前記複数のキューのうち第１のキューからデキュー対象のすべてのパケットを出力させてから、前記複数のキューのうち第２のキューからのパケットの出力を行わせる
ことを特徴とする付記１１または１２に記載のプログラム。
（付記１４）
前記時刻情報は相対時刻で表されており、
前記プログラムはさらに前記コンピュータに、
前記スケジューリング処理を開始する際に、前記スケジューリング処理の結果として出力される各パケットの送信を待つように、各パケットの出力先であるハードウェア回路に指示し、
前記スケジューリング処理を終了する際に、前記スケジューリング処理の結果として前記ハードウェア回路に出力された各パケットの送信を開始するように前記ハードウェア回路に指示する
処理を行わせることを特徴とする付記１１から１３のいずれか１項に記載のプログラム。
（付記１５）
前記コンピュータにさらに、
複数のパケットの種別をそれぞれ識別し、前記複数のパケットの各々を、前記複数のキューのうちで当該パケットの前記種別に対応するキューにエンキューするキューイング処理を行わせる
ことを特徴とする付記１１から１４のいずれか１項に記載のプログラム。
（付記１６）
パケット送信制御装置が備えるコンピュータが、格納するパケットの種別に応じてＱｏＳ設定値が設定されている複数のキューの各々にエンキューされている各パケットに対して、
当該キューに設定された前記ＱｏＳ設定値に基づいて、ソフトウェアにしたがって当該パケットの送信予定時刻を算出し、
当該パケットをデキューし、
当該パケットを、前記送信予定時刻を示す時刻情報とともに出力し、
前記パケット送信制御装置が備えるハードウェア回路が、前記時刻情報がそれぞれ付されて前記コンピュータから出力された複数のパケットを受け取り、
前記ハードウェア回路が、前記複数のパケットを前記送信予定時刻の順にソートして格納し、
前記ハードウェア回路が、記憶した前記複数のパケットの各々を、当該パケットの前記送信予定時刻に送信する、
ことを特徴とする方法。
【符号の説明】
【０２８６】
１  パケット送信制御装置
１００  ソフトウェア制御部
１０１  パケット種別識別部
１０２  キュー群
１０２−１〜１０２−ｎ  キュー
１０３  スケジューラ部
１０４  メモリ領域
１０５  送信パケットリスト
１０６  パケットバッファ
２００  ハードウェア制御部
２１０  バッファ格納処理部
２１１  制御回路
２１２  レジスタ領域
２２０  バッファ部
２２１  パケット格納部
２２２  時刻情報格納部
２２３  メモリ領域
２２４  レジスタ領域
２３０  送信処理部
２３１  制御回路
２３２  レジスタ領域
２３３  内部カウンタ
３０１  ＣＰＵ
３０２  メモリユニット
３０３  ＲＴＣ
３０４−１〜３０４−ｍ  ＭＡＣチップ
３０５−１〜３０５−ｍ  ＰＨＹチップ
３０６−１〜３０６−ｍ  ポート
３０７  バス
Ｐｉ、Ｑｈｇ、Ｑｊｈｇ  パケット
Ｔｉ  時刻情報
Ｌｉ  ノード
Ｆ  時刻指定フラグ
Ｒ１〜Ｒ７  レジスタ
【図１】
2011024027.tif 000005
【図２】
2011024027.tif 000006
【図３】
2011024027.tif 000007
【図４】
2011024027.tif 000008
【図５】
2011024027.tif 000009
【図６】
2011024027.tif 000010
【図７】
2011024027.tif 000011
【図８】
2011024027.tif 000012
【図９】
2011024027.tif 000013
【図１０】
2011024027.tif 000014
【図１１】
2011024027.tif 000015
【図１２】
2011024027.tif 000016