コンテンツにスキップ

Topics で読み物として読む

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

裏取りステータス: Code-verified

dplane_fpm_nl 移行、RTM_F_OFFLOAD 通知、fpmsyncd の応答チャネル、consistency monitoring script の現行 master 取り込みは未裏取り。

BGP Suppress FIB Pending(dplane_fpm_nl + RTM_F_OFFLOAD)

概要

T1 リブート直後に「FIB に乗っていない prefix を BGP がアドバタイズ → T2 が転送 → T1 で default route 経由で送り返し → credit loop / PFC storm」というシナリオを防ぐため、ASIC 書き込み完了まで BGP advertise を抑止する end-to-end フィードバック機構1

要点:

  • FRRbgp suppress-fib-pending 機能を活用。FRR は zebra から RTM_NEWROUTERTM_F_OFFLOAD フラグが立った応答を受けると当該 prefix を peer に advertise する
  • SONiC 側は orchagent / fpmsyncd 経由で「ASIC 書き込み完了」を zebra に返すループを実装
  • FRR の dplane_fpm_nl 新プラグインへの移行が前提(旧 fpm plugin は対応せず)1
  • グローバル ON/OFF を DEVICE_METADATA.localhost.suppress-fib-pending で切替。default disabled、ランタイム切替可

スコープ外: MPLSVNET routes。directly connected / kernel routes は本機構の対象外で従来通り即時 advertise1

動作仕様

フィードバックループ

sequenceDiagram
    participant B as bgpd (FRR)
    participant Z as zebra
    participant F as fpmsyncd
    participant A as APPL_DB
    participant O as orchagent
    participant S as syncd / SAI / ASIC
    B->>Z: install route (FIB pending)
    Z->>F: dplane_fpm_nl: RTM_NEWROUTE
    F->>A: ROUTE_TABLE write
    A->>O: notify
    O->>S: SAI route create
    S-->>O: OK
    O->>F: response (per-route OK / FAIL)
    F->>Z: RTM_NEWROUTE with RTM_F_OFFLOAD set
    Z->>B: route offloaded
    B->>B: advertise to peers

応答チャネルは「fpmsyncd ↔ zebra の TCP/FPM ソケット双方向利用」。HLD で response channel performance(per-route 通知のオーバーヘッド低減)の節を立てている1

CONFIG_DB

DEVICE_METADATA|localhost:
  suppress-fib-pending = enabled | disabled   # default disabled

ランタイム切替可。disabled のとき fpmsyncd は route をすぐ「offloaded 済み」として zebra に返す(つまり以前の挙動と同じ)1

Consistency monitoring と mitigation

route が advertise された後に dataplane で消えた場合、FRR は仕様上 withdraw を送らない(HLD 引用部の制約)1。これに対し SONiC 側は consistency monitoring script を別途持ち、STATE_DB / counters と BGP RIB を周期的に突き合わせ、不整合があれば mitigation(route 再 install)を打つ1

制約(FRR upstream の仕様)

HLD は FRR 仕様の制約をそのまま引用する1:

  • 既に local RIB にある prefix の re-learn には適用されない(best path 変更扱い)
  • redistribute 由来 route は対象外(peer 学習 route のみ)
  • 一旦 install された route が dataplane から消えても peer に withdraw は送らない("considered as dataplane issue")
  • 設定変更前に学習済み route には反映されないため clear bgp が必要
  • advertise が遅延する分、router 通信遅延は若干増える
📋 検証エビデンス: sonic-net/SONiC/doc/BGP/BGP-supress-fib-pending.md#L97-L103 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

出典:

sonic-net/SONiC/doc/BGP/BGP-supress-fib-pending.md#L97-L103 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

抜粋:

This feature is implemented as part of new *dplane_fpm_nl* zebra plugin in FRR 8.4 and a backport patch must be created
for current FRR 8.2 SONiC is using. SONiC is still using old *fpm* plugin which isn't developed anymore and thus SONiC
must migrate to the new implementation as part of this change.

判断根拠: dplane_fpm_nl 移行が機能の前提条件である根拠。

設定

CLI

HLD では専用 CLI の言及は無い。config device-metadata 系で書く想定か、CONFIG_DB を直接編集する。

設定例

sonic-db-cli CONFIG_DB hset "DEVICE_METADATA|localhost" suppress-fib-pending enabled

制限事項

  • MPLS / VNET routes は対象外1
  • directly connected / kernel routes は対象外
  • 設定変更前の学習済み route には反映されない(要 BGP session reset)
  • 一旦 install された route の dataplane drop には反応しない(FRR 仕様)
  • FRR 旧 fpm plugin から dplane_fpm_nl への移行が前提

干渉する機能

  • fpmsyncd NextHop Group 拡張: 同じ dplane_fpm_nl を共有するため、両機能の有効化状態が干渉しないか要確認
  • routeorch / orchagent crash: 従来は「route install 失敗 = orchagent crash で全 service restart」だったが、本機能はあくまで advertise 抑止であり crash 経路は別問題(ARP / nh resolution と組み合わせて議論)
  • CRM: ASIC リソース不足時の advertise 抑止に効くが、CRM threshold 設定との連携は HLD では未深堀

トラブルシューティング

  • 有効化したが advertise が止まらない → BGP session を reset(clear bgp *)必要
  • 有効化後に route advertise が極端に遅い → dplane_fpm_nl への移行が完了しているか確認
  • consistency monitor が誤判定 → スクリプトの周期と STATE_DB 反映遅延の関係を確認

コマンド例

Suppress FIB Pending の有効化と route advertise 状況を確認する。

docker exec bgp vtysh -c 'show running-config' | grep -iE 'suppress|fib'
show ip route summary
show bgp ipv4 unicast statistics 2>/dev/null | head

引用元

裏取りメモ (batch 30, 2026-05-11)

  • sonic-buildimage/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2:107bgp suppress-fib-pending 行が条件付きで挿入されており、FRR への機能有効化フックが実装済み。
  • sonic-buildimage/src/sonic-yang-models/yang-models/sonic-device_metadata.yang:242leaf suppress-fib-pending が定義されており、DEVICE_METADATA.localhost.suppress-fib-pending で ON/OFF を切替可能。
  • sonic-swss/fpmsyncd/routesync.h:19-22RTM_F_OFFLOAD の define、routesync.cpp:3115rtm->rtm_flags |= RTM_F_OFFLOAD を発行する zebra 応答ロジックが実装されている。fpmsyncd は dplane_fpm_nl 経由で zebra に offload 応答を返すフィードバックループの一端を担う。

HLD と実装は一致。code-verified に昇格。


  1. sonic-net/SONiC doc/BGP/BGP-supress-fib-pending.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06