コンテンツにスキップ

ROUTE_TABLE (STATE_DB / APPL_STATE_DB)

概要

SONiC には ROUTE_TABLE という名称のテーブルが 3 つの DB に存在する。このページでは orchagent (RouteOrch) が書き込む STATE_DBAPPL_STATE_DB の 2 テーブルを扱う。

DB 用途 書込み主体
APPL_DB fpmsyncd が FRR 経路を書き込む(ROUTE_TABLE (APPL_DB) 参照) fpmsyncd
STATE_DB デフォルト経路 (0.0.0.0/0 / ::0/0) の存在状態のみを書き込む RouteOrch
APPL_STATE_DB SAI への経路プログラミング結果(protocol + err_str)を書き込む RouteOrch via ResponsePublisher

設定 DB ではない

STATE_DB / APPL_STATE_DB の ROUTE_TABLE はどちらも 読み取り専用の状態情報。経路の追加・削除は APPL_DB の ROUTE_TABLE または CONFIG_DB の STATIC_ROUTE で行う。

データフロー

flowchart LR
  APPDB[("APPL_DB\nROUTE_TABLE")]
  OA["RouteOrch\norchagent"]
  SAI["SAI\nsai_route_api"]
  STATEDB[("STATE_DB\nROUTE_TABLE\nstate=ok/na")]
  APPLSTATE[("APPL_STATE_DB\nROUTE_TABLE\nprotocol + err_str")]

  APPDB -->|"subscribe"| OA
  OA -->|"updateDefRouteState()"| STATEDB
  OA -->|"SAI call"| SAI
  OA -->|"publishRouteState()"| APPLSTATE

STATE_DB ROUTE_TABLE

key 構造

ROUTE_TABLE|<prefix>

<prefix> は IPv4 デフォルト経路(0.0.0.0/0)または IPv6 デフォルト経路(::0/0 / ::/0)のみ。
一般のユニキャスト経路は STATE_DB の ROUTE_TABLE には書き込まれない。

フィールド一覧

フィールド 取り得る値 説明
state string "ok" / "na" デフォルト経路が存在する場合 "ok"、削除された場合 "na"

書き込みトリガー

RouteOrch::updateDefRouteState(string ip, bool add) が呼ばれたとき:

  • add=truestate = "ok"(デフォルト経路をプログラム完了)
  • add=falsestate = "na"(デフォルト経路を削除)

コード由来デフォルト詳細 (Phase A)

STATE_DB state フィールド

ソース: orchagent/routeorch.cpp lines 287–2951

void RouteOrch::updateDefRouteState(string ip, bool add)
{
    vector<FieldValueTuple> tuples;
    string state = add?"ok":"na";
    FieldValueTuple tuple("state", state);
    tuples.push_back(tuple);

    m_stateDefaultRouteTb->set(ip, tuples);
}
条件 state の値
デフォルト経路を SAI に追加成功後 "ok"
デフォルト経路を SAI から削除後 "na"
一般ユニキャスト経路 エントリ自体が存在しない

"na" は「フィールド不在」ではなく「デフォルト経路なし」という明示的状態である点に注意。フィールドが存在しない状態はデフォルト経路が一度もプログラムされていない初期状態のみ。

APPL_STATE_DB protocol フィールド

ソース: orchagent/routeorch.cpp lines 3185–32021

void RouteOrch::publishRouteState(const RouteBulkContext& ctx, const ReturnCode& status)
{
    std::vector<FieldValueTuple> fvs;

    if (ctx.is_set)
    {
        fvs.emplace_back("protocol", ctx.protocol);
    }

    m_publisher.publish(APP_ROUTE_TABLE_NAME, ctx.key, fvs, status, replace);
}
  • SET 操作時: protocol フィールドを ctx.protocol の値で書き込む
  • DEL 操作時: fvs が空 → ResponsePublisher がエントリ全体を APPL_STATE_DB から削除
  • ctx.protocol の初期値は "" で、APPL_DB の protocol フィールドが存在する場合のみ上書きされる
APPL_DB の protocol フィールド APPL_STATE_DB の protocol
"bgp" 等が存在する "bgp" 等(そのままコピー)
フィールド不在 "" (空文字列)

APPL_STATE_DB err_str フィールド

ResponsePublisher::publish() が自動付与するフィールド2:

swss::FieldValueTuple err_str("err_str", PrependedComponent(status) + status.message());
intent_attrs_copy.insert(intent_attrs_copy.begin(), err_str);
SAI 結果 err_str の値
成功 "SWSS_RC_SUCCESS"
SAI エラー "[SAI] <エラーメッセージ>"
その他失敗 "<エラーメッセージ>"

成功時は APPL_STATE_DB に protocolerr_str の 2 フィールドが書き込まれる。失敗時は通知チャンネルに送出されるが APPL_STATE_DB への書き込みはスキップされる。


APPL_STATE_DB ROUTE_TABLE

key 構造

ROUTE_TABLE:<prefix>
ROUTE_TABLE:<vrf_name>:<prefix>

APPL_DB の ROUTE_TABLE と同一キー空間。orchagent が SAI プログラミングに成功した後にのみ書き込まれる。

フィールド一覧

フィールド 書込み条件 説明
protocol string SET 操作かつ SAI 成功時 APPL_DB から引き継いだ経路プロトコル名(bgpstatickernel 等、または ""
err_str string SET / DEL 操作時 SAI 操作結果メッセージ。成功時 "SWSS_RC_SUCCESS"

購読者 (consumer)

プロセス 参照 DB / テーブル 用途
fpmsyncd APPL_STATE_DB ROUTE_TABLE SAI プログラミング結果を RESPONSE_CHANNEL 経由で受け取り、FRR へフィードバック
route_check.py APPL_STATE_DB ROUTE_TABLE route_check が APPL_DB と APPL_STATE_DB の整合を確認
BGP suppress / error-handling STATE_DB ROUTE_TABLE デフォルト経路の有無に基づく advertise 制御

関連リファレンス

引用元

運用ヒント

確認コマンド

# STATE_DB のデフォルト経路状態を確認
sonic-db-cli STATE_DB hgetall 'ROUTE_TABLE|0.0.0.0/0'
sonic-db-cli STATE_DB hgetall 'ROUTE_TABLE|::/0'

# APPL_STATE_DB の経路プログラミング結果を確認
sonic-db-cli APPL_STATE_DB hgetall 'ROUTE_TABLE:10.0.0.0/24'

# route_check.py でテーブル整合確認
sudo route_check.py

典型エントリ例

# STATE_DB: デフォルト経路あり
STATE_DB ROUTE_TABLE|0.0.0.0/0
  state: ok

# STATE_DB: デフォルト経路なし(削除後)
STATE_DB ROUTE_TABLE|0.0.0.0/0
  state: na

# APPL_STATE_DB: BGP 経路のプログラミング成功
APPL_STATE_DB ROUTE_TABLE:10.1.0.0/24
  err_str: SWSS_RC_SUCCESS
  protocol: bgp

よくある問題

  • STATE_DB の state=na が残る → デフォルト経路が FRR から削除されたが APPL_DB からも消えているか確認(sonic-db-cli APPL_DB hgetall 'ROUTE_TABLE:0.0.0.0/0'
  • APPL_STATE_DB にエントリがない → SAI プログラミングに失敗している可能性。/var/log/syslog の orchagent ログで err_str を確認