Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。
裏取りステータス: code-verified
fpmsyncd MPLS: sonic-swss/fpmsyncd/routesync.cpp L158 (APP_LABEL_ROUTE_TABLE_NAME ProducerStateTable), L2066 (AF_MPLS), L2914 (LWTUNNEL_ENCAP_MPLS), L2936 (RTA_NEWDST = MPLS NH label stack) を確認。
SONiC の MPLS 基盤¶
読み手が知りたいこと¶
- SONiC で MPLS が動く範囲はどこまでか(静的 LSP か、LDP / RSVP-TE まで含むのか)
- per-RIF で MPLS を on/off する設定はどこに入るか
- ラベル経路は kernel → APPL_DB → ASIC のどの経路で流れるか
- CRM や CLI、ASIC リソース監視は何が増えるか
スコープ(静的 LSP 中心)¶
SONiC の初期 MPLS 対応は 静的 LSP を前提に、IPv4/IPv6 routing インフラを MPLS にも拡げる方針1:
- per-RIF で MPLS を enable/disable
- Push / Pop / Swap ラベル操作(implicit-null / explicit-null 対応)
- bulk MPLS in-segment entry の SAI programming
- CRM に MPLS 系リソースを統合
LDP / RSVP-TE 等の動的シグナリングと L3VPN / EVPN-MPLS は scope 外(Future Requirements)1。
データフロー¶
flowchart LR
KERNEL[Linux kernel<br/>MPLS netlink] --> FPM[fpmsyncd]
FPM --> APPL[APPL_DB<br/>LABEL_ROUTE_TABLE]
CFG[CONFIG_DB<br/>INTERFACE.mpls] --> IM[IntfMgr]
IM --> APPL2[APPL_DB INTF_TABLE]
APPL --> RO[RouteOrch]
APPL2 --> IO[IntfsOrch]
IO --> ASIC1[ASIC_DB<br/>RIF / NEXT_HOP]
RO --> ASIC2[ASIC_DB<br/>INSEG_ENTRY]
ASIC1 --> SYN[syncd] --> SAI
ASIC2 --> SYN
要点1:
- ラベル経路は kernel → fpmsyncd → APPL_DB が基本(FRR ldpd / staticd / cRPD 等から流れる)
- IntfMgr は CONFIG_DB の MPLS フラグを APPL_DB へ伝搬
- RouteOrch が
LABEL_ROUTE_TABLEを読み INSEG_ENTRY 化 - bulk SAI API で大量 in-segment エントリを効率的に programming
スキーマ追加¶
CONFIG_DB¶
INTERFACE|<intf> mpls = "enable" | "disable"
VLAN_INTERFACE|<intf> mpls = ...
PORTCHANNEL_INTERFACE|<> mpls = ...
CRM | Config <MPLS 関連 threshold>
per-RIF で MPLS 許否を切り替える単純フラグ1。
APPL_DB¶
既存 INTF_TABLE / ROUTE_TABLE に加えて新規:
LABEL_ROUTE_TABLE:<incoming_label>
nexthop = "<ip1>,<ip2>,..."
ifname = "<intf1>,<intf2>,..."
mpls_pop = "1" | "2" | ... # POP 段数
mpls_nh = "push:<L>" # 出力時 PUSH ラベル
ASIC_DB / SAI¶
SAI_OBJECT_TYPE_INSEG_ENTRY(ingress label に対する処理ルール)SAI_OBJECT_TYPE_NEXT_HOPの MPLS 対応 typeSAI_OBJECT_TYPE_ROUTER_INTERFACEの MPLS 属性
内部表現と CRM¶
Label / LabelStack クラスで push/pop/swap 操作を抽象化し、NextHopKey に MPLS 情報を埋めて NeighOrch / RouteOrch で nexthop 解決時に MPLS 文脈を保つ1。
CRM の追加監視対象1:
- in-segment entry 数
- per-NH MPLS label stack 数
config crm thresholds ... で既存閾値設定枠組みに乗る。
CLI¶
config interface mpls add <intf> # enable
config interface mpls remove <intf> # disable
show mpls
show mpls route
設定¶
関連する CONFIG_DB¶
| Table | Key | フィールド |
|---|---|---|
INTERFACE / VLAN_INTERFACE / PORTCHANNEL_INTERFACE |
<intf> |
mpls (enable/disable) |
CRM |
Config |
MPLS 系 threshold |
設定例¶
sudo config interface mpls add Ethernet0
sudo config interface mpls add PortChannel0001
# 静的 LSP(cRPD / staticd / iproute2 経由で kernel に投入)
ip -f mpls route add 100 as 200 via inet 10.0.0.2
show mpls route
制限事項¶
- 初期実装は 静的 LSP が主シナリオ
- LDP / RSVP-TE / MPLS-VPN は scope 外
- per-RIF の disable は ASIC 側で MPLS を選択的有効化できる前提(ベンダ SAI 依存)
- HLD は 2021-12 Rev 1.0 で "final"。以降の進化(cRPD MPLS / EVPN-MPLS)は別 HLD
- warm-boot で実 LSP を保持するには MPLS state save 実装が必要
干渉する機能¶
- FRR / cRPD: 動的に静的 LSP を流すには
staticdMPLS 拡張または cRPD LDP 等が必要 - CRM: 新規リソース監視
- EVPN / VXLAN: MPLS は別 encapsulation(共存はベンダ依存)
- fpmsyncd: kernel MPLS netlink を APPL_DB に橋渡し
- interface MTU: MPLS ラベル分 MTU を消費するので隣接と整合
トラブルシューティング¶
# RIF が MPLS enabled か
redis-cli -n 4 HGETALL "INTERFACE|Ethernet0"
sysctl net.mpls.platform_labels
# label route が APPL_DB に届いているか
redis-cli -n 0 KEYS "LABEL_ROUTE_TABLE:*" | head
# SAI レベル
redis-cli -n 1 KEYS "ASIC_STATE:SAI_OBJECT_TYPE_INSEG_ENTRY:*" | head
# CRM
crm show resources mpls