コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 02 章: BGP と FRR 制御プレーン を参照。

裏取りステータス: code-verified(FAST/SLOW DOWNLOAD は warm-restart 経由)

sonic-swss/orchagent/nhgorch.{h,cpp}NextHopGroup::m_is_recursive / setRecursive(bool) / isRecursive()is_recursive フラグによる hierarchical NHG 制御が確認できた。fpmsyncd 側の FAST/SLOW DOWNLOAD という用語は実装に存在せず、fpmsyncd/fpmsyncd.cppWarmRestartHelper 経由の warm-restart timer 区別として実装されている。SAI vendor 側の hitless update 動作と FRR zebra→FPM 経路は本 cache では未確認。

BGP PIC(Prefix Independent Convergence / NHG 階層)

読者が知りたいこと

  • なぜ PIC が必要か(N に依存する収束の何が悪いのか)
  • PIC Core / PIC Edge / PIC Local の 3 形態は 何で起動し 何を切替えるか
  • NHG 階層(service / underlay)の絵
  • FAST DOWNLOAD / SLOW DOWNLOAD とは具体的に何の経路か
  • SONiC の どのファイル に hierarchical NHG が入っているか
  • 何ができないか(hitless 要件、HW resource、HLD と実装の差)

1. なぜ PIC が必要か

BGP overlay の数百万 route 規模で 影響を受けた N prefix を 1 件ずつ再プログラムする とパケットロスが膨らむ。PIC は収束コストを prefix 数 N に依存させずECMP / primary-backup multipath を多段の level of indirection (NHG) で共有することで一定時間に抑える1

IETF draft-ietf-rtgwg-bgp-pic を SONiC で実装するアーキテクチャ。本 HLD は protocol-independent(EVPN / MPLS / SRv6 のどれでも同じ枠組み)。

2. 3 形態と発火条件

形態 トリガ 検出 補助
PIC Core underlay (IGP) 内部の故障 local intf down / BFD NHG 更新だけで全 prefix 影響
PIC Edge overlay (BGP nexthop) の喪失 nexthop tracking via IGP/BGP 別 PE への切替を NHG レベルで
PIC Local (FRR) local 接続 link 故障 local intf down / BFD egress 側 backup path に切替、ingress 通知までの繋ぎ

3. NHG 階層

flowchart LR
  PFX[(prefix r1, r2, ..., rn)] --> NHGS["NHG-Service<br/>= remote nexthop list<br/>(PE1, PE2)"]
  NHGS --> NHGU["NHG-Underlay<br/>per remote PE"]
  NHGU --> IFA[Intf-A]
  NHGU --> IFB[Intf-B]
  • Prefix → service NHG(remote PE loopbacks)→ underlay NHG(physical intf list) の 2 段
  • N prefix が共有する level of indirection を 1 度更新するだけで全 prefix が切替わる
  • SONiC では NHG = nexthop group object
  • ECMP HW resource を消費するため、single-path のみの prefix では NHG を作らない1

設計要件:

  • 階層 forwarding chain を 複数 route で共有(per-prefix にしない)
  • HW は階層 NHG を 事前に program
  • Local 故障時は LL software / HW が NHG を pruning して 1 update に圧縮 し上位に通知
  • Remote 故障時は control plane が まず NHG だけ更新、後で full update
  • 全 transition(single↔multi、NHG↔NHG、direct↔NHG)が hitless(zero packet loss)

4. FAST DOWNLOAD / SLOW DOWNLOAD

BGP PIC works with the concept of FAST DOWNLOAD and SLOW DOWNLOAD updates.1

Phase やる事
FAST DOWNLOAD NHG 1 オブジェクトの HW 更新(パス削除)。検出から ms オーダー
SLOW DOWNLOAD control plane (zebra/bgpd) の本来の収束結果を反映。route 個別更新

FAST で被害最小化、SLOW で正規化、の二段。

Core Local Failure の call flow

sequenceDiagram
    participant ASIC as ASIC
    participant SD as syncd
    participant ADB as ASIC_DB
    participant OA as orchagent (nhgorch)
    participant ZB as zebra/bgpd
    participant FPM as fpmsyncd
    Note over ASIC: link loss 検出
    ASIC->>SD: port-down event
    SD->>ADB: port oper-down
    ADB->>OA: state 通知
    OA->>OA: NHG から該当 path を除去
    OA->>SD: NEXT_HOP_GROUP update
    SD->>ASIC: SAI NHG update (FAST)
    SD-->>ZB: kernel 経由で intf down (netlink)
    ZB->>ZB: control plane reconverge
    ZB->>FPM: NHG / route 更新
    FPM->>OA: SLOW DOWNLOAD

0-5 ステップで HW 1 update を完了、6 以降が SLOW(kernel netlink → zebra → bgpd → fpmsyncdASIC_DB の通常経路)1

5. 実装の所在(裏取り)

  • sonic-swss/orchagent/nhgorch.h:50 class NextHopGroup:86 isRecursive():88 setRecursive()m_is_recursive メンバ
  • sonic-swss/orchagent/nhgorch.cpp:65 is_recursive=false:118 if (is_recursive):292 nhg->setRecursive(is_recursive):691 ctor で m_is_recursive(false)
  • sonic-swss/fpmsyncd/fpmsyncd.cpp:12 #include "warmRestartHelper.h":153 WarmRestartHelper::checkAndStart(FAST/SLOW は warm-restart timer に対応)

HLD 用語「FAST DOWNLOAD」「SLOW DOWNLOAD」は コードに literal では存在しない が、warm-restart の早期/通常区別として実装される。

6. CLI / CONFIG_DB / YANG

本 HLD は アーキテクチャ文書 で個別 CLI / CONFIG_DB / YANG の定義はない1。具体的設定は zebra の nexthop-group 設定や BGP bestpath 系で表現される(HLD 未明記)。

7. 制限事項

  • ECMP HW resource は限られるため、NHG 利用は multipath 成立時に限定
  • per-prefix table 更新は SLOW DOWNLOAD 側に残るので「N 非依存」は FAST 部のみ
  • nexthop tracking が過渡的に機能しないと PIC Edge が動かない可能性
  • FRR (PIC Local) と PIC Edge は 別タイミングで動くため、両者の干渉を設計上避ける必要

8. 干渉する機能

  • FRR zebra / bgpd: NHG (nexthop-group) の生成と FPM 連携
  • fpmsyncd / orchagent (nhgorch): APPL_DB → ASIC_DB の NHG 経路
  • BFD: 高速検出
  • EVPN / MPLS / SRv6: overlay service の付加(PIC は protocol-independent)
  • sonic-weighted-ecmp / local-ars-hld: NHG を共有する隣接機能

9. 次に読む

制限事項

  • BGP PIC は FRR の対応バージョン (8.x 以降) と該当 SAI capability の両方が必要で、未対応 platform では nexthop group 単位での速い切替にはならない。
  • IBGP PIC edge / core 双方を有効化するには bgp bestpath multipath-relax 等の設定組み合わせが前提で、HLD では明示されない場合がある。
  • VRF / EVPN との同時利用は VRF leaking パスで遅延が大きくなる事例があり、本機能の効果が打ち消されるケースがある。

引用元

参考: IETF draft-ietf-rtgwg-bgp-pic


  1. sonic-net/SONiC doc/pic/bgp_pic_arch_doc.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06