コンテンツにスキップ

APPL_DB SRV6 テーブル

概要

SONiC の SRv6 制御面は 3 層構造をとる。

  1. CONFIG_DB (SRV6_MY_SIDS / SRV6_MY_LOCATORS) — ユーザー設定の起点
  2. APPL_DB (SRV6_MY_SID_TABLE / SRV6_SID_LIST_TABLE) — FRR → SAI のパイプライン中継点
  3. ASIC_DB — SAI が書き込むハードウェア状態

本ページは APPL_DB 側の 2 テーブルを解説する。 これらは fpmsyncd が FRR の netlink メッセージを受け取って書き込み、 Srv6Orchsonic-swss/orchagent/srv6orch.cpp)が消費して SAI オブジェクトを作成する。

データフロー (自動生成)

flowchart LR
  FRR["FRR (zebra/bgpd)"]
  FPM["fpmsyncd\n(routesync.cpp)"]
  APSID[("APPL_DB\nSRV6_MY_SID_TABLE")]
  APLIST[("APPL_DB\nSRV6_SID_LIST_TABLE")]
  ORCH["Srv6Orch"]
  SAI["SAI / ASIC\nMY_SID_ENTRY\nSRV6_SIDLIST"]
  FRR --> FPM --> APSID --> ORCH --> SAI
  FPM --> APLIST --> ORCH

凡例

APPL_DB は FRR と ASIC の橋渡しテーブルであり、直接ユーザー設定するテーブルではない。


SRV6_MY_SID_TABLE

key 構造

SRV6_MY_SID_TABLE|<block_len>:<node_len>:<func_len>:<arg_len>:<sid_ipv6>

例: SRV6_MY_SID_TABLE|32:16:16:0:fc00:0:1:64::1

key 内の各長さフィールドはロケータのビット長を示し、Srv6Orch がパースして sai_my_sid_entry_t に詰める(srv6orch.cpp:1453-1456)。

フィールド一覧

フィールド 説明
action string SRv6 エンドポイント動作(下表参照)。必須
vrf string デカプセル後の VRF 名。行動によって必要・不要が変わる
adj string nexthop 隣接 IPv4/IPv6 アドレス。行動によって必要・不要が変わる

コード由来のデフォルト(Phase A 解析)

フィールド 実効デフォルト コード根拠
action 省略不可 空文字列だと sidEntryEndpointBehavior が false を返し、orch がエントリ拒否(srv6orch.cpp:1473-1477
vrf 行動依存(下記参照) mySidVrfRequired(end_behavior) が真の行動(end.dt*/udt*)では省略不可。偽の行動では省略可。VRF 名 "default"gVirtualRouterId に解決(srv6orch.cpp:1484-1486
adj 行動依存(下記参照) mySidNextHopRequired(end_behavior) が真の行動(end.x/ua 等)では省略不可。偽の行動では省略可(srv6orch.cpp:1511-1547

NB-ZMQ 有効時の差異: fpmsyncd が NB-ZMQ モード(nbZmqEnabled=true)の場合、 action/vrf/adj を常に全フィールド push する(値が空文字列でも)。 これは ZMQ 側の冪等更新要件によるもの(routesync.cpp:1169-1172)。 通常モード(ZMQ 無効)では空文字列フィールドは省略される(routesync.cpp:1174-1182)。

vrf フィールドの行動別要否:

行動 vrf 必須 備考
end, un, ua 不要 SAI VRF 属性を設定しない
end.x, end.dx4, end.dx6, udx4, udx6 不要 nexthop (adj) を使用
end.dt4, end.dt6, end.dt46, udt4, udt6, udt46 必須 VRF 未指定だとエラー

adj フィールドの行動別要否:

行動 adj 必須 備考
end, un, end.dt*, udt* 不要 nexthop 不使用
end.x, end.dx4, end.dx6, ua, udx4, udx6 必須 隣接未解決の場合 pending エントリへ移動

サポート action 値

end_behavior_mapsrv6orch.cpp:41-62)に定義:

action 文字列 SAI 動作
end SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_E
end.x SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_X
end.t SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_T
end.dx6 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_DX6
end.dx4 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_DX4
end.dt4 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_DT4
end.dt6 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_DT6
end.dt46 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_DT46
un SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UN
ua SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UA
udx4 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UDX4
udx6 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UDX6
udt4 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UDT4
udt6 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UDT6
udt46 SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_UDT46
end.b6.encaps SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_B6_ENCAPS
end.b6.encaps.red SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_B6_ENCAPS_RED
end.b6.insert SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_B6_INSERT
end.b6.insert.red SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_B6_INSERT_RED

fpmsyncdmySidAction2Str()routesync.cpp:300-338)は FRR netlink action 値を上記文字列に変換してから APPL_DB へ書き込む。


SRV6_SID_LIST_TABLE

key 構造

SRV6_SID_LIST_TABLE|<sid_name>

<sid_name> は通常 VPN SID の IPv6 アドレス文字列として fpmsyncd が設定する (routesync.cpp:1408)。

フィールド一覧

フィールド 説明
path string (カンマ区切り IPv6 リスト) SID リスト(セグメントリスト)。必須
type enum sidlist タイプ。省略可(デフォルト encaps.red

コード由来のデフォルト(Phase A 解析)

フィールド 実効デフォルト コード根拠
path 省略不可(実質) 省略または空文字列だと segment_list.count=0 となり、orch が segment list count is zero, skip と記録して SAI 作成をスキップする(サイレント。srv6orch.cpp:1052-1055
type encaps.red sidlist_type_map にキーが存在しない場合(フィールド未設定を含む)、SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED を使用(srv6orch.cpp:1080-1083SWSS_LOG_INFO("Use default sidlist type: ENCAPS_RED")

fpmsyncd は type フィールドを書かない: Srv6SidListTableFieldValueTupleWrapper::fieldValueTupleVector()path のみを設定し、type フィールドは push しない(routesync.cpp:1189-1203)。 FRR 経由で登録されるすべての SID リストは実質 type=encaps.red 相当になる。

テストや手動設定で type を明示指定した場合は以下の値が有効: insert, insert.red, encaps, encaps.redsrv6orch.cpp:73-79)。


設定例

SRV6_MY_SID_TABLE エントリ(end.dt46 行動)

{
    "SRV6_MY_SID_TABLE": {
        "32:16:16:0:fc00:0:1:64::": {
            "action": "end.dt46",
            "vrf": "VrfDt46"
        }
    }
}

SRV6_SID_LIST_TABLE エントリ

{
    "SRV6_SID_LIST_TABLE": {
        "fc00:0:2:1::": {
            "path": "fc00:0:2:1::"
        }
    }
}

type フィールドを省略すると Orch が encaps.red として処理する。


関連テーブル

  • SRV6_MY_SIDS (CONFIG_DB) — ユーザー設定。bgpcfgd / fpmsyncd 経由で本テーブルへ反映
  • SRV6_MY_LOCATORS (CONFIG_DB) — ロケータ定義
  • VRF (CONFIG_DB) — vrf フィールドで参照する VRF エントリ

  1. sonic-swss/tests/test_srv6.py:837 より実例。