In-Situ OAM

過去のNVO3での提案は802.1agをもとにした方式が提案されたいた。一方最近は、IETFの計測系WGであるIPPM(IP Performance Metric) WGでIn-Situ OAMが積極的に標準化されている模様である。WikipediaによるとIn-Situ(イン・サイチュ)とはラテン語で「その位置において」ということらしい。 RFC 9197 - Data Fields for In Situ Operations, Administration, and Maintenance (IOAM)と、 RFC 9378 - In Situ Operations, Administration, and Maintenance (IOAM) Deploymentを読むのがよさそうである。

IOAMの種類は以下の4つのオプションタイプ。

  • ホップ毎トレース(Per-hop tracing)
    • 事前確保済み形式(Pre-allocated)
    • 増分形式(Incremental)
  • トランジット証明(Proof of Transit)
  • エッジツーエッジ(E2E: Edge-to-Edge)
  • 直接エクスポート(DEX: Direct Export)

ホップ毎トレース オプションタイプ

RFC9197によるとPre-allocated and Incremental(事前確保済み及び増分の)Trace-Option Header用には以下のデータフォーマットが定義されている。

ヘッダ

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Namespace-ID           |NodeLen  | Flags | RemainingLen|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |               IOAM Trace-Type                 |  Reserved     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

データ

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
   |                                                               |  |
   |                        node data list [0]                     |  |
   |                                                               |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  D
   |                                                               |  a
   |                        node data list [1]                     |  t
   |                                                               |  a
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   ~                             ...                               ~  S
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  p
   |                                                               |  a
   |                        node data list [n-1]                   |  c
   |                                                               |  e
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
   |                                                               |  |
   |                        node data list [n]                     |  |
   |                                                               |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+

各フィールドの意味は以下の通りである。

Field 意味
Namespace-ID 16bitの識別子。0x0000(=0)はデフォルト値。ノードの設定値とパケットの値が違う場合はIOAM-Data-Fieldsを変 更してはならない。
NodeLen 5bit符号なし整数。各ノードが追加するデータの長さ。4オクテット単位。IOAM Trace-Typeが22以外の場合は実際の長さと一致し、Trace-Typeが22の場合では実際の長さはこの値に"Opaque State Snapshot"の値を足した長さになる。
Flags 4bitの値。Bit 0Overflow(O-bit)で最重要な情報。パケット長がIOAMを追加することでPMTUを超える場合にデータは追加せずにこのbitを1にする。
RemainingLen 7bit符号なし整数。IOAMのノードデータを記録してよい残りの長さ。
IOAM Trace-Type 24bitのbit field。下表のとおり。

IOAM Trace-Typeはそれ以降につながるnode data listの赤にデータが存在することを意味しており、各bitの以下のとおりである。

bit 意味
0 最重要ビット。hop_lim(ホップリミット)とnode_id(ノード識別子)(短縮形式)
1 ingress_if_id(入力インタフェースID), egesress_if_id(入力インタフェースID)(短縮形式)
2 秒表現形式のタイムスタンプ
3 分数表現形式のタイムスタンプ
4 トランジット遅延
5 IOAM-Namespace固有データ(短縮形式)
6 キューの深さ
7 チェックサム補数
8 hop_lim(ホップリミット)とnode_id(ノード識別子)
9 ingress_if_id(入力インタフェースID), egesress_if_id(入力インタフェースID)
10 IOAM-Namespace固有データ(短縮形式)
11 バッファ占有率
12-21 未定義。0である必要有。1を受信した場合は0xffffffffのノードデータを追加。
22 可変長のOpaque State Snapshot
23 予約済。受送信時0である必要有。

各フィールドに対応するデータフォーマットは多すぎて省略しているためRFC9139 4.4.2を参照してください。

トランジット証明(POT: Proof of Transit) オプションタイプ

トラフィックが定義されたパスを通過したことを証明する。RFC9197ではType 0しか存在していない。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Namespace-ID           |IOAM POT-Type=0|R R R R R R R R|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
   |                        PktID                                  |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  P
   |                        PktID (contd)                          |  O
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  T
   |                        Cumulative                             |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
   |                        Cumulative (contd)                     |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
PktId 64ビットのパケット識別値
Cumulative 64bitの特定ノードで更新される累積値

エッジツーエッジ オプションタイプ

エッジツーエッジオプションタイプの場合は、トランジットノードでは変更していけない。データフォーマットは以下のとおりである。

ヘッダ

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Namespace-ID           |         IOAM E2E-Type         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

データ

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       E2E Option data field determined by IOAM-E2E-Type       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IOAM E2E Typeの意味は以下のとおりである。

bit 意味
0 64bitシーケンス番号。このbitが1の場合は1bit目(32bitシーケンス番号)は0である必要有。
1 32bitシーケンス番号。このbitが1の場合は0bit目(64bitシーケンス番号)は0である必要有。
2 秒形式タイムスタンプ。64bit形式のPTP, NTP, POSIXタイムスタンプの上位32bit。
3 分数形式タイムスタンプ。64bit形式のPTP, NTP, POSIXタイムスタンプの下位32bit。
4-15 未定義