PASS_THROUGH_ROUTE_TABLE テーブル(ChassisOrch)¶
概要¶
PASS_THROUGH_ROUTE_TABLE は CONFIG_DB に保持され、VoQ (Virtual Output Queue) チャシスのフロントエンドルータが VNet パススルールートを管理するテーブルである1。orchagent 内の ChassisOrch がこのテーブルを購読し、VNet nextHop 変化通知を受けて APP_DB の同名テーブルへルートエントリを転送する。
データフロー¶
flowchart LR
CDB[("CONFIG_DB\nPASS_THROUGH_ROUTE_TABLE")]
ChOrch["ChassisOrch\n(orchagent)"]
VNetOrch["VNetRouteOrch\n(observer)"]
ADB[("APP_DB\nPASS_THROUGH_ROUTE_TABLE")]
RouteOrch["routeorch"]
CDB -->|doTask: attach/detach| ChOrch
ChOrch -->|attach(observer)| VNetOrch
VNetOrch -->|VNetNextHopUpdate| ChOrch
ChOrch -->|set/del| ADB
ADB --> RouteOrch
凡例
CONFIG_DB エントリが「パススルールートを有効にする」シグナルとして機能する。実際のルート情報は VNetRouteOrch から通知された VNetNextHopUpdate をもとに APP_DB に書き込まれる。
key 構造¶
<IP_prefix>: VNet ルートの宛先 IP プレフィックス(例:10.1.0.0/16)IpPrefixクラスで正規化される
フィールド(CONFIG_DB 側)¶
このテーブルはフィールドを持たない key-only テーブルである。
CONFIG_DB に書き込まれる情報は key(IP プレフィックス)のみで、フィールド値は使用しない。ChassisOrch の doTask() は key を読み取り、SET 操作時は VNetRouteOrch::attach()、DEL 操作時は VNetRouteOrch::detach() を呼び出すだけである2。
YANG スキーマ
本テーブルの YANG モデルは存在しない。YANG バリデーションの対象外。
APP_DB への書き込みフィールド¶
ChassisOrch が VNet nextHop 更新を受けて APP_DB PASS_THROUGH_ROUTE_TABLE に書き込むフィールドを以下に示す。
| フィールド | 型 | 固定値 / 由来 | 説明 |
|---|---|---|---|
redistribute |
string | "true" (固定) |
ルートの再配布フラグ。常に "true" |
next_vrf_name |
string | VNetNextHopUpdate.vnet |
nextHop が属する VNet 名 |
next_hop_ip |
string | VNetNextHopUpdate.nexthop.ips.to_string() |
nextHop IP アドレス |
ifname |
string | VNetNextHopUpdate.nexthop.ifname |
出力インタフェース名 |
source |
string | "CHASSIS_ORCH" (固定) |
書き込み主体の識別子 |
暗黙デフォルト・コード由来挙動¶
redistribute = "true" の固定値¶
APP_DB に書き込まれる redistribute は常に "true" のハードコード固定値である。ユーザー設定不可・YANG 未定義。
routeorch はこのフィールドを参照してルート再配布の制御を行う(routeorch 側の実装による)。
source = "CHASSIS_ORCH" の識別子¶
全エントリに source = "CHASSIS_ORCH" が付与される。書き込み主体を識別するための固定文字列で、変更不可。
エントリ削除の連鎖¶
CONFIG_DB から PASS_THROUGH_ROUTE_TABLE|<prefix> が削除(DEL)された場合:
1. ChassisOrch::doTask() が VNetRouteOrch::detach(this, ip) を呼び出す
2. その後 VNetNextHopUpdate 通知経由で deleteRoutePassThroughRouteTable() が呼び出される
3. APP_DB から対応エントリが削除される
// orchagent/chassisorch.cpp:43-47
void ChassisOrch::deleteRoutePassThroughRouteTable(const VNetNextHopUpdate& update)
{
const std::string everflow_route = IpPrefix(update.destination.to_string()).to_string();
m_passThroughRouteTable.del(everflow_route);
}
ChassisOrch の初期化依存¶
ChassisOrch は orchdaemon の VNET 系orch 初期化後に登録される:
// orchagent/orchdaemon.cpp:290-293
const vector<string> chassis_frontend_tables = {
CFG_PASS_THROUGH_ROUTE_TABLE_NAME, // = "PASS_THROUGH_ROUTE_TABLE"
};
ChassisOrch* chassis_frontend_orch = new ChassisOrch(m_configDb, m_applDb, chassis_frontend_tables, vnet_rt_orch);
VNetRouteOrch (vnet_rt_orch) が存在しない場合、ChassisOrch は機能しない(constructor で受け取る依存関係)。
ハードコード定数一覧¶
| 定数 | 値 | 場所 |
|---|---|---|
| CONFIG_DB テーブル名 | "PASS_THROUGH_ROUTE_TABLE" |
schema.h:371 CFG_PASS_THROUGH_ROUTE_TABLE_NAME |
| APP_DB テーブル名 | "PASS_THROUGH_ROUTE_TABLE" |
schema.h:93 APP_PASS_THROUGH_ROUTE_TABLE_NAME |
redistribute |
"true" |
chassisorch.cpp:34 |
source |
"CHASSIS_ORCH" |
chassisorch.cpp:38 |
制約¶
<IP_prefix>はIpPrefixクラスで正規化される(ホストビットが切り捨てられる)- CONFIG_DB エントリはフィールドを持たないため、値の書き込みは不要
- YANG モデルが存在しないため、
config load/config reload時の YANG バリデーション対象外
書き込み入り口¶
対象テーブル: CONFIG_DB PASS_THROUGH_ROUTE_TABLE
- 通常はBGP / sonic-cfggen / 手動設定経由で CONFIG_DB に書き込まれる想定
- CLI コマンドは現時点で存在しない(
config/showサブコマンドなし) sonic-db-cli CONFIG_DB hset 'PASS_THROUGH_ROUTE_TABLE|10.1.0.0/16' dummy 1で直接設定可能
購読者¶
ChassisOrch(orchagent) — CONFIG_DB テーブルチェンジを購読し VNetRouteOrch に attach/detach する
関連 CONFIG_DB / APP_DB¶
- 関連 CONFIG_DB:
VNET_ROUTE_TABLE(VNet ルート設定) - 関連 APP_DB:
PASS_THROUGH_ROUTE_TABLE(ChassisOrch の書き込み先)、SYSTEM_NEIGH、SYSTEM_LAG_TABLE(chassis app DB クリーンアップ対象)
関連リファレンス¶
- ソース:
sonic-swss/orchagent/chassisorch.cpp - ソース:
sonic-swss/orchagent/chassisorch.h - ソース:
sonic-swss/orchagent/orchdaemon.cpp - スキーマ定数:
sonic-swss-common/common/schema.h
引用元¶
-
ChassisOrch 実装:
chassisorch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/chassisorch.cpp ↩ -
ChassisOrch の
doTask():chassisorch.cpp:50-67. observer attach/detach のみを行い、CONFIG_DB フィールドは参照しない。 ↩