Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。
裏取りステータス: code-verified
sonic-swss/orchagent/srv6orch.cpp / srv6orch.h を master で確認。SRV6_MY_SID_TABLE / SRV6_SID_LIST 等のスキーマ定数は sonic-swss-common/common/schema.h に取り込み済み。
SRv6(Segment Routing over IPv6 / END.DT46 / H.Encaps.Red)¶
概要¶
IETF RFC 8754 / 8986 で定義される Segment Routing over IPv6 を SONiC に実装する HLD1。SRv6 は SDN 向け IPv6 ベースのプログラマブル forwarding で、SID list を SRH に積み込むことで TE / VPN / EVPN 等を実現する。Phase 1 では SONiC を headend / endpoint 双方として動作させ、Phase 2 以降で uSID / G-SID / HMAC / sBFD / anycast SID 等に拡張する設計。FRR 側 SRv6 が成熟するまでは 静的 SID と policy を CONFIG_DB に直接書く運用。
動作仕様¶
Phase 1 のサポート機能¶
| Behavior | 用途 | RFC |
|---|---|---|
END |
prefix SID の SRv6 instantiation | 8986 |
END.DT46 |
endpoint with decap + VRF lookup(IP L3VPN) | 8986 |
H.Encaps.Red |
headend with reduced SRH encap | 8986 |
| traffic steering by SID list | TE policy 適用 | - |
Later phase: H.Encaps, END.B6.Encaps[.Red](Binding SID), END.X(Adj SID), uSID/G-SID, HMAC, sBFD, anycast SID, MySID counter1。
CONFIG_DB¶
SRV6_SID_LIST|<segment_name>:
path = [<sid>, <sid>, ...]
SRV6_MY_SID_TABLE|<ipv6_addr>:
block_len = 40 ; default
node_len = 24
func_len = 16
arg_len = <alen>
action = end | end.dt46 | end.x | end.b6.encap | ...
vrf = <VRF> ; END.DT46 用
adj = [<addr>, ...] ; END.X 用 (optional)
policy = <policy> ; END.B6.ENCAP 用
source = <addr> ; END.B6.ENCAP 用 src
SRV6_POLICY|<policy_name>:
segment = [<seg_name>, ...]
SRV6_STEER|<vrf>:<prefix>:
policy = <policy_name>
source = <ip>
block/node/func/arg_len は MySID address のビット分割を decode するための長さ指定(規定値 40/24/16)1。
APPL_DB¶
SRV6_SID_LIST_TABLE:<segment_name>: { path = [...] }
SRV6_MY_SID_TABLE:<block>:<node>:<func>:<arg>:<ipv6>: {
action, vrf, adj, segment, source
}
ROUTE_TABLE:<vrf>:<prefix>: { ... + segment list }
既存 ROUTE_TABLE も SID list を保持できるよう拡張1。
Orchagent(Srv6Orch)¶
flowchart LR
CFG[CONFIG_DB SRV6_*] --> CFGD["swss script / Translib<br/>※ master に独立した srv6cfgd 等のプロセスは未実装"]
CFGD --> APP[(APPL_DB SRV6_*)]
FRR["FRR srv6 (将来)"] --> FPM[fpmsyncd] --> APP
APP --> ORCH[Srv6Orch]
ORCH --> ASIC[(ASIC_DB)]
ASIC --> SAI[SAI SRv6 attributes]
Phase 1 では controller / swss スクリプトが Translib 経由で APPL_DB 直接更新1。FRR が SRv6 を full サポートしたら fpmsyncd 経由に切替。
Counter(v0.5 で追加)¶
各 MySID 単位の packet/byte counter を SAI に問い合わせる機能を追加1。CLI で:
config srv6 counter <enable|disable>config srv6 counter polling-interval <sec>show srv6 counter [my-sid <addr>]clear srv6 counter
Warm boot¶
planned 系 / swss / BGP warm reboot で対応想定1。MySID と SID list は CONFIG_DB から再復元、Srv6Orch が再 program。
📋 検証エビデンス: sonic-net/SONiC/doc/srv6/srv6_hld.md#L78-L99 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/srv6/srv6_hld.md#L78-L99 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Phase #1
Should be able to perform the role of SRv6 domain headend node, and endpoint node, more specific:
- Support END, Endpoint function ...
- Support END.DT46 ... - IP L3VPN use (equivalent of a per-VRF VPN label)
- Support H.Encaps.Red ...
- Support traffic steering on SID list
判断根拠: Phase 1 のサポート機能の根拠。
制限事項¶
- v0.5 で MySID counter 追加。それ以前 (Phase 1) は END / END.DT46 / H.Encaps.Red のみ
- FRR SRv6 全機能まで到達するまで CONFIG_DB / Translib 直接運用
- HMAC / sBFD / uSID / G-SID は Phase 2+
- block/node/func/arg_len のデフォルトに従わない address layout は MySID key 構成で明示が必要
干渉する機能¶
- 既存 routing (BGP / VRF / ROUTE_TABLE): ROUTE_TABLE の拡張で共存
- MPLS L3VPN: 等価機能の置き換え候補
- EVPN over SRv6: 後段の利用形
- PIC / wcmp / ARS: NHG / multipath との関係
- FRR / fpmsyncd: 将来の入力経路