(57)【要約】【課題】少ない記憶容量で再送処理を行う。【解決手段】データリンク層１０３は、長さの異なる複数のパケットを一時的に保持する再送用バッファ３８を有する。また、データリンク層１０３は、データパケットが新しく生成された際に再送用バッファ３８へ登録する位置を示す再送用バッファ書き込みアドレスカウンタ３４を有する。また、データリンク層１０３は、再送用バッファ３８に格納されているデータパケットの先頭位置を記憶するエントリからなるインデックステーブル３２を有する。【選択図】図２
2014049998.tif 000002
【特許請求の範囲】
【請求項１】
データの長さの異なる複数のデータパケットを一時的に保持するパケット記憶部と、
前記データパケットが新しく生成された際に前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部と、
前記データパケット記憶部内に格納されている該データパケットの先頭位置を記憶するエントリからなる位置情報記憶部と、
を備えることを特徴とする、データ送信装置。
【請求項２】
前記データパケットが新しく生成された際に前記位置情報記憶部に前記データパケットの先頭位置を登録するエントリ位置を示す位置情報書き込み指示部と、
前記位置情報記憶部の中の読み出し可能なエントリを指し示す位置情報読み出し指示部と、
をさらに備えることを特徴とする、請求項１に記載のデータ送信装置。
【請求項３】
前記データ送信装置は、１つ以上のデータパケットを発行し、
前記データパケットの送信先となるデータ受信装置から送信される応答パケットに付随する受信済順序番号を保持する確認済番号記憶部と、
前記確認済番号記憶部に保持される第１の受信済順序番号と、次に受信した応答パケットに付随する第２の受信済み順序番号とを用いて、前記データ受信装置が正常に受信した前記データパケットの数を計算し、当該計算結果に基づいて前記位置情報読み出し指示部を更新する計算更新部と、
をさらに備えることを特徴とする、請求項２に記載のデータ送信装置。
【請求項４】
前記データパケットの再送を開始すると判定した場合に、前記パケット記憶部に保持されている前記複数のデータパケットを再び送信する再送処理部をさらに備えることを特徴とする、請求項３に記載のデータ送信装置。
【請求項５】
前記再送処理部は、前記位置情報読み出し指示部の指し示す前記位置情報記憶部のエントリに記憶されている先頭位置を判別し、当該判別した先頭位置から前記パケット記憶部に登録されたデータパケットを読み出し、当該読み出したデータパケットから再送を行うことを特徴とする、請求項４に記載のデータ送信装置。
【請求項６】
前記再送処理部は、前記データパケットに順序番号を付与し、
前記データ送信装置は、前記再送処理部が付与した順序番号を前記受信済順序番号として前記データ受信装置により付与された応答パケットを受信する受信部を有することを特徴とする、請求項４に記載のデータ送信装置。
【請求項７】
前記パケット記憶部内のデータパケット送信のための読み出し位置を示すパケット読み出し位置指示部と、
現在再送中の前記パケット記憶部内のデータパケットについて前記位置情報記憶部が先頭位置を記憶したエントリの位置を示す再送中位置情報表示部と、
前記再送中位置情報表示部の示すエントリの次の位置に位置のエントリが記憶する第１の位置情報と該パケット読み出し位置指示部の示す第２の位置情報とを比較することで、前記パケット記憶部内の次の送信データパケットの先頭位置を検出するデータパケット先頭位置検出部と、
をさらに備える請求項６に記載のデータ送信装置。
【請求項８】
前記再送処理部は、再送処理中に前記データパケット先頭位置検出部がデータパケットの先頭位置を検出するたびに、前記データパケットに付与する順序番号を更新することを特徴とする、請求項７に記載のデータ送信装置。
【請求項９】
前記再送処理部は、再送処理中に前記データ受信装置から前記応答パケットを受信し、かつ、前記計算更新部で計算される前記正常受信したデータパケットの数よりも、再送したデータパケット数が多い場合は、再送処理中のデータパケットを送信後に再送処理を中止し、前記計算更新部によって更新された後の前記位置情報読み出し指示部が指し示すエントリに記憶されている先頭位置を新たに判別し、当該新たに判別した先頭位置から前記パケット記憶部に登録されたデータパケットから再送を再開することを特徴とする、請求項５に記載のデータ送信装置。
【請求項１０】
長さが異なる複数のデータパケットを送信するデータ送信装置が実行するデータ送信方法において、
パケット記憶部に、データの長さの異なる複数のデータパケットを一時的に保持し、
前記データパケットが新しく生成された際に、前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部が示した位置を位置情報記憶部に格納する
処理を実行することを特徴とする、データ送信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ送信装置、およびデータ送信方法に関する。
【背景技術】
【０００２】
従来、複数の装置間でデータの送受信を行う通信技術が知られている。このような技術の一例として、受信側の装置がデータを正しく受信できなかった場合に、送信側の装置がデータを再度送信する技術が知られている。
【０００３】
例えば、送信側の装置は、送信対象となる複数のデータに連続するシーケンス番号を割り当てる。そして、送信側の装置は、シーケンス番号順に各データを受信側の装置へ送信する。ここで、送信側の装置は、再送に備えて、送信したデータと各データに割り当てたシーケンス番号とを記憶装置に格納する。
【０００４】
一方、受信側の装置は、受信したデータが正しく受信できた場合には、Ａｃｋｎｏｗｌｅｄｇｅｍｅｎｔ（Ａｃｋ）を送信側の装置へ送信する。Ａｃｋは、正しく受信したデータのうち、最も新しいもののシーケンス番号を含む。また、受信側の装置は、受信したデータからエラーが検出された場合や、データに割り当てられた番号が連続していなかった場合には、Ｎｅｇａｔｉｖｅ  ＡｃＫｎｏｗｌｅｄｇｅ（Ｎａｋ）を送信側の装置へ送信する。Ｎａｋは、Ｎａｋの要因となる事象が発生するまでに正しく受信したデータのうち、最も新しいもののシーケンス番号を含む。
【０００５】
そして、送信側の装置は、受信側の装置からＮａｋを受信した場合や、受信側の装置からＡｃｋやＮａｋが一定期間の間受信されなかった場合には、データの再送処理を実行する。具体的には、送信側の装置は、記憶装置に格納した各データのうち、受信側で正しく受信したことが送信側に示されたデータのシーケンス番号の次のシーケンス番号が割り当てられたデータから、シーケンス番号順に再度送信側の装置へ送信する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開昭６３−１７７２４４号公報
【特許文献２】特開２００８−０５３７８３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ここで、上述したデータの再送処理を行う技術では、送信側の装置は、送信した各データを記憶装置に格納する。しかしながら、送信側の装置は、各データの大きさが固定ではない場合には、記憶装置が記憶したデータから再送対象となるデータをそれぞれ個別に識別するために、各データを格納した先頭アドレスと各データに割り当てたシーケンス番号との組を保持する。この結果、再送処理に要する記憶容量が増大するという問題がある。
【０００８】
すなわち、送信側の装置は、各データの大きさが固定ではない場合には、記憶装置が有する記憶領域のうち、どこからどこまでが再送対象のデータであるかを識別するため、各データを格納した先頭アドレスを各データのシーケンス番号と共に保持する。この結果、送信側の装置は、記憶装置に格納するデータの数だけ、先頭アドレスとシーケンス番号とを対応付けて保持するため、再送処理に要する記憶容量を増大させてしまう。
【０００９】
１つの側面では、本発明は、少ない情報量を用いて再送処理を行うデータ送信装置、およびデータ送信方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの側面では、データ送信装置は、データの長さの異なる複数のデータパケットを一時的に保持するパケット記憶部を有する。また、データ送信装置は、前記データパケットが新しく生成された際に前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部と、前記データパケット記憶部内に格納されている該データパケットの先頭位置を記憶するエントリからなる位置情報記憶部とを有する。
【発明の効果】
【００１１】
１つの実施形態では、少ない情報量を用いて再送処理を行うことができる。
【図面の簡単な説明】
【００１２】
【図１Ａ】図１Ａは、実施例１に係る情報処理装置が有するコンポーネントを説明するための図である。
【図１Ｂ】図１Ｂは、実施例１に係る情報処理装置を説明するための図である。
【図２】図２は、実施例１に係るデータリンク層の回路が有する機能構成を説明するための図である。
【図３】図３は、インデックステーブルを説明するための図である。
【図４】図４は、再送用バッファを説明するための図である。
【図５】図５は、再送タイマの機能構成を説明するための図である。
【図６Ａ】図６Ａは、再送用バッファが満杯であるか否かを判別する処理を説明するための図である。
【図６Ｂ】図６Ｂは、インデックステーブルにインデックスアドレスを格納する処理の流れを説明するための図である。
【図７】図７は、インデックステーブル承認済みエントリ番号保持レジスタが保持する値を更新する処理を説明するための図である。
【図８】図８は、再送時の初期値を再送用バッファ読み出しアドレスカウンタに設定する処理を説明するための図である。
【図９】図９は、再送時の初期値を再送用シーケンス番号カウンタに設定する処理を説明するための図である。
【図１０】図１０は、再送時にデータ毎の先頭ラインを検出する処理を説明するための図である。
【図１１】図１１は、再送のための読み出し開始アドレスを設定する処理の流れを説明するための図である。
【図１２】図１２は、パケットの先頭を検出する処理の流れを説明するための図である。
【図１３】図１３は、パケットの末尾を判定する処理を説明するための図である。
【図１４】図１４は、再送処理が終了したか否かを判定する処理の流れを説明するための図である。
【図１５】図１５は、インデックステーブルが満杯であるか否かを判別する処理を説明するための図である。
【図１６Ａ】図１６Ａは、再送用バッファが空ではない状態を説明するための図である。
【図１６Ｂ】図１６Ｂは、再送用バッファが空である場合を説明するための図である。
【図１７】図１７は、再送用バッファが満杯であるか否かを判別する処理の流れを説明するための図である。
【図１８】図１８は、実施例２に係るデータリンク層の機能構成を説明するための図である。
【図１９】図１９は、スキップ予約フラグを設定する処理を説明するための図である。
【図２０】図２０は、スキップ実行時の値を設定する処理を説明するための図である。
【図２１】図２１は、スキップを行う処理の流れを説明するための図である。
【図２２】図２２は、スキップ時に再送が終了したと判定する処理を説明するための図である。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して本願に係るデータ送信装置、およびデータ送信方法について説明する。
【実施例１】
【００１４】
まず、図１Ａ、及び図１Ｂを用いて、実施例１に係る情報処理装置が有するコンポーネントの例について説明する。図１Ａは、実施例１に係る情報処理装置が有するコンポーネントを説明するための図である。また、図１Ｂは、実施例１に係る情報処理装置を説明するための図である。
【００１５】
図１Ａに示すように、情報処理装置１００は、コンポーネント１０１、およびコンポーネント１０５を有する。コンポーネント１０１は、トランザクション層、データリンク層、および物理層の各層における処理を実行する回路を有する。以下の説明では、各層における処理を実行する回路を、トランザクション層１０２、データリンク層１０３、物理層１０４と記載する。一方、コンポーネント１０５は、コンポーネント１０１と同様に、トランザクション層１０６、データリンク層１０７、物理層１０８を有する。
【００１６】
ここで、コンポーネント１０１は、例えば、図１Ｂに示す情報処理装置１が有する、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔｓ  Ｉｎｔｅｒｃｏｎｎｅｃｔ−Ｅｘｐｒｅｓｓ（ＰＣＩｅ）ルートコンプレックス５であり、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ（ＣＰＵ）３、メモリ４を有するノード２に配置される。またコンポーネント１０５は、例えば、図１Ｂに示す情報処理装置１が有するＰＣＩｅエンドポイント１２であり、Ｉ／Ｏデバイス１１に配置される。また、各コンポーネント間は、ＰＣＩｅリンクで接続される。
【００１７】
ＣＰＵ３は、ノード２において各種演算処理を実行する演算処理装置である。また、ＣＰＵ３は、ＰＣＩｅルートコンプレックス５、およびＰＣＩｅエンドポイント１２を介して、Ｉ／Ｏデバイス１１との間でパケットの送受信を行う。ここでいうパケットとは、例えばヘッダやデータペイロードなどからなる情報単位であり、パケットの長さは固定ではない。また、メモリ４は、ノード２が有する記憶装置である。
【００１８】
また、Ｉ／Ｏデバイス１１は、ＰＣＩｅエンドポイント１２、およびＰＣＩｅルートコンプレックス５を介して、ノード２のメモリ４、ＣＰＵ３との間でパケットの送受信を行う。もちろん、コンポーネント１０５は、ノード２に配置されるＰＣＩｅルートコンプレックス５で、コンポーネント１０１がＩ／Ｏデバイス１１に配置されるＰＣＩｅエンドポイント１２であってもよいし、ＰＣＩｅルートコンプレックス５やＰＣＩｅエンドポイント１２は、ＰＣＩｅスイッチでもよい。さらに、コンポーネント１０１、及びコンポーネント１０５は、ＰＣＩｅに限らず、他の通信方式にも適用できる。
【００１９】
なお、以下の説明では、コンポーネント１０５の有する各回路は、コンポーネント１０１の有する各回路と同様の機能を発揮するものとして、詳細な説明を省略する。図１Ａのトランザクション層１０２は、パケットの送受信を行う際に、トランザクション層における処理を実行する。例えば、トランザクション層１０２は、図１Ａでは図示を省略した外部からの要求に応じて、送信パケットの生成等を行う。例えば、トランザクション層１０２は、図１Ａに示す情報処理装置１００が図１Ｂに示す情報処理装置１である場合は、ＣＰＵ３からの要求に従ってＴｒａｎｓａｃｔｉｏｎ  Ｌａｙｅｒ  Ｐａｃｋｅｔ（ＴＬＰ）の生成等を行う。
【００２０】
データリンク層１０３は、パケットの送受信を行う際に、データリンク層における処理を実行する。例えば、データリンク層１０３は、パケットの送受信を行うための機能や手段を制御する。物理層１０４は、パケットの送受信を行う際に、物理層における処理を実行する。例えば、物理層１０４は、パラレル方式の情報をシリアル方式の情報に変換する機能を持ち、シリアル変換されたパケットをコンポーネント１０５が有する物理層１０８へ伝送する。
【００２１】
ここで、コンポーネント１０１、およびコンポーネント１０５は、データリンク層１０３、およびデータリンク層１０７を介して、相互にデータの送受信を行う。具体的には、コンポーネント１０１は、コンポーネント１０５に対して送信する複数のパケットに連続するシーケンス番号を付与し、シーケンス番号を付与されたパケットをシーケンス番号順にコンポーネント１０５へ送信する。また、コンポーネント１０１は、パケットの再送に備えて、コンポーネント１０５へ送信したパケットを、シーケンス番号を含まない状態で保持する。
【００２２】
一方、コンポーネント１０５は、パケットを正しく受信した場合には、正しく受信したパケットに付与されたシーケンス番号を含むＡｃｋをコンポーネント１０１へ送信する。また、コンポーネント１０５は、パケットを正しく受信できなかった場合には、正しく受信できたパケットまでを示すシーケンス番号を含むＮａｋをコンポーネント１０１へ送信する。
【００２３】
すると、コンポーネント１０１は、コンポーネント１０５からＡｃｋまたはＮａｋを受信した場合は、ＡｃｋまたはＮａｋに含まれるシーケンス番号を保持する。そして、コンポーネント１０１は、コンポーネント１０５からＮａｋを受信した場合、または、コンポーネント１０５からＡｃｋやＮａｋを受信せずにタイムアウトが発生した場合には、保持したシーケンス番号の次の番号が付与されたパケットから順に、コンポーネント１０５へ再送する。
【００２４】
次に、図２を用いて、データリンク層１０３が有する機能構成の一例について説明する。図２は、実施例１に係るデータリンク層の回路が有する機能構成を説明するための図である。図２に示すように、データリンク層１０３は、受信器２０、Ａｃｋ／Ｎａｋ受信器２１、承認済みシーケンス番号保持レジスタ２２、Ａｃｋ数計算機２３、インデックステーブル承認済みエントリ番号保持レジスタ２４を有する。また、データリンク層１０３は、加算器２５、インデックステーブル再送中エントリ番号カウンタ２６、加算器２７、インデックステーブル書き込みエントリ番号カウンタ２８、再送予約フラグ２９、再送タイマ３０、再送中フラグ３１を有する。
【００２５】
また、データリンク層１０３は、インデックステーブル３２、シーケンス番号カウンタ３３、再送用バッファ書き込みアドレスカウンタ３４、再送用バッファ読み出しアドレスカウンタ３５、比較器３６、再送用シーケンス番号カウンタ３７、再送用バッファ３８を有する。また、データリンク層１０３は、パケット選択器３９、インデックステーブルエントリフルレジスタ４０ａ、再送用バッファフルレジスタ４０ｂ、パケット最大ライン数設定レジスタ４０ｃを有する。
【００２６】
以下、データリンク層１０３が発揮する機能について説明する。まず、インデックステーブル３２、および再送用バッファ３８について説明する。インデックステーブル３２は、コンポーネント１０１が再送に備えてパケットを再送用バッファ３８に格納した記憶領域の先頭アドレスであるインデックスアドレスを記憶する記憶装置である。
【００２７】
以下、図３を用いて、インデックステーブル３２の一例を説明する。図３は、インデックステーブルを説明するための図である。例えば、インデックステーブル３２は、それぞれ番号が付与された複数のエントリを有し、各エントリにインデックスアドレスを記憶する。例えば、図３に示す例では、インデックステーブル３２は、エントリ＃０〜＃ｎまでの番号が付与されたエントリを有し、エントリ＃０〜＃３にインデックスアドレス＃０〜＃３を記憶している。
【００２８】
一方、再送用バッファ３８は、コンポーネント１０１が再送に備えてパケットを記憶する記憶装置である。以下、図４を用いて、再送用バッファ３８の一例を説明する。図４は、再送用バッファを説明するための図である。図４に示すように、再送用バッファ３８は、複数のラインを有し、各ラインにはＮバイトのデータ格納領域と、同一ラインのデータ格納領域に含まれるデータからエラーを検出するためのＥｒｒｏｒ  Ｃｈｅｃｋ  ａｎｄ  Ｃｏｒｒｅｃｔ（ＥＣＣ）データの格納領域を持つ。ここで、再送用バッファ３８が記憶するパケットは、シーケンス番号を含まない状態で、再送用バッファ３８の一つ以上のラインを使用して格納される。また、各パケットの長さによって、パケットを記憶する際に使用するラインの数は異なる。
【００２９】
図２に戻って、受信器２０は、コンポーネント間のリンクを介し、物理層１５を経由して、コンポーネント１０５からのパケットを受信する。具体的には、受信器２０は、コンポーネント１０５が正しく受信したパケットのシーケンス番号である承認済みシーケンス番号を含むＡｃｋ、またはＮａｋを受信する。そして、受信器２０は、ＡｃｋまたはＮａｋからＡｃｋｎｏｗｌｅｄｇｅｍｅｎｔを示すＡｃｋ信号と承認済みシーケンス番号、またはＮｅｇａｔｉｖｅ  Ａｃｋｎｏｗｌｅｄｇｅｍｅｎｔを示すＮａｋ信号と承認済みシーケンス番号を抽出し、抽出したＡｃｋ信号またはＮａｋ信号と承認済みシーケンス番号をＡｃｋ／Ｎａｋ受信器２１に出力する。
【００３０】
Ａｃｋ／Ｎａｋ受信器２１は、承認済みシーケンス番号を受信すると、以下の処理を実行する。すなわち、Ａｃｋ／Ｎａｋ受信器２１は、承認済みシーケンス番号保持レジスタ２２、Ａｃｋ数計算機２３、再送用シーケンス番号カウンタ３７、インデックステーブルエントリフルレジスタ４０ａに承認済みシーケンス番号を出力する。さらに、Ａｃｋ／Ｎａｋ受信器２１は、Ｎａｋを受信した場合には、再送予約フラグ２９を「Ｈｉｇｈ」にする。また、Ａｃｋ／Ｎａｋ受信器２１は、Ａｃｋを受信した場合にはＡｃｋを受信した旨を、Ｎａｋを受信した場合には、Ｎａｋを受信した旨を再送タイマ３０に通知する。
【００３１】
承認済みシーケンス番号保持レジスタ２２は、Ａｃｋ／Ｎａｋ受信器２１から承認済みシーケンス番号を受信すると、受信した承認済みシーケンス番号を保持する。また、承認済みシーケンス番号保持レジスタ２２は、Ａｃｋ／Ｎａｋ受信器２１から新たな承認済みシーケンス番号を受信すると、それまで保持していた承認済みシーケンス番号をＡｃｋ数計算機２３に出力し、新たな承認済みシーケンス番号を保持する。
【００３２】
Ａｃｋ数計算機２３は、Ａｃｋ／Ｎａｋ受信器２１と、承認済みシーケンス番号保持レジスタ２２とから受信した承認済みシーケンス番号を用いて、インデックステーブル３２から再送対象のパケットに係るインデックスアドレスが格納されたエントリ番号を判別する。
【００３３】
具体的には、Ａｃｋ数計算機２３は、Ａｃｋ／Ｎａｋ受信器２１から受信した承認済みシーケンス番号から、承認済みシーケンス番号保持レジスタ２２から受信した承認済みシーケンス番号を減算する。すなわち、Ａｃｋ数計算機２３は、コンポーネント１０１がコンポーネント１０５から前回受信した承認済みシーケンス番号と、新たに受信した承認済みシーケンス番号との差を算出することで、コンポーネント１０５が正しく受信したパケットの数を計算する。
【００３４】
そして、Ａｃｋ数計算機２３は、算出した値をインデックステーブル承認済みエントリ番号保持レジスタ２４に出力する。また、Ａｃｋ数計算機２３は、正しく受信したパケットの数を計算した結果、それが１以上の値を示していた場合には、再送タイマ３０にその旨を出力し、さらに再送タイマ３０が、Ａｃｋ／Ｎａｋ受信器２１からＡｃｋを受信した旨を通知されていた場合には、再送タイマ３０は、タイムアウトを判別する再送タイマ３０のカウントをリセットする。
【００３５】
インデックステーブル承認済みエントリ番号保持レジスタ２４は、インデックステーブル３２が有するエントリのうち、コンポーネント１０５が最も最近承認したパケットの先頭を格納する再送用バッファ３８のラインのインデックスアドレスが記憶されたエントリを示すエントリ番号を保持する。具体的には、インデックステーブル承認済みエントリ番号保持レジスタ２４は、初期値として、後述するインデックステーブル書き込みエントリ番号カウンタ２８と同じようにエントリ番号「０」を保持し、その後、Ａｃｋ数計算機２３から受信した値を、保持した値に加算する。
【００３６】
すなわち、インデックステーブル承認済みエントリ番号保持レジスタ２４は、コンポーネント１０５が承認したパケットの数をＡｃｋ／Ｎａｋ受信の度に加算することで、コンポーネント１０５が最も最近承認したパケットの先頭が格納されたインデックスアドレスが格納されたインデックステーブル３２のエントリ番号を保持する。
【００３７】
加算器２５は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値に１を加算した値をインデックステーブル再送中エントリ番号カウンタ２６とインデックステーブル３２に出力する。すなわち、加算器２５は、コンポーネント１０５が最も最近承認したパケットの先頭のインデックスアドレスが格納されたインデックステーブル３２のエントリ番号に１を加算することで、次に承認する予定のパケットの先頭のインデックスアドレスが格納されたエントリ番号を算出する。
【００３８】
ここで、次に承認する予定のパケットとは、現状において再送対象となる最初のパケットである。このため、加算器２５は、すなわち再送対象となるパケットの先頭が格納されたインデックスアドレスが格納されたエントリ番号をインデックステーブル再送中エントリ番号カウンタ２６に出力することとなる。
【００３９】
インデックステーブル再送中エントリ番号カウンタ２６は、インデックステーブル３２が有する各エントリのうち、再送対象となるパケットのインデックスが格納されたエントリのエントリ番号を保持するカウンタである。具体的には、インデックステーブル再送中エントリ番号カウンタ２６は、加算器２５が出力したエントリ番号を受信すると、受信したエントリ番号をカウンタ初期値として保持するとともに、保持したエントリ番号を加算器２７に出力する。
【００４０】
加算器２７は、インデックステーブル再送中エントリ番号カウンタ２６が出力したエントリ番号に１を加算した値のエントリ番号をインデックステーブル３２に出力する。すなわち、加算器２７は、再送対象となるパケットのうち、現在再送中のパケットの次に送信されるパケットの先頭が格納されたインデックスアドレスを保持するエントリ番号を出力する。
【００４１】
インデックステーブル書き込みエントリ番号カウンタ２８は、インデックステーブル３２にインデックスを新たに書き込むエントリのエントリ番号を保持する。例えば、インデックステーブル書き込みエントリ番号カウンタ２８は、初期値として、エントリ番号「＃０」が格納されている。このような場合には、インデックステーブル書き込みエントリ番号カウンタ２８は、エントリ番号「＃０」をインデックステーブル３２に出力する。
【００４２】
そして、インデックステーブル書き込みエントリ番号カウンタ２８は、エントリ番号「＃０」のエントリにインデックスアドレスが格納された場合には、自身が保持するエントリ番号に１を加算し、エントリ番号「＃１」を保持する。その後、インデックステーブル書き込みエントリ番号カウンタ２８は、新たなエントリ番号「＃１」をインデックステーブル３２に出力する。この結果、インデックステーブル３２は、各エントリに対して、エントリ番号が若い順にインデックスアドレスを順に格納する。
【００４３】
再送予約フラグ２９は、パケットの再送を行うか否かを示すフラグ情報である。例えば、再送予約フラグ２９は、フリップフロップ等に格納される１ビットの情報であり、「Ｈｉｇｈ（１）」である場合は、パケットの再送を行う旨を示し、「Ｌｏｗ（０）」である場合には、パケットの再送を行わない旨を示す。
【００４４】
再送タイマ３０は、コンポーネント１０５からの応答がタイムアウトしたか否かを判別する。具体的には、再送タイマ３０は、所定のタイミングでカウントを行うカウンタを有し、カウンタが所定の値となった場合には、再送予約フラグ２９を「Ｈｉｇｈ」にする。また、再送タイマ３０は、Ａｃｋ／Ｎａｋ受信器２１とＡｃｋ数計算機２３から、一つ以上のパケット承認したＡｃｋを受信した旨を受信した場合には、カウンタをリセットする。
【００４５】
以下、図５を用いて、再送タイマ３０が有する機能構成の一例について説明する。図５は、再送タイマの機能構成を説明するための図である。図５に示す例では、再送タイマ３０は、規定値レジスタ４１、再送タイマ最大値設定レジスタ４２、再送タイマ最大値選択レジスタ４３、セレクタ４４、カウンタ４５、カウンタ比較器４６を有する。
【００４６】
規定値レジスタ４１は、再送タイマでカウントする所定の値を複数設定できるレジスタで、情報処理装置１００の動作周波数等などの条件によって、複数の所定値から一つの所定値を選択して出力する。また、再送タイマ最大値設定レジスタ４２は、再送タイマ３０に設定可能なタイムアウトまでにカウントする値の所定値を自由に設定可能なレジスタである。また、再送タイマ最大値選択レジスタ４３は、再送タイマ３０に設定するタイムアウトまでにカウントする所定値を選択するための値を記憶する。
【００４７】
セレクタ４４は、規定値レジスタ４１、再送タイマ最大値設定レジスタ４２が記憶する各値を取得する。そして、セレクタ４４は、再送タイマ最大値選択レジスタ４３が指示する値に基づいて、既定値レジスタ４１、再送タイマ最大値設定レジスタ４２から取得した値をタイムアウトまでにカウントする所定値として選択し、選択した値をカウンタ比較器４６に出力する。
【００４８】
カウンタ４５は、所定のタイミングでカウントを行うカウンタである。カウンタ４５は、パケット選択器３９からパケットの末尾を送信した旨を受信した場合には、カウンタの値を１加算する。またカウンタ４５は、カウント中の値が１以上の値を示していれば、マイサイクル１を加算することでカウントを継続する。また、カウンタ４５は、Ａｃｋ／Ｎａｋ受信器２１とＡｃｋ数計算機２３から、一つ以上のパケット承認したＡｃｋを受信した旨を受信した場合には、カウント中の値を一旦０にリセットし、１からカウントを始める。また、カウンタ４５は、Ａｃｋ／Ｎａｋ受信器２１からＮａｋを受信した旨の通知を受信した場合は、カウント中の値を０にリセットする。
【００４９】
また、カウンタ４５は、カウンタ比較器４６からカウント中の値をリセットするよう指示された場合には、カウント中の値を０にリセットする。
【００５０】
カウンタ比較器４６は、カウンタ４５がカウント中の値と、セレクタ４４が出力した値とを比較する。そして、カウンタ比較器４６は、カウンタ４５がカウント中の値と、セレクタ４４が出力した値とが一致した場合には、再送予約フラグ２９を「Ｈｉｇｈ」にし、カウンタ４５にカウント中の値をリセットするよう指示する。すなわち、カウンタ比較器４６は、タイムアウトが発生した場合には、再送予約フラグ２９を「Ｈｉｇｈ」に設定する。
【００５１】
図２に戻って、再送中フラグ３１は、再送処理を実行するか否かを示すフラグ情報である。例えば、再送用バッファ３８は、パケットの書き込み中等、パケットの読み出しが行えない場合がある。そこで、再送中フラグ３１は、再送予約フラグ２９が「Ｈｉｇｈ」であり、かつ再送用バッファ３８からパケットの読み出しが行える場合には、「Ｈｉｇｈ」に遷移する。
【００５２】
シーケンス番号カウンタ３３は、送信対象となるパケットに付与するシーケンス番号をカウントするカウンタである。具体的には、シーケンス番号カウンタ３３は、トランザクション層１０２から受け取った送信パケットとともに、カウンタの出力を送信シーケンス番号としてパケット選択器３９に出力する。シーケンス番号をパケット選択器３９に出力するたびにシーケンス番号を１つ加算する。
【００５３】
再送用バッファ書き込みアドレスカウンタ３４は、パケットを再送用バッファ３８に格納する際のインデックスアドレスを指定する。具体的には、再送用バッファ書き込みアドレスカウンタ３４は、トランザクション層１０２が新たなパケットを出力した場合には、保持するインデックスアドレスを再送用バッファ３８とインデックステーブル３２に出力する。
【００５４】
すなわち、再送用バッファ書き込みアドレスカウンタ３４は、パケットを再送用バッファ３８に格納する際のインデックスアドレスを再送用バッファ３８とインデックステーブル３２に出力する。この結果、再送用バッファ３８は、再送用バッファ書き込みアドレスカウンタ３４が出力したインデックスアドレスが示すラインからパケットの格納を開始する。また、インデックステーブル３２は、トランザクション層１０２が出力したパケットの先頭を再送用バッファ３８に格納する際、パケットの先頭が格納されたインデックスアドレスをインデックステーブル書き込みエントリ番号カウンタ２８が出力するエントリ番号のエントリに格納する。
【００５５】
また、再送用バッファ書き込みアドレスカウンタ３４は、再送用バッファ３８にパケットが１ライン分格納されるごとにインデックスアドレスを１つ加算し、加算したインデックスアドレスを再送用バッファ３８に出力する。この結果、再送用バッファ３８は、トランザクション層１０２が出力するパケットを連続するラインに順に格納する。また、再送用バッファ書き込みアドレスカウンタ３４は、比較器３６に、カウント中のインデックスアドレスを出力する。
【００５６】
再送用バッファ読み出しアドレスカウンタ３５は、再送用バッファ３８から再送対象のパケットを読み出すためのインデックスアドレスを記憶する。具体的には、再送用バッファ読み出しアドレスカウンタ３５は、再送中フラグ３１が「Ｈｉｇｈ」となった場合には、インデックステーブル３２の各エントリのうち、加算器２５が出力するエントリ番号が示すエントリに格納されたインデックスアドレスを取得する。そして、再送用バッファ読み出しアドレスカウンタ３５は、インデックステーブル３２から読み出したインデックスアドレスを初期値として保持する。すなわち、再送用バッファ読み出しアドレスカウンタ３５は、再送対象のパケットが格納されたラインのうち、最初のラインのインデックスアドレスを保持する。
【００５７】
また、再送用バッファ読み出しアドレスカウンタ３５は、保持したインデックスアドレスを再送用バッファ３８に出力することで、再送用バッファ３８に再送対象のパケットを出力させる。また、再送用バッファ読み出しアドレスカウンタ３５は、再送用バッファ３８からデータを１ライン読み出すごとに、保持したインデックスアドレスに１を加算する。そして、再送用バッファ読み出しアドレスカウンタ３５は、新たなインデックスアドレスを再送用バッファ３８に出力することで、再送対象のパケットを出力させる。
【００５８】
比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値、すなわち、再送用バッファ３８の読み出し対象となるラインのインデックスアドレスを取得する。また、比較器３６は、インデックステーブル３２の各エントリのうち、加算器２７が出力したエントリ番号のエントリに格納されたインデックスアドレス、すなわち、次に再送用バッファ３８の読み出し対象となるラインのインデックスアドレスを取得する。
【００５９】
そして、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値と、インデックステーブル３２から読み出したインデックスアドレスとを比較する。その後、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値と、インデックステーブル３２から読み出したインデックスアドレスとが一致した場合には、パケットの先頭を検出した旨を再送用シーケンス番号カウンタ３７に通知する。
【００６０】
すなわち、比較器３６は、再送用バッファ３８の読み出し対象となるラインのインデックスアドレスと、現在読み出し中のパケットの次に読み出し対象となるパケットの、先頭が格納されたラインのインデックスアドレスとが一致した場合には、これから読み出すラインが新たなパケットの先頭であると判別する。そして、比較器３６は、これから読み出すパケットに対し、直前に読み出したパケットとは異なるシーケンス番号を付与するように再送用シーケンス番号カウンタ３７に指示する。
【００６１】
また、比較器３６は、インデックステーブル３２から読み出したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ３５が保持する値とが一致し、パケットの先頭を検出した場合には、以下の処理を実行する。すなわち、比較器３６は、インデックステーブル再送中エントリ番号カウンタ２６に、更新を指示する。すると、インデックステーブル再送中エントリ番号カウンタ２６は、保持するエントリ番号に１を加算し、新たなエントリ番号を出力する。
【００６２】
なお、比較器３６は、パケットの末尾を判別してもよい。例えば、比較器３６は、インデックステーブル３２から取得したインデックスアドレスから１を減算することで、パケットの末尾が格納されたインデックスアドレスを識別する。そして、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値と、パケットの末尾が格納されたインデックスアドレスとが一致した場合には、これから読み出すラインがパケットの末尾であると再送用シーケンス番号カウンタ３７に通知してもよい。
【００６３】
また、比較器３６は、再送用バッファ書き込みアドレスカウンタ３４が加算後に保持する値と再送用バッファ読み出しアドレスカウンタ３５が保持する値とを比較する。そして、比較器３６は、再送用バッファ書き込みアドレスカウンタ３４が保持する値と再送用バッファ読み出しアドレスカウンタ３５が保持する値とが一致した場合には、再送用バッファ３８のエントリを全て読み出したと判別する。その後、比較器３６は、再送中フラグ３１を「Ｌｏｗ」にすることで、再送処理を終了する。なお、図２においては、図が煩雑になるのを防ぐため、比較器３６が再送中フラグ３１を「Ｌｏｗ」にする処理を示す矢印の記載を省略した。
【００６４】
また、比較器３６は、インデックステーブル書き込みエントリ番号カウンタ２８が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値を取得する。また、比較器３６は、インデックステーブル書き込みエントリ番号カウンタ２８が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値とを比較する。
【００６５】
そして、比較器３６は、比較した各値が一致した状態でインデックステーブル３２に新たなインデックスアドレスのパケットが格納された場合には、インデックステーブル３２が満杯である旨を示すフラグをインデックステーブルエントリフルレジスタ４０ａに格納する。例えば、比較器３６は、「Ｈｉｇｈ」をインデックステーブルエントリフルレジスタ４０ａに格納する。
【００６６】
また、比較器３６は、インデックステーブル書き込みエントリ番号カウンタ２８が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値に１を加算した値とを比較する。そして、比較器３６は、比較した各値が一致した場合には、インデックステーブルエントリフルレジスタ４０ａにインデックステーブル３２が満杯である旨を示すフラグが格納されているか否かを判別する。
【００６７】
そして、比較器３６は、インデックステーブルエントリフルレジスタ４０ａにインデックステーブル３２が満杯である旨を示すフラグが格納されていない場合には、再送用バッファ３８が空であり、インデックステーブル３２が空であると判別する。一方、比較器３６は、インデックステーブルエントリフルレジスタ４０ａにインデックステーブル３２が満杯である旨を示すフラグが格納されている場合には、再送用バッファ３８が空では判別する。
【００６８】
また、比較器３６は、比較した各値が一致しない場合には、インデックステーブル３２に余裕がある旨を示すフラグ、例えば「Ｌｏｗ」をインデックステーブルエントリフルレジスタ４０ａに格納する。なお、トランザクション層１０２は、インデックステーブルエントリフルレジスタ４０ａに、インデックステーブル３２が満杯である旨を示すフラグが格納されている場合には、パケットの出力を待機することで、パケットの送信を停止する。
【００６９】
さらに、トランザクション層１０２は、再送用バッファ３８のラインの残数が、最大サイズのパケットが必要とするライン数よりも少なくなった時も、パケットの送信を停止する。パケット最大サイズは、システムによって異なる値であり、最大サイズのパケットに必要なライン数を示す値は外部（図示されない）から直接与えられてもよいし、レジスタを持って設定してもよい。また、外部から与えられた最大パケットサイズ、またはレジスタで設定された最大パケットサイズから、必要ライン数を計算する計算器を持って計算してもよい。
【００７０】
以下、図６Ａを用いて、再送用バッファ３８のラインの残数が最大サイズのパケットが必要とするライン数よりも少なくなっ際に、パケットの送信を停止する処理について説明する。図６Ａは、再送用バッファが満杯であるか否かを判別する処理を説明するための図である。なお、図６Ａに示す再送用バッファフルレジスタ４０ｂは、再送用バッファ４８の残りラインの数が、最大サイズのパケットが必要とするライン数よりも少なくなったか否かを示すフラグを記憶するレジスタである。
【００７１】
また、パケット最大ライン数設定レジスタ４０ｃは、図示されない外部から書き込みが行われるレジスタであり、最大サイズのパケットが必要とするライン数を記憶するレジスタである。また、図２では図が煩雑になるのを防ぐため、記載を省略したが、図６Ａに示す例では、トランザクション層１０２は、現状において最初に送信されるであろうパケットの先頭のインデックスアドレスから、再送用バッファ書き込みアドレスカウンタ３４の値を減算する減算器４７を有するものとする。
【００７２】
再送用バッファ３８が有するラインの残数は、次に承認される予定のパケットの先頭が格納された再送用バッファ３８のインデックスアドレスの値から、次に書き込みを行う再送用バッファ３８のインデックスアドレスの値を減算することで求められる。つまり、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値を加算器２５に出力し、インデックステーブル３２の各エントリのうち、加算器２５が出力するエントリ番号が示すエントリに格納されたインデックスアドレスが、次に承認される予定のパケットの先頭が格納されたインデックスアドレスであり、すなわちこれは、現状において最初に再送されるであろうパケットの先頭のインデックスアドレスでもある。ここから、再送用バッファ書き込みアドレスカウンタ３４の値を減算した結果が、再送用バッファ３８のラインの残数である。
【００７３】
そして、比較器３６は、トランザクション層１０２からパケットの末尾を受け取る度に、再送バッファ３８のラインの残数、すなわち減算器４７の出力とパケット最大ライン数設定レジスタ４０ｃの値を比較する。その後、比較器３６は、比較の結果、ラインの残数がパケット最大ライン数設定レジスタ４０ｃが記憶する値より小さければ、再送用バッファ３８は満杯になったと見做し、再送用バッファフルレジスタ４０ｂを「Ｈｉｇｈ」に設定する。一方、トランザクション層１０２は、再送用バッファフルレジスタ４０ｂに、再送用バッファ３８が満杯である旨を示す、「Ｈｉｇｈ」が設定されている場合には、パケット送信停止要求がされたものとみなし、次のパケットの出力を待機することで、パケットの送信を停止する。
【００７４】
また、比較器３６は、インデックステーブル３２が空であると判別した場合には、再送用バッファ３８に再送対象のパケットが格納されていないので、再送は行われない。例えば、比較器３６は、再送予約フラグ２９が「Ｈｉｇｈ」である状態において、送信した全てのパケットについて承認が行われ、インデックステーブル３２に有効なパケットが存在しなくなり、インデックステーブル３２が空であると判別した場合には、再送予約フラグ２９を「Ｌｏｗ」にリセットする。
【００７５】
図２に戻って、再送用シーケンス番号カウンタ３７は、再送対象となるパケットに対し、最初の送信時に割り当てられたシーケンス番号と同じシーケンス番号を、再送シーケンス番号として付与する。具体的には、再送用シーケンス番号カウンタ３７は、初期値として、承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号に１を加算した値を保持する。また、再送用シーケンス番号カウンタ３７は、比較器３６がパケットの先頭を判別し、比較器３６から直前に読み出したパケットとは異なるシーケンス番号を付与するよう指示された場合には、保持するシーケンス番号に１を加算し、新たなシーケンス番号をパケット選択器３９に出力する。
【００７６】
すなわち、再送用シーケンス番号カウンタ３７は、コンポーネント１０５から承認されていないパケットのシーケンス番号を保持し、比較器３６が再送するパケットの先頭を検出するごとに、保持したシーケンス番号に１を加算し、再送シーケンス番号をパケット選択器３９に出力する。この結果、トランザクション層１０２は、再送用のシーケンス番号をすべて記憶しなくともよいので、再送処理を実行するために必要な記憶容量を削減することができる。なお、比較器３６は、パケットの末尾を判別した時に、次のパケットに備えて再送用シーケンス番号カウンタ３７に１を加算するとしても良い。加算後の再送シーケンス番号を、次のパケットに用いるシーケンス番号として、読み出された次のパケットとともに、パケット選択器３９に出力する。
【００７７】
パケット選択器３９は、トランザクション層１０２からパケットを受信するとともに、シーケンス番号カウンタ３３からシーケンス番号を受信する。さらに、再送中フラグ３１の出力を受信する。再送中フラグ３１が、「Ｌｏｗ」を示している場合には、パケット選択器３９は、トランザクション層１０２から受信したパケットにシーケンス番号カウンタ３３から受信したシーケンス番号を付与したパケットを選択し、物理層１０４を経由した後、コンポーネント間のリンクを介して、コンポーネント１０５へ送信する。
【００７８】
また、パケット選択器３９は、再送用バッファ３８から再送対象のパケットを受信するとともに、再送用シーケンス番号カウンタ３７から再送シーケンス番号を受信する。そして、再送中フラグ３１が、「Ｈｉｇｈ」を示している場合には、パケット選択器３９は、再送対象のパケットに再送シーケンス番号を付与したパケットを選択し、物理層１０４を経由した後、コンポーネント間のリンクを介して、コンポーネント１０５のへ送信する。また、パケット選択器３９は、パケットを送信した場合、すなわちパケットの末尾を送信した場合には、再送タイマ３０にパケットの末尾を送信した旨を通知する。
【００７９】
次に、図６Ｂを用いて、インデックステーブル３２にインデックスアドレスを格納する処理について説明する。図６Ｂは、インデックステーブルにインデックスアドレスを格納する処理を説明するための図である。まず、トランザクション層１０２が次に送信するパケットを出力すると、シーケンス番号カウンタ（ＮＸＴ＿ＴＲＡＮ＿ＳＥＱ＿ＣＴ）３３は、送信シーケンス番号をパケット選択器３９に入力する。この結果、パケット選択器３９は、送信シーケンス番号とパケットとを含むパケットを送信する。
【００８０】
また、トランザクション層１０２が出力したパケットは、再送用バッファ３８に入力される。すると、再送用バッファ３８は、再送用バッファ書き込みアドレスカウンタ３４が示すインデックスアドレスから順に、一つまたは複数のラインにパケットを格納する。
【００８１】
また、インデックステーブル３２は、再送用バッファ書き込みアドレスカウンタ３４が出力するインデックスアドレスのうち、パケットを格納した複数のラインのうち、最初のラインのインデックスアドレスを受信する。そして、インデックステーブル３２は、インデックステーブル書き込みエントリ番号カウンタ２８が出力するエントリ番号のエントリに、インデックスアドレスを格納する。
【００８２】
次に、図７を用いて、インデックステーブル承認済みエントリ番号保持レジスタ２４に、コンポーネント１０５が承認したパケットのシーケンス番号を格納する処理について説明する。図７は、インデックステーブル承認済みエントリ番号保持レジスタが保持する値を更新する処理を説明するための図である。
【００８３】
例えば、図７に示す例では、Ａｃｋ／Ｎａｋ受信器２１が、Ａｃｋに格納されていた承認済みシーケンス番号をＡｃｋ数計算機２３と、承認済みシーケンス番号保持レジスタ（ＡＣＫＤ＿ＳＥＱ＿ＲＥＧ）２２に出力する。すると、承認済みシーケンス番号保持レジスタ２２は、前回記憶した承認済みシーケンス番号をＡｃｋ数計算機２３に出力し、新たに受信した承認済みシーケンス番号を保持する。
【００８４】
一方、Ａｃｋ数計算機２３は、Ａｃｋ／Ｎａｋ受信器２１から受信した承認済みシーケンス番号値から、承認済みシーケンス番号保持レジスタ２２から受信した承認済みシーケンス番号の値を減算する。そして、Ａｃｋ数計算機２３は、計算結果の値と、インデックステーブル承認済みエントリ番号保持レジスタ２４が記憶する値との和を、新たな承認済みエントリ番号として、インデックステーブル承認済みエントリ番号保持レジスタ２４に格納する。
【００８５】
また、加算器２５は、インデックステーブル承認済みエントリ番号保持レジスタ２４に格納されたエントリ番号に１を加算した値をインデックステーブル再送中エントリ番号カウンタ２６に格納する。すなわち、加算器２５は、現状において最初に再送されるであろうパケットに割り当てられたエントリ番号をインデックステーブル再送中エントリ番号カウンタ２６に格納する。
【００８６】
次に、図８を用いて、パケットの再送を行うための初期値を再送用バッファ読み出しアドレスカウンタ３５に設定する処理の流れについて説明する。図８は、再送時の初期値を再送用バッファ読み出しアドレスカウンタに設定する処理を説明するための図である。例えば、加算器２５は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算したエントリ番号をインデックステーブル３２に出力する。そして、再送用バッファ書き込みアドレスカウンタ３５は、再送中フラグ３１が「Ｈｉｇｈ」となった場合には、加算器２５が出力したエントリ番号が示すエントリに格納されたインデックスアドレスを保持する。
【００８７】
すなわち、インデックステーブル承認済みエントリ番号保持レジスタ２４は、コンポーネント１０５が最も最近承認したパケットの先頭のインデックスアドレスが格納されたエントリのエントリ番号を保持する。そして、加算器２５は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算することで、再送対象のパケットの先頭のインデックスアドレスが格納されたエントリのエントリ番号を算出する。この結果、再送用バッファ書き込みアドレスカウンタ３５は、加算器２５が出力するエントリ番号が示すエントリに格納されたインデックスアドレスを保持することで、再送対象のパケットの先頭が格納されたインデックスアドレスを保持することができる。
【００８８】
次に、図９を用いて、パケットの再送を行うための初期値を再送用シーケンス番号カウンタ３７に設定する処理の流れについて説明する。図９は、再送時の初期値を再送用シーケンス番号カウンタに設定する処理を説明するための図である。例えば、再送用シーケンス番号カウンタ３７（ＲＰＬ＿ＴＲＡＮ＿ＳＥＱ＿ＣＴ）には、承認済みシーケンス番号保持レジスタ（ＡＣＫＤ＿ＳＥＱ＿ＲＥＧ）２２が保持するシーケンス番号に１を加算したシーケンス番号が格納される。この結果、再送用シーケンス番号カウンタ３７には、再送対象のパケットが、最初の送信時にシーケンス番号カウンタ３３によって割り当てられたシーケンス番号と同じシーケンス番号が再送対象のパケットに設定されることとなる。
【００８９】
次に、図１０を用いて、パケットの再送中に、パケットごとの先頭ラインを検出する処理の流れについて説明する。図１０は、再送時にパケット毎の先頭ラインを検出する処理を説明するための図である。例えば、比較器３６は、加算器２７が出力するエントリ番号、すなわちインデックステーブル再送中エントリ番号カウンタ２６が保持するエントリ番号に１を加算したエントリ番号に格納されたインデックスアドレスを取得する。すなわち、比較器３６は、次の再送対象となるパケットの先頭を格納した再送用バッファ３８のラインのインデックスアドレスを取得する。
【００９０】
そして、比較器３６は、インデックステーブル３２から取得したインデックスアドレスと再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスとを比較する。その後、比較器３６は、比較した各アドレスが一致する場合には、パケットの先頭を検出した旨を再送用シーケンス番号カウンタ３７に通知する。
【００９１】
すると、再送用シーケンス番号カウンタ３７は、保持しているシーケンス番号に１を加算し、新たなシーケンス番号をパケット選択器３９に出力する。そして、パケット選択器３９は、新たなシーケンス番号とともに再送用バッファ３８から読み出されたパケットを受信し、受信したシーケンス番号をさらにパケットに付与したパケットを出力する。なお、比較器３６は、パケットの末尾を判別した時に、次のパケットに備えて再送用シーケンス番号カウンタ３７が保持するシーケンス番号に１を加算するとしても良い。このような場合には、データリンク層１０３は、１を加算した再送シーケンス番号を、次のパケットに用いるシーケンス番号として、再送用バッファ３８から読み出された次のパケットとともに、パケット選択器３９に出力する。
【００９２】
なお、比較器３６は、パケットの先頭を検出した場合には、インデックステーブル再送中エントリ番号カウンタ２６に対し、エントリ番号の更新を指示する。この結果、インデックステーブル再送中エントリ番号カウンタ２６は、保持するエントリ番号に１を加算し、新たなエントリ番号を出力する。
【００９３】
次に、図１１〜図１６を用いて、データリンク層１０３が実行する処理の具体例を説明する。まず、図１１を用いて、パケットの再送を行うための初期値を再送用バッファ読み出しアドレスカウンタ３５に設定する処理の具体例を説明する。
【００９４】
図１１は、再送のための読み出し開始アドレスを設定する処理の流れを説明するための図である。例えば、図１１に示す例では、インデックステーブル３２は、エントリ番号「０」から「５」までのエントリに、インデックスアドレス「ｍ−６」、「ｍ−１」、「ｍ＋１」、「ｍ＋５」、「ｍ＋７」、「ｍ＋１０」を記憶する。
【００９５】
また、図１１中の斜線で示すように、再送用バッファ３８のうち、アドレス「ｍ」までの領域に格納されたパケットは、コンポーネント１０５からすでに承認されたパケットである。すなわち、エントリ番号「０」、および「１」に格納されたインデックスアドレスが示す記憶領域に格納されたパケットは、コンポーネント１０５からすでに承認されたパケットである。
【００９６】
また、承認済みシーケンス番号保持レジスタ２２には、承認済みシーケンス番号として「ｎ」が格納されている。また、インデックステーブル承認済みエントリ番号保持レジスタ２４には、更新前の値として、承認済みのパケットの先頭が格納されたインデックスアドレスが格納されたエントリのエントリ番号「１」が格納されている。
【００９７】
ここで、Ａｃｋ数計算機２３は、コンポーネント１０５が３つのパケットを承認した結果、新たな承認済みシーケンス番号として、「ｎ＋３」を受信する。すると、Ａｃｋ数計算機２３は、新たな承認済みシーケンス番号から承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号を減算した値「３」を算出する。そして、Ａｃｋ数計算機２３は、値「３」をインデックステーブル承認済みエントリ番号保持レジスタ２４に出力する。
【００９８】
すると、インデックステーブル承認済みエントリ番号保持レジスタ２４は、「１」にＡｃｋ数計算機２３から受信した値「３」を加算したエントリ番号「４」を保持する。また、インデックステーブル承認済みエントリ番号保持レジスタ２４は、エントリ番号「４」を加算器２５に出力する。この結果、加算器２５は、エントリ番号「５」をインデックステーブル３２に出力する。
【００９９】
すると、再送用バッファ読み出しアドレスカウンタ３５は、エントリ番号「５」に格納されたインデックスアドレス「ｍ＋１０」を保持する。この結果、再送用バッファ読み出しアドレスカウンタ３５は、現状において承認されていないパケット、すなわち再送対象のパケットの先頭アドレスを保持することとなる。
【０１００】
次に、図１２を用いて、パケットの再送中に、パケットごとの先頭ラインを検出する処理の具体例について説明する。図１２は、パケットの先頭を検出する処理の流れを説明するための図である。なお、図１２に示す例では、承認済みシーケンス番号保持レジスタ２２、インデックステーブル３２、再送用バッファ３８は、図１１と同様のパケットを記憶しているものとする。
【０１０１】
さらに、インデックステーブル３２は、エントリ番号「６」のエントリにインデックスアドレス「ｍ＋１２」を記憶しているものとする。また、図１２に示す例では、斜線で示すように、再送用バッファ３８のインデックスアドレス「ｍ＋９」に格納されたパケットまでが新たに承認されたものとする。
【０１０２】
例えば、Ａｃｋ数計算機２３は、承認済みシーケンス番号「ｎ＋３」から承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号「ｎ」を減算した値「３」をインデックステーブル承認済みエントリ番号保持レジスタ２４に出力する。すると、インデックステーブル承認済みエントリ番号保持レジスタ２４は、更新後の値「４」を加算器２５に出力する。この結果、インデックステーブル再送中エントリ番号カウンタ２６は、値「５」を保持する。
【０１０３】
また、加算器２７は、インデックステーブル再送中エントリ番号カウンタ２６が保持する値「５」に１を加算した値「６」を出力する。この結果、比較器３６は、エントリ番号「６」に格納されたインデックスアドレス「ｍ＋１２」を取得する。そして、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスが「ｍ＋１２」になった場合には、パケットの先頭を検出したと判別する。
【０１０４】
また、比較器３６は、パケットの先頭を検出した場合には、インデックステーブル再送中エントリ番号カウンタ２６に保持する値を更新するよう指示する。このように、データリンク層１０３は、次回送信するパケットのインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスとを比較することで、次回送信するパケットの先頭を識別することができる。
【０１０５】
次に、図１３を用いて、パケットの末尾を判別する処理の具体例について説明する。図１３は、パケットの末尾を判定する処理を説明するための図である。なお、図１３に示す例では、インデックステーブル３２、および再送用バッファ３８は、図１１に示す例と同様のパケットを記憶しているものとする。
【０１０６】
例えば、インデックステーブル再送中エントリ番号カウンタ２６は、エントリ番号の値「３」を記憶している。この結果、加算器２７は、エントリ番号「４」を出力する。比較器３６は、インデックステーブル３２のうち、加算器２７が出力したエントリ番号「４」のエントリに格納されたインデックスアドレスが「ｍ＋７」であるので、「ｍ＋７」から１を減算した値「ｍ＋６」を識別する。そして、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値が「ｍ＋６」になった場合には、読み出し中の再送用バッファ３８のラインがパケットの末尾であると判別する。
【０１０７】
次に、図１４を用いて、再送処理が終了したか否かを判定する処理の具体例について説明する。図１４は、再送処理が終了したか否かを判定する処理の流れを説明するための図である。なお、図１４に示す例では、インデックステーブル３２、および再送用バッファ３８は、図１３と同様のパケットを記憶するものとする。
【０１０８】
また、インデックステーブル書き込みエントリ番号カウンタ２８は、エントリ番号「６」を保持しているものとする。また、インデックステーブル承認済みエントリ番号保持レジスタ２４は、エントリ番号「１」を保持しているものとする。また、エントリ番号「２」に格納されたインデックスアドレス「ｍ＋１」からパケットの再送が行われた結果、インデックステーブル再送中エントリ番号カウンタ２６には「５」が格納され、インデックステーブル再送中エントリ番号カウンタ２６には「５」が格納されているものとする。
【０１０９】
このような場合には、再送用バッファ読み出しアドレスカウンタ３５は、再送用バッファ読み出しアドレスカウンタ３５が保持する値と再送用バッファ書き込みアドレスカウンタ３４が保持する値とを比較する。ここで、図１４に示す例では、再送対象のパケットが順次読み出された結果、再送用バッファ読み出しアドレスカウンタ３５が保持する値が「ｍ＋１２」となる。
【０１１０】
すると、比較器３６は、再送用バッファ読み出しアドレスカウンタ３５が保持する値が再送用バッファ書き込みアドレスカウンタ３４が保持する値「ｍ＋１２」と一致したと判断する。この結果、比較器３６は、再送用バッファのエントリを全て読み出したと判定し、再送中フラグ３１を「Ｌｏｗ」にリセットする。
【０１１１】
次に、図１５を用いて、インデックステーブルが満杯であるかを判別する処理の具体例について説明する。図１５は、インデックステーブルが満杯であるか否かを判別する処理を説明するための図である。なお、図１５に示す例では、インデックステーブル３２は、エントリ番号「３」のエントリのみが空いているものとする。
【０１１２】
例えば、比較器３６は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号と、インデックステーブル書き込みエントリ番号カウンタ２８とを比較する。図１５に示す例では、比較器３６は、比較対象の各エントリ番号が「３」で一致すると判別する。そして、比較器３６は、新たな送信パケットがトランザクション層１０２から出力され、そのパケットをデータリンク層１０３が受け取ると、インデックステーブルエントリフルレジスタ４０ａに「Ｈｉｇｈ」を格納することで、インデックステーブル３２が満杯である旨をトランザクション層１０２に通知する。
【０１１３】
なお、図１５に示す例では、トランザクション層１０２が出力した新たな送信パケットは、再送用バッファ３８が有するラインのうち、再送用バッファ書き込みアドレスカウンタ３４が示すインデックスアドレス「ｍ＋７」から順に格納される。この結果、インデックステーブル３２は、エントリ番号「３」のエントリに、インデックスアドレス「ｍ＋７」を格納することとなる。
【０１１４】
次に、図１６Ａ、図１６Ｂ、図１７を用いて、再送用バッファ３８が空であるか否かを判別する処理の流れ、及び再送用バッファ３８が満杯であるか否かを判別する処理の流れについて説明する。例えば、データリンク層１０３は、再送用バッファ３８が空であるか、満杯であるかを判別するには、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号と、インデックステーブル書き込みエントリ番号カウンタ２８が保持するエントリ番号を利用する。
【０１１５】
例えば、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算した値と、インデックステーブル書き込みエントリ番号カウンタ２８が保持するエントリ番号が一致するのは、インデックステーブル３２が満杯のときか、または、インデックステーブル３２が空、つまり再送用バッファ３８が空の時である。この時、インデックステーブルエントリフルレジスタ４０ａが「Ｈｉｇｈ」を示していなければ、インデックステーブル３２は満杯でない、つまり再送用バッファ３８が空である、ということになる。
【０１１６】
図１６Ａは、再送用バッファが空ではない状態を説明するための図である。例えば、図１６Ａに示す例では、比較器３６は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算した値と、インデックステーブル書き込みエントリ番号カウンタ２８が保持するエントリ番号が一致するか判別する。
【０１１７】
例えば、図１６Ａに示す例では、比較器３６は、各エントリ番号が「４」で一致すると判別する。すると、比較器３６は、インデックステーブルエントリフルレジスタ４０ａに「Ｈｉｇｈ」が格納されているか否かを判別する。ここで、図１６Ａに示す例では、インデックステーブル３２の全エントリにインデックステーブルが格納されているため、インデックステーブルエントリフルレジスタ４０ａには「Ｈｉｇｈ」が格納されている。この結果、比較器３６は、再送用バッファは空ではないと判定する。
【０１１８】
一方、図１６Ｂは、再送用バッファが空である場合を説明するための図である。図１６Ｂ中の斜線で示すように、再送用バッファ３８には、有効なパケットが格納されておらず、この結果、インデックステーブル３２にも有効なパケットは格納されていない。しかしながら、図１６Ｂに示す例でも、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値に１を加算した値とインデックステーブル書き込みエントリ番号カウンタ２８が保持する値とが一致する。
【０１１９】
そこで、比較器３６は、各エントリ番号が一致すると判別した場合には、インデックステーブルエントリフルレジスタ４０ａに「Ｈｉｇｈ」が格納されているか否かを判別する。ここで、図１６Ｂに示す例では、インデックステーブル３２が空であるので、直前の処理サイクルにおいて図１５に例示した処理は行われない。
【０１２０】
この結果、図１６Ｂに示す例では、インデックステーブルエントリフルレジスタ４０ａには「Ｌｏｗ」が格納されている。このため、比較器３６は、再送用バッファが空であり、ひいては、インデックステーブル３２も空であると判別することができる。
【０１２１】
次に、図１７を用いて、再送バッファが満杯であるか否かを判別する処理の流れを説明する。図１７は、再送バッファが満杯であるか否かを判別する処理の流れを説明するための図である。なお、図１７に示す例では、インデックステーブル承認済みエントリ番号保持レジスタ２４は、値「３」を記憶し、再送用バッファ書き込みアドレスカウンタ３４は、「ｍ＋７」を記憶している者とする。また、パケット最大ライン数設定レジスタ４０ｃは、値「ｎ」記憶しているものとする。
【０１２２】
例えば、トランザクション層１０２からパケットの末尾を受け取ると、減算器４７は、以下の処理を実行する。まず、減算器４７は、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値「３」に１を加算したエントリ番号「４」を識別する。そして、減算器４７は、インデックステーブル３２の各エントリのうち、識別したエントリ番号「４」が示すエントリに格納されたインデックスアドレス「ｍ＋１１」を取得する。
【０１２３】
また、減算器４７は、再送用バッファ書き込みアドレスカウンタが記憶するインデックスアドレス「ｍ＋７」を取得する。そして、減算器４７は、インデックステーブル３２から取得したインデックスアドレス「ｍ＋１１」から、再送用バッファ書き込みアドレスカウンタ３４から取得したインデックスアドレス「ｍ＋７」を減算した値「４」を比較器３６に出力する。
【０１２４】
すると、比較器３６は、減算器４７から受信した値「４」とパケット最大ライン数設定レジスタ４０ｃが記憶する値「ｎ」とを比較する。そして、比較器３６は、減算器４７から受信した値「４」よりも、パケット最大ライン数設定レジスタ４０ｃが記憶する値「ｎ」の方が大きい場合には、再送用バッファが満杯であると判別し、再送用バッファフルレジスタ４０ｂを「Ｈｉｇｈ」に設定する。
【０１２５】
このように、データリンク層１０３は、次に再送されるであろうパケットの先頭が格納されたインデックスアドレスと、再送用バッファ書き込みアドレスカウンタ３４が記憶するインデックスアドレスとを用いて、再送用バッファ３８の残りライン数を計数する。そして、データリンク層１０３は、残りのライン数が、パケットを記憶する際の最大ライン数よりも少ない場合には、トランザクション層１０２にデータの送信停止を要求する。このため、データリンク層１０３は、再送用バッファ３８のオーバーフローを防ぐことができる。なお、ＰＣＩｅのデータリンク層は本来、ＬＣＲＣなどによるデータ保護機能などの本文に書かれていない機能を備えるが、本発明の本質的な部分に関わるものではないため、説明を省略した。
【０１２６】
［実施例１の効果］
上述したように、コンポーネント１０１は、再送用バッファ３８と、インデックステーブル３２とを有する。また、コンポーネント１０１は、インデックステーブル３２が新たなインデックスアドレスを記憶する際のエントリ番号の保持、および更新を行うインデックステーブル書き込みエントリ番号カウンタ２８を有する。また、コンポーネント１０１は、インデックステーブル３２から再送対象となるパケットのインデックスを読み出すためのエントリ番号の保持、および更新を行うインデックステーブル承認済みエントリ番号保持レジスタ２４を有する。
【０１２７】
また、コンポーネント１０１は、コンポーネント１０５からＡｃｋを受信したパケットの承認済みシーケンス番号を保持する承認済みシーケンス番号保持レジスタ２２を有する。そして、コンポーネント１０１は、新たに受信した承認済みのシーケンス番号と、承認済みシーケンス番号保持レジスタ２２に格納されたシーケンス番号とに基き、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持する値を更新する。
【０１２８】
このため、コンポーネント１０１は、再送対象となるパケットが不定長である際に、シーケンス番号を全て保持せずとも、再送対象となる各パケットに、送信時と同様のシーケンス番号を付与することができる。この結果、コンポーネント１０１は、再送処理に要する記憶容量を削減することができる。
【０１２９】
また、コンポーネント１０１は、承認済みシーケンス番号保持レジスタ２２が保持する承認済みシーケンス番号保持レジスタ２２と、新たに受信した承認済みシーケンス番号との差から、コンポーネント１０５が正確に受信したパケットの数を判別する。そして、コンポーネント１０１は、判別した数だけ、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号の値を加算する。このため、コンポーネント１０１は、再送対象となるパケットの先頭が格納されたインデックスアドレスとシーケンス番号とを対応付けて記憶せずとも、再送用バッファ３８に格納された各パケットの先頭を識別することができる。
【０１３０】
また、再送用バッファ読み出しアドレスカウンタ３５は、Ｎａｋを受信した場合には、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算したエントリ番号が示すエントリからインデックスアドレスを取得する。そして、再送用バッファ読み出しアドレスカウンタ３５は、取得したインデックスアドレスから順に、再送用バッファ３８が記憶するパケットの読み出しを行う。その後、パケット選択器３９は、読み出したパケットをコンポーネント１０５へ送信する。このため、コンポーネント１０１は、記憶容量を増大させることなく、再送対象となるパケットをコンポーネント１０５に送信することができる。
【０１３１】
また、比較器３６は、インデックステーブル再送中エントリ番号カウンタ２６が保持するエントリ番号に１を加算したエントリ番号が示すエントリに格納されたインデックスアドレスを取得する。また、比較器３６は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスとが一致するか否かを判別する。
【０１３２】
そして、パケット選択器３９は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスとが一致する場合は、一致したインデックスアドレスから読み出したパケットを新たなパケットとして送信する。すなわち、パケット選択器３９は、直前まで送信していたパケットとは異なるパケットとして送信する。この結果、コンポーネント１０１は、各パケットが不定長である場合にも、それぞれ異なるパケットとしてコンポーネント１０５へ送信することができる。
【０１３３】
さらに、インデックステーブル再送中エントリ番号カウンタ２６は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ３５が保持するインデックスアドレスとが一致する場合は、保持するエントリ番号を更新する。このため、コンポーネント１０１は、連続して複数のパケットを再送する場合にも、各パケットの先頭を正確に識別し、各パケットをそれぞれ異なるパケットとしてコンポーネント１０５に送信することができる。
【０１３４】
また、再送タイマ３０は、Ａｃｋ、またはＮａｋを所定時間の間に受信しなかった場合には、再送予約フラグ２９を「Ｈｉｇｈ」にする。この結果、再送中フラグ３１が「Ｈｉｇｈ」となった場合には、再送用バッファ読み出しアドレスカウンタ３５は、インデックステーブル３２から再送対象となるパケットの先頭が格納されたインデックスアドレスを取得する。このため、コンポーネント１０１は、タイムアウトが発生した場合にも、再送処理を開始することができる。
【０１３５】
また、再送用シーケンス番号カウンタ３７は、再送処理を開始する際、承認済みシーケンス番号保持レジスタ２２が保持する承認済みシーケンス番号に１を加算した値を初期値として保持する。そして、パケット選択器３９は、再送用シーケンス番号カウンタ３７が保持する値を再送用のシーケンス番号として、再送するパケットに付与する。このため、コンポーネント１０１は、再送するパケットとシーケンス番号とを対応付けて記憶せずとも、再送するパケットが最初の送信で割り当てられた送信シーケンス番号と同じシーケンス番号を再度割り当てて、コンポーネント１０５に再送することができる。
【０１３６】
また、データリンク層１０３は、長さの異なる複数のパケットを一時的に保持する再送用バッファ３８を有する。また、データリンク層１０３は、パケットが新しく生成された際に再送用バッファ３８へ登録する位置を示す再送用バッファ書き込みアドレスカウンタ３４を有する。また、データリンク層１０３は、再送用バッファ３８内に格納されているパケットの先頭位置を記憶するエントリからなるインデックステーブル３２を有する。このため、データリンク層１０３は、少ない記憶資源でデータの再送を行う事ができる。
【０１３７】
また、データリンク層１０３は、パケットが新しく生成された際にインデックステーブル３２にパケットの先頭位置を登録するエントリ位置を示すインデックステーブル書き込みエントリ番号カウンタ２８を有する。また、データリンク層１０３は、インデックステーブル３２の中の読み出し可能なエントリを指し示すインデックステーブル再送中エントリ番号カウンタ２６を有する。このため、データリンク層１０３は、少ない記憶資源でデータの再送を行う事ができる。
【０１３８】
また、データリンク層１０３は、パケットの送信先から送信される応答パケットに付随する承認済みシーケンス番号保持レジスタ２２を有する。また、データリンク層１０３は、承認済みシーケンス番号保持レジスタ２２に保持される第１の承認済みシーケンス番号と、次に受信した応答パケットに付随する第２の承認済みシーケンス番号とを用いて、パケットの送信先が正常に受信したパケットの数を計算し、計算結果に基づいてインデックステーブル承認済みエントリ番号保持レジスタ２４を更新する。このため、データリンク層１０３は、少ない記憶資源でデータの再送を行う事ができる。
【０１３９】
また、データリンク層１０３は、パケットの再送を開始すると判定した場合に、再送用バッファ３８に保持されている複数のパケットを再び送信するパケット選択器３９を有する。このため、データリンク層１０３は、データの再送を行う事ができる。
【０１４０】
データリンク層１０３は、インデックステーブル再送中エントリ番号カウンタ２６が指し示すエントリに記憶されている先頭位置を判別し、判別した先頭位置から再送用バッファ３８に登録されたパケットを読み出し、読み出したパケットから再送を行う。このため、データリンク層１０３は、データの再送を行う事ができる。
【０１４１】
データリンク層１０３は、パケットにシーケンス番号を付与し、付与したシーケンス番号が承認シーケンス番号としてパケットの送信先に付与されたＡｃｋ、またはＮａｋを受信する。このため、データリンク層１０３は、再送シーケンス番号を適切に識別できる。
【０１４２】
データリンク層１０３は、再送用バッファ３８内のパケット送信のための読み出し位置を示す再送用バッファ読み出しアドレスカウンタ３５ａを有する。また、データリンク層１０３は、再送中のパケットについてインデックステーブル３２が先頭位置を記憶したエントリの位置を示すインデックステーブル再送中エントリ番号カウンタ２６を有する。また、データリンク層１０３は、インデックステーブル再送中エントリ番号カウンタ２６が示すエントリの次の位置に位置のエントリが記憶する第１のインデックスアドレスと再送用バッファ読み出しアドレスカウンタ３５の示す第２のインデックスアドレスとを比較することで、パケットの先頭位置を検出する比較器３６を有する。このため、データリンク層１０３は、再送用バッファ３８からパケットをそれぞれ個別に読み出すことができる。
【０１４３】
データリンク層１０３は、再送処理中にパケットの先頭位置を検出するたびに、パケットに付与するシーケンス番号を更新する。このため、データリンク層１０３は、再送するパケットに正しい再送シーケンス番号を付与できる。
【実施例２】
【０１４４】
以下の実施例では、再送するパケット量を削減するため、再送中にＡｃｋ／Ｎａｋを受け取った場合、再送予定のパケットについて、送信先の装置がすでに認証したパケットの再送を行わなず(以下の説明では、このような処理を“スキップする”と記載する)、その次のパケットから再送を続ける装置について説明する。なお、以下の説明では、実施例２に係る装置は、コンポーネント１０１が有するデータリンク層１０３と同様のデータリンク層１０３ａを有するものとする。
【０１４５】
以下、図１８を用いて、データリンク層１０３ａが有する機能構成について説明する。図１８は、実施例２に係るデータリンク層の機能構成を説明するための図である。なお、図１８に示す例では、図２に示したデータリンク層１０３と同様の機能を発揮するものについて、図２と同様の符号を付し、以下の説明を省略する。
【０１４６】
図１８に示すように、データリンク層１０３ａは、再送用バッファ読み出しアドレスカウンタ３５ａ、再送用シーケンス番号カウンタ３７ａ、再送数計算器５０、スキップ判定比較器５１、スキップ予約フラグ５２、スキップ設定レジスタ５３を有する。再送数計算器５０は、インデックステーブル再送中エントリ番号カウンタ２６が保持するエントリ番号と、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号とを取得する。そして、再送数計算器５０は、取得したエントリ番号の差分を算出することで、再送したパケットの個数を計算し、計算結果をスキップ判定比較器５１に出力する。
【０１４７】
スキップ判定比較器５１は、スキップ設定レジスタ５３にスキップの実行を示すフラグが格納されている場合には、以下の処理を実行する。まず、スキップ判定比較器５１は、再送数計算器５０から再送したパケットの個数を受信する。また、スキップ判定比較器５１は、Ａｃｋ数計算機２３から新たに承認されたパケットの個数を受信する。
【０１４８】
そして、スキップ判定比較器５１は、新たに承認されたパケットの個数が再送したパケットの個数よりも多い場合には、再送する必要のないパケットが存在すると判別する。その後、スキップ判定比較器５１は、再送する必要の無いパケットが存在すると判別した場合には、スキップ予約フラグ５２に「Ｈｉｇｈ」を格納する。
【０１４９】
スキップ予約フラグ５２は、スキップの実行を指示するフラグであり、「Ｈｉｇｈ」が格納された場合には、再送用バッファ読み出しアドレスカウンタ３５ａにスキップの実行を指示する。また、スキップ設定レジスタ５３は、利用者によって設定されたスキップを実行するか否かを設定するためのフラグを記憶するレジスタである。
【０１５０】
次に、スキップ予約フラグ５２に「Ｈｉｇｈ」が設定された際に、再送用バッファ読み出しアドレスカウンタ３５ａが実行する処理について説明する。なお、再送用バッファ読み出しアドレスカウンタ３５ａは、実施例１に係る再送用バッファ読み出しアドレスカウンタ３５と同様の機能を発揮することができる。
【０１５１】
また、再送用バッファ読み出しアドレスカウンタ３５ａは、スキップ予約フラグ５２に「Ｈｉｇｈ」が設定されている場合には、以下の処理を実行する。まず、再送用バッファ読み出しアドレスカウンタ３５ａは、図１３に示す処理を用いて、パケットの末尾を識別する。そして、パケットの末尾を識別したなら、再送用バッファ読み出しアドレスカウンタ３５ａは、加算器２５が出力するエントリ番号のエントリに格納されたインデックスアドレスを取得し、取得したインデックスアドレスを保持する。その後、再送用バッファ読み出しアドレスカウンタ３５ａは、新たに保持したインデックスアドレスからパケットの読み出しを継続する。
【０１５２】
また、再送用シーケンス番号カウンタ３７ａは、スキップ予約フラグ５２に「Ｈｉｇｈ」が設定された状態でパケットの末尾を識別したなら、承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号に１を加算した値を新たに保持する。この結果、再送用シーケンス番号カウンタ３７ａは、スキップ後に再送するパケットに、再送用のシーケンス番号を正しく付与することができる。
【０１５３】
このように、コンポーネント１０１は、パケットの再送中に新たな承認シーケンス番号を受信した場合には、再送中のパケットの末尾まで出力した後、次に再送する予定のパケットから新たな承認シーケンス番号で承認されたパケットまでの再送をスキップする。その後、コンポーネント１０１は、新たに承認されたパケットの次に再送する予定であったパケットの再送を開始する。
【０１５４】
なお、コンポーネント１０１は、パケットの再送をスキップする場合にも、図１４に示す処理を実行することにより、パケットの再送処理が終了したか否かを判別することができる。また、コンポーネント１０１は、再送用バッファ３８に格納された残りのパケット全ての再送をスキップした場合にも、パケットの再送が終了したと判別する。具体的には、図１４に示す処理を実行することにより、パケットの再送が終了したと判別した場合には、比較器３６が、再送中フラグ３１をリセットするとともに、スキップ予約フラグ５２を「Ｌｏｗ」にリセットする。
【０１５５】
次に、図１９を用いて、スキップ予約フラグを設定する処理の流れについて説明する。図１９は、スキップ予約フラグを設定する処理を説明するための図である。まず、再送数計算器５０は、インデックステーブル承認済みエントリ番号保持レジスタ２４から承認済みエントリ番号を取得し、インデックステーブル再送中エントリ番号カウンタ２６からエントリ番号を取得する。そして、再送数計算器５０は、インデックステーブル承認済みエントリ番号保持レジスタ２４から取得したエントリ番号からインデックステーブル再送中エントリ番号カウンタ２６からエントリ番号を減算した値をスキップ判定比較器５１に出力する。
【０１５６】
一方、Ａｃｋ数計算機２３は、新たに受信した承認済みシーケンス番号から承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号を減算した値をスキップ判定比較器５１に出力する。また、スキップ判定比較器５１は、スキップ設定レジスタ５３に「Ｈｉｇｈ」が設定されている場合には、再送数計算器５０から受信した値がＡｃｋ数計算機２３から受信した値よりも小さいか否かを判別する。
【０１５７】
そして、スキップ判定比較器５１は、スキップ設定レジスタ５３に「Ｈｉｇｈ」が格納されている場合に、再送数計算器５０から受信した値がＡｃｋ数計算機２３から受信した値よりも小さいと判定した場合には、スキップ予約フラグ５２を「Ｈｉｇｈ」に設定する。この結果、コンポーネント１０１は、新たに承認されたパケットの再送をスキップする。
【０１５８】
次に、図２０を用いて、パケットの再送をスキップする際に、再送用バッファ読み出しアドレスカウンタ３５ａに新たな値を設定する処理について説明する。図２０は、スキップ実行時の値を設定する処理を説明するための図である。図２０に示すように、スキップ判定比較器５１は、スキップを実行すると判定した場合には、スキップ予約フラグ５２を「Ｈｉｇｈ」に設定する。
【０１５９】
すると、再送用バッファ読み出しアドレスカウンタ３５ａは、スキップ実行時に、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算したエントリ番号が示すエントリから、新たなインデックスアドレスを取得する。この結果、コンポーネント１０１は、コンポーネント１０５がすでに受け取ったパケットの再送をスキップすることができる。
【０１６０】
また、再送用シーケンス番号カウンタ３７ａは、スキップ予約フラグ５２に「Ｈｉｇｈ」が設定されると、スキップ実行時に、承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号に１を加算したシーケンス番号を新たに保持する。この結果、コンポーネント１０１は、スキップ後に再送するパケットに対して、正しいシーケンス番号を付与することができる。
【０１６１】
次に、図２１を用いて、スキップを行う処理の具体例について説明する。図２１は、スキップを行う処理の流れを説明するための図である。なお、図２１に示す例では、インデックステーブル３２は、図１３と同様のインデックスアドレスを記憶し、再送用バッファ３８は、図１３に示す場合と同様のパケットを記憶しているものとする。
【０１６２】
また、インデックステーブル承認済みエントリ番号保持レジスタ２４は、エントリ番号「１」を保持し、インデックステーブル再送中エントリ番号カウンタ２６は、エントリ番号「３」を保持しているものとする。また、コンポーネント１０１は、インデックスアドレス「ｍ＋１」に先頭が格納されたパケットから順次再送し、インデックスアドレス「ｍ＋５」から格納されたパケットの再送を行っている間に、新たな承認済みシーケンス番号「ｎ＋３」を受信したものとする。
【０１６３】
このような場合には、Ａｃｋ数計算機２３は、承認済みシーケンス番号保持レジスタ２２が保持する承認済みシーケンス番号と、新たに受信した承認済みシーケンス番号との差である「３」を出力する。
【０１６４】
また、再送数計算器５０は、インデックステーブル再送中エントリ番号カウンタ２６が保持しているエントリ番号「３」から、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持しているエントリ番号「１」を減算する。そして、再送数計算器５０は、計算結果の「２」をスキップ判定比較器５１に出力する。
【０１６５】
すると、スキップ判定比較器５１は、Ａｃｋ数計算機２３が出力する値「３」が、再送数計算器５０が出力する値「２」よりも多いので、スキップ予約フラグ５２を「Ｈｉｇｈ」に設定する。つまり、前回の承認からこれまで、エントリ番号「２」に対応するパケットを再送し、現在はエントリ番号「３」に対応するパケットを再送中であり、この次には「４」を再送する予定であったが、承認済みシーケンス番号は、エントリ番号「２」「３」「４」に対応するパケットが承認されたことを示していたため、エントリ番号「４」に対応するパケットをこの後再送する必要はない。つまり、再送したパケットよりも承認されたパケットの数の方が多い場合には、再送をスキップすることが、再送量を削減して無駄を省くために有効である。
【０１６６】
インデックステーブル承認済みエントリ番号保持レジスタ２４は、再送数計算器５０に保持する値を出力した後、通常通りＡｃｋ数計算機２３の出力を加算して更新される。この結果、インデックステーブル承認済みエントリ番号保持レジスタ２４は、エントリ番号「４」を保持する。
【０１６７】
さらに、図１３と同様にパケット末尾の判別を行う。スキップ予約フラグ５２が「Ｈｉｇｈ」に設定されている状態で、再送用バッファ読み出しアドレスカウンタ３５ａは、読み出し中のパケットの末尾が格納されたインデックスアドレス「ｍ＋６」までカウントし、比較器３６が、エントリ番号「３」に対応するパケットの末尾の読み出しを終えたと判別したら、コンポーネント１０１は、スキップ処理を実行する。スキップ実行処理によって、インデックステーブル承認済みエントリ番号保持レジスタ２４は、更新後の値「４」を加算器２５に出力する。この結果、インデックステーブル再送中エントリ番号カウンタ２６は、エントリ番号「５」を保持することとなる。さらに、スキップ実行処理によって、再送用バッファ読み出しアドレスカウンタ３５ａは、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算したエントリ番号のエントリに格納されたインデックスアドレス「ｍ＋１０」を新たに取得する。
【０１６８】
すなわち、再送用バッファ読み出しアドレスカウンタ３５ａは、加算器２５が出力するエントリ番号のエントリに格納されたインデックスアドレスを取得する。この結果、コンポーネント１０１は、再送用バッファ３８が記憶するパケットのうち、インデックスアドレス「ｍ＋７」から「ｍ＋９」に格納されたパケットの再送をスキップすることとなる。
【０１６９】
次に、図２２を用いて、スキップ処理を実行した際に、再送が終了したか否かを判定する処理の具体例について説明する。つまり、再送中に、残りの全てのパケットが承認されて、スキップを実行した結果、再送を継続する必要がなくなった場合の処理である。図２２は、スキップ時に再送が終了したと判定する処理を説明するための図である。例えば、Ａｃｋ数計算機２３は、新たな承認済みシーケンス番号「ｎ＋２」と承認済みシーケンス番号保持レジスタ２２が保持するシーケンス番号「ｎ」との差分「２」を算出する。この結果、インデックステーブル承認済みエントリ番号保持レジスタ２４は、保持していたエントリ番号「１」をエントリ番号「３」に更新する。
【０１７０】
すると、比較器３６は、インデックステーブル書き込みエントリ番号カウンタ２８に格納されたエントリ番号「４」と、インデックステーブル承認済みエントリ番号保持レジスタ２４が保持するエントリ番号に１を加算した値とが一致すると判別する。そして、比較器３６は、インデックステーブルエントリフルレジスタ４０ａに「Ｈｉｇｈ」が設定されているか否かを判別し、「Ｈｉｇｈ」が設定されていない場合には、インデックステーブル３２が空であり、再送用バッファ３８も空であると判別する。再送用バッファ３８が空になれば、その後、再送を継続する必要はない。比較器３６は、再送中フラグ３１を「Ｌｏｗ」にリセットし、処理を終了する。
【０１７１】
［実施例２の効果］
上述したように、再送数計算器５０は、インデックステーブル再送中エントリ番号カウンタ２６とインデックステーブル承認済みエントリ番号保持レジスタ２４とが保持するエントリ番号から、コンポーネント１０５へ再送したパケットの数を計算する。また、スキップ判定比較器５１は、再送数計算器５０が計算したパケットの数と、Ａｃｋ数計算機２３が計算したパケットの数、すなわち新たにコンポーネント１０５が正常に受信したパケットの数とを比較する。
【０１７２】
そして、スキップ判定比較器５１は、再送数計算器５０が計算したパケットの数が、Ａｃｋ数計算機２３が計算したパケットの数よりも少ない場合には、スキップ予約フラグ５２を「Ｈｉｇｈ」に設定してスキップを予約し、スキップが予約された状態で現在再送中のパケットの末尾の読み出しが完了すればパケットのスキップが指示される。再送用バッファ読み出しアドレスカウンタ３５ａは、パケットのスキップを指示された場合は、加算器２５が出力するエントリ番号のエントリからインデックスアドレスを新たに取得し、取得したインデックスアドレスを保持する。さらに、インデックステーブル再送中エントリ番号カウンタ２６は、加算器２５が出力するエントリ番号を新たに取得し、保持する。
【０１７３】
この結果、コンポーネント１０１は、コンポーネント１０５が正常に受信したパケットの再送をスキップし、コンポーネント１０５から承認されていないパケットの送信を開始することができるので、無駄な再送を抑えることができる。
【０１７４】
また、データリンク層１０３ａは、再送処理中にＡｃｋを受信し、かつ、パケットの送信先が正常受信したパケットの数よりも、再送したパケット数が多い場合は、再送処理中のパケットを送信後に再送処理を中止する。そして、データリンク層１０３ａは、Ａｃｋ数計算機２３によって更新された後のインデックステーブル承認済みエントリ番号保持レジスタ２４が指し示すエントリに記憶されているインデックスアドレスを新たに判別し、当該新たに判別したインデックスアドレスに登録されたパケットから再送を再開する。このため、データリンク層１０３ａは、スキップ処理を行う事ができる。
【実施例３】
【０１７５】
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例３として本発明に含まれる他の実施例を説明する。
【０１７６】
（１）インデックスアドレス、およびシーケンス番号について
上述した実施例１、および実施例２ではインデックステーブル３２に格納したインデックスアドレスの具体例、およびシーケンス番号の具体例について説明したが、上述した具体例は、あくまで一例であり、任意の形式や数値を適用することができる。例えば、インデックスアドレスやシーケンス番号は、任意の桁数や任意の進数を適用することができる。
【０１７７】
（２）送信するパケットについて
上述した実施例１、および実施例２では、再送用バッファ３８にパケットを格納し、パケット選択器３９がパケットとシーケンス番号とをパケットに格納する例について説明した。しかし、実施例はこれに限定されるものではなく、例えば、再送用バッファ３８は、トランザクション層１０２が生成したパケットを記憶し、パケット選択器３９は、送信するパケットにシーケンス番号を格納して出力しても良い。
【０１７８】
（３）実施形態について
上述したインデックステーブル承認済みエントリ番号保持レジスタ２４は、加算器２５の機能を含んでも良い。また、インデックステーブル再送中エントリ番号カウンタ２６は、加算器２７の機能を含んでも良い。
【０１７９】
また、図１ａに示した情報処理装置１の構成は、あくまで一例であり、情報処理装置１は、任意の数のＣＰＵやメモリを有しても良い。また、情報処理装置１のＰＣＩｅエンドポイントは、ＰＣＩｅスイッチであってもよい。ＰＣＩｅスイッチは、ＰＣＩｅルートコンプレックスと同じノードに載っていてもよい。また、ＰＣＩｅスイッチとＰＣＩｅエンドポイントからなる装置であってもよい。また、ＰＣＩｅスイッチとＰＣＩｅスイッチとからなる装置であってもよい。例えば、エンドポイントからルートコンプレックスへのパケット送信の様に、送信側と受信側が逆であってもよい。さらに、ＰＣＩｅに限定されず、同様のシーケンス番号を用いた再送機能を要するような装置であれば、適用可能である。例えばＵｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ（ＵＳＢ）３．０の様な、Ｏｐｅｎ  Ｓｙｓｔｅｍｓ  Ｉｎｔｅｒｃｏｎｎｅｃｔｉｏｎ（ＯＳＩ）参照モデルの第二層のデータリンク層を持つものが考えられる。
【０１８０】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１８１】
（付記１）データの送信が正常に行われなかった場合に当該データを再送可能なデータ転送装置において、
送信したデータを順次記憶するデータ記憶部と、
前記データ記憶部が前記データを記憶した領域のアドレスを記憶するアドレス記憶部と、
前記アドレス記憶部が前記アドレスを記憶するたびに、前記アドレス記憶部が新たなアドレスを記憶する領域の識別番号を更新する第１の更新部と、
前記アドレス記憶部から再送対象のデータを記憶するアドレスを読み出すための前記識別番号を更新する第２の更新部と、
前記データの送信先となる装置から、正常に受信したデータの識別情報を受信すると、受信した識別情報を記憶する識別情報記憶部と、
前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とに基づいて、前記第２の更新部が前記識別番号を更新する処理を制御する制御部と
を有することを特徴とするデータ転送装置。
【０１８２】
（付記２）前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データの送信先となる装置が正確に受信したデータの数を計数する計数部を有し、
前記制御部は、前記計数部が計数した数だけ前記識別番号を加算するように前記第２の更新部を更新することを特徴とする付記１に記載のデータ転送装置。
【０１８３】
（付記３）前記データの送信先となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、前記第２の更新部が更新した識別番号に１を加算した値が示す領域に格納されたアドレスを取得する取得部と、
前記取得部が取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行う読出部と、
前記読出部が読み出したデータを前記データの送信先へ送信する送信部と
を有することを特徴とする付記１または２に記載のデータ転送装置。
【０１８４】
（付記４）前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致するか否かを判別する判別部を有し、
前記送信部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合には、当該アドレスから前記読出部が順に読み出すデータを前回読出部が読み出したデータとは異なるデータとして出力することを特徴とする付記３に記載のデータ転送装置。
【０１８５】
（付記５）前記第２の更新部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合は、前記識別番号を更新することを特徴とする付記４に記載のデータ転送装置。
【０１８６】
（付記６）前記取得部は、前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間受信しなかった場合は、前記第２の更新部が更新した識別番号に１を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記３−５のいずれか１つに記載のデータ転送装置。
【０１８７】
（付記７）前記送信部は、前記識別情報記憶部が記憶する識別情報に１を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データの送信先となる装置へ送信することを特徴とする付記３−６のいずれか１つに記載のデータ転送装置。
【０１８８】
（付記８）前記データの送信先となる装置へ再送したデータの数を計数する再送計数部と、
前記再送計数部が計数したデータの数と、前記計数部が計数したデータの数とを比較し、前記再送計数部が計数したデータの数が前記計数部が計数したデータの数よりも少ない場合には、前記データの送信先となる装置が正確に受信したデータの再送をスキップするよう前記取得部と前記読出部とに指示する指示部とを有し、
前記取得部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記第２の更新部が更新した識別番号に１を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記読出部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記取得部が新たに取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行うことを特徴とする付記３−７のいずれか１つに記載のデータ転送装置。
【０１８９】
（付記９）データを送信するデータ送信装置と、正常に受信したデータの識別情報を前記データ送信装置へ返信するデータ受信装置とを有する情報処理装置において、
前記データ送信装置は、
送信したデータを順次記憶するデータ記憶部と、
前記データ記憶部が前記データを記憶した領域のアドレスを記憶するアドレス記憶部と、
前記アドレス記憶部が前記アドレスを記憶するたびに、前記アドレス記憶部が新たなアドレスを記憶する領域の識別番号を更新する第１の更新部と、
前記アドレス記憶部から再送対象のデータを記憶するアドレスを読み出すための前記識別番号を更新する第２の更新部と、
前記データ受信装置から、正常に受信したデータの識別情報を受信すると、受信した識別情報を記憶する識別情報記憶部と、
前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とに基づいて、前記第２の更新部が前記識別番号を更新する処理を制御する制御部と
を有することを特徴とする情報処理装置。
【０１９０】
（付記１０）前記データ受信装置となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データ受信装置となる装置が正確に受信したデータの数を計数する計数部を有し、
前記制御部は、前記計数部が計数した数だけ前記識別番号を加算するように前記第２の更新部を更新することを特徴とする付記９に記載の情報処理装置。
【０１９１】
（付記１１）前記データ受信装置となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、前記第２の更新部が更新した識別番号に１を加算した値が示す領域に格納されたアドレスを取得する取得部と、
前記取得部が取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行う読出部と、
前記読出部が読み出したデータを前記データ受信装置へ送信する送信部と
を有することを特徴とする付記９または１０に記載の情報処理装置。
【０１９２】
（付記１２）前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致するか否かを判別する判別部を有し、
前記送信部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合には、当該アドレスから前記読出部が順に読み出すデータを前回読出部が読み出したデータとは異なるデータとして出力することを特徴とする付記１１に記載の情報処理装置。
【０１９３】
（付記１３）前記第２の更新部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合は、前記識別番号を更新することを特徴とする付記１２に記載の情報処理装置。
【０１９４】
（付記１４）前記取得部は、前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間受信しなかった場合は、前記第２の更新部が更新した識別番号に１を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記１１−１３のいずれか１つに記載の情報処理装置。
【０１９５】
（付記１５）前記送信部は、前記識別情報記憶部が記憶する識別情報に１を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データ受信装置となる装置へ送信することを特徴とする付記１１−１４のいずれか１つに記載の情報処理装置。
【０１９６】
（付記１６）前記データ受信装置となる装置へ再送したデータの数を計数する再送計数部と、
前記再送計数部が計数したデータの数と、前記計数部が計数したデータの数とを比較し、前記再送計数部が計数したデータの数が前記計数部が計数したデータの数よりも少ない場合には、前記データ受信装置となる装置が正確に受信したデータの再送をスキップするよう前記取得部と前記読出部とに指示する指示部とを有し、
前記取得部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記第２の更新部が更新した識別番号に１を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記読出部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記取得部が新たに取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行うことを特徴とする付記１１−１５のいずれか１つに記載の情報処理装置。
【０１９７】
（付記１７）データの送信が正常に行われなかった場合に当該データを再送可能なデータ転送装置が実行するデータ転送方法において
送信したデータを第１の記憶装置に順次格納し、
前記データを格納した領域のアドレスを第２の記憶装置に格納し、
前記第２の記憶装置に前記アドレスを格納するたびに、前記第２の記憶装置に新たなアドレスを格納する領域の識別番号を更新し、
前記データの送信先となる装置から、正常に受信したデータの識別情報を受信した場合には受信した識別情報を第３の記憶装置に格納し、
前記データの送信先となる装置から新たに受信した識別情報と、前記第３の記憶装置が記憶する識別情報とに基づいて、前記第２の記憶装置から、再送対象のデータが格納されたアドレスを記憶する領域の識別番号を更新する
処理を実行することを特徴とするデータ転送方法。
【０１９８】
（付記１８）前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データの送信先となる装置が正確に受信したデータの数を計数し、
前記計数した数だけ前記識別番号を加算するように、前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号を更新することを特徴とする付記１７に記載のデータ転送方法。
【０１９９】
（付記１９）前記データの送信先となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、再送対象のデータが格納されたアドレスを記憶する領域の識別番号に１を加算した値が示す領域に格納されたアドレスを取得し、
前記取得したアドレスから順に、前記第１の記憶装置が記憶するデータの読み出しを行い、
前記読み出したデータを前記データの送信先へ送信することを特徴とする付記１７または１８に記載のデータ転送方法。
【０２００】
（付記２０）前記再送対象のデータが格納されたアドレスの次に前記第２の記憶装置が記憶したアドレスと、前記第１の記憶装置からデータを読み出したアドレスとが一致するか否かを判別し、
前記再送対象のデータが格納されたアドレスの次に前記第２の記憶装置が記憶したアドレスと、前記第１の記憶装置からデータを読み出したアドレスとが一致すると判別した場合には、当該アドレスからデータを順に読み出して、読み出したデータを新たなデータとして出力することを特徴とする付記１９に記載のデータ転送方法。
【０２０１】
（付記２１）前記再送対象のデータが格納されたアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記第１の記憶装置からデータを読み出したアドレスとが一致すると判別した場合は、前記識別情報を更新することを特徴とする付記２０に記載のデータ転送方法。
【０２０２】
（付記２２）前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間、前記データの送信先となる装置から受信しなかった場合は、更新した前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号に１を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記１９−２１のいずれか１つに記載のデータ転送方法。
【０２０３】
（付記２３）前記第３の記憶装置が記憶する識別情報に１を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データの送信先となる装置へ送信することを特徴とする付記１９−２２のいずれか１つに記載のデータ転送方法。
【０２０４】
（付記２４）前記データの送信先となる装置へ再送したデータの数を計数し、
前記データの送信先となる装置が正確に受信したデータの数と、前記データの送信先となる装置へ再送したデータの数とを比較し、前記データの送信先となる装置へ再送したデータの数が、前記データの送信先となる装置が正確に受信したデータの数よりも少ない場合には、前記データの送信先となる装置が正確に受信したデータの再送をスキップすると判別し、
前記データの再送をスキップすると判別した場合には、前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号に１を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記新たに取得したアドレスから順に、前記第１の記憶部が記憶するデータの読み出しを行うことを特徴とする付記１９−２３のいずれか１つに記載のデータ転送方法。
【０２０５】
（付記２５）データの長さの異なる複数のデータパケットを一時的に保持するパケット記憶部と、
前記データパケットが新しく生成された際に前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部と、
前記データパケット記憶部内に格納されている該データパケットの先頭位置を記憶するエントリからなる位置情報記憶部と、
を備えることを特徴とする、データ送信装置。
【０２０６】
（付記２６）前記データパケットが新しく生成された際に前記位置情報記憶部に前記データパケットの先頭位置を登録するエントリ位置を示す位置情報書き込み指示部と、
前記位置情報記憶部の中の読み出し可能なエントリを指し示す位置情報読み出し指示部と、
をさらに備えることを特徴とする、付記２５に記載のデータ送信装置。
【０２０７】
（付記２７）前記データ送信装置は、１つ以上のデータパケットを発行し、
前記データパケットの送信先となるデータ受信装置から送信される応答パケットに付随する受信済順序番号を保持する確認済番号記憶部と、
前記確認済番号記憶部に保持される第１の受信済順序番号と、次に受信した応答パケットに付随する第２の受信済み順序番号とを用いて、前記データ受信装置が正常に受信した前記データパケットの数を計算し、当該計算結果に基づいて前記位置情報読み出し指示部を更新する計算更新部と、
をさらに備えることを特徴とする、付記２６に記載のデータ送信装置。
【０２０８】
（付記２８）前記データパケットの再送を開始すると判定した場合に、前記パケット記憶部に保持されている前記複数のデータパケットを再び送信する再送処理部をさらに備えることを特徴とする、付記２７に記載のデータ送信装置。
【０２０９】
（付記２９）前記再送処理部は、前記位置情報読み出し指示部の指し示す前記位置情報記憶部のエントリに記憶されている先頭位置を判別し、当該判別した先頭位置から前記パケット記憶部に登録されたデータパケットを読み出し、当該読み出したデータパケットから再送を行うことを特徴とする付記２８に記載のデータ送信装置。
【０２１０】
（付記３０）前記再送処理部は、前記データパケットに順序番号を付与し、
前記データ送信装置は、前記再送処理部が付与した順序番号を前記受信済順序番号として前記データ受信装置により付与された応答パケットを受信する受信部を有することを特徴とする付記２８に記載のデータ送信装置。
【０２１１】
（付記３１）前記パケット記憶部内のデータパケット送信のための読み出し位置を示すパケット読み出し位置指示部と、
現在再送中の前記パケット記憶部内のデータパケットにについて前記位置情報記憶部が先頭位置を記憶したエントリの位置を示す再送中位置情報表示部と、
前記再送中位置情報表示部の示すエントリの次の位置に位置のエントリが記憶する第１の位置情報と該パケット読み出し位置指示部の示す第２の位置情報とを比較することで、前記パケット記憶部内の次の送信データパケットの先頭位置を検出するデータパケット先頭位置検出部と、
をさらに備える付記３０に記載のデータ送信装置。
【０２１２】
（付記３２）前記再送処理部は、再送処理中に前記データパケット先頭位置検出部がデータパケットの先頭位置を検出するたびに、前記データパケットに付与する順序番号を更新することを特徴とする、付記３１に記載のデータ送信装置。
【０２１３】
（付記３３）前記再送処理部は、再送処理中に前記データ受信装置から前記応答パケットを受信し、かつ、前記計算更新部で計算される前記正常受信したデータパケットの数よりも、再送したデータパケット数が多い場合は、再送処理中のデータパケットを送信後に再送処理を中止し、前記計算更新部によって更新された後の前記位置情報読み出し指示部が指し示すエントリに記憶されている先頭位置を新たに判別し、当該新たに判別した先頭位置から前記パケット記憶部に登録されたデータパケットから再送を再開することを特徴とする、付記２９に記載のデータ送信装置。
【０２１４】
（付記３４）長さが異なる複数のデータパケットを送信するデータ送信装置が実行するデータ送信方法において、
パケット記憶部に、データの長さの異なる複数のデータパケットを一時的に保持し、
前記データパケットが新しく生成された際に、前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部が示した位置を位置情報記憶部に格納する
処理を実行することを特徴とするデータ送信方法。
【０２１５】
（付記３５）前記データパケットが新しく生成された際に前記位置情報記憶部に前記データパケットの先頭位置を登録するエントリ位置を示し、
前記位置情報記憶部の中の読み出し可能なエントリを指し示す
ことを特徴とする、付記３４に記載のデータ送信方法。
【０２１６】
（付記３６）前記データ送信装置は、１つ以上のデータパケットを発行し、
前記データパケットの送信先となるデータ受信装置から送信される応答パケットに付随する受信済順序番号を確認済番号記憶部に保持し
前記確認済番号記憶部に保持される第１の受信済順序番号と、次に受信した応答パケットに付随する第２の受信済み順序番号とを用いて、前記データ受信装置が正常に受信した前記データパケットの数を計算し、当該計算結果に基づいて、読み出し可能なエントリを更新することを特徴とする、付記３５に記載のデータ送信方法。
【０２１７】
（付記３７）前記データパケットの再送を開始すると判定した場合に、前記パケット記憶部に保持されている前記複数のデータパケットを再び送信することを特徴とする付記３６に記載のデータ送信方法。
【０２１８】
（付記３８）前記指し示した読み出し可能なエントリに記憶されている先頭位置を判別し、当該判別した先頭位置から前記パケット記憶部に登録されたデータパケットを読み出し、当該読み出したデータパケットから再送を行うことを特徴とする付記３７に記載のデータ送信方法。
【０２１９】
（付記３９）前記データパケットに順序番号を付与し、
前記データ送信装置は、前記データ受信装置が前記順序番号を前記受信済順序番号として付与した応答パケットを受信することを特徴とする付記３７に記載のデータ送信方法。
【０２２０】
（付記４０）前記パケット記憶部内のデータパケット送信のための読み出し位置を示し、
現在再送中の前記パケット記憶部内のデータパケットについて前記位置情報記憶部が先頭位置を記憶したエントリの次の位置のエントリが記憶する第１の位置情報と該パケット読み出し位置指示部の示す第２の位置情報とを比較することで、前記パケット記憶部内の次の送信データパケットの先頭位置を検出することを特徴とする付記３９に記載のデータ送信方法。
【０２２１】
（付記４１）再送処理中にデータパケットの先頭位置を検出するたびに、当該データパケットに付与する順序番号を更新することを特徴とする、付記４０に記載のデータ送信方法。
【０２２２】
（付記４２）前記再送処理中に前記データ受信装置から前記応答パケットを受信し、かつ、正常受信したデータパケットの数よりも、再送したデータパケット数が多い場合は、再送処理中のデータパケットを送信後に再送処理を中止し、更新後の読み出し可能なエントリに記憶されている先頭位置を新たに判別し、当該新たに判別した先頭位置から前記パケット記憶部に登録されたデータパケットから再送を再開することを特徴とする付記３８に記載のデータ送信方法。
【符号の説明】
【０２２３】
１、１００  情報処理装置
２、９  ノード
３、１０  ＣＰＵ
４、１１  メモリ
５  ＰＣＩｅルートコンプレックス
６、１３、１０２、１０６  トランザクション層
７、１４、１０３、１０７  データリンク層
８、１５、１０４、１０８  物理層
１２  ＰＣＩｅエンドポイント
２０  受信器
２１  Ａｃｋ／Ｎａｋ受信器
２２  承認済みシーケンス番号保持レジスタ
２３  Ａｃｋ数計算機
２４  インデックステーブル承認済みエントリ番号保持レジスタ
２５、２７  加算器
２６  インデックステーブル再送中エントリ番号カウンタ
２８  インデックステーブル書き込みエントリ番号カウンタ
２９  再送予約フラグ
３０  再送タイマ
３１  再送中フラグ
３２  インデックステーブル
３３  シーケンス番号カウンタ
３４  再送用バッファ書き込みアドレスカウンタ
３５、３５ａ  再送用バッファ読み出しアドレスカウンタ
３６  比較器
３７、３７ａ  再送用シーケンス番号カウンタ
３８  再送用バッファ
３９  パケット選択器
４０ａ  インデックステーブルエントリフルレジスタ
４０ｂ  再送用バッファフルレジスタ
４０ｃ  パケット最大ライン数設定レジスタ
４１  規定値レジスタ
４２  再送タイマ最大値設定レジスタ
４３  再送タイマ最大値選択レジスタ
４４  セレクタ
４５  カウンタ
４６  カウンタ比較器
４７  減算器
５０  再送数計算器
５１  スキップ判定比較器
５２  スキップ予約フラグ
５３  スキップ設定レジスタ
１０１、１０５  コンポーネント
【図１Ａ】
2014049998.tif 000003
【図１Ｂ】
2014049998.tif 000004
【図２】
2014049998.tif 000005
【図３】
2014049998.tif 000006
【図４】
2014049998.tif 000007
【図５】
2014049998.tif 000008
【図６Ａ】
2014049998.tif 000009
【図６Ｂ】
2014049998.tif 000010
【図７】
2014049998.tif 000011
【図８】
2014049998.tif 000012
【図９】
2014049998.tif 000013
【図１０】
2014049998.tif 000014
【図１１】
2014049998.tif 000015
【図１２】
2014049998.tif 000016
【図１３】
2014049998.tif 000017
【図１４】
2014049998.tif 000018
【図１５】
2014049998.tif 000019
【図１６Ａ】
2014049998.tif 000020
【図１６Ｂ】
2014049998.tif 000021
【図１７】
2014049998.tif 000022
【図１８】
2014049998.tif 000023
【図１９】
2014049998.tif 000024
【図２０】
2014049998.tif 000025
【図２１】
2014049998.tif 000026
【図２２】
2014049998.tif 000027