Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 02 章: BGP と FRR 制御プレーン を参照。
裏取りステータス: Discrepancy-found(HLD 提案は現行 master に取り込まれていない)
ERROR_ROUTE_TABLE / BGP_ERROR_CFG_TABLE / config bgp error-handling CLI を sonic-swss / sonic-utilities / sonic-buildimage / sonic-frr / sonic-buildimage/src/sonic-yang-models/ 全体に対して grep ヒット 0 件(verified 2026-05-09)。本 HLD で提案された ERROR_ROUTE_TABLE 経由の FIB-install pending 機構は採用されず、後発の BGP Suppress FIB Pending(dplane_fpm_nl + bgp suppress-fib-pending コマンド)に置き換えられている。sonic-buildimage/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 L107 で bgp suppress-fib-pending のデフォルト有効化を確認。本 HLD は歴史的設計提案として残し、実装裏取りは BGP Suppress FIB Pending ページで継続。
BGP Route Install Error Handling(ERROR_ROUTE_TABLE / FIB-install pending)¶
概要¶
ASIC への route install が(CRM 制限などで)失敗した場合に、その情報を ERROR_DB.ERROR_ROUTE_TABLE 経由で fpmsyncd → zebra → bgpd まで伝搬し、bgpd 側で当該 prefix を "FIB-install pending" と marking して peer への advertise を抑止する 仕組み1。
要点:
- ECMP の場合、NHG 内の一部 NH の install 失敗も route 全体の失敗として扱う
- BGP のリトライ機構は本 HLD のスコープ外(user が
clear系コマンドで手動 retry 必要)1 - warm reboot / GR 対応は別物としてスコープ外
- グローバル ON/OFF は
BGP_ERROR_CFG_TABLE:config.enable=true/false。default disabled。enabled→disabled の切替は BGP container 再起動推奨
動作仕様¶
コンポーネント間フロー¶
sequenceDiagram
participant B as bgpd (FRR)
participant Z as zebra
participant K as kernel
participant F as fpmsyncd
participant A as APP_DB
participant O as orchagent
participant S as syncd / SAI
participant E as ERROR_DB
B->>Z: install route
Z->>K: route add (FIB)
Z->>F: FPM RTM_NEWROUTE
F->>A: ROUTE_TABLE
O->>S: SAI route create -> FAIL (CRM full)
S->>E: ERROR_ROUTE_TABLE 書き込み
E-->>F: subscribe 通知
F->>Z: zebra common-header msg "route failed"
Z->>K: kernel から route withdraw
Z->>B: NOTIFY: route not installed
B->>B: RIB-IN に "FIB-install pending" mark
B->>B: RIB-OUT から削除(advertise 取消)
各レイヤの責務¶
| Layer | 責務 |
|---|---|
syncd / orchagent |
SAI 失敗を ERROR_ROUTE_TABLE に書き出す(既存 error handling framework 経由)1 |
fpmsyncd |
BGP_ERROR_CFG_TABLE.enable=true のとき ERROR_ROUTE_TABLE を subscribe。失敗を zebra socket 経由で送る(既存 FPM TCP socket を再利用) |
zebra |
失敗 route を kernel から withdraw、RIB に "Not installed in hardware" フラグ。次善 NH を fpmsyncd に流さない |
bgpd |
"pending FIB install" を default 状態とし、success 通知でクリア。failure 通知では advertise しない / RIB-OUT から削除 |
CONFIG_DB¶
表示¶
show bgp ipv4 unicast の status code に #(FIB-install pending)が増える。show ip route でも #(Not installed in hardware)が出る1。
ECMP の扱い¶
fpmsyncd は ECMP route を NH list 込みで受け取る。NHG 単位でも install 失敗は「route 全体の失敗」とする1。NH 1 件だけ失敗したような部分失敗は表現しない。
📋 検証エビデンス: sonic-net/SONiC/doc/bgp_error_handling/BGP_Route_Error_Handling_Arlo.md#L93-L96 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/bgp_error_handling/BGP_Route_Error_Handling_Arlo.md#L93-L96 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
A new class is added in fpmsyncd to subscribe to ERROR_ROUTE_TABLE present inside the ERROR_DB.
Subscription to this table is sufficient to handle the errors in route installation.
Currently, fpmsyncd has a TCP socket with Zebra listening on FPM_DEFAULT_PORT. ... We will reuse the same socket
to send information back to Zebra.
判断根拠: ERROR_ROUTE_TABLE 経由 + 既存 FPM socket 双方向の根拠。
設定¶
CLI¶
enabled→disabled 切替時は HLD 上 BGP docker 再起動が推奨1。disabled の間に投入された route には機能が効かないため、enable 後は session reset が現実的。
制限事項¶
- 失敗 route の 自動リトライは未実装(user 操作で手動 retry)1
- warm reboot / GR for BGP はスコープ外
- 部分 NH 失敗の表現はない(route 単位)
- enable/disable 切替時の挙動はやや不安定。container 再起動を推奨
- EntityBulker の SAI_STATUS_ITEM_NOT_FOUND (sonic-swss#3270):
EntityBulker.flushがルート削除処理時に既に存在しないエントリを SAI に渡しSAI_STATUS_ITEM_NOT_FOUNDで失敗するケースがある。syslog にflush_removing_entries: EntityBulker.flush remove entries failed, number of entries to remove: 1, status: SAI_STATUS_ITEM_NOT_FOUNDが記録される。ECMP ネクストホップグループの更新中に発生しやすく、orchagent は警告を出した上で処理を継続するが、状態の一時的な不整合が生じることがある。
干渉する機能¶
- BGP Suppress FIB Pending: 同じ目的で後発の dplane_fpm_nl + RTM_F_OFFLOAD 経路がある。両機能の共存・置き換え関係は要確認
- CRM: ASIC リソース不足を警告するメカニズム。本機能と組み合わせ、CRM threshold 越え前から advertise 抑止できる
- orchagent error framework:
ERROR_ROUTE_TABLE自体は SAI failure 一般の枠組みの一部
トラブルシューティング¶
show ip routeに#が増えない →BGP_ERROR_CFG_TABLE.enable=true確認、fpmsyncd のログで subscribe 完了確認- enable した直後の既存 route には適用されない → BGP session を
clear bgp *で reset
HLD と実装の差分
2026-05-09 時点の現行 master を裏取り。本 HLD は採用されず、後発の BGP Suppress FIB Pending に置き換えられている。
1. ERROR_DB / ERROR_ROUTE_TABLE は未実装¶
- HLD 記述: 新規 Redis DB
ERROR_DBとERROR_ROUTE_TABLEを導入し、orchagent → fpmsyncd → zebra → bgpd の経路で FIB-install 失敗を伝搬する。 - 実装位置:
sonic-swss-common/common/schema.h、sonic-swss/orchagent/、sonic-buildimage/src/sonic-yang-models/、sonic-frr/のいずれにもERROR_ROUTE_TABLE/ERROR_DB(独立 Redis DB id)の定義は 存在しない(grep ヒット 0)。 - 差分の中身: HLD で計画された subscriber クラス(fpmsyncd 側
ErrorListener等)も実装されていない。FPM socket の双方向化(zebra への送信路)も入っていない。 - 読者への影響: 「HLD のとおりに
ERROR_ROUTE_TABLEを watch して BGP advertise を抑止する」設計を期待すると動かない。現行は orchagent のSWSS_LOG_ERRORで失敗ログが出るのみで、BGP 側は失敗を構造化された形で受け取らない。 - 回避策: route install 失敗による誤広告を防ぐには次節の BGP Suppress FIB Pending を使う。
2. BGP_ERROR_CFG_TABLE / config bgp error-handling CLI も未実装¶
- HLD 記述: CLI
config bgp error-handling enable/disableでBGP_ERROR_CFG_TABLEを ON/OFF する。 - 実装位置:
sonic-utilities/config/main.pyにbgp error-handlingサブコマンドは存在せず、sonic-yang-modelsにもsonic-bgp-error-cfg.yang相当は無い。 - 差分の中身: CLI / yang / CONFIG_DB スキーマ全てが提案レベルで止まっている。
- 読者への影響: 設定する手段が無いため、本 HLD の「条件分岐」自体が現行 master では発生しない。
- 回避策: 本機能は 設定しない。必要な機能は次項に置き換わっている。
3. 後発機能 BGP Suppress FIB Pending が代替¶
- 実装位置:
sonic-buildimage/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2:107デフォルトでbgpdの起動 config に挿入される。FRR 側はdplane_fpm_nlと zebra の RTM_F_OFFLOAD/RTM_F_TRAP フラグを利用し、ASIC への install 完了通知を受けるまで BGP advertise を保留する。 - 差分の中身: HLD は「ERROR_DB 経由で失敗を能動通知」だが、実装は「ASIC 取り込み成功の確認を待ってから広告する」inverse のアプローチ。失敗時の挙動は「ずっと pending のまま広告しない」となる。
- 読者への影響: 結果として運用観点では本 HLD の意図と同じ「未 install な route は広告しない」が満たされる。一方で「失敗の明示的なカウント/lookup table」は提供されない(pending のままという受動的な状態)。
- 回避策:
- 実運用では BGP Suppress FIB Pending を有効のままにする(デフォルト有効)。
- 「どの prefix が pending か」を知りたいときは
vtysh -c "show ip route <prefix>"のT>/>flag(installed/offloaded)を確認するか、show bgp ipv4 unicastの status code を見る。 - 詳細は routing/bgp-suppress-announcements-of-routes-not-installed-in-hw.md を参照。
結論¶
本 HLD(2019)は採用されなかった。設計意図は後発の BGP Suppress FIB Pending(FRR bgp suppress-fib-pending + RTM_F_OFFLOAD)に引き継がれており、ERROR_DB 経由の仕組みは実装されていない。本ページは設計史としての参考。
関連 GitHub Issue / PR¶
- [GitHub Issue / PR の関連リンクは未確認] —
ERROR_ROUTE_TABLE/ FIB-install pending の HLD 取り込みは fpmsyncd / orchagent の個別 PR に分散しており、HLD と直接紐づくトラッキング Issue / PR は確認できず。
コマンド例¶
BGP route install error の有効状態と ERROR_DB を確認する (現行 master では未実装、Suppress FIB Pending に置換)。
show runningconfig bgp | grep -iE 'error|suppress'
redis-cli -n 0 keys 'ERROR_ROUTE_TABLE*'
docker exec bgp vtysh -c 'show bgp summary' | head
引用元¶
このページを読んだ後の次アクション¶
読み手向け
- 本機能を実運用で使う場合: 本 HLD は採用見送り。後継機能 (下記リンク) を参照
- upstream 動向を追う場合: 関連 issue / PR を sonic-net/SONiC で検索(HLD タイトル / CONFIG_DB テーブル名 / Orch クラス名で grep するのが速い)
- 代替手段 / 関連 reference: 本ページの frontmatter
relatedが空のため、Reference 索引 から関連テーブル / CLI / YANG を辿る
本ドキュメントの追跡
- monitor:
deprecated/ last_verified:2026-05-09 - 次回再裏取りトリガ: biannual。一覧は discrepancy-index を参照(運用詳細は repo の
meta/discrepancy-operations.md)