(58)【調査した分野】(Int.Cl.,DB名)
請求項1に記載の方法において、汎用化後の前記少なくとも1つのプロトコルヘッダを、当該ネットワークスイッチの送信ポートの出口側ポートタイプ(egress portType)に基づいて変更する、方法。
請求項1に記載の方法において、汎用的な命令の前記セットが、あるプロトコルの第1の変種のパケットヘッダを変更するために、かつ、当該プロトコルの第2の変種のパケットヘッダを変更するために使用される、方法。
請求項1に記載の方法において、汎用的な命令の前記セットが、第1のプロトコルのパケットヘッダを変更するために、かつ、第2のプロトコルのパケットヘッダを変更するために使用される、方法。
【発明を実施するための形態】
【0021】
以降では、説明目的の具体例を幾つか述べる。当業者であれば、それらの具体例以外でも本発明を実施できることを理解するであろう。すなわち、本発明は図示の実施形態に必ずしも限定されず、本明細書で述べる原理及び特徴に沿った最大限の範囲を包含する。
【0022】
[序論]
ネットワークスイッチ等のネットワークデバイスは、ネットワーク上のトラフィックのスイッチングつまりルーティングを行うことができる。ネットワークスイッチは、パケットを受信する少なくとも1つの入力ポートつまり受信ポート、およびパケットを送信する少なくとも1つの出力ポートつまり送信ポートを備える。一部の実施形態において、ネットワークスイッチは、さらに、パーサ(パース処理手段)およびリライタ(書き換え手段)を備える。パーサ(解析手段)は、ネットワーク上のパケット(ネットワークパケット)のコンテンツを特定する少なくとも1つのパーサエンジンを含み得る。リライタ(再書込手段)は、パケットを、ネットワークスイッチから送出する前に変更する少なくとも1つのリライトエンジンを含み得る。これら少なくとも1つのパーサエンジンおよび少なくとも1つのリライトエンジンは、自由に変更可能であり、プログラマブル(設定可能)に動作し得る。
【0023】
上記ネットワークスイッチは、さらに、当該ネットワークスイッチが使用するデータを記憶するメモリを備える。一例において、このメモリは、汎用的な命令のセットを記憶する。簡単に述べると、これら汎用的な命令は、プロトコルヘッダを変更するために典型的に使用される。他の例において、そのメモリは、さらに、プロトコルの汎用フォーマットについてのソフトウェア定義のマッピングのセットを記憶する。簡単に述べると、各プロトコルヘッダは、そのソフトウェア定義のマッピングのうち、そのプロトコルに特有であるマッピングに従った表現に変換され得る。後で詳述するように、これらのマッピングは、あるプロトコルの、互いに異なる変種にも、互いに異なるプロトコルにも適用可能であると共に、将来の新しいプロトコルにも適用(対応)可能である。さらなる他の例において、上記メモリは、さらに、プロトコルテーブルを記憶する。簡単に述べると、このプロトコルテーブルは、各プロトコルレイヤ組合せにおける各プロトコルレイヤのレイヤ情報を含む。各プロトコルレイヤ組合せは、そのプロトコルテーブル内にプログラム(書き込まれる)される。さらなる他の例において、上記メモリは、さらに、計数値(counter)および統計量(statistic)を記憶する。
【0024】
イーサネット(登録商標)では、パケットが複数のプロトコルレイヤを含む。各プロトコルレイヤは、互いに異なる情報を伝達する。そのようなレイヤとして、例えば:イーサネット;PBBイーサネット;ARP;IPv4;IPv6;MPLS;FCoE;TCP;UDP;ICMP;IGMP;GRE;ICMPv6;VxLAN;TRILL;CNM;等が周知である。
【0025】
理論的に言えば、プロトコルレイヤは任意の順番であってもよい。しかし実際には周知のレイヤ組合せとなる。有効なレイヤ組合せとして、例えば:イーサネット;イーサネット,ARP;イーサネット,CNM;イーサネット,FCoE;イーサネット,IPv4;イーサネット,IPv4,ICMP;イーサネット,IPv4,IGMP;等がある。
【0026】
[パケットの固有の識別子(固有のパケット識別子)]
一部の実施形態において、上記ネットワークスイッチは、17種類のプロトコルおよび8層のプロトコルレイヤをサポートする。すなわち、8
17通りのプロトコルレイヤ組合せが想定され得る。
図1に、パケット内のプロトコルレイヤ組合せの複数例を示す。一例として、パケットは、イーサネット,IPv4,ICMPのような3層プロトコルレイヤ組合せを有し得る。他の例として、パケットは、イーサネット,IPv4,UDP,VxLAN,イーサネット,ARPのような7層プロトコルレイヤ組合せを有し得る。
【0027】
8
17通りのプロトコルレイヤ組合せが想定されるものの、周知のレイヤ組合せはごく一部である。既知の全てのプロトコルレイヤ組合せが、一意的に特定され、パケット識別子(PktID)と称される固有の番号に翻訳(変換)され得る。上記ネットワークスイッチのメモリに記憶されたプロトコルテーブルは、既知の各プロトコルレイヤ組合せにおける各レイヤのレイヤ情報を含むようにプログラムされ得る。実際的には、ローカルなプロトコルテーブルに含まれるプロトコルレイヤ組合せの数は、256未満になり得る。一部の実施形態において、このローカルなプロトコルテーブルに含まれる既知のプロトコルレイヤ組合せの数は、212である。しかしながら、このローカルなテーブルは、これを上回る数の又はこれを下回る数のプロトコルレイヤ組合せを含むようにプログラムされてもよい。
【0028】
図2に、本発明の一部の実施形態での、ローカルなプロトコルテーブル200の構造の一例を示す。ローカルなテーブル200内のプロトコルレイヤ組合せのそれぞれは、PktIDによって索引付けられ、そのプロトコルレイヤ組合せにおける各プロトコルレイヤのレイヤ情報を含み得る。
図2では、これらの情報は、レイヤ0情報、レイヤ1情報およびレイヤN情報と称されている。このようにPktIDで索引付けすることにより、パケット内のN個の全てのレイヤの、どのレイヤについてのレイヤ情報にもアクセス又は取り出すことが可能である。
【0029】
各プロトコルレイヤのレイヤ情報は、少なくとも:レイヤタイプ(LayerType);レイヤデータオフセット(LayerDataOffset);および付帯情報(MiscellaneousInformation);を含む。しかしながら、ローカルなテーブル200には、より多くの種類の情報が記憶されてもよい。簡単に述べると、レイヤタイプ(LayerType)は、そのプロトコルレイヤのプロトコル(例えば、IP、TCP、UDPまたはイーサネット)を指す。レイヤデータオフセット(LayerDataOffset)は、そのプロトコルレイヤ内においてレイヤデータが開始する位置(開始位置)を供与する。付帯情報(MiscellaneousInformation)は、チェックサム、長さデータ等のデータを含む。
【0030】
典型的に、上記パーサエンジンは、ネットワークスイッチが受信した受信パケットのPktIDを特定することができる。上記リライトエンジンが、そのPktIDを上記プロトコルテーブルのキーとして用いることにより、そのパケットにおける各プロトコルレイヤを変更用に汎用化するのに必要な全ての情報を、このプロトコルテーブルが当該リライトエンジンに供給し得る。すなわち、上記リライトエンジンは、上記パーサエンジンがパース処理した結果を受け取るのではなく、PktIDを用いることにより、上記プロトコルテーブル内に存在する、そのパケットの各プロトコルレイヤのレイヤ情報にアクセスし得るか又はそのような情報を上記プロトコルテーブルから取り出し得る。
【0031】
<レイヤタイプ>
レイヤタイプ(LayerType)と、パケットの1つ以上のフィールドについてのハッシュとの固有の組合せにより、上記リライトエンジンに、各プロトコルレイヤの汎用フォーマットが供与され得る。一部の実施形態において、この固有の組合せにより、上記メモリに記憶された、プロトコルの汎用フォーマットについてのソフトウェア定義のマッピングのうちの1つが指定され得る。上記リライトエンジンは、この汎用フォーマットを使用して、プロトコルレイヤの拡張、さらには、ソフトウェア命令を用いてのプロトコルレイヤの変更を行い得る。このレイヤタイプ(LayerType)が、さらに、パケット内においてそのプロトコルレイヤが開始する位置(開始位置)を、上記リライトエンジンに教示し得る。
【0032】
<レイヤデータオフセット>
上記リライトエンジンは、パケット内の所与のデータを用いて、受信ヘッダにおけるレイヤを変更するが、そのパケット内における当該データの位置はどこであってもよい。レイヤのサイズは様々に変化し得るため、上記リライトエンジンによる変更時に必要な、データのオフセット自体も、様々に変化し得る。このことは、リライトエンジンがどのデータをどこから選択できるのかに関してのハードウェア面での柔軟性を低下させる原因となり得る。
【0033】
受信パケットのヘッダから抽出されるデータは、レイヤ単位で配置される。具体的に述べると、抽出されるデータ構造内において各レイヤデータ構造が開始するオフセット(開始位置)は、PktID毎に固有である。各レイヤのレイヤデータオフセット(LayerDataOffset)は、抽出されるデータについて、その変更時に用いる位置を特定するのに使用され得る。パケット内のレイヤ構造も、レイヤから抽出するデータの位置も、そのパケットのPktIDで特定され得る。このように、ソフトウェアもハードウェアも、抽出されるデータを同じ固有の識別子を用いて管理するので、リライトエンジンの命令を簡略化することが可能になる。
【0034】
<付帯情報>
チェックサム、長さデータ等の付帯情報(MiscellaneousInformation)は、チェックサムの再計算およびヘッダの長さの更新などといった、そのプロトコルレイヤの特殊な取扱い要件を、上記リライトエンジンに教示し得る。
【0035】
パケット汎用化手法は、少数のセットの汎用的な命令を定義することを可能にする。この汎用的な命令のセットは、所与のプロトコルに単に基づくものであり、そのプロトコルレイヤの前後のプロトコルレイヤの影響を受けない。このパケット汎用化手法は、さらに、将来起こり得るプロトコルの改変や追加の影響を受け難い、ハードウェア面での柔軟性をもたらすことができる。
【0036】
図3に、本発明の一部の実施形態での、ネットワークスイッチの動作方法の一例300を示す。典型的に、このネットワークスイッチは、前記パーサエンジンおよび前記リライトエンジンを備える。
【0037】
過程305で、前記パーサエンジンが、受信パケットを調べて当該受信パケットのPktIDを特定する。一部の実施形態では、前記パーサエンジンが、そのパケットをパース処理したデータではなく前記PktIDを前記リライトエンジンに入力する。
【0038】
過程310で、前記リライトエンジンが、前記ネットワークスイッチが受け取る複数のパケットの互いに異なるパケット構造を定義するプロトコルテーブルを参照する。前記リライトエンジンが、前記PktIDを前記プロトコルテーブルのキーとして用いて、変更に必要な、パケットの各プロトコルレイヤのレイヤ情報を取り出し得る。
【0039】
過程315で、前記リライトエンジンが、前記プロトコルテーブルに記憶されたデータに基づいてパケットを変更する。典型的には、パケットを変更するのに先立って、前記リライトエンジンが、そのパケットの各プロトコルレイヤを拡張する。プロトコルレイヤの拡張および変更の詳細については、後で説明する。
【0040】
図4に、本発明の一部の実施形態での、ネットワークスイッチの動作方法の他の例400を示す。典型的に、このネットワークスイッチは、メモリおよび少なくとも1つの受信ポートを備える。
【0041】
過程405で、前記メモリに、プロトコルテーブルを記憶する。このプロトコルテーブルは、複数のパケットの互いに異なるパケット構造を定義する。これらパケット構造のそれぞれは、PktIDによって索引付けられる。また、これらパケット構造は、プロトコルレイヤ組合せを表し、かつ、そのプロトコルレイヤ組合せにおける各プロトコルレイヤのレイヤ情報を含む。前記プロトコルテーブルは、新しいプロトコルを表した新しいパケット構造を追加するために更新され得る。また、前記プロトコルテーブルは、プロトコルの改変に応答して、パケット構造を変更するために更新され得る。
【0042】
過程410で、前記受信ポートにおいてパケットを受信する。
【0043】
過程415で、そのパケットのPktIDを特定する。一部の実施形態では、前記パーサエンジンが、そのパケットのPktIDを特定する。
【0044】
過程420で、そのパケットの各プロトコルレイヤのレイヤ情報にアクセスする。典型的に、このレイヤ情報は、前記プロトコルテーブル内に存在する。一部の実施形態では、このレイヤ情報を用いることにより、そのパケットのプロトコルヘッダを、そのプロトコルの汎用フォーマットに従って汎用化する。この汎用フォーマットは、前記メモリ内にソフトウェアで定義され得る。
【0045】
既述したように、少なくとも1つの命令を汎用化後のプロトコルヘッダに適用することにより、その汎用化後のプロトコルヘッダを変更することができる。一部の実施形態では、その汎用化後のプロトコルヘッダを変更するのに使用する、データの位置を、前記レイヤ情報を用いて決定する。典型的には、前記ネットワークスイッチの前記リライトエンジンにより、プロトコルヘッダの汎用化、さらには、汎用化後のプロトコルヘッダの変更を行う。
【0046】
[汎用フォーマット]
略述したように、前記リライトエンジンが、パケットの各プロトコルヘッダを、そのプロトコルに特有である汎用フォーマットで表現することにより、パケットにプログラマブルな変更を可能にする。これにより、パケットのヘッダを変更する際のハードウェア面およびソフトウェア面での柔軟性が向上する。
【0047】
図5は、本発明の一部の実施形態において、受信パケットにおける様々なレイヤのヘッダを汎用フォーマットに拡張する様子を示す概略構成500である。
図5の受信パケットは、8層のプロトコルレイヤを含む。そして、各プロトコルレイヤは、そのプロトコルに対応したヘッダ(プロトコルヘッダ)を有する。なお、プロトコルレイヤの層数は、8層を超える場合も8層未満の場合もあり得る。リライトエンジンは、どのプロトコルヘッダからも、欠けているフィールドを検出することができると共に、各プロトコルヘッダを
図5に示すような汎用フォーマットに拡張することができる。「正準レイヤ」つまり「正準化されたレイヤ」とは、汎用フォーマットに拡張されたプロトコルレイヤのことを指す。手短に言って、正準レイヤのそれぞれは、無効フィールドについてはビットが0にマークされて有効フィールドについてはビットが1にマークされたビットベクトルを備える。
【0048】
図6A〜
図8Cに、本発明の一部の実施形態において、リライトエンジンがイーサネットプロトコルを扱う各種例を示す。
図6A〜
図8Cに示された各種例は、本発明にかかるリライトエンジンにより、あるプロトコル(これらの例では、イーサネットプロトコル)の、互いに異なる変種を扱うことができることを証明している。各例には、イーサネットプロトコルの受信時のヘッダと、その汎用フォーマットとが描かれている。他種のプロトコルの場合の説明は省略するが、本発明にかかるリライトエンジンは、他種のプロトコル合も同様に扱うことができる。
【0049】
図6Aに、受信パケット内のイーサネットパケットヘッダのフォーマットの一例600を示す。このイーサネットパケットヘッダ600は、22バイトであり、送信元アドレス(SA)フィールド、宛先アドレス(DA)フィールド、サービスVLANタグフィールド、カスタマVLANタグフィールドおよびイーサタイプフィールドの、5つのフィールドを有する。SAフィールドおよびDAフィールドは、いずれも6バイトである。サービスVLANタグフィールドおよびカスタマVLANタグフィールドは、いずれも4バイトである。イーサタイプフィールドは、2バイトである。このイーサネットパケットヘッダ600を含むパケットは、イーサネットパケットの変種のなかでも最も大きい変種であり、そのサイズは最大22バイトであり得る。
【0050】
リライトエンジンは、イーサネットパケットヘッダ600を処理して、当該イーサネットパケットヘッダ600には欠けているフィールドがないと判断する。このように、イーサネットパケットヘッダ600は想定されるフィールド全てを備えていることから、このイーサネットパケットヘッダ600の汎用フォーマットは、イーサネットパケットヘッダ600と全く同一になる。
図6Bに、
図6Aのイーサネットパケットヘッダ600を表したビットベクトル605を示す。ビットベクトル605の各ビットは、イーサネットパケットヘッダ600の22バイトのうちの1バイトにそれぞれ対応する。イーサネットパケットヘッダ600には、フィールド全てが存在していることから、当該イーサネットパケットヘッダ600のフィールド全てが有効フィールドとなる(すなわち、数値を有する)。したがって、ビットベクトル605のビットは全て「1」である。つまり、イーサネットパケットヘッダ600は、{22’b111111_111111_1111_1111_11}という汎用フォーマットで表現することができる。
【0051】
図7Aに、受信パケットのイーサネットパケットヘッダのフォーマットの他の例700を示す。このイーサネットパケットヘッダ700は、18バイトであり、SAフィールド、DAフィールド、カスタマVLANタグフィールドおよびイーサタイプフィールドの、4つのフィールドしか有していない。すなわち、イーサネットパケットヘッダ700には、サービスVLANタグフィールドが欠けている。このイーサネットパケットヘッダ700を含むパケットも、イーサネットパケットの変種である。
【0052】
リライトエンジンは、イーサネットパケットヘッダ700を処理して、当該イーサネットパケットヘッダ700にはサービスVLANタグフィールドが欠けていると判断し、当該イーサネットパケットヘッダ700の汎用フォーマットにおける適切な位置に、欠けているサービスVLANタグフィールドを含めることにより、そのイーサネットパケットヘッダ700を最大サイズである22バイトに拡張する。
図7Bに、拡張後のイーサネットパケットヘッダの汎用フォーマット700’を示す。拡張後のイーサネットパケットヘッダ700’は、欠けていたサービスVLANタグフィールドも含め、イーサネットプロトコルについて想定されるフィールド全てを備えている。拡張後のイーサネットパケットヘッダ700’内の有効フィールドは、拡張前のイーサネットパケットヘッダ700から存在していたSAフィールド、DAフィールド、カスタマVLANタグフィールドおよびイーサタイプフィールドである。拡張後のイーサネットパケットヘッダ700’内の無効フィールドは、拡張前のイーサネットパケットヘッダ700内には存在せずに拡張後のイーサネットパケットヘッダ700’で追加された、サービスVLANタグフィールドである。
【0053】
図7Cに、
図7Bの拡張後のイーサネットパケットヘッダ700’を表したビットベクトル705を示す。ビットベクトル705の各ビットは、拡張後のイーサネットパケットヘッダ700’の22バイトのうちの1バイトにそれぞれ対応する。ビットベクトル705は、SAフィールド、DAフィールド、カスタマVLANタグフィールドおよびイーサタイプフィールドからなる有効フィールド全てについて「1」である。また、ビットベクトル705は、サービスVLANタグフィールドのみからなる無効フィールド全てについて「0」である。つまり、イーサネットパケットヘッダ700は、{22’b111111_111111_0000_1111_11}という汎用フォーマットで表現することができる。
【0054】
図8Aに、受信パケットのイーサネットパケットヘッダのフォーマットのさらなる他の例800を示す。このイーサネットパケットヘッダ800は、14バイトであり、SAフィールド、DAフィールドおよびイーサタイプフィールドの、3つのフィールドしか有していない。すなわち、イーサネットパケットヘッダ800には、サービスVLANタグフィールドとカスタマVLANタグフィールドとが欠けている。このイーサネットパケットヘッダ800を含むパケットは、イーサネットパケットの変種のなかでも最も小さい変種である。
【0055】
リライトエンジンは、イーサネットパケットヘッダ800を処理して、当該イーサネットパケットヘッダ800にはサービスVLANタグフィールドとカスタマVLANタグフィールドとが欠けていると判断し、当該イーサネットパケットヘッダ800の汎用フォーマットにおける適切な位置に、欠けているサービスVLANタグフィールドとカスタマVLANタグフィールドとを含めることにより、そのイーサネットパケットヘッダ800を最大サイズである22バイトに拡張する。
図8Bに、拡張後のイーサネットパケットヘッダの汎用フォーマット800’を示す。拡張後のイーサネットパケットヘッダ800’は、欠けていたサービスVLANタグフィールドおよびカスタマVLANタグフィールドも含め、イーサネットプロトコルについて想定される全てのフィールドを備えている。拡張後のイーサネットパケットヘッダ800’内の有効フィールドは、拡張前のイーサネットパケットヘッダ800から存在していたSAフィールド、DAフィールドおよびイーサタイプフィールドである。拡張後のイーサネットパケットヘッダ800’内の無効フィールドは、拡張前のイーサネットパケットヘッダ800内に存在せずに拡張後のイーサネットパケットヘッダ800’で追加された、サービスVLANタグフィールドおよびカスタマVLANタグフィールドである。
【0056】
図8Cに、
図8Bの拡張後のイーサネットパケットヘッダ800’を表したビットベクトル805を示す。ビットベクトル805の各ビットは、拡張後のイーサネットパケットヘッダ800’の22バイトのうちの1バイトにそれぞれ対応する。ビットベクトル805は、SAフィールド、DAフィールドおよびイーサタイプフィールドからなる有効フィールド全てについて「1」である。また、ビットベクトル805は、サービスVLANタグフィールドおよびカスタマVLANタグフィールドからなる無効フィールド全てについて「0」である。つまり、イーサネットパケットヘッダ800は、{22’b111111_111111_0000_0000_11}という汎用フォーマットで表現することができる。
【0057】
図6A〜
図8Cから分かるように、イーサネットヘッダを汎用フォーマットに拡張することにより、フィールドのオフセットは、受信時のイーサネットヘッダの変種にかかわらず、最大サイズを有するイーサネットヘッダ(これらの例では、
図6Aのイーサネットパケットヘッダ600)のオフセットと同一になる。このようにイーサネットヘッダを、最大サイズを有するイーサネットヘッダに拡張することにより、受信時のイーサネットヘッダにかかわらず、同一のセットのソフトウェア命令での処理が可能になるので有利である。よって、例えばイーサタイプフィールドを変更する命令は、どのようなイーサネットヘッダを受信したのかにかかわらず常に同一のオフセットを指すことができる。
【0058】
パケットヘッダの汎用フォーマットを用いることにより、そのパケットヘッダを変更する際のハードウェア面およびソフトウェア面での柔軟性が向上する。ハードウェアは、そのパケットヘッダの変更を、当該パケットヘッダ内におけるフィールドの位置に関係なく実施することができる。ソフトウェアにより、新しいプロトコルを支援するようにハードウェアをプログラムすることができる。また、ソフトウェアにより、ハードウェアのテーブル内に、ヘッダの各種プロトコルに用いる汎用フォーマットをプログラムすることができる。
【0059】
[仮定1](受信パケットは単一タグ付きイーサネットパケットであり、送信パケットはタグなしイーサネットパケットであると仮定)
ネットワークスイッチの入力イーサネットポートで受信した、カスタマVLANタグ付きのパケットを、タグがない状態で、出力イーサネットポートに送信する場合を考える。
図9Aに、その受信イーサネットポートで受信するパケット内の、イーサネットパケットヘッダのフォーマットの一例900を示す。その受信イーサネットポートで受信するパケットに対して、ソフトウェアにより、イーサネットヘッダの汎用フォーマットが、{22’b111111_111111_0000_1111_11}であるとプログラムされる。リライトエンジンは、そのヘッダ内のプロトコルレイヤを受け取って前記メモリを参照し、このメモリは、当該ヘッダのプロトコルの汎用フォーマットが{22’b111111_111111_0000_1111_11}であることをハードウェアに認識させる。この場合、ハードウェアでは、先頭から連続する12個の(いずれも「1」にマークされた)バイトと、4バイト分シフトして後に続く6個の(いずれも「1」にマークされた)バイトとの内容について待ち受ける。前記4バイト分は、ビットベクトルにおいて「0」にマークされた4個のビットに対応する、無効なバイトである。
【0060】
リライトエンジンは、上記の{22’b111111_111111_0000_1111_11}という汎用フォーマットに基づき、受信されたヘッダにおける前記プロトコルレイヤを、
図9Bに示す拡張後のヘッダ905に拡張し、拡張後のレイヤ905の各バイトに対して1ビットを管理する。
図9Cに、この拡張後のヘッダ905に対応するビットベクトル910を示す。ビットベクトル910は、どのバイトが有効でどのバイトが無効であるかを、前記ハードウェアに認識させる。
【0061】
本仮定1の送信方針(中継決定)によると、パケットは、タグがない状態で送信することが求められる。前記ハードウェアは、前記送信イーサネットポートの出口側ポートタイプ(egress portType)に基づいて命令テーブルを参照し、当該命令テーブルが、そのハードウェアに、カスタマVLANタグをデリート(消去)するように認識させる。カスタマVLANタグは、常に決まったオフセット(すなわち、16)で開始する。命令は汎用フォーマットに適用されるため、カスタマVLANタグをデリートする命令は、「位置16から開始する(カスタマVLANタグの)4バイト分をデリートする」という命令になる。前記ハードウェアは、単にその4バイト分を無効であるとマークして、これらをデリートする。
図9Dに、汎用フォーマットで、タグがない状態のイーサネットヘッダ915を示す。
図9Eに、このタグがない状態のイーサネットヘッダ915に対するビットベクトル920を示す。前記ハードウェアは、無効なバイトを全て除外することにより、
図9Fに示すような新しいヘッダ925を形成する。そして、パケットが、その新しいヘッダ925付きで、前記送信イーサネットポートから送出される。
【0062】
[仮定2](受信パケットは二重タグ付きイーサネットパケットであり、送信パケットはタグなしイーサネットパケットであると仮定)
ネットワークスイッチの入力イーサネットポートで受信した、サービスVLANタグおよびカスタマVLANタグ付きのパケットを、タグがない状態で、出力イーサネットポートに送信する場合を考える。
図10Aに、その受信イーサネットポートで受信するパケット内の、イーサネットパケットヘッダのフォーマットの一例1000を示す。その受信イーサネットポートで受信するパケットに対して、ソフトウェアにより、イーサネットヘッダの汎用フォーマットが、{22’b111111_111111_1111_1111_11}であるとプログラムされる。リライトエンジンは、そのヘッダ内のプロトコルレイヤを受け取って前記メモリを参照し、このメモリは、当該ヘッダのプロトコルの汎用フォーマットが{22’b111111_111111_1111_1111_11}であることをハードウェアに認識させる。この場合、ハードウェアは、連続する22個の(いずれも「1」にマークされた)バイトの内容について待ち受ける。
【0063】
リライトエンジンは、上記の{22’b111111_111111_1111_1111_11}という汎用フォーマットからみて、このプロトコルヘッダが既に最大サイズを有していることから、受信されたヘッダにおける前記プロトコルレイヤを拡張する必要がない。
図10Bに、このヘッダ1000に対応するビットベクトル1005を示す。ビットベクトル1005は、どのバイトが有効でどのバイトが無効であるかを、前記ハードウェアに認識させる。
【0064】
本仮定2の送信方針によると、パケットは、タグがない状態で送信することが求められる。前記ハードウェアは、前記送信イーサネットポートの出口側ポートタイプに基づいて命令テーブルを参照し、当該命令テーブルが、そのハードウェアに、カスタマVLANタグおよびサービスVLANタグをデリートするように認識させる。カスタマVLANタグは、常に決まったオフセット(具体的には、16)で開始する。同様に、サービスVLANタグは、常に決まったオフセット(具体的には、12)で開始する。命令は汎用フォーマットに適用されるため、カスタマVLANタグおよびサービスVLANタグをデリートする命令は、それぞれ、「位置16から開始する(カスタマVLANタグの)4バイト分をデリートする」という命令と、「位置12から開始する(サービスVLANタグの)4バイト分をデリートする」という命令になる。前記ハードウェアは、単にこれら8バイト分を無効であるとマークして、これらをデリートする。
図10Cに、汎用フォーマットで、タグがない状態のイーサネットヘッダ1010を示す。
図10Dに、このタグがない状態のイーサネットヘッダ1010に対するビットベクトル1015を示す。前記ハードウェアは、無効なバイトを全て除外することにより、
図10Eに示すような新しいヘッダ1020を形成する。そして、、パケットが、その新しいヘッダ1020付きで、前記送信イーサネットポートから送出される。
【0065】
[仮定3](受信パケットはタグなしイーサネットパケット、単一タグ付きイーサネットパケットまたは二重タグ付きイーサネットパケットであり、送信パケットは二重タグ付きイーサネットパケットであると仮定)
ネットワークスイッチの入力イーサネットポートで受信した、タグが付いていないパケット、またはサービスVLANタグ、カスタマVLANタグもしくは両方のタグが付いたパケットを、(別の)二重タグ付きの状態で、出力イーサネットポートに送信する場合を考える。前記受信パケットが二重タグ付きのパケットである場合、ソフトウェアにより、イーサネットヘッダの汎用フォーマットが、、{22’b111111_111111_1111_1111_11}であるとプログラムされる。前記受信パケットがタグの付いていないパケットである場合、ソフトウェアにより、イーサネットヘッダの汎用フォーマットが、{22’b111111_111111_0000_0000_11}であるとプログラムされる。前記受信パケットが単一タグ付きのパケットである場合、ソフトウェアにより、イーサネットヘッダの汎用フォーマットが、{22’b111111_111111_0000_1111_11}又は{22’b111111_111111_1111_0000_11}であるとプログラムされる。
【0066】
本仮定3の送信方針によると、パケットは、二重タグ付きで送信することが求められる。前記ハードウェアは、前記送信イーサネットポートの出口側ポートタイプに基づいて命令テーブルを参照し、当該命令テーブルは、そのハードウェアに、カスタマVLANタグおよびサービスVLANタグをそれぞれ別のものに置き換えるように認識させる。カスタマVLANタグは、常に決まったオフセット(具体的には、16)で開始する。同様に、サービスVLANタグは、常に決まったオフセット(具体的には、12)で開始する。どちらのタグについても、同様の命令が使用される。汎用フォーマットに適用される命令を用いることから、それぞれの命令は「レイヤデータ位置X(layerData.locationX)から(サービスVLANタグの)4バイト分を開始位置(startLocation)=12にコピーする」という命令と「レイヤデータ位置Y(layerData.locationY)から(サービスVLANタグの)4バイト分を開始位置(startLocation)=16にコピーする」という命令になる。このとき、レイヤデータ位置X(layerData.locationX)およびレイヤデータ位置Y(layerData.locationY)によって指定される位置から、それぞれのコンテンツがコピーされる。
【0067】
以上の仮定1〜3によって示されたとおり、ハードウェア内のリライトエンジンを簡略化することができると共に、メモリ内に設定されるソフトウェア命令を小規模に抑えることができる。これにより、命令を保持するために必要なハードウェアメモリを浅く(小容量)にすることができる。
【0068】
図11に、本発明の一部の実施形態での、リライトエンジンの動作方法1100を示す。過程1105で、リライトエンジンにより、受信パケットのプロトコルヘッダから、欠けているフィールドを検出する。
【0069】
過程1110で、リライトエンジンにより、前記プロトコルヘッダを、前記検出の結果に基づいて、そのプロトコルの汎用フォーマットに拡張する。前記汎用フォーマットは、前記プロトコルについて想定されるフィールドを全て備えている。それら各フィールドのオフセットは、前記プロトコルヘッダのプロトコルの変種にかかわらず同一である。リライトエンジンは、拡張後のプロトコルヘッダに対するビットベクトルを保持し、当該ビットベクトルは、その拡張後のプロトコルヘッダの各バイトに対して1ビットを有する。リライトエンジンにより、有効フィールドにおける全てのバイトに対する各ビットを、有効であるとマークする。有効フィールドは、前記受信パケットの前記プロトコルヘッダ内に存在するフィールドである。リライトエンジンにより、無効フィールドにおける全てのバイトに対する各ビットを、無効であるとマークする。無効フィールドは、前記受信パケットの前記プロトコルヘッダ内に存在しないフィールドである。
【0070】
一部の実施形態では、過程1105および過程1110を、前記受信パケットの各プロトコルレイヤに対して実行する。
【0071】
図12に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1200を示す。一部の実施形態において、このネットワークスイッチは、プロトコルの汎用フォーマットについての、ソフトウェア定義のマッピングを可能にし、そのソフトウェア定義のマッピングを、当該ネットワークスイッチのメモリに記憶する。このネットワークスイッチは、プロトコルヘッダを汎用化するリライトエンジンを備える。過程1205で、そのネットワークスイッチの受信ポートでパケットを受信する。
【0072】
過程1210で、パケットのプロトコルヘッダを、そのプロトコルの汎用フォーマットに従って汎用化する。具体的に説明すると、既述したように、そのプロトコルヘッダが、前記ネットワークスイッチの前記メモリに記憶された前記マッピングのうちの1つに従ってハードウェアにより拡張される。拡張後のプロトコルヘッダに対するビットベクトルが、どのバイトが有効でどのバイトが無効であるかを、そのハードウェアに認識させる。
【0073】
過程1215で、少なくとも1つの命令を、汎用化後のプロトコルヘッダに適用することにより、当該汎用化後のプロトコルヘッダを変更する。具体的に説明すると、既述したように、ハードウェアが、送信イーサネットポートの出口側ポートタイプに基づいて命令テーブルを参照することにより、そのプロトコルヘッダに適用すべき前記少なくとも1つの命令を決定する。
【0074】
過程1220で、変更後のプロトコルヘッダにおける無効なバイトを全て除外することにより、新しいヘッダを形成する。
【0075】
過程1225で、前記パケットを、前記新しいヘッダ付きで、前記ネットワークスイッチの送信ポートから送出する。
【0076】
図13に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1300を示す。過程1305で、プロトコルの汎用フォーマットについてのソフトウェア定義のマッピングを有するように、このネットワークスイッチを構成する。具体的に述べると、前記ソフトウェア定義のマッピングを、そのネットワークスイッチのメモリに記憶する。
【0077】
過程1310で、前記ネットワークスイッチの受信ポートでパケットを受信する。
【0078】
過程1315で、前記パケットのプロトコルヘッダを、前記ソフトウェア定義のマッピングのうちの1つに基づいて汎用化する。
【0079】
過程1320で、汎用化後のプロトコルヘッダに対するビットベクトルを保持する。このビットベクトルは、その汎用化後のプロトコルヘッダの各バイトに対して1ビットを有する。
【0080】
[汎用化後のプロトコルヘッダの最適な表現様式]
受信時の各レイヤに含まれるバイト数は、例えば64バイトであったり、128バイトであったり、あるいは、それ以上にもなり得る。なお、これまでの例における拡張後のイーサネットヘッダのバイト数は、22バイトであった。プロトコルレイヤ内の全てのバイトをビットベクトルで表そうとすると、プロトコルによっては最悪の場合、メモリを大量に消費することになり、効率が良いとは言えないことがある。現代のシステムオンチップ(SOC)設計では、通常、組み込まれるメモリの面積および電力予算がチップ全体の予算を大きく占める。そのため、限られたメモリリソースを効率的に利用することが重要となる。
【0081】
「ホール」すなわち無効なバイトが少ないプロトコルが大半を占める場合、ヘッダの汎用フォーマットを、連続するバイトの計数値と、それ以降の連続しないバイトを表した小規模のビットベクトルと、で表現するほうが低コストになる。一部の実施形態において、この小規模のビットベクトルのサイズは、プログラマブルであるが、典型的には一定とされる。このサイズは、1つのプロトコルのこのような表現において記憶する必要がある非連続バイトの個数の最大値を、複数のプロトコルの統計から求めて調節可能であり得る。
【0082】
一部の実施形態において、パケットの汎用フォーマットは、連続バイト(continuous_byte)フィールドとビットベクトル(bitvector)フィールドとの2つのフィールドを有するデータ構造を用いた表現により、最適に表現することができる。連続バイト(continuous_byte)フィールドは、そのプロトコルレイヤ内において先頭から連続する有効なバイトの個数を表す。ビットベクトル(bitvector)フィールドは、そのプロトコルレイヤの各バイトをビットで表したものである。詳細には、このビットベクトル(bitvector)フィールドは、「ホール」すなわち無効なバイトを示す。ビットベクトル(bitvector)フィールドは、全てのプロトコルとは言わないが、ほぼ全てのプロトコルに対処することができる。このように、最適な表現とは、{連続バイト(continuous_byte),ビットベクトル(bitvector)}による表現である。このデータ構造は、プロトコルヘッダのサイズにに影響されない。
【0083】
一例として、
図6Bのビットベクトル605は{22,0000_0000_0000_0000}とコンパクトに表現することができる。これは、
図6Aのイーサネットパケットヘッダ600の先頭から連続するバイト数が22であることを表している。そのビットベクトル(bitvector)フィールドは、無効なバイトがないので全て「0」である。
【0084】
他の例として、
図7Cのビットベクトル705は{12,0000_1111_1100_0000}とコンパクトに表現することができる。これは、
図7Bの拡張後のイーサネットパケットヘッダ700’の先頭から連続するバイト数が12であり、その次に無効なバイトが4個続いてから、有効なバイトが6個続くことを表している。
【0085】
さらなる他の例として、
図8Cのビットベクトル805は{12,0000_0000_1100_0000}とコンパクトに表現することができる。これは、
図8Bの拡張後のイーサネットパケットヘッダ800’の先頭から連続するバイト数が12であり、その次に無効なバイトが8個続いてから、有効なバイトが2個続くことを表している。
【0086】
図14に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1400を示す。過程1405で、拡張後のプロトコルヘッダを得る。既述したように、拡張後のプロトコルヘッダとは、受信パケットのプロトコルヘッダを、そのプロトコルの汎用フォーマットに従って汎用化したものである。典型的に、プロトコルヘッダの汎用化は、リライトエンジンが、そのプロトコルヘッダから欠けているフィールドを検出し、さらに、そのプロトコルヘッダを、当該検出の結果に基づいて汎用フォーマットに従って拡張することで実行される。汎用フォーマットは、そのプロトコルについて想定される全てのフィールドを備えている。それら各フィールドのオフセットは、そのプロトコルヘッダのプロトコルの変種にかかわらず同一である。
【0087】
過程1410で、拡張後のプロトコルヘッダの表現を保持する。この表現は、連続バイト(continuous_byte)フィールドとビットベクトル(bitvector)フィールドとを有するデータ構造である。
【0088】
過程1415で、連続バイト(continuous_byte)フィールドを、拡張後のプロトコルヘッダの先頭から連続する有効なバイト数に設定する。
【0089】
過程1420で、ビットベクトル(bitvector)フィールドについて、前記連続する有効なバイトの後の、無効フィールドにおける全てのバイトに対する各ビットを、無効であるとマークする。無効フィールドのそれぞれは、前記受信パケットのプロトコルヘッダ内に存在しないフィールドである。
【0090】
過程1425で、ビットベクトル(bitvector)フィールドについて、前記連続する有効なバイトの後の、有効フィールドにおける全てのバイトに対する各ビットを、有効であるとマークする。有効フィールドのそれぞれは、前記受信パケットのプロトコルヘッダ内に存在するフィールドである。
【0091】
図15に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1500を示す。過程1505で、このネットワークスイッチの受信ポートでパケットを受信する。
【0092】
過程1510で、そのパケットのプロトコルヘッダを、そのプロトコルの汎用フォーマットに従って汎用化する。典型的に、プロトコルの汎用化は、リライトエンジンにより実行される。
【0093】
過程1515で、汎用化後のプロトコルヘッダを、そのプロトコルヘッダのサイズに影響されないデータ構造で表現する。一部の実施形態において、このデータ構造は、プロトコルレイヤの先頭から連続する有効なバイト数を表した連続バイト(continuous_byte)フィールドと、そのプロトコルヘッダの各バイトをビットで表したビットベクトル(bitvector)フィールドとを有する。
【0094】
このようなデータ構造を用いることにより、各種プロトコルレイヤを表す汎用的な表現を、プロトコルレイヤヘッダのサイズに影響されない表現とすることができる。また、ビットベクトルをコンパクトに表現するので、ハードウェアコストを削減することができて有利である。
【0095】
[ヘッダの変更に用いる汎用的な命令]
変更は、拡張後のプロトコルヘッダに適用され得る汎用的な命令のセットを用いる。これら命令は、受信時のヘッダ(例えば、サイズ、プロトコルなど)に影響されないので、いずれも汎用的な命令であると言える。
【0096】
以下の表1に、リライトエンジンがプロトコルヘッダの変更のために使用する、汎用的な命令の一覧を示す。このように、少数セットの汎用的な命令を、受信時のパケットのヘッダ(例えば、サイズ、プロトコルなど)にかかわらずヘッダの変更に用いることができるのは、その変更対象のパケットのヘッダが変更に先立って汎用化されているからである。典型的に、これら汎用的な命令は、ソフトウェアによりプログラム可能なマイクロコードのように機能する。
【0098】
デリート(DELETE)命令は、汎用化後のプロトコルレイヤ内において開始(Start)位置からサイズ(Size)分のバイトを、無効なバイトとすることによりデリートし得る。具体的に述べると、ビットベクトルのうち、これらのバイトに対応するビットが0にマークされ得る。
【0099】
コピー(COPY)命令は、ソース(Source)のソースオフセット(SourceOffset)から、サイズ(Size)分のバイトのデータを、汎用化後のプロトコルレイヤの宛先オフセット(DestinationOffset)にコピーし得る。また、コピー(COPY)命令は、ソース(Source)のデータの有効性に応じて、対応するコピー先のバイトを有効なバイト又は無効なバイトにし得る。具体的に述べると、ビットベクトルにおいて無効なバイトを表すビットが0にマークされ得る。ビットベクトルにおいて有効なバイトを表すビットが1にマークされ得る。また、コピー(COPY)命令は、ビットマスク(Bitmask)を用いてビットマスク演算を実行可能であり得る。また、コピー(COPY)命令は、コピー一定ビットマスク(copyConstantBitMask)およびコピー一定データ(copyConstantData)を使用可能であり得る。具体的に述べると、コピー一定ビットマスク(copyConstantBitMask)が所与のビット位置に「1」を有するとき、コピー一定データ(copyConstantData)における対応する位置のバイトを、汎用化後のヘッダレイヤにおける対応する位置にコピーし得る。一部の実施形態では、一定データはテーブルに記憶されている。一部の実施形態では、一定データが、ソフトウェアで定義される。
【0100】
移動(MOVE)命令は、汎用化後のプロトコルレイヤ内において開始オフセット(StartOffset)からサイズ(Size)分のバイトを、宛先オフセット(DestinationOffset)に移動し得る。また、移動(MOVE)命令は、ソース(Source)のデータの有効性に応じて、対応する移動先のバイトを有効なバイト又は無効なバイトにし得る。具体的に述べると、ビットベクトルにおいて無効なバイトを表すビットが0にマークされ得る。ビットベクトルにおいて有効なバイトを表すビットが1にマークされ得る。
【0101】
少なくとも1つのカウンタ(計数手段)を用いることにより、実行された全ての演算についての追加された又はデリートされたバイト数が計数され得る。この少なくとも1つのカウンタは、ハードウェアカウンタであり得る。あるいは、この少なくとも1つのカウンタは、ソフトウェアカウンタであり得る。この少なくとも1つのカウンタは、統計目的およびその他の目的で、その計数値を監視し得る。一部の実施形態では、リライトエンジンが、変更前のビットベクトルと変更後のビットベクトルとの2つのビットベクトルにXOR演算を実行することにより、変更のあったビット数をハードウェアに認識させる。この情報は、デリートされた又は追加されたバイトの数の計算に利用され得る。
【0102】
図16に、本発明の一部の実施形態での、リライトエンジンの他の動作方法1600を示す。このリライトエンジンは、ネットワークスイッチの一部であり、パケットをネットワークスイッチから送出される前に変更する。過程1605で、パケットの各プロトコルヘッダを、当該プロトコルヘッダの汎用フォーマットに従って汎用化する。この汎用フォーマットは、そのプロトコルについて想定されるフィールド全てを備える。よって、それら各フィールドのオフセットは、そのプロトコルヘッダのプロトコルの変種にかかわらず同一であり得る。汎用化後の各プロトコルヘッダは、ビットベクトルを備え得る。このビットベクトルは、汎用化後のプロトコルヘッダの各バイトに対して1ビットを有し得る。このビットベクトルは、無効フィールドについてはビットが0にマークされて有効フィールドについてはビットが1にマークされる。ここで、無効フィールドとは、受信時のパケットのプロトコルヘッダ内に存在しないフィールドであり、有効フィールドとは、受信時のパケットのプロトコルヘッダ内に存在するフィールドである。
【0103】
過程1610で、前記ネットワークスイッチのメモリに記憶された汎用的な命令のセットから、少なくとも1つの命令を用いることにより、汎用化後の少なくとも1つのプロトコルヘッダを変更する。汎用化後の少なくとも1つのプロトコルヘッダを、前記ネットワークスイッチの送信ポートの出口側ポートタイプに基づいて変更し得る。汎用化後の少なくとも1つのプロトコルヘッダを変更すると、ビットベクトルが更新され得る。
【0104】
汎用的な命令の前記セットは、受信時のパケットのヘッダにかかわらず、ヘッダを変更することができる。したがって、汎用的な命令の前記セットは、あるプロトコルの、第1の変種のパケットヘッダを変更するのにも第2の変種のパケットヘッダを変更するのにも使用され得る。同様に、汎用的な命令の前記セットは、第1のプロトコルのパケットヘッダを変更するのにも第2のプロトコルのパケットヘッダを変更するのにも使用され得る。
【0105】
図17に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1700を示す。過程1705で、ネットワークスイッチのメモリ内に、汎用的な命令のセットを保持する。
【0106】
過程1710で、前記ネットワークスイッチの受信ポートでパケットを受信する。
【0107】
過程1715で、前記パケットの各プロトコルヘッダを、当該プロトコルヘッダの汎用フォーマットに従って汎用化する。前記パケットの前記プロトコルヘッダから、欠けているフィールドを検出し得る。そのプロトコルヘッダを、前記検出の結果に基づいて、前記欠けているフィールドを含めることにより、前記汎用フォーマットに拡張し得る。汎用化後の各プロトコルヘッダは、無効フィールドについてはビットが0にマークされて有効フィールドについてはビットが1にマークされたビットベクトルを備える。ここで、無効フィールドとは、受信時のパケットのプロトコルヘッダ内に存在しないフィールドであり、有効フィールドとは、受信時のパケットのプロトコルヘッダ内に存在するフィールドである。
【0108】
過程1720で、汎用的な命令の前記セットから、少なくとも1つの命令を、汎用化後のプロトコルヘッダに適用することにより、汎用化後の少なくとも1つのプロトコルヘッダを変更する。これにより、前記ビットベクトルが更新される。
【0109】
過程1725で、更新後のビットベクトルに基づいて、新しいプロトコルヘッダを形成する。
【0110】
過程1730で、前記パケットを、前記新しいプロトコルヘッダ付きで、前記ネットワークスイッチの送信ポートから送信する。一部の実施形態では、前記パケットを前記新しいプロトコルヘッダ付きで送信するのに先立って、実行された全てのオペレーション(演算)について、追加された又はデリートされたバイト数を計数する。
【0111】
[変更後のプロトコルヘッダの、ビットベクトルを用いての減縮(縮小)]
リライトエンジンは、プロトコルヘッダを変更用の汎用フォーマットに基づいて拡張するためだけに限らず、そのプロトコルヘッダを当該汎用フォーマットから「通常の」フォーマットに減縮するためにも、各プロトコルヘッダに対するビットベクトルを用い得る。典型的に、ビットベクトルの各ビットは、汎用化後のプロトコルヘッダ内の1バイトを表している。ビットベクトルにおいて0にマークされたビットは無効なバイトに対応し、1にマークされたビットは有効なバイトに対応する。汎用化後のプロトコルヘッダに対して全ての命令が実行された後、リライトエンジンが、ビットベクトルを用いて無効なバイトを全て除外することにより、新しいプロトコルヘッダを形成し得る。このように、リライトエンジンは、ビットベクトルを用いて、パケット内のプロトコルヘッダを拡張することも減縮することも可能であり得る。つまり、汎用的な命令のセットを用いることにより、パケットの柔軟な変更が実施可能になり得る。
【0112】
一例として仮定1を参照すると、
図9Eのビットベクトル920は、
図9Bの汎用化後のプロトコルヘッダ905にデリート(Delete)命令を適用してなる、
図9Dの変更後のプロトコルヘッダ915を表している。この仮定1では、カスタマVLANタグがデリートされることで、そのカスタマVLANタグの4バイト分が無効にされる。すなわち、ビットベクトル920において、カスタマVLANタグに対応するビットが0にマークされる。全ての命令(仮定1ではデリート(Delete)命令)が実行された後、リライトエンジンが、ビットベクトル920を用いて無効なバイトを全て除外する。これにより、ビットベクトル920が減縮される。減縮後のビットベクトルに基づいて、新しいプロトコルヘッダが形成される。
図9Fには、無効なバイトが全て除外されてなる新しいプロトコルヘッダ925が示されている。仮定1のパケットは、この新しいヘッダ925付きで送信イーサネットポートから送出される。
【0113】
他の例として仮定2を参照すると、
図10Dのビットベクトル1015は、
図10Aのプロトコルヘッダ1000にデリート(Delete)命令を適用してなる、
図10Cの変更後のプロトコルヘッダ915を表している。この仮定2では、サービスVLANタグおよびカスタマVLANタグがデリートされることで、それらサービスVLANタグの4バイト分およびカスタマVLANタグの4バイト分が無効にされる。すなわち、ビットベクトル1015において、サービスVLANタグに対応するビットおよびカスタマVLANタグに対応するビットが0にマークされる。全ての命令(仮定2では2回のデリート(Delete)命令)が実行された後、リライトエンジンが、ビットベクトル1015を用いて無効なバイトを全て除外する。これにより、ビットベクトル1015が減縮される。減縮後のビットベクトルに基づいて、新しいプロトコルヘッダが形成される。
図10Eには、無効なバイトが全て除外されてなる新しいプロトコルヘッダ1020が示されている。仮定2のパケットは、この新しいヘッダ1020付きで送信イーサネットポートから送出される。
【0114】
図18に、本発明の一部の実施形態での、リライトエンジンのさらなる他の動作方法1800を示す。このリライトエンジンは、ネットワークスイッチの一部であり、パケットをネットワークスイッチから送出される前に変更する。過程1805で、汎用化後の各プロトコルヘッダに対するビットベクトルを保持する。汎用化後のプロトコルヘッダとは、パケットのうち、汎用フォーマットに拡張されたプロトコルヘッダのことである。この汎用フォーマットは、そのプロトコルについて想定される全てのフィールドを備えている。それら各フィールドのオフセットは、そのプロトコルヘッダのプロトコルの変種にかかわらず同一であり得る。前記ビットベクトルは、汎用化後のプロトコルヘッダの各バイトに対して1ビットを有し得る。
【0115】
過程1810で、汎用化後の少なくとも1つのプロトコルヘッダの前記変更に基づいて、前記ビットベクトルを更新する。その変更過程は、ネットワークスイッチのメモリに記憶された汎用的な命令のセットから、少なくとも1つの命令を用いることにより、汎用化後の少なくとも1つのプロトコルヘッダを変更することを含み得る。
【0116】
過程1815で、更新後のビットベクトルを用いて、汎用化後の少なくとも1つのプロトコルヘッダを圧縮する。一部の実施形態では、過程1815に先立って、前記ビットベクトルと更新後の当該ビットベクトルとにXOR演算を実行することにより、変更のあったビット数を求める。これにより、リライトエンジンは、デリートされたバイトおよび追加されたバイトの数を計算することができる。
【0117】
図19に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法1900を示す。過程1905で、このネットワークスイッチの受信ポートでパケットを受信する。
【0118】
過程1910で、前記パケットにおける各プロトコルヘッダを、そのプロトコルヘッダの汎用フォーマットに従って汎用化する。前記パケットにおけるそのプロトコルヘッダから、欠けているフィールドを検出し得る。具体的に述べると、そのプロトコルヘッダを、前記検出の結果に基づいて、欠けているフィールドを含めることにより、汎用フォーマットに拡張し得る。
【0119】
過程1915で、汎用化後の各プロトコルヘッダに対するビットベクトルを保持する。このビットベクトルは、無効フィールドについてはビットが0にマークされて有効フィールドについてはビットが1にマークされる。
【0120】
過程1920で、汎用化後の少なくとも1つのプロトコルヘッダを変更することにより、前記ビットベクトルが更新される。その変更過程は、ネットワークスイッチのメモリに記憶された汎用的な命令のセットから、少なくとも1つの命令を用いて、汎用化後の少なくとも1つのプロトコルヘッダを変更することを含み得る。具体的に述べると、汎用化後の少なくとも1つのプロトコルヘッダを、ネットワークスイッチの送信ポートの出口側ポートタイプに基づいて変更し得る。
【0121】
過程1925で、更新後のビットベクトルについて、そのビットベクトルにおいて0にマークされたビットを全て除外するようにシフトすることにより、当該更新後のビットベクトルを減縮する。
【0122】
過程1930で、減縮後のビットベクトルに基づいて、コンパクトなプロトコルヘッダを形成する。前記パケットは、少なくともこのコンパクトなプロトコルヘッダ付きで、前記ネットワークスイッチの送信ポートから送出され得る。一部の実施形態では、パケットを送出する過程に先立って、実行された全てのオペレーション(演算)について、追加された又はデリートされたバイト数を計数する。
【0123】
[ポインタ構造]
受信パケットから、複数の互いに異なるプロトコルレイヤを汎用化のためにそれぞれ抽出したり、これらのプロトコルレイヤの変更後にパケットを再構築したりするのに、ポインタ構造(ポインタ構造体)が使用され得る。このポインタ構造は、N+1個のレイヤポインタおよびそのパケット内の全てのヘッダの合計サイズを含み得る。典型的に、このポインタ構造は、パーサエンジンにより供給されるデータを用いて予め更新(初期化)され、リライトエンジンが、そのポインタ構造を用いてパケットを個々のレイヤに分割し、さらに、そのポインタ構造を用いてこれら個々のレイヤを情報処理で(知的に(intelligently))継合する。具体的に述べると、リライトエンジンは、パケットを個々のレイヤに分割した後、プロトコルヘッダを汎用化し、汎用化後のプロトコルヘッダを変更し、さらに、無効なバイトを全て除外することによって汎用化後のプロトコルヘッダを圧縮し得る。リライトエンジンは、レイヤを変更すると、前記レイヤポインタを更新し得る。パケットをネットワークスイッチから送信するのに先立って、更新後のレイヤポインタを用いて、互いに異なるプロトコルレイヤを互いに継合し得る。このようにプロトコルレイヤを互いに継合するため、複数のプロトコルレイヤを実体的には連続させずとも、レイヤポインタによってあたかもプロコルレイヤが連続するかのように扱う(仮想的に連続させる)ことが可能となる。
【0124】
図20に、本発明の一部の実施形態での、レイヤ構造の一例2000を示す。ここでは、受信パケットが、独自ヘッダ(独自プロトコルのヘッダ)、イーサネット、IPv4、UDP、VxLANおよびイーサネットの各プロトコルレイヤを有していると仮定する。さらに、ネットワークスイッチのパーサエンジンが最大で8層のレイヤをパース処理可能な一方で、それと並行してリライトエンジンにより変更可能なプロトコルレイヤの層数が、(ソフトウェア要求および/またはハードウェア能力のために)先頭からN層(ここでは、N=4とする)のプロトコルレイヤに限られるものと仮定する。一部の実施形態において、パーサエンジンは、パケット内における各プロトコルヘッダの開始位置等のデータをリライトエンジンに供給する。
【0125】
この例におけるリライトエンジンは、パケットの先頭から4層のプロトコルレイヤしか変更できないので、パーサエンジンからの関連データのみを、すなわち、パーサエンジンから独自ヘッダ、イーサネット、IPv4およびUDPからなる先頭から4層のプロトコルレイヤに関するデータのみを用い得る。このデータを用いて、そのパケットに対するポインタ構造が初期化され得る。具体的に述べると、レイヤポインタ0(LayerPointer0)が、そのパケット内における独自ヘッダ(すなわち、レイヤ0)の開始位置である0に設定され、レイヤポインタ1(LayerPointer1)が、そのパケット内におけるイーサネットヘッダ(すなわち、レイヤ1)の開始位置である16に設定され、レイヤポインタ2(LayerPointer2)が、そのパケット内におけるIPv4ヘッダ(すなわち、レイヤ2)の開始位置である36に設定され、レイヤポインタ3(LayerPointer3)が、そのパケット内におけるUDPヘッダ(すなわち、レイヤ3)の開始位置である48に設定され、レイヤポインタ4(LayerPointer4)が、リライトエンジンにより変更されない、ヘッダの残りの部分の開始位置である56に設定され得る。一部の実施形態において、リライトエンジンは、ヘッダのサイズを算出してヘッダサイズ(HeaderSize)(すなわち、全てのヘッダの合計サイズ)を223に設定する。
【0126】
リライトエンジンは、これらのレイヤポインタを用いて、先頭から4層のプロトコルレイヤ(すなわち、独自ヘッダ、イーサネット、IPv4およびUDP)を変更用に汎用化し得る。そして、リライトエンジンは、変更を実施した後、無効なバイトを全て除外することにより、変更後のプロトコルヘッダを圧縮し得る。典型的に、プロトコルヘッダが変更されると、前記レイヤポインタが更新される。
【0127】
また、これらのレイヤポインタは終点ポインタを形成し得る。前記ヘッダサイズ(HeaderSize)を伴ったこの終点ポインタは、ヘッダのボディに関連付けられる。ヘッダのボディとは、そのヘッダにおいて変更されない部分であって、後で継合するために伝達される部分のことである。全ての変更が実行されて、変更されたヘッダが圧縮されると、同じく変更された前記レイヤポインタを用いて、これら変更後のヘッダ同士がそれらのボディと一緒に継合され得る。
【0128】
リライトエンジンが変更できるレイヤの層数は限られ得る。一部の実施形態では、リライトエンジンが任意のプロトコルレイヤを拡張できる程度(大きさ)も限られ得る。この実施形態では、リライトエンジンが、2つの隣り合うレイヤポインタ同士を減算することにより、プロトコルレイヤのサイズを抽出する。そのレイヤのサイズがリライトエンジンのハードウェア能力を超えている場合、当該リライトエンジンは、1つ前のレイヤポインタを用いて情報処理でボディを形成し得る。
【0129】
1つのプロトコルレイヤを拡張できる大きさが最大40バイトであるにもかかわらず、そのプロトコルのなかで最も大きい変種が64バイトであると仮定する。一部の実施形態において、リライトエンジンは、変更のためにプロトコルヘッダを最大40バイトまで拡張する。リライトエンジンは、変更を実施した後、レイヤポインタを用いて、未変更のバイトを変更されたバイトに継合し得る。
【0130】
レイヤポインタを使用することにより、プロトコルレイヤを1つずつ取り扱うことになるので、ハードウェアのロジックや複雑性を大幅に軽減することができる。具体的に述べると、ハードウェアの命令の範囲を、所与のプロトコルレイヤに絞ることができる。すなわち、命令エンジンが前後のレイヤに影響されないので、各層に必要な命令を増やしたい場合には、命令ハードウェア(命令を含むハードウェア)をマルチパスで利用すればよい。換言すれば、命令の内部状態に命令間で相関性がないことから、複数の命令を並行して利用することができる。同様に、複数層のレイヤを並行して変更することも可能である。
【0131】
図21に、本発明の一部の実施形態での、リライトエンジンのさらなる他の動作方法2100を示す。このリライトエンジンは、ネットワークスイッチの一部であり、パケットをネットワークスイッチから送出される前に変更する。過程2105で、各パケットに対するポインタ構造を保持する。このポインタ構造は、レイヤポインタおよびそのパケット内の全てのヘッダの合計サイズを含む。これらレイヤポインタのそれぞれは、パケット内の関連レイヤの開始位置に対応する。
【0132】
前記ポインタ構造はN+1個のレイヤポインタを含み得る。リライトエンジンにより、パケット内のN層のレイヤを変更し得る。前記レイヤポインタは終点を形成し得る。この終点は、前記合計サイズを伴って、ヘッダのボディを示し得る。ヘッダのボディとは、リライトエンジンにより変更されないヘッダ部分である。
【0133】
過程2110で、パケットを、レイヤの変更のために、前記レイヤポインタに基づいてレイヤに分割する。そのパケットのプロトコルヘッダから、欠けているフィールドを検出し得る。このプロトコルヘッダを、前記検出の結果に基づいて、そのプロトコルの汎用フォーマットに拡張し得る。この汎用フォーマットは、そのプロトコルについて想定されるフィールド全てを備えている。それら各フィールドのオフセットは、そのプロトコルヘッダのプロトコルの変種にかかわらず同一であり得る。汎用化後の各プロトコルヘッダは、無効フィールドについてはビットが0にマークされて有効フィールドについてはビットが1にマークされたビットベクトルを備え得る。汎用的な命令のセットから、少なくとも1つの命令を用いることにより、汎用化後のプロトコルヘッダを変更し得る。典型的に変更後に前記ビットベクトルを更新する。
【0134】
過程2115で、レイヤポインタを、レイヤの変更の結果に基づいて更新する。
【0135】
過程2120で、複数のレイヤを、更新後のレイヤポインタに基づいて互いに継合する。
【0136】
図22に、本発明の一部の実施形態での、ネットワークスイッチのさらなる他の動作方法2200を示す。過程2205で、このネットワークスイッチの受信ポートでパケットを受信する。
【0137】
過程2210で、ポインタ構造を用いることにより、そのパケットのプロトコルレイヤを互いに分離する。このポインタ構造は、そのパケット内のN+1個の位置へのN+1個のレイヤポインタ、および当該パケット内の全てのヘッダの合計サイズを含み得る。前記位置は、プロトコルレイヤの開始位置であり得る。そのパケットをパース処理したデータに基づいて、前記ポインタ構造を初期化し得る。
【0138】
過程2215で、分離後のプロトコルレイヤを、変更用に汎用化する。各レイヤについて、当該レイヤのサイズを抽出することにより、そのサイズが当該レイヤを変更するためのハードウェア能力を超えているか否かを判断し得る。前記ポインタ構造における2つの隣り合うレイヤポインタ同士を減算することにより、前記サイズを抽出し得る。前記判断の結果に基づいて、前記2つの隣り合うレイヤポインタのうちの先のレイヤポインタを用いてボディを形成し得る。
【0139】
過程2220で、前記ポインタ構造を、変更に基づいて更新する。
【0140】
過程2225で、更新後のポインタ構造を用いることにより、変更後のプロトコルレイヤを情報処理で継合する。これにより、新しいプロトコルヘッダスタックを形成する。
【0141】
過程2230で、前記パケットを、その新しいプロトコルヘッダスタック付きで、ネットワークスイッチの送信ポートから送出する。
【0142】
当業者であれば、上記以外にも用途や利点が存在することが理解できるであろう。これまでの本発明の説明は幾つかの具体例に基づいたものであったが、当業者であれば、本発明の精神を逸脱することなく本発明をその他の具体的な形態でも実施可能であることを理解できるであろう。すなわち、当業者であれば、本発明が前述の具体例に限定されるものではなく、添付の特許請求の範囲により規定されるものであることを理解するであろう。