STATE_DB BGP 関連テーブル¶
概要¶
SONiC の BGP ランタイム状態は 2 つの Redis DB にまたがって格納される。
- STATE_DB —
BGP_STATE_TABLE(EOIU マーカー)・BGP_PEER_CONFIGURED_TABLE(bgpcfgd によるピア確認状態) - BMP_STATE_DB —
BGP_NEIGHBOR_TABLE・BGP_RIB_IN_TABLE・BGP_RIB_OUT_TABLE(BMP コンテナが FRR/bgpd から収集する BGP モニタリングデータ)
いずれも 読み取り専用 の観測テーブルであり、CONFIG_DB への書き戻しは行われない1。
BGP_STATE_TABLE (STATE_DB)¶
目的¶
Warm Restart 時に bgp docker の bgp_eoiu_marker プロセスが書き込む EOIU(End-Of-Initial-Update)マーカー2。fpmsyncd がこのフラグを監視し、全 BGP ピアのルート収束完了を確認してから RIB 再構成(reconciliation)を開始する。Warm Restart が無効の場合は書き込まれない。
key 構造¶
<family>:"IPv4"または"IPv6"- サブキー: 常に
eoiu固定
フィールド¶
| フィールド | 型 | 初期値 | 設定値 | 説明 |
|---|---|---|---|---|
state |
enum string | "unknown" |
"unknown" / "reached" / "consumed" |
EOIU 到達状態。Warm Restart 開始時に "unknown" で初期化 |
timestamp |
string | (書き込み時刻) | "YYYY-MM-DD HH:MM:SS" |
最終更新時刻。strftime("%Y-%m-%d %H:%M:%S", gmtime()) で生成 |
state の遷移3:
| 値 | セット元 | タイミング |
|---|---|---|
"unknown" |
bgp_eoiu_marker.py |
Warm Restart 開始時(クリア後に再セット) |
"reached" |
bgp_eoiu_marker.py |
全 BGP ピアの EOR 受信完了後 |
"consumed" |
fpmsyncd |
reconciliation 開始後に更新(スキーマ定義上の値; fpmsyncd は read のみ確認) |
関連定数¶
| 定数 | 値 | 意味 |
|---|---|---|
DEFAULT_EOIU_HOLD_INTERVAL |
3 秒 |
EOIU 検出後の reconciliation 開始待機時間 |
DEFAULT_ROUTING_RESTART_INTERVAL |
120 秒 |
Warm Restart タイムアウト |
ソース: fpmsyncd/fpmsyncd.cpp L46, L51
BGP_PEER_CONFIGURED_TABLE (STATE_DB)¶
目的¶
bgpcfgd(managers_bgp.py)が CONFIG_DB の BGP_NEIGHBOR / BGP_PEER_RANGE を処理した後、ピアが bgpcfgd によって認識・設定済み であることを示す確認テーブル4。SDN コントローラが BGP ピアの設定反映を確認するために参照する。
key 構造¶
<vrf>: VRF / VNET 名。"default"VRF では省略<peer_name>: ピア IP アドレス(静的)またはピアグループ名(動的)
ソース: bgpcfgd/managers_bgp.py L280-283
フィールド(動的ピア)¶
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
ip_range |
list/string | 必須 | 動的ピアの listen range IP リスト |
name |
string | 必須 | ピアグループ名 |
peer_asn |
string | 任意 | ピアの AS 番号 |
src_address |
string | 任意 | セッション送信元 IP |
静的ピアの場合も同じテーブル名で BGP_NEIGHBOR のフィールドをそのまま転記する。
デフォルト値なし: CONFIG_DB の値を list(sorted(data.items())) でそのまま書き込む5。
書き込みタイミング¶
| 操作 | コード |
|---|---|
| SET(ピア追加・更新時) | state_peer_table.set(key, list(sorted(data.items()))) (L289) |
| DEL(ピア削除時) | state_peer_table.delete(key) (L294) |
全削除(config bgp remove neighbor 等) |
sonic-utilities/config/main.py L1613: delete_all_by_pattern(STATE_DB, "BGP_PEER_CONFIGURED_TABLE|*") |
BGP_NEIGHBOR_TABLE (BMP_STATE_DB)¶
目的¶
BGP Monitoring Protocol (BMP)6 が FRR/bgpd から収集した BGP ネイバー属性(capability、ポート番号、AS 情報など)を格納するテーブル。bmp docker 内の openbmpd が BGP OPEN メッセージを解析して書き込む。
key 構造¶
フィールド¶
| フィールド | 型 | サンプル値 | 説明 |
|---|---|---|---|
peer_addr |
IP string | "10.0.0.23" |
ピア IP アドレス |
peer_asn |
string | "65200" |
ピア AS 番号 |
peer_rd |
string | "0:0" |
Route Distinguisher |
remote_port |
string | "179" |
ピアのポート番号(BGP は 179) |
local_ip |
IP string | "10.0.0.22" |
ローカル IP アドレス |
local_asn |
string | "65100" |
ローカル AS 番号 |
local_port |
string | "40760" |
ローカルポート番号(エフェメラル) |
sent_cap |
string | "MPBGP (1) : afi=1 ..." |
送信 BGP capabilities(OPEN メッセージから) |
recv_cap |
string | "MPBGP (1) : afi=1 ..." |
受信 BGP capabilities(OPEN メッセージから) |
デフォルト値なし。FRR が BGP OPEN メッセージを送受信したタイミングで openbmpd が書き込む。
ソース: SONiC/doc/bmp/bmp.md L141-166(redis-cli HGETALL 実例); sonic-utilities/show/main.py L2550-2573
BGP_RIB_IN_TABLE / BGP_RIB_OUT_TABLE (BMP_STATE_DB)¶
目的¶
FRR が受信・送信した BGP ルートのスナップショット。RIB-In はピアから受信した経路(post-policy)、RIB-Out はピアへ送信する経路を格納する。openbmpd が BGP UPDATE メッセージを解析して書き込む7。
key 構造¶
<nlri>: ネットワークプレフィックス(例:"192.172.80.128/25"、"20c0:ef50::/64")<peer_ip>: BGP ピア IP アドレス
フィールド(RIB_IN / RIB_OUT 共通)¶
| フィールド | 型 | サンプル値 | デフォルト | 説明 |
|---|---|---|---|---|
origin |
string | "igp" |
— | 経路起源。"igp" / "egp" / "incomplete" |
as_path |
string | "65100 64600 65534" |
— | AS パス(スペース区切り) |
as_path_count |
string | "3" |
— | AS パスのホップ数 |
origin_as |
string | "65534" |
— | 起源 AS 番号 |
next_hop |
IP string | "" |
"" |
ネクストホップ IP。未設定時は空文字 |
local_pref |
string | "0" |
"0" |
Local Preference 値 |
community_list |
string | "" |
"" |
コミュニティ属性。未設定時は空文字 |
ext_community_list |
string | "" |
"" |
拡張コミュニティ属性。未設定時は空文字 |
large_community_list |
string | "" |
"" |
Large Community 属性。未設定時は空文字 |
originator_id |
string | "" |
"" |
ORIGINATOR_ID 属性。未設定時は空文字 |
ソース: SONiC/doc/bmp/bmp.md L167-209; sonic-utilities/tests/show_bmp_test.py L70-130
BMP テーブルのライフサイクル¶
BMP コンテナが再起動または FRR との接続が切断・再確立された場合、テーブルはクリアされてから再書き込みされる8。
bmpcfgd は CONFIG_DB の BMP.table エントリ(bgp_neighbor_table / bgp_rib_in_table / bgp_rib_out_table)を参照し、テーブルごとに収集の有効/無効を制御する。
CONFIG_DB BMP|table:
bgp_neighbor_table = "true" | "false"
bgp_rib_in_table = "true" | "false"
bgp_rib_out_table = "true" | "false"
-
sonic-swss-common/common/schema.hL437, L502, L511, L557-559 にテーブル名定数が定義されている。 ↩ -
sonic-swss/fpmsyncd/bgp_eoiu_marker.pyL4-17 (ファイルヘッダコメント) ↩ -
sonic-swss/fpmsyncd/bgp_eoiu_marker.pyL78-88, L200-208;sonic-swss/fpmsyncd/fpmsyncd.cppL54-72;sonic-swss/doc/swss-schema.mdL1155-1164 ↩ -
SONiC/doc/BGP/Bgpcfgd-dyn-peer-modification-support.mdL53-90 ↩ -
sonic-buildimage/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.pyL289 ↩ -
RFC 7854;
SONiC/doc/bmp/bmp.md↩ -
SONiC/doc/bmp/bmp.mdL286-306 ↩ -
sonic-buildimage/src/sonic-bmpcfgd/bmpcfgd/bmpcfgd.pyL64-65:delete_all_by_pattern(BMP_STATE_DB, 'BGP_RIB_IN_TABLE*')等 ↩