APPL_DB PORT_TABLE¶
概要¶
APPL_DB PORT_TABLE は物理ポートの実効設定と運用状態を保持する APPL_DB テーブル。
CONFIG_DB PORT テーブルとは別物であり、以下の 3 つのプロセスが書き込む123:
- portsyncd — 起動時に CONFIG_DB
PORTテーブルの全フィールドを APPL_DB に転写する - portmgrd — CONFIG_DB の変更を監視し、
admin_status/mtuの変更を APPL_DB に反映する。初回書き込み時はコード由来のデフォルト値を補完する - orchagent (PortsOrch) — SAI から通知を受けた
oper_status/flap_count/last_up_time/last_down_timeを書き戻す
flowchart LR
CDB[("CONFIG_DB\nPORT")]
PSYNC["portsyncd\n(全フィールド転写)"]
PMGR["portmgrd\n(admin_status/mtu)"]
APPDB[("APPL_DB\nPORT_TABLE")]
ORCH["orchagent\nPortsOrch"]
SAI["SAI\nsai_port_api"]
CDB --> PSYNC --> APPDB
CDB --> PMGR --> APPDB
APPDB --> ORCH --> SAI
SAI --> ORCH
ORCH --> APPDB
key 構造¶
<port_name> は Ethernet<N> 形式の物理ポート名。
フィールド一覧¶
| フィールド | 型 | 書き込み元 | デフォルト | 説明 |
|---|---|---|---|---|
admin_status |
up/down |
portsyncd / portmgrd | "down" ※1 |
管理状態 |
mtu |
uint (68..9216) | portsyncd / portmgrd | "9100" ※2 |
MTU [byte] |
speed |
uint [Mbps] | portsyncd | CONFIG_DB の値 | ポート速度 |
lanes |
string | portsyncd | CONFIG_DB の値 | ハードウェアレーン番号 |
alias |
string | portsyncd | CONFIG_DB の値 | ポート別名 |
index |
uint | portsyncd | CONFIG_DB の値 | フロントパネルポートインデックス |
description |
string | portsyncd | CONFIG_DB の値 | ユーザ定義説明 |
fec |
rs/fc/none/auto |
portsyncd | CONFIG_DB の値 | FEC モード |
autoneg |
on/off |
portsyncd | CONFIG_DB の値 | オートネゴシエーション |
link_training |
on/off |
portsyncd | CONFIG_DB の値 | リンクトレーニング |
adv_speeds |
uint list | portsyncd | CONFIG_DB の値 | 広告速度 |
interface_type |
string | portsyncd | CONFIG_DB の値 | インタフェースタイプ |
pfc_asym |
on/off |
portsyncd | CONFIG_DB の値 | 非対称 PFC |
tpid |
hex string | portsyncd | CONFIG_DB の値 | TPID |
subport |
uint | portsyncd | CONFIG_DB の値 | breakout サブポート番号 |
oper_status |
up/down |
orchagent | "down" ※3 |
実効運用状態 |
flap_count |
uint64 | orchagent | (フラップ発生後) | ポートフラップ累積回数 |
last_down_time |
string (UTC) | orchagent | (フラップ発生後) | 最後に DOWN した時刻 |
last_up_time |
string (UTC) | orchagent | (フラップ発生後) | 最後に UP した時刻 |
system_oper_status |
up/down |
orchagent | (Gearbox 環境のみ) | Gearbox system side oper status |
line_oper_status |
up/down |
orchagent | (Gearbox 環境のみ) | Gearbox line side oper status |
※1, ※2, ※3 は「コード由来の暗黙デフォルト」参照
購読者¶
- orchagent (PortsOrch):
PORT_TABLEをSubscriberStateTable/Tableで読み取り、SAI に反映する。PortsOrch はPORT_TABLEの oper_status / flap_count を書き戻す唯一のプロセス - linkmgrd:
mux_cableフラグを含むポートを検索するために読み込む - 各種 orchs: IntfsOrch / BufferOrch 等が PORT_TABLE の
oper_status変化を受けて副次処理を実行
コード由来の暗黙デフォルト (Phase A)¶
注記: YANG
default指定がない APPL_DB フィールドでも、portmgrd / orchagent がコード内でデフォルト値を注入する。以下は実装精読から検出した暗黙デフォルトと挙動。
admin_status¶
- portmgr.h:14
#define DEFAULT_ADMIN_STATUS_STR "down"でハードコード - portmgrd が初回 SET 時(ポートが
m_portListに未登録)に CONFIG_DB にadmin_statusフィールドが存在しなければ"down"を APPL_DB に書き込む (portmgr.cpp:175) - 初回 SET ではまず CONFIG_DB の値で上書きし、CONFIG_DB に値がない場合のみデフォルトが使われる (
portmgr.cpp:186-198) - portsyncd は CONFIG_DB PORT テーブルの
admin_statusをそのまま転写するが、CONFIG_DB に値がない場合は転写されない
暗黙デフォルト: "down" (portmgrd が CONFIG_DB に admin_status がないときに注入)
mtu¶
- portmgr.h:15
#define DEFAULT_MTU_STR "9100"でハードコード - portmgrd 初回 SET 時に CONFIG_DB に
mtuフィールドがなければ "9100" を APPL_DB に注入 (portmgr.cpp:176) - port.h には
DEFAULT_MTU 1492という別の定数も存在する。これは orchagent 内部の Port struct の初期値であり (port.h:194)、SAI デフォルト MTU (1514) から ethernet header/FCS 22 bytes を引いた値。APPL_DB に書かれる portmgrd のデフォルト9100とは別物であり混同に注意 - portmgrd が SAI に渡す際には
mtu値に 22 bytes を加算する (ethernet header + FCS 対応、portsorch 内)
暗黙デフォルト: "9100" (portmgrd fallback; CONFIG_DB に mtu フィールドがない場合)
oper_status¶
- orchagent (PortsOrch) がポート初期化時に
m_portTable->hset(port.m_alias, "oper_status", "down")を書き込む (portsorch.cpp:6643) - SAI から port oper status 変化通知を受信したとき、
updateDbPortOperStatus()が"up"または"down"に更新 (portsorch.cpp:3928) - warmboot 時は
m_portTable->get()で既存値を読み戻し、"up"ならSAI_PORT_OPER_STATUS_UPとして m_oper_status を初期化 (portsorch.cpp:6617-6647) SAI_PORT_OPER_STATUS_UNKNOWNはoper_status_stringsマップに定義されていないため、該当状態を受信するとstd::out_of_range例外が発生する可能性がある
暗黙デフォルト: "down" (orchagent がポート初期化時に書き込む値)
flap_count¶
- Port struct の
m_flap_count = 0が初期値 (port.h:235) - フラップ発生前は APPL_DB に
flap_countフィールドが存在しない - ポートフラップ発生時に
updateDbPortFlapCount()が累積カウンタを APPL_DB に書き込む (portsorch.cpp:3867-3870) - warmboot 時は既存の flap_count を読み戻して継続 (
portsorch.cpp:6655-6656)
暗黙デフォルト: 初期書き込みなし (フラップ発生後に初めて存在する)
last_down_time / last_up_time¶
updateDbPortFlapCount()内でポートが DOWN/UP になった時刻を"%a %b %d %H:%M:%S %Y"(UTC) 形式で記録 (portsorch.cpp:3878, 3887)- フラップ発生前は APPL_DB に該当フィールドが存在しない
暗黙デフォルト: 存在しない (フラップ初回発生で初期化)
system_oper_status / line_oper_status (Gearbox 専用)¶
updateGearboxPortOperStatus()が gearbox 環境 (isGearboxEnabled()が true) でのみ書き込む (portsorch.cpp:11220-11261)- gearbox 未使用の通常環境では APPL_DB にこれらのフィールドは書かれない
暗黙デフォルト: gearbox 未使用時は存在しない
speed / fec / lanes 等 (portsyncd パススルー)¶
- portsyncd は CONFIG_DB PORT テーブルの全フィールドを APPL_DB にそのままコピーする (
portsyncd.cpp:196-208) speed/fec/lanes/alias等のデフォルト値は CONFIG_DB 側 (sonic-port.yang / port_config.ini) が決定する- orchagent の
updateDbPortOperSpeed()/updateDbPortOperFec()は STATE_DB (m_portStateTable) に書くため APPL_DB の値は変わらない
暗黙デフォルト: CONFIG_DB の値をそのままパススルー
CONFIG_DB PORT との対応¶
| 側面 | CONFIG_DB PORT | APPL_DB PORT_TABLE |
|---|---|---|
| 書き込み元 | CLI / sonic-cfggen / db_migrator | portsyncd / portmgrd / orchagent |
| 主な用途 | 設定の永続化 | orchagent への設定伝達 + 運用状態の公開 |
| oper_status | なし | あり (orchagent が SAI から書き戻す) |
| flap_count | なし | あり (orchagent が書き込む) |
| last_up/down_time | なし | あり (orchagent が書き込む) |
確認コマンド¶
# APPL_DB PORT_TABLE を直接参照
sonic-db-cli APPL_DB hgetall 'PORT_TABLE:Ethernet0'
# 全ポートの oper_status を確認
show interfaces status
# APPL_DB と CONFIG_DB の差分確認
sonic-db-cli APPL_DB hget 'PORT_TABLE:Ethernet0' oper_status
sonic-db-cli CONFIG_DB hget 'PORT|Ethernet0' admin_status
関連リファレンス¶
- CONFIG_DB:
PORT テーブル - CLI:
show interfaces status、config interface
引用元¶
-
portsyncd portsyncd.cpp: https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/portsyncd/portsyncd.cpp ↩
-
portmgrd portmgr.h, portmgr.cpp: https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/cfgmgr/portmgr.h ↩
-
orchagent portsorch.cpp: https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/portsorch.cpp ↩