Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。
裏取りステータス: Code-verified(基本構成のみ)
現行 master の sonic-swss/orchagent/srv6orch.cpp に srv6_prefix_agg_id_table_ (1721-)、createSrv6Vpn/deleteSrv6Vpn (1025/776)、vpn_sid 管理が実装され、HLD の Prefix AGG_ID / VPN encap mapper 設計と一致。SRV6_MY_SID テーブル管理も APP_SRV6_MY_SID_TABLE_NAME / CFG_SRV6_MY_SID_TABLE_NAME 経由で確認済み。SRV6_POLICY_TABLE のキー名そのものは見えなかったが、内部データ構造として agg_id/vpn_sid が存在することを確認(verified at: 2026-05-09)。
SRv6 VPN(L3VPN over SRv6 と SRv6 Policy)¶
読者が知りたいこと¶
- SONiC で SRv6 L3VPN を BGP-VPN AF と組み合わせて動かす ための data 構造はどこにあるか
- APPL_DB の新規/拡張テーブル(
SRV6_POLICY_TABLE/ROUTE_TABLE.vpn_sid/SRV6_MY_SID_TABLE)は何のために存在するか - SAI / SWSS / SONiC / FRR のどこをいじっているのか
- 既知の workaround(zebra が MY_SID を netlink で渡さない問題)と、どんな構成で本機能が動くのか
1. 全体像と適用シナリオ¶
Alibaba がエッジルータ用ホワイトボックス SONiC で運用している実機ベースの提案 HLD。FRR 8.4+ を前提に、SRv6 を network programming framework として VPN 識別と policy ベース steering を実装する1。
flowchart LR
BGP[FRR BGP\n L3VPN over SRv6] -->|route + vpn_sid| FPM[fpmsyncd]
FPM --> APP[(APPL_DB ROUTE_TABLE\n vpn_sid / policy)]
BGP -->|policy| POL[(APPL_DB SRV6_POLICY_TABLE)]
BGP -->|MY_SID| MYSID[(APPL_DB SRV6_MY_SID_TABLE)]
APP --> RO[RouteOrch]
POL --> SO[SRv6Orch]
MYSID --> SO
RO <--> SO
SO --> SAI[(SAI: SRv6 VPN APIs)]
変更領域:
- FRR: VRF route leak / BGP advertise delay / conditional advertisement / SRv6 Policy
- SAI: SRv6 VPN 用 SAI(Cisco 提案の SAI 拡張)
- SWSS / SONiC: 新規
SRV6_POLICY_TABLE、ROUTE_TABLE.vpn_sid/policyフィールド、SRv6Orch/RouteOrch拡張
2. APPL_DB スキーマ¶
新規・拡張のみを列挙。CONFIG_DB / SONiC CLI / YANG は本 HLD では追加されない(FRR / コントローラから APPL_DB に直接書く)。
SRV6_POLICY_TABLE(新規)¶
SRV6_POLICY_TABLE|<policy_name>
segment = comma-list of SRV6_SID_LIST.key
weight = comma-list of int
ROUTE_TABLE 拡張¶
ROUTE_TABLE:<VRF>:<prefix>
nexthop = ...
intf = ...
vni_label = ...
router_mac = ...
blackhole = 0|1
segment = SRV6_SID_LIST.key ; OPTIONAL
seg_src = address ; OPTIONAL
vpn_sid = vpn_sid ; NEW: BGP 学習時の VPN SID
policy = comma-list ; NEW: 適用する SRv6 policy
SRV6_MY_SID_TABLE¶
SRV6_MY_SID_TABLE:<block_len>:<node_len>:<func_len>:<arg_len>:<ipv6address>
action = uN | End.X | End.DT46 | End.B6.ENCAP | ...
vrf = <vrf> ; END.DT46 用
adj = comma-list ip ; END.X 用
segment = SRV6_SID_LIST.key ; END.B6.ENCAP 用
source = address ; END.B6.ENCAP 用
3. 制御フロー上の工夫¶
Prefix AGG_ID による encap mapper¶
SRv6 VPN ルート追加時、SRv6Orch は vpn_sid 付き BGP NH 用の SRv6 トンネルを必要に応じて作成し、encap mapper で参照する。Mapper のキーは Prefix AGG_ID で、同一 NH を共有する複数 VPN ルートで encap 情報を集約する。これにより VPN prefix 数に対する SAI オブジェクト数を抑える。
Anycast MY_SID と nexthop id¶
Alibaba 運用では anycast routes を MY_SID として使う ことで BGP NH 収束時のアウトを抑える。FRR zebra は SRV6_MY_SID をカーネルに直接書くため、netlink 経由で fpmsyncd に流れない既知問題があり、本 HLD で workaround を導入している1。End.X action の nexthop id 処理も srv6orch に追加。
Segment list 最適化¶
セグメントリスト先頭 SID が MY_SID(action=End.X)に一致するとき、SAI_SRV6_SIDLIST_ATTR_NEXT_HOP_ID を設定し、SAI_SRV6_SIDLIST_ATTR_SEGMENT_LIST から先頭 SID を除外する1。
4. 設定例¶
SONiC 側は CONFIG_DB を触らない。FRR (vtysh) で設定する。
# FRR 側 (vtysh) - 概念的な L3VPN over SRv6 設定
configure terminal
router bgp 65001
segment-routing srv6
locator loc1
address-family ipv4 vpn
neighbor 10.0.0.1 activate
rd vpn export 65001:1
rt vpn both 65001:1
完全な FRR 構文は本 HLD では詳述されず、FRR 8.4+ の SRv6 VPN ガイドを参照 する必要がある。
5. 制限事項¶
- FRR 8.4 以上 が必要。SONiC 採用 FRR バージョンと整合させる
- FRR が
SRV6_MY_SIDを netlink で fpmsyncd に渡せない問題を回避する anycast route ハック が必要1 - SAI 側で SRv6 VPN 拡張がプラットフォームでサポート されている必要がある(未対応プラットフォームでは動かない)
- 提案段階の HLD。現行 master 取り込み状況は別途裏取り
6. 干渉する機能¶
- SRv6 Static Configuration HLD: CONFIG_DB の
SRV6_MY_LOCATORS/SRV6_MY_SIDSを bgpcfgd 経由で投入する別経路。本ページの BGP 学習経路と組み合わせて使う - VRF / VRF leaking: FRR の VRF route leak が前提
- BGP PIC: FRR 側 PIC が無いときの workaround として anycast MY_SID を使う、と HLD で記述あり1
7. トラブルシューティング¶
- VPN ルートが ASIC に積まれない → APPL_DB
ROUTE_TABLE:<VRF>:<prefix>のvpn_sidを確認 - SRv6 トンネルが作られない →
SRv6Orchログで encap mapper / Prefix AGG_ID 生成を確認 - MY_SID 削除がうまくいかない → anycast route ハック workaround が効いているか、fpmsyncd ログで route delete を確認
コマンド例¶
SRv6 L3VPN (VPNv4/VPNv6 over SRv6) の状態を確認する。
docker exec bgp vtysh -c 'show bgp ipv4 vpn' | head
docker exec bgp vtysh -c 'show bgp ipv6 vpn' | head
show srv6 sid
8. 次に読む¶
- Topics: SRv6 / MPLS 概念, SRv6 / MPLS アーキテクチャ, SRv6 / MPLS 内部実装
- 関連 HLD: SRv6 SID L3 Adjacency, SRv6 over IPv6 HLD, Static Configuration of SRv6, SONiC uSID
制限事項¶
- SRv6 VPN は ASIC SAI capability (
SAI_SWITCH_ATTR_SRV6_*) に依存し、未対応 NPU では機能しない。 - locator / behavior (
End,End.DT4,End.DT6,End.DX4等) のサポート範囲は SAI 実装ベンダーごとに差があり、HLD の網羅範囲とは一致しない。 - FRR と SAI 間の MSDP 等周辺プロトコル協調はまだ実験的で、商用配備例は限定的。