TUNNEL STATE_DB テーブル群
概要
STATE_DB には TUNNEL の処理結果を反映する複数のテーブルが存在する。書き込み元はオーケストレーター(orchagent)と cfgmgr(vxlanmgrd)の両方。
| STATE_DB テーブル名 |
書き込み元 |
役割 |
TUNNEL_DECAP_TABLE |
tunneldecaporch |
APPL_DB TUNNEL_DECAP_TABLE の SAI 反映状態ミラー |
TUNNEL_DECAP_TERM_TABLE |
tunneldecaporch |
Decap term エントリの SAI 反映状態ミラー |
VXLAN_TUNNEL_TABLE |
VxlanTunnelOrch |
VxLAN トンネルの作成状態 + operstatus |
VXLAN_TABLE |
VxlanMgr |
VxLAN netdevice 作成成功フラグ |
TUNNEL_DECAP_TABLE
key 構造
TUNNEL_DECAP_TABLE|<tunnel_name>
フィールド
| フィールド |
型 |
説明 |
tunnel_type |
string |
IPINIP 固定。省略された場合はこのフィールドなし |
dscp_mode |
string |
uniform または pipe |
ecn_mode |
string |
copy_from_outer または standard |
encap_ecn_mode |
string |
standard のみ有効 |
ttl_mode |
string |
uniform または pipe |
書き込みは setDecapTunnelStatus() が APPEND_IF_NOT_EMPTY マクロを使用するため、内部キャッシュで空のフィールドは STATE_DB に書かれない。
書き込みタイミング
- 新規トンネル作成:
addDecapTunnel() 完了後
- 既存トンネル更新(
dscp_mode / ttl_mode / QoS マップ変更): SET_COMMAND 処理後
- 削除:
removeDecapTunnel() で del() — ただし ref count > 0 の間は消去されない
TUNNEL_DECAP_TERM_TABLE
key 構造
TUNNEL_DECAP_TERM_TABLE|<tunnel_name>|<dst_ip_prefix>
フィールド
| フィールド |
型 |
省略時 |
説明 |
term_type |
string |
常に存在 (P2MP がデフォルト) |
P2P / P2MP / MP2MP |
src_ip |
string |
フィールドなし |
P2P/MP2MP 時は必須。省略で P2MP |
subnet_type |
string |
フィールドなし |
vlan または vip。MP2MP subnet decap 専用 |
term_type のデフォルト P2MP は doDecapTunnelTermTask() 内の変数初期値 (TUNNEL_TERM_TYPE_P2MP) に由来する。
書き込みタイミング
addDecapTunnelTermEntry() 成功後に setDecapTunnelTermStatus() が呼ばれる
- 削除:
removeDecapTunnelTermStatus() で del()
VXLAN_TUNNEL_TABLE
key 構造
VXLAN_TUNNEL_TABLE|<tunnel_name>
フィールド
| フィールド |
型 |
初期値 |
説明 |
src_ip |
string |
— |
VxLAN トンネル送信元 IP |
dst_ip |
string |
— |
VxLAN トンネル宛先 IP (P2P の場合) |
tnl_src |
string |
— |
CLI (config経由) または EVPN (BGP EVPN経由) |
operstatus |
string |
down |
作成直後は常に down。ポート UP で up に遷移 |
operstatus の初期値 "down" は addRemoveStateTableEntry() でハードコードされている(vxlanorch.cpp L1942)。
書き込みタイミング
- トンネル作成:
addRemoveStateTableEntry(add=true) — operstatus=down で書き込み
- ポート状態変化:
operstatus を up/down に更新
- 削除:
addRemoveStateTableEntry(add=false) で del()
- Warm reboot: 既存エントリが存在する場合は上書きしない(重複防止)
VXLAN_TABLE
key 構造
フィールド
| フィールド |
型 |
値 |
説明 |
state |
string |
ok (固定) |
VxLAN netdevice 作成成功を示す。失敗時は書かれない |
createVxlan() (vxlanmgr.cpp) 成功時のみ "state"="ok" を書き込む。値はハードコード固定。
関連 CONFIG_DB / CLI
暗黙デフォルト・コード由来挙動 (Phase A)
以下は設定省略時にコード実装から導出される暗黙の挙動。
TUNNEL_DECAP_TABLE — フィールド省略時の挙動
| フィールド |
省略/未設定時の STATE_DB 挙動 |
ソース証跡 |
tunnel_type |
APPEND_IF_NOT_EMPTY マクロにより STATE_DB に書かれない |
tunneldecaporch.cpp L1526 |
dscp_mode |
空の場合は STATE_DB に書かれない |
tunneldecaporch.cpp L1527 |
ecn_mode |
空の場合は STATE_DB に書かれない |
tunneldecaporch.cpp L1528 |
encap_ecn_mode |
空の場合は STATE_DB に書かれない |
tunneldecaporch.cpp L1529 |
ttl_mode |
空の場合は STATE_DB に書かれない |
tunneldecaporch.cpp L1530 |
TUNNEL_DECAP_TERM_TABLE — フィールド省略時の挙動
| フィールド |
省略/未設定時の STATE_DB 挙動 |
ソース証跡 |
term_type |
常に書かれる。省略時デフォルト P2MP |
tunneldecaporch.cpp L361, L1550 |
src_ip |
src_ip_str.empty() なら STATE_DB に書かれない |
tunneldecaporch.cpp L1551-1554 |
subnet_type |
subnet_type.empty() なら STATE_DB に書かれない |
tunneldecaporch.cpp L1555-1558 |
VXLAN_TUNNEL_TABLE — ハードコードデフォルト
| フィールド |
ハードコード値 |
説明 |
operstatus |
"down" |
トンネル作成直後の初期値。ポート link-up イベントまで down のまま |
tnl_src |
"EVPN" |
BGP EVPN 経由で作成された場合の固定ラベル |
VXLAN_TABLE — ハードコードデフォルト
| フィールド |
ハードコード値 |
説明 |
state |
"ok" |
createVxlan() 成功時のみ書き込まれる。値は常に "ok" でユーザー変更不可 |
削除・ref count 依存の残存
TUNNEL_DECAP_TABLE は tunneldecaporch が参照カウント (ref_count) を管理しており、MUX や他エンティティからの参照が残る間は del() されない。削除要求後も STATE_DB エントリが残存する場合がある。
Warm Reboot 時のスキップ
VXLAN_TUNNEL_TABLE: warm reboot 中 (WarmStartState == INITIALIZED) かつ既存エントリが STATE_DB に存在する場合、addRemoveStateTableEntry() は書き込みをスキップする(vxlanorch.cpp L1927-1945)。
YANG-実装 discrepancy
TUNNEL_DECAP_TABLE / TUNNEL_DECAP_TERM_TABLE / VXLAN_TUNNEL_TABLE は STATE_DB テーブルであり、sonic-yang-models に対応する YANG モジュールは存在しない。フィールド定義はすべてコード (tunneldecaporch.cpp / vxlanorch.cpp) から導出。
TUNNEL_DECAP_TERM_TABLE の term_type デフォルト P2MP は YANG にも明示されておらず、コードの変数初期値のみが規定している。
引用元