コンテンツにスキップ

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 に実装する HLD1SRv6 は 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_lenMySID 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 counterSAI に問い合わせる機能を追加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: 将来の入力経路

引用元

関連 Topics


  1. sonic-net/SONiC doc/srv6/srv6_hld.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06