まず、図1A、及び図1Bを用いて、実施例1に係る情報処理装置が有するコンポーネントの例について説明する。図1Aは、実施例1に係る情報処理装置が有するコンポーネントを説明するための図である。また、図1Bは、実施例1に係る情報処理装置を説明するための図である。
図1Aに示すように、情報処理装置100は、コンポーネント101、およびコンポーネント105を有する。コンポーネント101は、トランザクション層、データリンク層、および物理層の各層における処理を実行する回路を有する。以下の説明では、各層における処理を実行する回路を、トランザクション層102、データリンク層103、物理層104と記載する。一方、コンポーネント105は、コンポーネント101と同様に、トランザクション層106、データリンク層107、物理層108を有する。
ここで、コンポーネント101は、例えば、図1Bに示す情報処理装置1が有する、Peripheral Components Interconnect−Express(PCIe)ルートコンプレックス5であり、Central Processing Unit(CPU)3、メモリ4を有するノード2に配置される。またコンポーネント105は、例えば、図1Bに示す情報処理装置1が有するPCIeエンドポイント12であり、I/Oデバイス11に配置される。また、各コンポーネント間は、PCIeリンクで接続される。
CPU3は、ノード2において各種演算処理を実行する演算処理装置である。また、CPU3は、PCIeルートコンプレックス5、およびPCIeエンドポイント12を介して、I/Oデバイス11との間でパケットの送受信を行う。ここでいうパケットとは、例えばヘッダやデータペイロードなどからなる情報単位であり、パケットの長さは固定ではない。また、メモリ4は、ノード2が有する記憶装置である。
また、I/Oデバイス11は、PCIeエンドポイント12、およびPCIeルートコンプレックス5を介して、ノード2のメモリ4、CPU3との間でパケットの送受信を行う。もちろん、コンポーネント105は、ノード2に配置されるPCIeルートコンプレックス5で、コンポーネント101がI/Oデバイス11に配置されるPCIeエンドポイント12であってもよいし、PCIeルートコンプレックス5やPCIeエンドポイント12は、PCIeスイッチでもよい。さらに、コンポーネント101、及びコンポーネント105は、PCIeに限らず、他の通信方式にも適用できる。
なお、以下の説明では、コンポーネント105の有する各回路は、コンポーネント101の有する各回路と同様の機能を発揮するものとして、詳細な説明を省略する。図1Aのトランザクション層102は、パケットの送受信を行う際に、トランザクション層における処理を実行する。例えば、トランザクション層102は、図1Aでは図示を省略した外部からの要求に応じて、送信パケットの生成等を行う。例えば、トランザクション層102は、図1Aに示す情報処理装置100が図1Bに示す情報処理装置1である場合は、CPU3からの要求に従ってTransaction Layer Packet(TLP)の生成等を行う。
データリンク層103は、パケットの送受信を行う際に、データリンク層における処理を実行する。例えば、データリンク層103は、パケットの送受信を行うための機能や手段を制御する。物理層104は、パケットの送受信を行う際に、物理層における処理を実行する。例えば、物理層104は、パラレル方式の情報をシリアル方式の情報に変換する機能を持ち、シリアル変換されたパケットをコンポーネント105が有する物理層108へ伝送する。
ここで、コンポーネント101、およびコンポーネント105は、データリンク層103、およびデータリンク層107を介して、相互にデータの送受信を行う。具体的には、コンポーネント101は、コンポーネント105に対して送信する複数のパケットに連続するシーケンス番号を付与し、シーケンス番号を付与されたパケットをシーケンス番号順にコンポーネント105へ送信する。また、コンポーネント101は、パケットの再送に備えて、コンポーネント105へ送信したパケットを、シーケンス番号を含まない状態で保持する。
一方、コンポーネント105は、パケットを正しく受信した場合には、正しく受信したパケットに付与されたシーケンス番号を含むAckをコンポーネント101へ送信する。また、コンポーネント105は、パケットを正しく受信できなかった場合には、正しく受信できたパケットまでを示すシーケンス番号を含むNakをコンポーネント101へ送信する。
すると、コンポーネント101は、コンポーネント105からAckまたはNakを受信した場合は、AckまたはNakに含まれるシーケンス番号を保持する。そして、コンポーネント101は、コンポーネント105からNakを受信した場合、または、コンポーネント105からAckやNakを受信せずにタイムアウトが発生した場合には、保持したシーケンス番号の次の番号が付与されたパケットから順に、コンポーネント105へ再送する。
次に、図2を用いて、データリンク層103が有する機能構成の一例について説明する。図2は、実施例1に係るデータリンク層の回路が有する機能構成を説明するための図である。図2に示すように、データリンク層103は、受信器20、Ack/Nak受信器21、承認済みシーケンス番号保持レジスタ22、Ack数計算機23、インデックステーブル承認済みエントリ番号保持レジスタ24を有する。また、データリンク層103は、加算器25、インデックステーブル再送中エントリ番号カウンタ26、加算器27、インデックステーブル書き込みエントリ番号カウンタ28、再送予約フラグ29、再送タイマ30、再送中フラグ31を有する。
また、データリンク層103は、インデックステーブル32、シーケンス番号カウンタ33、再送用バッファ書き込みアドレスカウンタ34、再送用バッファ読み出しアドレスカウンタ35、比較器36、再送用シーケンス番号カウンタ37、再送用バッファ38を有する。また、データリンク層103は、パケット選択器39、インデックステーブルエントリフルレジスタ40a、再送用バッファフルレジスタ40b、パケット最大ライン数設定レジスタ40cを有する。
以下、データリンク層103が発揮する機能について説明する。まず、インデックステーブル32、および再送用バッファ38について説明する。インデックステーブル32は、コンポーネント101が再送に備えてパケットを再送用バッファ38に格納した記憶領域の先頭アドレスであるインデックスアドレスを記憶する記憶装置である。
以下、図3を用いて、インデックステーブル32の一例を説明する。図3は、インデックステーブルを説明するための図である。例えば、インデックステーブル32は、それぞれ番号が付与された複数のエントリを有し、各エントリにインデックスアドレスを記憶する。例えば、図3に示す例では、インデックステーブル32は、エントリ#0〜#nまでの番号が付与されたエントリを有し、エントリ#0〜#3にインデックスアドレス#0〜#3を記憶している。
一方、再送用バッファ38は、コンポーネント101が再送に備えてパケットを記憶する記憶装置である。以下、図4を用いて、再送用バッファ38の一例を説明する。図4は、再送用バッファを説明するための図である。図4に示すように、再送用バッファ38は、複数のラインを有し、各ラインにはNバイトのデータ格納領域と、同一ラインのデータ格納領域に含まれるデータからエラーを検出するためのError Check and Correct(ECC)データの格納領域を持つ。ここで、再送用バッファ38が記憶するパケットは、シーケンス番号を含まない状態で、再送用バッファ38の一つ以上のラインを使用して格納される。また、各パケットの長さによって、パケットを記憶する際に使用するラインの数は異なる。
図2に戻って、受信器20は、コンポーネント間のリンクを介し、物理層15を経由して、コンポーネント105からのパケットを受信する。具体的には、受信器20は、コンポーネント105が正しく受信したパケットのシーケンス番号である承認済みシーケンス番号を含むAck、またはNakを受信する。そして、受信器20は、AckまたはNakからAcknowledgementを示すAck信号と承認済みシーケンス番号、またはNegative Acknowledgementを示すNak信号と承認済みシーケンス番号を抽出し、抽出したAck信号またはNak信号と承認済みシーケンス番号をAck/Nak受信器21に出力する。
Ack/Nak受信器21は、承認済みシーケンス番号を受信すると、以下の処理を実行する。すなわち、Ack/Nak受信器21は、承認済みシーケンス番号保持レジスタ22、Ack数計算機23、再送用シーケンス番号カウンタ37、インデックステーブルエントリフルレジスタ40aに承認済みシーケンス番号を出力する。さらに、Ack/Nak受信器21は、Nakを受信した場合には、再送予約フラグ29を「High」にする。また、Ack/Nak受信器21は、Ackを受信した場合にはAckを受信した旨を、Nakを受信した場合には、Nakを受信した旨を再送タイマ30に通知する。
承認済みシーケンス番号保持レジスタ22は、Ack/Nak受信器21から承認済みシーケンス番号を受信すると、受信した承認済みシーケンス番号を保持する。また、承認済みシーケンス番号保持レジスタ22は、Ack/Nak受信器21から新たな承認済みシーケンス番号を受信すると、それまで保持していた承認済みシーケンス番号をAck数計算機23に出力し、新たな承認済みシーケンス番号を保持する。
Ack数計算機23は、Ack/Nak受信器21と、承認済みシーケンス番号保持レジスタ22とから受信した承認済みシーケンス番号を用いて、インデックステーブル32から再送対象のパケットに係るインデックスアドレスが格納されたエントリ番号を判別する。
具体的には、Ack数計算機23は、Ack/Nak受信器21から受信した承認済みシーケンス番号から、承認済みシーケンス番号保持レジスタ22から受信した承認済みシーケンス番号を減算する。すなわち、Ack数計算機23は、コンポーネント101がコンポーネント105から前回受信した承認済みシーケンス番号と、新たに受信した承認済みシーケンス番号との差を算出することで、コンポーネント105が正しく受信したパケットの数を計算する。
そして、Ack数計算機23は、算出した値をインデックステーブル承認済みエントリ番号保持レジスタ24に出力する。また、Ack数計算機23は、正しく受信したパケットの数を計算した結果、それが1以上の値を示していた場合には、再送タイマ30にその旨を出力し、さらに再送タイマ30が、Ack/Nak受信器21からAckを受信した旨を通知されていた場合には、再送タイマ30は、タイムアウトを判別する再送タイマ30のカウントをリセットする。
インデックステーブル承認済みエントリ番号保持レジスタ24は、インデックステーブル32が有するエントリのうち、コンポーネント105が最も最近承認したパケットの先頭を格納する再送用バッファ38のラインのインデックスアドレスが記憶されたエントリを示すエントリ番号を保持する。具体的には、インデックステーブル承認済みエントリ番号保持レジスタ24は、初期値として、後述するインデックステーブル書き込みエントリ番号カウンタ28と同じようにエントリ番号「0」を保持し、その後、Ack数計算機23から受信した値を、保持した値に加算する。
すなわち、インデックステーブル承認済みエントリ番号保持レジスタ24は、コンポーネント105が承認したパケットの数をAck/Nak受信の度に加算することで、コンポーネント105が最も最近承認したパケットの先頭が格納されたインデックスアドレスが格納されたインデックステーブル32のエントリ番号を保持する。
加算器25は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値に1を加算した値をインデックステーブル再送中エントリ番号カウンタ26とインデックステーブル32に出力する。すなわち、加算器25は、コンポーネント105が最も最近承認したパケットの先頭のインデックスアドレスが格納されたインデックステーブル32のエントリ番号に1を加算することで、次に承認する予定のパケットの先頭のインデックスアドレスが格納されたエントリ番号を算出する。
ここで、次に承認する予定のパケットとは、現状において再送対象となる最初のパケットである。このため、加算器25は、すなわち再送対象となるパケットの先頭が格納されたインデックスアドレスが格納されたエントリ番号をインデックステーブル再送中エントリ番号カウンタ26に出力することとなる。
インデックステーブル再送中エントリ番号カウンタ26は、インデックステーブル32が有する各エントリのうち、再送対象となるパケットのインデックスが格納されたエントリのエントリ番号を保持するカウンタである。具体的には、インデックステーブル再送中エントリ番号カウンタ26は、加算器25が出力したエントリ番号を受信すると、受信したエントリ番号をカウンタ初期値として保持するとともに、保持したエントリ番号を加算器27に出力する。
加算器27は、インデックステーブル再送中エントリ番号カウンタ26が出力したエントリ番号に1を加算した値のエントリ番号をインデックステーブル32に出力する。すなわち、加算器27は、再送対象となるパケットのうち、現在再送中のパケットの次に送信されるパケットの先頭が格納されたインデックスアドレスを保持するエントリ番号を出力する。
インデックステーブル書き込みエントリ番号カウンタ28は、インデックステーブル32にインデックスを新たに書き込むエントリのエントリ番号を保持する。例えば、インデックステーブル書き込みエントリ番号カウンタ28は、初期値として、エントリ番号「#0」が格納されている。このような場合には、インデックステーブル書き込みエントリ番号カウンタ28は、エントリ番号「#0」をインデックステーブル32に出力する。
そして、インデックステーブル書き込みエントリ番号カウンタ28は、エントリ番号「#0」のエントリにインデックスアドレスが格納された場合には、自身が保持するエントリ番号に1を加算し、エントリ番号「#1」を保持する。その後、インデックステーブル書き込みエントリ番号カウンタ28は、新たなエントリ番号「#1」をインデックステーブル32に出力する。この結果、インデックステーブル32は、各エントリに対して、エントリ番号が若い順にインデックスアドレスを順に格納する。
再送予約フラグ29は、パケットの再送を行うか否かを示すフラグ情報である。例えば、再送予約フラグ29は、フリップフロップ等に格納される1ビットの情報であり、「High(1)」である場合は、パケットの再送を行う旨を示し、「Low(0)」である場合には、パケットの再送を行わない旨を示す。
再送タイマ30は、コンポーネント105からの応答がタイムアウトしたか否かを判別する。具体的には、再送タイマ30は、所定のタイミングでカウントを行うカウンタを有し、カウンタが所定の値となった場合には、再送予約フラグ29を「High」にする。また、再送タイマ30は、Ack/Nak受信器21とAck数計算機23から、一つ以上のパケット承認したAckを受信した旨を受信した場合には、カウンタをリセットする。
以下、図5を用いて、再送タイマ30が有する機能構成の一例について説明する。図5は、再送タイマの機能構成を説明するための図である。図5に示す例では、再送タイマ30は、規定値レジスタ41、再送タイマ最大値設定レジスタ42、再送タイマ最大値選択レジスタ43、セレクタ44、カウンタ45、カウンタ比較器46を有する。
規定値レジスタ41は、再送タイマでカウントする所定の値を複数設定できるレジスタで、情報処理装置100の動作周波数等などの条件によって、複数の所定値から一つの所定値を選択して出力する。また、再送タイマ最大値設定レジスタ42は、再送タイマ30に設定可能なタイムアウトまでにカウントする値の所定値を自由に設定可能なレジスタである。また、再送タイマ最大値選択レジスタ43は、再送タイマ30に設定するタイムアウトまでにカウントする所定値を選択するための値を記憶する。
セレクタ44は、規定値レジスタ41、再送タイマ最大値設定レジスタ42が記憶する各値を取得する。そして、セレクタ44は、再送タイマ最大値選択レジスタ43が指示する値に基づいて、既定値レジスタ41、再送タイマ最大値設定レジスタ42から取得した値をタイムアウトまでにカウントする所定値として選択し、選択した値をカウンタ比較器46に出力する。
カウンタ45は、所定のタイミングでカウントを行うカウンタである。カウンタ45は、パケット選択器39からパケットの末尾を送信した旨を受信した場合には、カウンタの値を1加算する。またカウンタ45は、カウント中の値が1以上の値を示していれば、マイサイクル1を加算することでカウントを継続する。また、カウンタ45は、Ack/Nak受信器21とAck数計算機23から、一つ以上のパケット承認したAckを受信した旨を受信した場合には、カウント中の値を一旦0にリセットし、1からカウントを始める。また、カウンタ45は、Ack/Nak受信器21からNakを受信した旨の通知を受信した場合は、カウント中の値を0にリセットする。
また、カウンタ45は、カウンタ比較器46からカウント中の値をリセットするよう指示された場合には、カウント中の値を0にリセットする。
カウンタ比較器46は、カウンタ45がカウント中の値と、セレクタ44が出力した値とを比較する。そして、カウンタ比較器46は、カウンタ45がカウント中の値と、セレクタ44が出力した値とが一致した場合には、再送予約フラグ29を「High」にし、カウンタ45にカウント中の値をリセットするよう指示する。すなわち、カウンタ比較器46は、タイムアウトが発生した場合には、再送予約フラグ29を「High」に設定する。
図2に戻って、再送中フラグ31は、再送処理を実行するか否かを示すフラグ情報である。例えば、再送用バッファ38は、パケットの書き込み中等、パケットの読み出しが行えない場合がある。そこで、再送中フラグ31は、再送予約フラグ29が「High」であり、かつ再送用バッファ38からパケットの読み出しが行える場合には、「High」に遷移する。
シーケンス番号カウンタ33は、送信対象となるパケットに付与するシーケンス番号をカウントするカウンタである。具体的には、シーケンス番号カウンタ33は、トランザクション層102から受け取った送信パケットとともに、カウンタの出力を送信シーケンス番号としてパケット選択器39に出力する。シーケンス番号をパケット選択器39に出力するたびにシーケンス番号を1つ加算する。
再送用バッファ書き込みアドレスカウンタ34は、パケットを再送用バッファ38に格納する際のインデックスアドレスを指定する。具体的には、再送用バッファ書き込みアドレスカウンタ34は、トランザクション層102が新たなパケットを出力した場合には、保持するインデックスアドレスを再送用バッファ38とインデックステーブル32に出力する。
すなわち、再送用バッファ書き込みアドレスカウンタ34は、パケットを再送用バッファ38に格納する際のインデックスアドレスを再送用バッファ38とインデックステーブル32に出力する。この結果、再送用バッファ38は、再送用バッファ書き込みアドレスカウンタ34が出力したインデックスアドレスが示すラインからパケットの格納を開始する。また、インデックステーブル32は、トランザクション層102が出力したパケットの先頭を再送用バッファ38に格納する際、パケットの先頭が格納されたインデックスアドレスをインデックステーブル書き込みエントリ番号カウンタ28が出力するエントリ番号のエントリに格納する。
また、再送用バッファ書き込みアドレスカウンタ34は、再送用バッファ38にパケットが1ライン分格納されるごとにインデックスアドレスを1つ加算し、加算したインデックスアドレスを再送用バッファ38に出力する。この結果、再送用バッファ38は、トランザクション層102が出力するパケットを連続するラインに順に格納する。また、再送用バッファ書き込みアドレスカウンタ34は、比較器36に、カウント中のインデックスアドレスを出力する。
再送用バッファ読み出しアドレスカウンタ35は、再送用バッファ38から再送対象のパケットを読み出すためのインデックスアドレスを記憶する。具体的には、再送用バッファ読み出しアドレスカウンタ35は、再送中フラグ31が「High」となった場合には、インデックステーブル32の各エントリのうち、加算器25が出力するエントリ番号が示すエントリに格納されたインデックスアドレスを取得する。そして、再送用バッファ読み出しアドレスカウンタ35は、インデックステーブル32から読み出したインデックスアドレスを初期値として保持する。すなわち、再送用バッファ読み出しアドレスカウンタ35は、再送対象のパケットが格納されたラインのうち、最初のラインのインデックスアドレスを保持する。
また、再送用バッファ読み出しアドレスカウンタ35は、保持したインデックスアドレスを再送用バッファ38に出力することで、再送用バッファ38に再送対象のパケットを出力させる。また、再送用バッファ読み出しアドレスカウンタ35は、再送用バッファ38からデータを1ライン読み出すごとに、保持したインデックスアドレスに1を加算する。そして、再送用バッファ読み出しアドレスカウンタ35は、新たなインデックスアドレスを再送用バッファ38に出力することで、再送対象のパケットを出力させる。
比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値、すなわち、再送用バッファ38の読み出し対象となるラインのインデックスアドレスを取得する。また、比較器36は、インデックステーブル32の各エントリのうち、加算器27が出力したエントリ番号のエントリに格納されたインデックスアドレス、すなわち、次に再送用バッファ38の読み出し対象となるラインのインデックスアドレスを取得する。
そして、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値と、インデックステーブル32から読み出したインデックスアドレスとを比較する。その後、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値と、インデックステーブル32から読み出したインデックスアドレスとが一致した場合には、パケットの先頭を検出した旨を再送用シーケンス番号カウンタ37に通知する。
すなわち、比較器36は、再送用バッファ38の読み出し対象となるラインのインデックスアドレスと、現在読み出し中のパケットの次に読み出し対象となるパケットの、先頭が格納されたラインのインデックスアドレスとが一致した場合には、これから読み出すラインが新たなパケットの先頭であると判別する。そして、比較器36は、これから読み出すパケットに対し、直前に読み出したパケットとは異なるシーケンス番号を付与するように再送用シーケンス番号カウンタ37に指示する。
また、比較器36は、インデックステーブル32から読み出したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ35が保持する値とが一致し、パケットの先頭を検出した場合には、以下の処理を実行する。すなわち、比較器36は、インデックステーブル再送中エントリ番号カウンタ26に、更新を指示する。すると、インデックステーブル再送中エントリ番号カウンタ26は、保持するエントリ番号に1を加算し、新たなエントリ番号を出力する。
なお、比較器36は、パケットの末尾を判別してもよい。例えば、比較器36は、インデックステーブル32から取得したインデックスアドレスから1を減算することで、パケットの末尾が格納されたインデックスアドレスを識別する。そして、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値と、パケットの末尾が格納されたインデックスアドレスとが一致した場合には、これから読み出すラインがパケットの末尾であると再送用シーケンス番号カウンタ37に通知してもよい。
また、比較器36は、再送用バッファ書き込みアドレスカウンタ34が加算後に保持する値と再送用バッファ読み出しアドレスカウンタ35が保持する値とを比較する。そして、比較器36は、再送用バッファ書き込みアドレスカウンタ34が保持する値と再送用バッファ読み出しアドレスカウンタ35が保持する値とが一致した場合には、再送用バッファ38のエントリを全て読み出したと判別する。その後、比較器36は、再送中フラグ31を「Low」にすることで、再送処理を終了する。なお、図2においては、図が煩雑になるのを防ぐため、比較器36が再送中フラグ31を「Low」にする処理を示す矢印の記載を省略した。
また、比較器36は、インデックステーブル書き込みエントリ番号カウンタ28が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値を取得する。また、比較器36は、インデックステーブル書き込みエントリ番号カウンタ28が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値とを比較する。
そして、比較器36は、比較した各値が一致した状態でインデックステーブル32に新たなインデックスアドレスのパケットが格納された場合には、インデックステーブル32が満杯である旨を示すフラグをインデックステーブルエントリフルレジスタ40aに格納する。例えば、比較器36は、「High」をインデックステーブルエントリフルレジスタ40aに格納する。
また、比較器36は、インデックステーブル書き込みエントリ番号カウンタ28が保持する値と、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値に1を加算した値とを比較する。そして、比較器36は、比較した各値が一致した場合には、インデックステーブルエントリフルレジスタ40aにインデックステーブル32が満杯である旨を示すフラグが格納されているか否かを判別する。
そして、比較器36は、インデックステーブルエントリフルレジスタ40aにインデックステーブル32が満杯である旨を示すフラグが格納されていない場合には、再送用バッファ38が空であり、インデックステーブル32が空であると判別する。一方、比較器36は、インデックステーブルエントリフルレジスタ40aにインデックステーブル32が満杯である旨を示すフラグが格納されている場合には、再送用バッファ38が空では判別する。
また、比較器36は、比較した各値が一致しない場合には、インデックステーブル32に余裕がある旨を示すフラグ、例えば「Low」をインデックステーブルエントリフルレジスタ40aに格納する。なお、トランザクション層102は、インデックステーブルエントリフルレジスタ40aに、インデックステーブル32が満杯である旨を示すフラグが格納されている場合には、パケットの出力を待機することで、パケットの送信を停止する。
さらに、トランザクション層102は、再送用バッファ38のラインの残数が、最大サイズのパケットが必要とするライン数よりも少なくなった時も、パケットの送信を停止する。パケット最大サイズは、システムによって異なる値であり、最大サイズのパケットに必要なライン数を示す値は外部(図示されない)から直接与えられてもよいし、レジスタを持って設定してもよい。また、外部から与えられた最大パケットサイズ、またはレジスタで設定された最大パケットサイズから、必要ライン数を計算する計算器を持って計算してもよい。
以下、図6Aを用いて、再送用バッファ38のラインの残数が最大サイズのパケットが必要とするライン数よりも少なくなっ際に、パケットの送信を停止する処理について説明する。図6Aは、再送用バッファが満杯であるか否かを判別する処理を説明するための図である。なお、図6Aに示す再送用バッファフルレジスタ40bは、再送用バッファ48の残りラインの数が、最大サイズのパケットが必要とするライン数よりも少なくなったか否かを示すフラグを記憶するレジスタである。
また、パケット最大ライン数設定レジスタ40cは、図示されない外部から書き込みが行われるレジスタであり、最大サイズのパケットが必要とするライン数を記憶するレジスタである。また、図2では図が煩雑になるのを防ぐため、記載を省略したが、図6Aに示す例では、トランザクション層102は、現状において最初に送信されるであろうパケットの先頭のインデックスアドレスから、再送用バッファ書き込みアドレスカウンタ34の値を減算する減算器47を有するものとする。
再送用バッファ38が有するラインの残数は、次に承認される予定のパケットの先頭が格納された再送用バッファ38のインデックスアドレスの値から、次に書き込みを行う再送用バッファ38のインデックスアドレスの値を減算することで求められる。つまり、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値を加算器25に出力し、インデックステーブル32の各エントリのうち、加算器25が出力するエントリ番号が示すエントリに格納されたインデックスアドレスが、次に承認される予定のパケットの先頭が格納されたインデックスアドレスであり、すなわちこれは、現状において最初に再送されるであろうパケットの先頭のインデックスアドレスでもある。ここから、再送用バッファ書き込みアドレスカウンタ34の値を減算した結果が、再送用バッファ38のラインの残数である。
そして、比較器36は、トランザクション層102からパケットの末尾を受け取る度に、再送バッファ38のラインの残数、すなわち減算器47の出力とパケット最大ライン数設定レジスタ40cの値を比較する。その後、比較器36は、比較の結果、ラインの残数がパケット最大ライン数設定レジスタ40cが記憶する値より小さければ、再送用バッファ38は満杯になったと見做し、再送用バッファフルレジスタ40bを「High」に設定する。一方、トランザクション層102は、再送用バッファフルレジスタ40bに、再送用バッファ38が満杯である旨を示す、「High」が設定されている場合には、パケット送信停止要求がされたものとみなし、次のパケットの出力を待機することで、パケットの送信を停止する。
また、比較器36は、インデックステーブル32が空であると判別した場合には、再送用バッファ38に再送対象のパケットが格納されていないので、再送は行われない。例えば、比較器36は、再送予約フラグ29が「High」である状態において、送信した全てのパケットについて承認が行われ、インデックステーブル32に有効なパケットが存在しなくなり、インデックステーブル32が空であると判別した場合には、再送予約フラグ29を「Low」にリセットする。
図2に戻って、再送用シーケンス番号カウンタ37は、再送対象となるパケットに対し、最初の送信時に割り当てられたシーケンス番号と同じシーケンス番号を、再送シーケンス番号として付与する。具体的には、再送用シーケンス番号カウンタ37は、初期値として、承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号に1を加算した値を保持する。また、再送用シーケンス番号カウンタ37は、比較器36がパケットの先頭を判別し、比較器36から直前に読み出したパケットとは異なるシーケンス番号を付与するよう指示された場合には、保持するシーケンス番号に1を加算し、新たなシーケンス番号をパケット選択器39に出力する。
すなわち、再送用シーケンス番号カウンタ37は、コンポーネント105から承認されていないパケットのシーケンス番号を保持し、比較器36が再送するパケットの先頭を検出するごとに、保持したシーケンス番号に1を加算し、再送シーケンス番号をパケット選択器39に出力する。この結果、トランザクション層102は、再送用のシーケンス番号をすべて記憶しなくともよいので、再送処理を実行するために必要な記憶容量を削減することができる。なお、比較器36は、パケットの末尾を判別した時に、次のパケットに備えて再送用シーケンス番号カウンタ37に1を加算するとしても良い。加算後の再送シーケンス番号を、次のパケットに用いるシーケンス番号として、読み出された次のパケットとともに、パケット選択器39に出力する。
パケット選択器39は、トランザクション層102からパケットを受信するとともに、シーケンス番号カウンタ33からシーケンス番号を受信する。さらに、再送中フラグ31の出力を受信する。再送中フラグ31が、「Low」を示している場合には、パケット選択器39は、トランザクション層102から受信したパケットにシーケンス番号カウンタ33から受信したシーケンス番号を付与したパケットを選択し、物理層104を経由した後、コンポーネント間のリンクを介して、コンポーネント105へ送信する。
また、パケット選択器39は、再送用バッファ38から再送対象のパケットを受信するとともに、再送用シーケンス番号カウンタ37から再送シーケンス番号を受信する。そして、再送中フラグ31が、「High」を示している場合には、パケット選択器39は、再送対象のパケットに再送シーケンス番号を付与したパケットを選択し、物理層104を経由した後、コンポーネント間のリンクを介して、コンポーネント105のへ送信する。また、パケット選択器39は、パケットを送信した場合、すなわちパケットの末尾を送信した場合には、再送タイマ30にパケットの末尾を送信した旨を通知する。
次に、図6Bを用いて、インデックステーブル32にインデックスアドレスを格納する処理について説明する。図6Bは、インデックステーブルにインデックスアドレスを格納する処理を説明するための図である。まず、トランザクション層102が次に送信するパケットを出力すると、シーケンス番号カウンタ(NXT_TRAN_SEQ_CT)33は、送信シーケンス番号をパケット選択器39に入力する。この結果、パケット選択器39は、送信シーケンス番号とパケットとを含むパケットを送信する。
また、トランザクション層102が出力したパケットは、再送用バッファ38に入力される。すると、再送用バッファ38は、再送用バッファ書き込みアドレスカウンタ34が示すインデックスアドレスから順に、一つまたは複数のラインにパケットを格納する。
また、インデックステーブル32は、再送用バッファ書き込みアドレスカウンタ34が出力するインデックスアドレスのうち、パケットを格納した複数のラインのうち、最初のラインのインデックスアドレスを受信する。そして、インデックステーブル32は、インデックステーブル書き込みエントリ番号カウンタ28が出力するエントリ番号のエントリに、インデックスアドレスを格納する。
次に、図7を用いて、インデックステーブル承認済みエントリ番号保持レジスタ24に、コンポーネント105が承認したパケットのシーケンス番号を格納する処理について説明する。図7は、インデックステーブル承認済みエントリ番号保持レジスタが保持する値を更新する処理を説明するための図である。
例えば、図7に示す例では、Ack/Nak受信器21が、Ackに格納されていた承認済みシーケンス番号をAck数計算機23と、承認済みシーケンス番号保持レジスタ(ACKD_SEQ_REG)22に出力する。すると、承認済みシーケンス番号保持レジスタ22は、前回記憶した承認済みシーケンス番号をAck数計算機23に出力し、新たに受信した承認済みシーケンス番号を保持する。
一方、Ack数計算機23は、Ack/Nak受信器21から受信した承認済みシーケンス番号値から、承認済みシーケンス番号保持レジスタ22から受信した承認済みシーケンス番号の値を減算する。そして、Ack数計算機23は、計算結果の値と、インデックステーブル承認済みエントリ番号保持レジスタ24が記憶する値との和を、新たな承認済みエントリ番号として、インデックステーブル承認済みエントリ番号保持レジスタ24に格納する。
また、加算器25は、インデックステーブル承認済みエントリ番号保持レジスタ24に格納されたエントリ番号に1を加算した値をインデックステーブル再送中エントリ番号カウンタ26に格納する。すなわち、加算器25は、現状において最初に再送されるであろうパケットに割り当てられたエントリ番号をインデックステーブル再送中エントリ番号カウンタ26に格納する。
次に、図8を用いて、パケットの再送を行うための初期値を再送用バッファ読み出しアドレスカウンタ35に設定する処理の流れについて説明する。図8は、再送時の初期値を再送用バッファ読み出しアドレスカウンタに設定する処理を説明するための図である。例えば、加算器25は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算したエントリ番号をインデックステーブル32に出力する。そして、再送用バッファ書き込みアドレスカウンタ35は、再送中フラグ31が「High」となった場合には、加算器25が出力したエントリ番号が示すエントリに格納されたインデックスアドレスを保持する。
すなわち、インデックステーブル承認済みエントリ番号保持レジスタ24は、コンポーネント105が最も最近承認したパケットの先頭のインデックスアドレスが格納されたエントリのエントリ番号を保持する。そして、加算器25は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算することで、再送対象のパケットの先頭のインデックスアドレスが格納されたエントリのエントリ番号を算出する。この結果、再送用バッファ書き込みアドレスカウンタ35は、加算器25が出力するエントリ番号が示すエントリに格納されたインデックスアドレスを保持することで、再送対象のパケットの先頭が格納されたインデックスアドレスを保持することができる。
次に、図9を用いて、パケットの再送を行うための初期値を再送用シーケンス番号カウンタ37に設定する処理の流れについて説明する。図9は、再送時の初期値を再送用シーケンス番号カウンタに設定する処理を説明するための図である。例えば、再送用シーケンス番号カウンタ37(RPL_TRAN_SEQ_CT)には、承認済みシーケンス番号保持レジスタ(ACKD_SEQ_REG)22が保持するシーケンス番号に1を加算したシーケンス番号が格納される。この結果、再送用シーケンス番号カウンタ37には、再送対象のパケットが、最初の送信時にシーケンス番号カウンタ33によって割り当てられたシーケンス番号と同じシーケンス番号が再送対象のパケットに設定されることとなる。
次に、図10を用いて、パケットの再送中に、パケットごとの先頭ラインを検出する処理の流れについて説明する。図10は、再送時にパケット毎の先頭ラインを検出する処理を説明するための図である。例えば、比較器36は、加算器27が出力するエントリ番号、すなわちインデックステーブル再送中エントリ番号カウンタ26が保持するエントリ番号に1を加算したエントリ番号に格納されたインデックスアドレスを取得する。すなわち、比較器36は、次の再送対象となるパケットの先頭を格納した再送用バッファ38のラインのインデックスアドレスを取得する。
そして、比較器36は、インデックステーブル32から取得したインデックスアドレスと再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスとを比較する。その後、比較器36は、比較した各アドレスが一致する場合には、パケットの先頭を検出した旨を再送用シーケンス番号カウンタ37に通知する。
すると、再送用シーケンス番号カウンタ37は、保持しているシーケンス番号に1を加算し、新たなシーケンス番号をパケット選択器39に出力する。そして、パケット選択器39は、新たなシーケンス番号とともに再送用バッファ38から読み出されたパケットを受信し、受信したシーケンス番号をさらにパケットに付与したパケットを出力する。なお、比較器36は、パケットの末尾を判別した時に、次のパケットに備えて再送用シーケンス番号カウンタ37が保持するシーケンス番号に1を加算するとしても良い。このような場合には、データリンク層103は、1を加算した再送シーケンス番号を、次のパケットに用いるシーケンス番号として、再送用バッファ38から読み出された次のパケットとともに、パケット選択器39に出力する。
なお、比較器36は、パケットの先頭を検出した場合には、インデックステーブル再送中エントリ番号カウンタ26に対し、エントリ番号の更新を指示する。この結果、インデックステーブル再送中エントリ番号カウンタ26は、保持するエントリ番号に1を加算し、新たなエントリ番号を出力する。
次に、図11〜図16を用いて、データリンク層103が実行する処理の具体例を説明する。まず、図11を用いて、パケットの再送を行うための初期値を再送用バッファ読み出しアドレスカウンタ35に設定する処理の具体例を説明する。
図11は、再送のための読み出し開始アドレスを設定する処理の流れを説明するための図である。例えば、図11に示す例では、インデックステーブル32は、エントリ番号「0」から「5」までのエントリに、インデックスアドレス「m−6」、「m−1」、「m+1」、「m+5」、「m+7」、「m+10」を記憶する。
また、図11中の斜線で示すように、再送用バッファ38のうち、アドレス「m」までの領域に格納されたパケットは、コンポーネント105からすでに承認されたパケットである。すなわち、エントリ番号「0」、および「1」に格納されたインデックスアドレスが示す記憶領域に格納されたパケットは、コンポーネント105からすでに承認されたパケットである。
また、承認済みシーケンス番号保持レジスタ22には、承認済みシーケンス番号として「n」が格納されている。また、インデックステーブル承認済みエントリ番号保持レジスタ24には、更新前の値として、承認済みのパケットの先頭が格納されたインデックスアドレスが格納されたエントリのエントリ番号「1」が格納されている。
ここで、Ack数計算機23は、コンポーネント105が3つのパケットを承認した結果、新たな承認済みシーケンス番号として、「n+3」を受信する。すると、Ack数計算機23は、新たな承認済みシーケンス番号から承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号を減算した値「3」を算出する。そして、Ack数計算機23は、値「3」をインデックステーブル承認済みエントリ番号保持レジスタ24に出力する。
すると、インデックステーブル承認済みエントリ番号保持レジスタ24は、「1」にAck数計算機23から受信した値「3」を加算したエントリ番号「4」を保持する。また、インデックステーブル承認済みエントリ番号保持レジスタ24は、エントリ番号「4」を加算器25に出力する。この結果、加算器25は、エントリ番号「5」をインデックステーブル32に出力する。
すると、再送用バッファ読み出しアドレスカウンタ35は、エントリ番号「5」に格納されたインデックスアドレス「m+10」を保持する。この結果、再送用バッファ読み出しアドレスカウンタ35は、現状において承認されていないパケット、すなわち再送対象のパケットの先頭アドレスを保持することとなる。
次に、図12を用いて、パケットの再送中に、パケットごとの先頭ラインを検出する処理の具体例について説明する。図12は、パケットの先頭を検出する処理の流れを説明するための図である。なお、図12に示す例では、承認済みシーケンス番号保持レジスタ22、インデックステーブル32、再送用バッファ38は、図11と同様のパケットを記憶しているものとする。
さらに、インデックステーブル32は、エントリ番号「6」のエントリにインデックスアドレス「m+12」を記憶しているものとする。また、図12に示す例では、斜線で示すように、再送用バッファ38のインデックスアドレス「m+9」に格納されたパケットまでが新たに承認されたものとする。
例えば、Ack数計算機23は、承認済みシーケンス番号「n+3」から承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号「n」を減算した値「3」をインデックステーブル承認済みエントリ番号保持レジスタ24に出力する。すると、インデックステーブル承認済みエントリ番号保持レジスタ24は、更新後の値「4」を加算器25に出力する。この結果、インデックステーブル再送中エントリ番号カウンタ26は、値「5」を保持する。
また、加算器27は、インデックステーブル再送中エントリ番号カウンタ26が保持する値「5」に1を加算した値「6」を出力する。この結果、比較器36は、エントリ番号「6」に格納されたインデックスアドレス「m+12」を取得する。そして、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスが「m+12」になった場合には、パケットの先頭を検出したと判別する。
また、比較器36は、パケットの先頭を検出した場合には、インデックステーブル再送中エントリ番号カウンタ26に保持する値を更新するよう指示する。このように、データリンク層103は、次回送信するパケットのインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスとを比較することで、次回送信するパケットの先頭を識別することができる。
次に、図13を用いて、パケットの末尾を判別する処理の具体例について説明する。図13は、パケットの末尾を判定する処理を説明するための図である。なお、図13に示す例では、インデックステーブル32、および再送用バッファ38は、図11に示す例と同様のパケットを記憶しているものとする。
例えば、インデックステーブル再送中エントリ番号カウンタ26は、エントリ番号の値「3」を記憶している。この結果、加算器27は、エントリ番号「4」を出力する。比較器36は、インデックステーブル32のうち、加算器27が出力したエントリ番号「4」のエントリに格納されたインデックスアドレスが「m+7」であるので、「m+7」から1を減算した値「m+6」を識別する。そして、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値が「m+6」になった場合には、読み出し中の再送用バッファ38のラインがパケットの末尾であると判別する。
次に、図14を用いて、再送処理が終了したか否かを判定する処理の具体例について説明する。図14は、再送処理が終了したか否かを判定する処理の流れを説明するための図である。なお、図14に示す例では、インデックステーブル32、および再送用バッファ38は、図13と同様のパケットを記憶するものとする。
また、インデックステーブル書き込みエントリ番号カウンタ28は、エントリ番号「6」を保持しているものとする。また、インデックステーブル承認済みエントリ番号保持レジスタ24は、エントリ番号「1」を保持しているものとする。また、エントリ番号「2」に格納されたインデックスアドレス「m+1」からパケットの再送が行われた結果、インデックステーブル再送中エントリ番号カウンタ26には「5」が格納され、インデックステーブル再送中エントリ番号カウンタ26には「5」が格納されているものとする。
このような場合には、再送用バッファ読み出しアドレスカウンタ35は、再送用バッファ読み出しアドレスカウンタ35が保持する値と再送用バッファ書き込みアドレスカウンタ34が保持する値とを比較する。ここで、図14に示す例では、再送対象のパケットが順次読み出された結果、再送用バッファ読み出しアドレスカウンタ35が保持する値が「m+12」となる。
すると、比較器36は、再送用バッファ読み出しアドレスカウンタ35が保持する値が再送用バッファ書き込みアドレスカウンタ34が保持する値「m+12」と一致したと判断する。この結果、比較器36は、再送用バッファのエントリを全て読み出したと判定し、再送中フラグ31を「Low」にリセットする。
次に、図15を用いて、インデックステーブルが満杯であるかを判別する処理の具体例について説明する。図15は、インデックステーブルが満杯であるか否かを判別する処理を説明するための図である。なお、図15に示す例では、インデックステーブル32は、エントリ番号「3」のエントリのみが空いているものとする。
例えば、比較器36は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号と、インデックステーブル書き込みエントリ番号カウンタ28とを比較する。図15に示す例では、比較器36は、比較対象の各エントリ番号が「3」で一致すると判別する。そして、比較器36は、新たな送信パケットがトランザクション層102から出力され、そのパケットをデータリンク層103が受け取ると、インデックステーブルエントリフルレジスタ40aに「High」を格納することで、インデックステーブル32が満杯である旨をトランザクション層102に通知する。
なお、図15に示す例では、トランザクション層102が出力した新たな送信パケットは、再送用バッファ38が有するラインのうち、再送用バッファ書き込みアドレスカウンタ34が示すインデックスアドレス「m+7」から順に格納される。この結果、インデックステーブル32は、エントリ番号「3」のエントリに、インデックスアドレス「m+7」を格納することとなる。
次に、図16A、図16B、図17を用いて、再送用バッファ38が空であるか否かを判別する処理の流れ、及び再送用バッファ38が満杯であるか否かを判別する処理の流れについて説明する。例えば、データリンク層103は、再送用バッファ38が空であるか、満杯であるかを判別するには、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号と、インデックステーブル書き込みエントリ番号カウンタ28が保持するエントリ番号を利用する。
例えば、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算した値と、インデックステーブル書き込みエントリ番号カウンタ28が保持するエントリ番号が一致するのは、インデックステーブル32が満杯のときか、または、インデックステーブル32が空、つまり再送用バッファ38が空の時である。この時、インデックステーブルエントリフルレジスタ40aが「High」を示していなければ、インデックステーブル32は満杯でない、つまり再送用バッファ38が空である、ということになる。
図16Aは、再送用バッファが空ではない状態を説明するための図である。例えば、図16Aに示す例では、比較器36は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算した値と、インデックステーブル書き込みエントリ番号カウンタ28が保持するエントリ番号が一致するか判別する。
例えば、図16Aに示す例では、比較器36は、各エントリ番号が「4」で一致すると判別する。すると、比較器36は、インデックステーブルエントリフルレジスタ40aに「High」が格納されているか否かを判別する。ここで、図16Aに示す例では、インデックステーブル32の全エントリにインデックステーブルが格納されているため、インデックステーブルエントリフルレジスタ40aには「High」が格納されている。この結果、比較器36は、再送用バッファは空ではないと判定する。
一方、図16Bは、再送用バッファが空である場合を説明するための図である。図16B中の斜線で示すように、再送用バッファ38には、有効なパケットが格納されておらず、この結果、インデックステーブル32にも有効なパケットは格納されていない。しかしながら、図16Bに示す例でも、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値に1を加算した値とインデックステーブル書き込みエントリ番号カウンタ28が保持する値とが一致する。
そこで、比較器36は、各エントリ番号が一致すると判別した場合には、インデックステーブルエントリフルレジスタ40aに「High」が格納されているか否かを判別する。ここで、図16Bに示す例では、インデックステーブル32が空であるので、直前の処理サイクルにおいて図15に例示した処理は行われない。
この結果、図16Bに示す例では、インデックステーブルエントリフルレジスタ40aには「Low」が格納されている。このため、比較器36は、再送用バッファが空であり、ひいては、インデックステーブル32も空であると判別することができる。
次に、図17を用いて、再送バッファが満杯であるか否かを判別する処理の流れを説明する。図17は、再送バッファが満杯であるか否かを判別する処理の流れを説明するための図である。なお、図17に示す例では、インデックステーブル承認済みエントリ番号保持レジスタ24は、値「3」を記憶し、再送用バッファ書き込みアドレスカウンタ34は、「m+7」を記憶している者とする。また、パケット最大ライン数設定レジスタ40cは、値「n」記憶しているものとする。
例えば、トランザクション層102からパケットの末尾を受け取ると、減算器47は、以下の処理を実行する。まず、減算器47は、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値「3」に1を加算したエントリ番号「4」を識別する。そして、減算器47は、インデックステーブル32の各エントリのうち、識別したエントリ番号「4」が示すエントリに格納されたインデックスアドレス「m+11」を取得する。
また、減算器47は、再送用バッファ書き込みアドレスカウンタが記憶するインデックスアドレス「m+7」を取得する。そして、減算器47は、インデックステーブル32から取得したインデックスアドレス「m+11」から、再送用バッファ書き込みアドレスカウンタ34から取得したインデックスアドレス「m+7」を減算した値「4」を比較器36に出力する。
すると、比較器36は、減算器47から受信した値「4」とパケット最大ライン数設定レジスタ40cが記憶する値「n」とを比較する。そして、比較器36は、減算器47から受信した値「4」よりも、パケット最大ライン数設定レジスタ40cが記憶する値「n」の方が大きい場合には、再送用バッファが満杯であると判別し、再送用バッファフルレジスタ40bを「High」に設定する。
このように、データリンク層103は、次に再送されるであろうパケットの先頭が格納されたインデックスアドレスと、再送用バッファ書き込みアドレスカウンタ34が記憶するインデックスアドレスとを用いて、再送用バッファ38の残りライン数を計数する。そして、データリンク層103は、残りのライン数が、パケットを記憶する際の最大ライン数よりも少ない場合には、トランザクション層102にデータの送信停止を要求する。このため、データリンク層103は、再送用バッファ38のオーバーフローを防ぐことができる。なお、PCIeのデータリンク層は本来、LCRCなどによるデータ保護機能などの本文に書かれていない機能を備えるが、本発明の本質的な部分に関わるものではないため、説明を省略した。
[実施例1の効果]
上述したように、コンポーネント101は、再送用バッファ38と、インデックステーブル32とを有する。また、コンポーネント101は、インデックステーブル32が新たなインデックスアドレスを記憶する際のエントリ番号の保持、および更新を行うインデックステーブル書き込みエントリ番号カウンタ28を有する。また、コンポーネント101は、インデックステーブル32から再送対象となるパケットのインデックスを読み出すためのエントリ番号の保持、および更新を行うインデックステーブル承認済みエントリ番号保持レジスタ24を有する。
また、コンポーネント101は、コンポーネント105からAckを受信したパケットの承認済みシーケンス番号を保持する承認済みシーケンス番号保持レジスタ22を有する。そして、コンポーネント101は、新たに受信した承認済みのシーケンス番号と、承認済みシーケンス番号保持レジスタ22に格納されたシーケンス番号とに基き、インデックステーブル承認済みエントリ番号保持レジスタ24が保持する値を更新する。
このため、コンポーネント101は、再送対象となるパケットが不定長である際に、シーケンス番号を全て保持せずとも、再送対象となる各パケットに、送信時と同様のシーケンス番号を付与することができる。この結果、コンポーネント101は、再送処理に要する記憶容量を削減することができる。
また、コンポーネント101は、承認済みシーケンス番号保持レジスタ22が保持する承認済みシーケンス番号保持レジスタ22と、新たに受信した承認済みシーケンス番号との差から、コンポーネント105が正確に受信したパケットの数を判別する。そして、コンポーネント101は、判別した数だけ、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号の値を加算する。このため、コンポーネント101は、再送対象となるパケットの先頭が格納されたインデックスアドレスとシーケンス番号とを対応付けて記憶せずとも、再送用バッファ38に格納された各パケットの先頭を識別することができる。
また、再送用バッファ読み出しアドレスカウンタ35は、Nakを受信した場合には、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算したエントリ番号が示すエントリからインデックスアドレスを取得する。そして、再送用バッファ読み出しアドレスカウンタ35は、取得したインデックスアドレスから順に、再送用バッファ38が記憶するパケットの読み出しを行う。その後、パケット選択器39は、読み出したパケットをコンポーネント105へ送信する。このため、コンポーネント101は、記憶容量を増大させることなく、再送対象となるパケットをコンポーネント105に送信することができる。
また、比較器36は、インデックステーブル再送中エントリ番号カウンタ26が保持するエントリ番号に1を加算したエントリ番号が示すエントリに格納されたインデックスアドレスを取得する。また、比較器36は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスとが一致するか否かを判別する。
そして、パケット選択器39は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスとが一致する場合は、一致したインデックスアドレスから読み出したパケットを新たなパケットとして送信する。すなわち、パケット選択器39は、直前まで送信していたパケットとは異なるパケットとして送信する。この結果、コンポーネント101は、各パケットが不定長である場合にも、それぞれ異なるパケットとしてコンポーネント105へ送信することができる。
さらに、インデックステーブル再送中エントリ番号カウンタ26は、取得したインデックスアドレスと、再送用バッファ読み出しアドレスカウンタ35が保持するインデックスアドレスとが一致する場合は、保持するエントリ番号を更新する。このため、コンポーネント101は、連続して複数のパケットを再送する場合にも、各パケットの先頭を正確に識別し、各パケットをそれぞれ異なるパケットとしてコンポーネント105に送信することができる。
また、再送タイマ30は、Ack、またはNakを所定時間の間に受信しなかった場合には、再送予約フラグ29を「High」にする。この結果、再送中フラグ31が「High」となった場合には、再送用バッファ読み出しアドレスカウンタ35は、インデックステーブル32から再送対象となるパケットの先頭が格納されたインデックスアドレスを取得する。このため、コンポーネント101は、タイムアウトが発生した場合にも、再送処理を開始することができる。
また、再送用シーケンス番号カウンタ37は、再送処理を開始する際、承認済みシーケンス番号保持レジスタ22が保持する承認済みシーケンス番号に1を加算した値を初期値として保持する。そして、パケット選択器39は、再送用シーケンス番号カウンタ37が保持する値を再送用のシーケンス番号として、再送するパケットに付与する。このため、コンポーネント101は、再送するパケットとシーケンス番号とを対応付けて記憶せずとも、再送するパケットが最初の送信で割り当てられた送信シーケンス番号と同じシーケンス番号を再度割り当てて、コンポーネント105に再送することができる。
また、データリンク層103は、長さの異なる複数のパケットを一時的に保持する再送用バッファ38を有する。また、データリンク層103は、パケットが新しく生成された際に再送用バッファ38へ登録する位置を示す再送用バッファ書き込みアドレスカウンタ34を有する。また、データリンク層103は、再送用バッファ38内に格納されているパケットの先頭位置を記憶するエントリからなるインデックステーブル32を有する。このため、データリンク層103は、少ない記憶資源でデータの再送を行う事ができる。
また、データリンク層103は、パケットが新しく生成された際にインデックステーブル32にパケットの先頭位置を登録するエントリ位置を示すインデックステーブル書き込みエントリ番号カウンタ28を有する。また、データリンク層103は、インデックステーブル32の中の読み出し可能なエントリを指し示すインデックステーブル再送中エントリ番号カウンタ26を有する。このため、データリンク層103は、少ない記憶資源でデータの再送を行う事ができる。
また、データリンク層103は、パケットの送信先から送信される応答パケットに付随する承認済みシーケンス番号保持レジスタ22を有する。また、データリンク層103は、承認済みシーケンス番号保持レジスタ22に保持される第1の承認済みシーケンス番号と、次に受信した応答パケットに付随する第2の承認済みシーケンス番号とを用いて、パケットの送信先が正常に受信したパケットの数を計算し、計算結果に基づいてインデックステーブル承認済みエントリ番号保持レジスタ24を更新する。このため、データリンク層103は、少ない記憶資源でデータの再送を行う事ができる。
また、データリンク層103は、パケットの再送を開始すると判定した場合に、再送用バッファ38に保持されている複数のパケットを再び送信するパケット選択器39を有する。このため、データリンク層103は、データの再送を行う事ができる。
データリンク層103は、インデックステーブル再送中エントリ番号カウンタ26が指し示すエントリに記憶されている先頭位置を判別し、判別した先頭位置から再送用バッファ38に登録されたパケットを読み出し、読み出したパケットから再送を行う。このため、データリンク層103は、データの再送を行う事ができる。
データリンク層103は、パケットにシーケンス番号を付与し、付与したシーケンス番号が承認シーケンス番号としてパケットの送信先に付与されたAck、またはNakを受信する。このため、データリンク層103は、再送シーケンス番号を適切に識別できる。
データリンク層103は、再送用バッファ38内のパケット送信のための読み出し位置を示す再送用バッファ読み出しアドレスカウンタ35aを有する。また、データリンク層103は、再送中のパケットについてインデックステーブル32が先頭位置を記憶したエントリの位置を示すインデックステーブル再送中エントリ番号カウンタ26を有する。また、データリンク層103は、インデックステーブル再送中エントリ番号カウンタ26が示すエントリの次の位置に位置のエントリが記憶する第1のインデックスアドレスと再送用バッファ読み出しアドレスカウンタ35の示す第2のインデックスアドレスとを比較することで、パケットの先頭位置を検出する比較器36を有する。このため、データリンク層103は、再送用バッファ38からパケットをそれぞれ個別に読み出すことができる。
データリンク層103は、再送処理中にパケットの先頭位置を検出するたびに、パケットに付与するシーケンス番号を更新する。このため、データリンク層103は、再送するパケットに正しい再送シーケンス番号を付与できる。
以下の実施例では、再送するパケット量を削減するため、再送中にAck/Nakを受け取った場合、再送予定のパケットについて、送信先の装置がすでに認証したパケットの再送を行わなず(以下の説明では、このような処理を“スキップする”と記載する)、その次のパケットから再送を続ける装置について説明する。なお、以下の説明では、実施例2に係る装置は、コンポーネント101が有するデータリンク層103と同様のデータリンク層103aを有するものとする。
以下、図18を用いて、データリンク層103aが有する機能構成について説明する。図18は、実施例2に係るデータリンク層の機能構成を説明するための図である。なお、図18に示す例では、図2に示したデータリンク層103と同様の機能を発揮するものについて、図2と同様の符号を付し、以下の説明を省略する。
図18に示すように、データリンク層103aは、再送用バッファ読み出しアドレスカウンタ35a、再送用シーケンス番号カウンタ37a、再送数計算器50、スキップ判定比較器51、スキップ予約フラグ52、スキップ設定レジスタ53を有する。再送数計算器50は、インデックステーブル再送中エントリ番号カウンタ26が保持するエントリ番号と、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号とを取得する。そして、再送数計算器50は、取得したエントリ番号の差分を算出することで、再送したパケットの個数を計算し、計算結果をスキップ判定比較器51に出力する。
スキップ判定比較器51は、スキップ設定レジスタ53にスキップの実行を示すフラグが格納されている場合には、以下の処理を実行する。まず、スキップ判定比較器51は、再送数計算器50から再送したパケットの個数を受信する。また、スキップ判定比較器51は、Ack数計算機23から新たに承認されたパケットの個数を受信する。
そして、スキップ判定比較器51は、新たに承認されたパケットの個数が再送したパケットの個数よりも多い場合には、再送する必要のないパケットが存在すると判別する。その後、スキップ判定比較器51は、再送する必要の無いパケットが存在すると判別した場合には、スキップ予約フラグ52に「High」を格納する。
スキップ予約フラグ52は、スキップの実行を指示するフラグであり、「High」が格納された場合には、再送用バッファ読み出しアドレスカウンタ35aにスキップの実行を指示する。また、スキップ設定レジスタ53は、利用者によって設定されたスキップを実行するか否かを設定するためのフラグを記憶するレジスタである。
次に、スキップ予約フラグ52に「High」が設定された際に、再送用バッファ読み出しアドレスカウンタ35aが実行する処理について説明する。なお、再送用バッファ読み出しアドレスカウンタ35aは、実施例1に係る再送用バッファ読み出しアドレスカウンタ35と同様の機能を発揮することができる。
また、再送用バッファ読み出しアドレスカウンタ35aは、スキップ予約フラグ52に「High」が設定されている場合には、以下の処理を実行する。まず、再送用バッファ読み出しアドレスカウンタ35aは、図13に示す処理を用いて、パケットの末尾を識別する。そして、パケットの末尾を識別したなら、再送用バッファ読み出しアドレスカウンタ35aは、加算器25が出力するエントリ番号のエントリに格納されたインデックスアドレスを取得し、取得したインデックスアドレスを保持する。その後、再送用バッファ読み出しアドレスカウンタ35aは、新たに保持したインデックスアドレスからパケットの読み出しを継続する。
また、再送用シーケンス番号カウンタ37aは、スキップ予約フラグ52に「High」が設定された状態でパケットの末尾を識別したなら、承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号に1を加算した値を新たに保持する。この結果、再送用シーケンス番号カウンタ37aは、スキップ後に再送するパケットに、再送用のシーケンス番号を正しく付与することができる。
このように、コンポーネント101は、パケットの再送中に新たな承認シーケンス番号を受信した場合には、再送中のパケットの末尾まで出力した後、次に再送する予定のパケットから新たな承認シーケンス番号で承認されたパケットまでの再送をスキップする。その後、コンポーネント101は、新たに承認されたパケットの次に再送する予定であったパケットの再送を開始する。
なお、コンポーネント101は、パケットの再送をスキップする場合にも、図14に示す処理を実行することにより、パケットの再送処理が終了したか否かを判別することができる。また、コンポーネント101は、再送用バッファ38に格納された残りのパケット全ての再送をスキップした場合にも、パケットの再送が終了したと判別する。具体的には、図14に示す処理を実行することにより、パケットの再送が終了したと判別した場合には、比較器36が、再送中フラグ31をリセットするとともに、スキップ予約フラグ52を「Low」にリセットする。
次に、図19を用いて、スキップ予約フラグを設定する処理の流れについて説明する。図19は、スキップ予約フラグを設定する処理を説明するための図である。まず、再送数計算器50は、インデックステーブル承認済みエントリ番号保持レジスタ24から承認済みエントリ番号を取得し、インデックステーブル再送中エントリ番号カウンタ26からエントリ番号を取得する。そして、再送数計算器50は、インデックステーブル承認済みエントリ番号保持レジスタ24から取得したエントリ番号からインデックステーブル再送中エントリ番号カウンタ26からエントリ番号を減算した値をスキップ判定比較器51に出力する。
一方、Ack数計算機23は、新たに受信した承認済みシーケンス番号から承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号を減算した値をスキップ判定比較器51に出力する。また、スキップ判定比較器51は、スキップ設定レジスタ53に「High」が設定されている場合には、再送数計算器50から受信した値がAck数計算機23から受信した値よりも小さいか否かを判別する。
そして、スキップ判定比較器51は、スキップ設定レジスタ53に「High」が格納されている場合に、再送数計算器50から受信した値がAck数計算機23から受信した値よりも小さいと判定した場合には、スキップ予約フラグ52を「High」に設定する。この結果、コンポーネント101は、新たに承認されたパケットの再送をスキップする。
次に、図20を用いて、パケットの再送をスキップする際に、再送用バッファ読み出しアドレスカウンタ35aに新たな値を設定する処理について説明する。図20は、スキップ実行時の値を設定する処理を説明するための図である。図20に示すように、スキップ判定比較器51は、スキップを実行すると判定した場合には、スキップ予約フラグ52を「High」に設定する。
すると、再送用バッファ読み出しアドレスカウンタ35aは、スキップ実行時に、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算したエントリ番号が示すエントリから、新たなインデックスアドレスを取得する。この結果、コンポーネント101は、コンポーネント105がすでに受け取ったパケットの再送をスキップすることができる。
また、再送用シーケンス番号カウンタ37aは、スキップ予約フラグ52に「High」が設定されると、スキップ実行時に、承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号に1を加算したシーケンス番号を新たに保持する。この結果、コンポーネント101は、スキップ後に再送するパケットに対して、正しいシーケンス番号を付与することができる。
次に、図21を用いて、スキップを行う処理の具体例について説明する。図21は、スキップを行う処理の流れを説明するための図である。なお、図21に示す例では、インデックステーブル32は、図13と同様のインデックスアドレスを記憶し、再送用バッファ38は、図13に示す場合と同様のパケットを記憶しているものとする。
また、インデックステーブル承認済みエントリ番号保持レジスタ24は、エントリ番号「1」を保持し、インデックステーブル再送中エントリ番号カウンタ26は、エントリ番号「3」を保持しているものとする。また、コンポーネント101は、インデックスアドレス「m+1」に先頭が格納されたパケットから順次再送し、インデックスアドレス「m+5」から格納されたパケットの再送を行っている間に、新たな承認済みシーケンス番号「n+3」を受信したものとする。
このような場合には、Ack数計算機23は、承認済みシーケンス番号保持レジスタ22が保持する承認済みシーケンス番号と、新たに受信した承認済みシーケンス番号との差である「3」を出力する。
また、再送数計算器50は、インデックステーブル再送中エントリ番号カウンタ26が保持しているエントリ番号「3」から、インデックステーブル承認済みエントリ番号保持レジスタ24が保持しているエントリ番号「1」を減算する。そして、再送数計算器50は、計算結果の「2」をスキップ判定比較器51に出力する。
すると、スキップ判定比較器51は、Ack数計算機23が出力する値「3」が、再送数計算器50が出力する値「2」よりも多いので、スキップ予約フラグ52を「High」に設定する。つまり、前回の承認からこれまで、エントリ番号「2」に対応するパケットを再送し、現在はエントリ番号「3」に対応するパケットを再送中であり、この次には「4」を再送する予定であったが、承認済みシーケンス番号は、エントリ番号「2」「3」「4」に対応するパケットが承認されたことを示していたため、エントリ番号「4」に対応するパケットをこの後再送する必要はない。つまり、再送したパケットよりも承認されたパケットの数の方が多い場合には、再送をスキップすることが、再送量を削減して無駄を省くために有効である。
インデックステーブル承認済みエントリ番号保持レジスタ24は、再送数計算器50に保持する値を出力した後、通常通りAck数計算機23の出力を加算して更新される。この結果、インデックステーブル承認済みエントリ番号保持レジスタ24は、エントリ番号「4」を保持する。
さらに、図13と同様にパケット末尾の判別を行う。スキップ予約フラグ52が「High」に設定されている状態で、再送用バッファ読み出しアドレスカウンタ35aは、読み出し中のパケットの末尾が格納されたインデックスアドレス「m+6」までカウントし、比較器36が、エントリ番号「3」に対応するパケットの末尾の読み出しを終えたと判別したら、コンポーネント101は、スキップ処理を実行する。スキップ実行処理によって、インデックステーブル承認済みエントリ番号保持レジスタ24は、更新後の値「4」を加算器25に出力する。この結果、インデックステーブル再送中エントリ番号カウンタ26は、エントリ番号「5」を保持することとなる。さらに、スキップ実行処理によって、再送用バッファ読み出しアドレスカウンタ35aは、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算したエントリ番号のエントリに格納されたインデックスアドレス「m+10」を新たに取得する。
すなわち、再送用バッファ読み出しアドレスカウンタ35aは、加算器25が出力するエントリ番号のエントリに格納されたインデックスアドレスを取得する。この結果、コンポーネント101は、再送用バッファ38が記憶するパケットのうち、インデックスアドレス「m+7」から「m+9」に格納されたパケットの再送をスキップすることとなる。
次に、図22を用いて、スキップ処理を実行した際に、再送が終了したか否かを判定する処理の具体例について説明する。つまり、再送中に、残りの全てのパケットが承認されて、スキップを実行した結果、再送を継続する必要がなくなった場合の処理である。図22は、スキップ時に再送が終了したと判定する処理を説明するための図である。例えば、Ack数計算機23は、新たな承認済みシーケンス番号「n+2」と承認済みシーケンス番号保持レジスタ22が保持するシーケンス番号「n」との差分「2」を算出する。この結果、インデックステーブル承認済みエントリ番号保持レジスタ24は、保持していたエントリ番号「1」をエントリ番号「3」に更新する。
すると、比較器36は、インデックステーブル書き込みエントリ番号カウンタ28に格納されたエントリ番号「4」と、インデックステーブル承認済みエントリ番号保持レジスタ24が保持するエントリ番号に1を加算した値とが一致すると判別する。そして、比較器36は、インデックステーブルエントリフルレジスタ40aに「High」が設定されているか否かを判別し、「High」が設定されていない場合には、インデックステーブル32が空であり、再送用バッファ38も空であると判別する。再送用バッファ38が空になれば、その後、再送を継続する必要はない。比較器36は、再送中フラグ31を「Low」にリセットし、処理を終了する。
[実施例2の効果]
上述したように、再送数計算器50は、インデックステーブル再送中エントリ番号カウンタ26とインデックステーブル承認済みエントリ番号保持レジスタ24とが保持するエントリ番号から、コンポーネント105へ再送したパケットの数を計算する。また、スキップ判定比較器51は、再送数計算器50が計算したパケットの数と、Ack数計算機23が計算したパケットの数、すなわち新たにコンポーネント105が正常に受信したパケットの数とを比較する。
そして、スキップ判定比較器51は、再送数計算器50が計算したパケットの数が、Ack数計算機23が計算したパケットの数よりも少ない場合には、スキップ予約フラグ52を「High」に設定してスキップを予約し、スキップが予約された状態で現在再送中のパケットの末尾の読み出しが完了すればパケットのスキップが指示される。再送用バッファ読み出しアドレスカウンタ35aは、パケットのスキップを指示された場合は、加算器25が出力するエントリ番号のエントリからインデックスアドレスを新たに取得し、取得したインデックスアドレスを保持する。さらに、インデックステーブル再送中エントリ番号カウンタ26は、加算器25が出力するエントリ番号を新たに取得し、保持する。
この結果、コンポーネント101は、コンポーネント105が正常に受信したパケットの再送をスキップし、コンポーネント105から承認されていないパケットの送信を開始することができるので、無駄な再送を抑えることができる。
また、データリンク層103aは、再送処理中にAckを受信し、かつ、パケットの送信先が正常受信したパケットの数よりも、再送したパケット数が多い場合は、再送処理中のパケットを送信後に再送処理を中止する。そして、データリンク層103aは、Ack数計算機23によって更新された後のインデックステーブル承認済みエントリ番号保持レジスタ24が指し示すエントリに記憶されているインデックスアドレスを新たに判別し、当該新たに判別したインデックスアドレスに登録されたパケットから再送を再開する。このため、データリンク層103aは、スキップ処理を行う事ができる。
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例3として本発明に含まれる他の実施例を説明する。
(1)インデックスアドレス、およびシーケンス番号について
上述した実施例1、および実施例2ではインデックステーブル32に格納したインデックスアドレスの具体例、およびシーケンス番号の具体例について説明したが、上述した具体例は、あくまで一例であり、任意の形式や数値を適用することができる。例えば、インデックスアドレスやシーケンス番号は、任意の桁数や任意の進数を適用することができる。
(2)送信するパケットについて
上述した実施例1、および実施例2では、再送用バッファ38にパケットを格納し、パケット選択器39がパケットとシーケンス番号とをパケットに格納する例について説明した。しかし、実施例はこれに限定されるものではなく、例えば、再送用バッファ38は、トランザクション層102が生成したパケットを記憶し、パケット選択器39は、送信するパケットにシーケンス番号を格納して出力しても良い。
(3)実施形態について
上述したインデックステーブル承認済みエントリ番号保持レジスタ24は、加算器25の機能を含んでも良い。また、インデックステーブル再送中エントリ番号カウンタ26は、加算器27の機能を含んでも良い。
また、図1aに示した情報処理装置1の構成は、あくまで一例であり、情報処理装置1は、任意の数のCPUやメモリを有しても良い。また、情報処理装置1のPCIeエンドポイントは、PCIeスイッチであってもよい。PCIeスイッチは、PCIeルートコンプレックスと同じノードに載っていてもよい。また、PCIeスイッチとPCIeエンドポイントからなる装置であってもよい。また、PCIeスイッチとPCIeスイッチとからなる装置であってもよい。例えば、エンドポイントからルートコンプレックスへのパケット送信の様に、送信側と受信側が逆であってもよい。さらに、PCIeに限定されず、同様のシーケンス番号を用いた再送機能を要するような装置であれば、適用可能である。例えばUniversal Serial Bus(USB)3.0の様な、Open Systems Interconnection(OSI)参照モデルの第二層のデータリンク層を持つものが考えられる。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)データの送信が正常に行われなかった場合に当該データを再送可能なデータ転送装置において、
送信したデータを順次記憶するデータ記憶部と、
前記データ記憶部が前記データを記憶した領域のアドレスを記憶するアドレス記憶部と、
前記アドレス記憶部が前記アドレスを記憶するたびに、前記アドレス記憶部が新たなアドレスを記憶する領域の識別番号を更新する第1の更新部と、
前記アドレス記憶部から再送対象のデータを記憶するアドレスを読み出すための前記識別番号を更新する第2の更新部と、
前記データの送信先となる装置から、正常に受信したデータの識別情報を受信すると、受信した識別情報を記憶する識別情報記憶部と、
前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とに基づいて、前記第2の更新部が前記識別番号を更新する処理を制御する制御部と
を有することを特徴とするデータ転送装置。
(付記2)前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データの送信先となる装置が正確に受信したデータの数を計数する計数部を有し、
前記制御部は、前記計数部が計数した数だけ前記識別番号を加算するように前記第2の更新部を更新することを特徴とする付記1に記載のデータ転送装置。
(付記3)前記データの送信先となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、前記第2の更新部が更新した識別番号に1を加算した値が示す領域に格納されたアドレスを取得する取得部と、
前記取得部が取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行う読出部と、
前記読出部が読み出したデータを前記データの送信先へ送信する送信部と
を有することを特徴とする付記1または2に記載のデータ転送装置。
(付記4)前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致するか否かを判別する判別部を有し、
前記送信部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合には、当該アドレスから前記読出部が順に読み出すデータを前回読出部が読み出したデータとは異なるデータとして出力することを特徴とする付記3に記載のデータ転送装置。
(付記5)前記第2の更新部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合は、前記識別番号を更新することを特徴とする付記4に記載のデータ転送装置。
(付記6)前記取得部は、前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間受信しなかった場合は、前記第2の更新部が更新した識別番号に1を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記3−5のいずれか1つに記載のデータ転送装置。
(付記7)前記送信部は、前記識別情報記憶部が記憶する識別情報に1を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データの送信先となる装置へ送信することを特徴とする付記3−6のいずれか1つに記載のデータ転送装置。
(付記8)前記データの送信先となる装置へ再送したデータの数を計数する再送計数部と、
前記再送計数部が計数したデータの数と、前記計数部が計数したデータの数とを比較し、前記再送計数部が計数したデータの数が前記計数部が計数したデータの数よりも少ない場合には、前記データの送信先となる装置が正確に受信したデータの再送をスキップするよう前記取得部と前記読出部とに指示する指示部とを有し、
前記取得部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記第2の更新部が更新した識別番号に1を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記読出部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記取得部が新たに取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行うことを特徴とする付記3−7のいずれか1つに記載のデータ転送装置。
(付記9)データを送信するデータ送信装置と、正常に受信したデータの識別情報を前記データ送信装置へ返信するデータ受信装置とを有する情報処理装置において、
前記データ送信装置は、
送信したデータを順次記憶するデータ記憶部と、
前記データ記憶部が前記データを記憶した領域のアドレスを記憶するアドレス記憶部と、
前記アドレス記憶部が前記アドレスを記憶するたびに、前記アドレス記憶部が新たなアドレスを記憶する領域の識別番号を更新する第1の更新部と、
前記アドレス記憶部から再送対象のデータを記憶するアドレスを読み出すための前記識別番号を更新する第2の更新部と、
前記データ受信装置から、正常に受信したデータの識別情報を受信すると、受信した識別情報を記憶する識別情報記憶部と、
前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とに基づいて、前記第2の更新部が前記識別番号を更新する処理を制御する制御部と
を有することを特徴とする情報処理装置。
(付記10)前記データ受信装置となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データ受信装置となる装置が正確に受信したデータの数を計数する計数部を有し、
前記制御部は、前記計数部が計数した数だけ前記識別番号を加算するように前記第2の更新部を更新することを特徴とする付記9に記載の情報処理装置。
(付記11)前記データ受信装置となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、前記第2の更新部が更新した識別番号に1を加算した値が示す領域に格納されたアドレスを取得する取得部と、
前記取得部が取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行う読出部と、
前記読出部が読み出したデータを前記データ受信装置へ送信する送信部と
を有することを特徴とする付記9または10に記載の情報処理装置。
(付記12)前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致するか否かを判別する判別部を有し、
前記送信部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合には、当該アドレスから前記読出部が順に読み出すデータを前回読出部が読み出したデータとは異なるデータとして出力することを特徴とする付記11に記載の情報処理装置。
(付記13)前記第2の更新部は、前記取得部が取得したアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記読出部がデータを読み出したアドレスとが一致すると前記判別部が判別した場合は、前記識別番号を更新することを特徴とする付記12に記載の情報処理装置。
(付記14)前記取得部は、前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間受信しなかった場合は、前記第2の更新部が更新した識別番号に1を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記11−13のいずれか1つに記載の情報処理装置。
(付記15)前記送信部は、前記識別情報記憶部が記憶する識別情報に1を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データ受信装置となる装置へ送信することを特徴とする付記11−14のいずれか1つに記載の情報処理装置。
(付記16)前記データ受信装置となる装置へ再送したデータの数を計数する再送計数部と、
前記再送計数部が計数したデータの数と、前記計数部が計数したデータの数とを比較し、前記再送計数部が計数したデータの数が前記計数部が計数したデータの数よりも少ない場合には、前記データ受信装置となる装置が正確に受信したデータの再送をスキップするよう前記取得部と前記読出部とに指示する指示部とを有し、
前記取得部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記第2の更新部が更新した識別番号に1を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記読出部は、前記指示部から前記データの再送をスキップするよう指示された場合には、前記取得部が新たに取得したアドレスから順に、前記データ記憶部が記憶するデータの読み出しを行うことを特徴とする付記11−15のいずれか1つに記載の情報処理装置。
(付記17)データの送信が正常に行われなかった場合に当該データを再送可能なデータ転送装置が実行するデータ転送方法において
送信したデータを第1の記憶装置に順次格納し、
前記データを格納した領域のアドレスを第2の記憶装置に格納し、
前記第2の記憶装置に前記アドレスを格納するたびに、前記第2の記憶装置に新たなアドレスを格納する領域の識別番号を更新し、
前記データの送信先となる装置から、正常に受信したデータの識別情報を受信した場合には受信した識別情報を第3の記憶装置に格納し、
前記データの送信先となる装置から新たに受信した識別情報と、前記第3の記憶装置が記憶する識別情報とに基づいて、前記第2の記憶装置から、再送対象のデータが格納されたアドレスを記憶する領域の識別番号を更新する
処理を実行することを特徴とするデータ転送方法。
(付記18)前記データの送信先となる装置から新たに受信した識別情報と、前記識別情報記憶部が記憶する識別情報とを用いて、前記データの送信先となる装置が正確に受信したデータの数を計数し、
前記計数した数だけ前記識別番号を加算するように、前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号を更新することを特徴とする付記17に記載のデータ転送方法。
(付記19)前記データの送信先となる装置から前記データを正常に受信できなかった旨の通知を受信した場合には、前記アドレス記憶部が記憶するアドレスのうち、再送対象のデータが格納されたアドレスを記憶する領域の識別番号に1を加算した値が示す領域に格納されたアドレスを取得し、
前記取得したアドレスから順に、前記第1の記憶装置が記憶するデータの読み出しを行い、
前記読み出したデータを前記データの送信先へ送信することを特徴とする付記17または18に記載のデータ転送方法。
(付記20)前記再送対象のデータが格納されたアドレスの次に前記第2の記憶装置が記憶したアドレスと、前記第1の記憶装置からデータを読み出したアドレスとが一致するか否かを判別し、
前記再送対象のデータが格納されたアドレスの次に前記第2の記憶装置が記憶したアドレスと、前記第1の記憶装置からデータを読み出したアドレスとが一致すると判別した場合には、当該アドレスからデータを順に読み出して、読み出したデータを新たなデータとして出力することを特徴とする付記19に記載のデータ転送方法。
(付記21)前記再送対象のデータが格納されたアドレスの次に前記アドレス記憶部が記憶したアドレスと、前記第1の記憶装置からデータを読み出したアドレスとが一致すると判別した場合は、前記識別情報を更新することを特徴とする付記20に記載のデータ転送方法。
(付記22)前記データを正常に受信できなかった旨の通知、もしくは、前記正常に受信したデータの識別情報を所定の期間、前記データの送信先となる装置から受信しなかった場合は、更新した前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号に1を加算した識別番号が示す領域に格納されたアドレスを取得することを特徴とする付記19−21のいずれか1つに記載のデータ転送方法。
(付記23)前記第3の記憶装置が記憶する識別情報に1を加算した値を新たな識別情報として前記読出部が読み出したデータに付与し、当該新たな識別情報を付与したデータを前記データの送信先となる装置へ送信することを特徴とする付記19−22のいずれか1つに記載のデータ転送方法。
(付記24)前記データの送信先となる装置へ再送したデータの数を計数し、
前記データの送信先となる装置が正確に受信したデータの数と、前記データの送信先となる装置へ再送したデータの数とを比較し、前記データの送信先となる装置へ再送したデータの数が、前記データの送信先となる装置が正確に受信したデータの数よりも少ない場合には、前記データの送信先となる装置が正確に受信したデータの再送をスキップすると判別し、
前記データの再送をスキップすると判別した場合には、前記再送対象のデータが格納されたアドレスを記憶する領域の識別番号に1を加算した識別番号が示す領域に格納されたアドレスを新たに取得し、
前記新たに取得したアドレスから順に、前記第1の記憶部が記憶するデータの読み出しを行うことを特徴とする付記19−23のいずれか1つに記載のデータ転送方法。
(付記25)データの長さの異なる複数のデータパケットを一時的に保持するパケット記憶部と、
前記データパケットが新しく生成された際に前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部と、
前記データパケット記憶部内に格納されている該データパケットの先頭位置を記憶するエントリからなる位置情報記憶部と、
を備えることを特徴とする、データ送信装置。
(付記26)前記データパケットが新しく生成された際に前記位置情報記憶部に前記データパケットの先頭位置を登録するエントリ位置を示す位置情報書き込み指示部と、
前記位置情報記憶部の中の読み出し可能なエントリを指し示す位置情報読み出し指示部と、
をさらに備えることを特徴とする、付記25に記載のデータ送信装置。
(付記27)前記データ送信装置は、1つ以上のデータパケットを発行し、
前記データパケットの送信先となるデータ受信装置から送信される応答パケットに付随する受信済順序番号を保持する確認済番号記憶部と、
前記確認済番号記憶部に保持される第1の受信済順序番号と、次に受信した応答パケットに付随する第2の受信済み順序番号とを用いて、前記データ受信装置が正常に受信した前記データパケットの数を計算し、当該計算結果に基づいて前記位置情報読み出し指示部を更新する計算更新部と、
をさらに備えることを特徴とする、付記26に記載のデータ送信装置。
(付記28)前記データパケットの再送を開始すると判定した場合に、前記パケット記憶部に保持されている前記複数のデータパケットを再び送信する再送処理部をさらに備えることを特徴とする、付記27に記載のデータ送信装置。
(付記29)前記再送処理部は、前記位置情報読み出し指示部の指し示す前記位置情報記憶部のエントリに記憶されている先頭位置を判別し、当該判別した先頭位置から前記パケット記憶部に登録されたデータパケットを読み出し、当該読み出したデータパケットから再送を行うことを特徴とする付記28に記載のデータ送信装置。
(付記30)前記再送処理部は、前記データパケットに順序番号を付与し、
前記データ送信装置は、前記再送処理部が付与した順序番号を前記受信済順序番号として前記データ受信装置により付与された応答パケットを受信する受信部を有することを特徴とする付記28に記載のデータ送信装置。
(付記31)前記パケット記憶部内のデータパケット送信のための読み出し位置を示すパケット読み出し位置指示部と、
現在再送中の前記パケット記憶部内のデータパケットにについて前記位置情報記憶部が先頭位置を記憶したエントリの位置を示す再送中位置情報表示部と、
前記再送中位置情報表示部の示すエントリの次の位置に位置のエントリが記憶する第1の位置情報と該パケット読み出し位置指示部の示す第2の位置情報とを比較することで、前記パケット記憶部内の次の送信データパケットの先頭位置を検出するデータパケット先頭位置検出部と、
をさらに備える付記30に記載のデータ送信装置。
(付記32)前記再送処理部は、再送処理中に前記データパケット先頭位置検出部がデータパケットの先頭位置を検出するたびに、前記データパケットに付与する順序番号を更新することを特徴とする、付記31に記載のデータ送信装置。
(付記33)前記再送処理部は、再送処理中に前記データ受信装置から前記応答パケットを受信し、かつ、前記計算更新部で計算される前記正常受信したデータパケットの数よりも、再送したデータパケット数が多い場合は、再送処理中のデータパケットを送信後に再送処理を中止し、前記計算更新部によって更新された後の前記位置情報読み出し指示部が指し示すエントリに記憶されている先頭位置を新たに判別し、当該新たに判別した先頭位置から前記パケット記憶部に登録されたデータパケットから再送を再開することを特徴とする、付記29に記載のデータ送信装置。
(付記34)長さが異なる複数のデータパケットを送信するデータ送信装置が実行するデータ送信方法において、
パケット記憶部に、データの長さの異なる複数のデータパケットを一時的に保持し、
前記データパケットが新しく生成された際に、前記パケット記憶部内へ登録する位置を示すパケット書き込み先頭位置指示部が示した位置を位置情報記憶部に格納する
処理を実行することを特徴とするデータ送信方法。
(付記35)前記データパケットが新しく生成された際に前記位置情報記憶部に前記データパケットの先頭位置を登録するエントリ位置を示し、
前記位置情報記憶部の中の読み出し可能なエントリを指し示す
ことを特徴とする、付記34に記載のデータ送信方法。
(付記36)前記データ送信装置は、1つ以上のデータパケットを発行し、
前記データパケットの送信先となるデータ受信装置から送信される応答パケットに付随する受信済順序番号を確認済番号記憶部に保持し
前記確認済番号記憶部に保持される第1の受信済順序番号と、次に受信した応答パケットに付随する第2の受信済み順序番号とを用いて、前記データ受信装置が正常に受信した前記データパケットの数を計算し、当該計算結果に基づいて、読み出し可能なエントリを更新することを特徴とする、付記35に記載のデータ送信方法。
(付記37)前記データパケットの再送を開始すると判定した場合に、前記パケット記憶部に保持されている前記複数のデータパケットを再び送信することを特徴とする付記36に記載のデータ送信方法。
(付記38)前記指し示した読み出し可能なエントリに記憶されている先頭位置を判別し、当該判別した先頭位置から前記パケット記憶部に登録されたデータパケットを読み出し、当該読み出したデータパケットから再送を行うことを特徴とする付記37に記載のデータ送信方法。
(付記39)前記データパケットに順序番号を付与し、
前記データ送信装置は、前記データ受信装置が前記順序番号を前記受信済順序番号として付与した応答パケットを受信することを特徴とする付記37に記載のデータ送信方法。
(付記40)前記パケット記憶部内のデータパケット送信のための読み出し位置を示し、
現在再送中の前記パケット記憶部内のデータパケットについて前記位置情報記憶部が先頭位置を記憶したエントリの次の位置のエントリが記憶する第1の位置情報と該パケット読み出し位置指示部の示す第2の位置情報とを比較することで、前記パケット記憶部内の次の送信データパケットの先頭位置を検出することを特徴とする付記39に記載のデータ送信方法。
(付記41)再送処理中にデータパケットの先頭位置を検出するたびに、当該データパケットに付与する順序番号を更新することを特徴とする、付記40に記載のデータ送信方法。
(付記42)前記再送処理中に前記データ受信装置から前記応答パケットを受信し、かつ、正常受信したデータパケットの数よりも、再送したデータパケット数が多い場合は、再送処理中のデータパケットを送信後に再送処理を中止し、更新後の読み出し可能なエントリに記憶されている先頭位置を新たに判別し、当該新たに判別した先頭位置から前記パケット記憶部に登録されたデータパケットから再送を再開することを特徴とする付記38に記載のデータ送信方法。