STATE_DB STP_TABLE(STP 状態テーブル)¶
概要¶
STATE_DB の STP_TABLE は、スイッチ ASIC のハードウェア STP インスタンス上限を格納する 読み取り専用 の状態テーブル。orchagent の StpOrch が SAI 属性 SAI_SWITCH_ATTR_MAX_STP_INSTANCE から取得した値を書き込み、stpmgrd がこの値を読み取って STP インスタンス数を管理する。
テーブルには GLOBAL キーの 1 エントリのみが存在し、フィールドは max_stp_inst の 1 本のみ。
書き込み主体:
| プロセス | 書き込みトリガー | ファイル |
|---|---|---|
orchagent (StpOrch) |
起動時に SAI から SAI_SWITCH_ATTR_MAX_STP_INSTANCE 取得成功時 |
orchagent/stporch.cpp |
データフロー¶
flowchart LR
SAI["ASIC SAI\nSAI_SWITCH_ATTR_MAX_STP_INSTANCE"]
STPORCH["StpOrch\n(orchagent)"]
STATEDB[("STATE_DB\nSTP_TABLE|GLOBAL")]
STPMGR["StpMgr\n(stpmgrd)\ngetStpMaxInstances()"]
STPD["stpd\n(STP daemon)"]
SAI -->|"get_switch_attribute()"| STPORCH
STPORCH -->|"max_stp_inst = N-1"| STATEDB
STATEDB -->|"60秒ポーリング\n読み取り"| STPMGR
STPMGR -->|"IPC メッセージ"| STPD
key 構造¶
エントリは GLOBAL キーの 1 件のみ。
フィールド一覧¶
| フィールド | 書込み主体 | 型 | コード由来デフォルト | 説明 |
|---|---|---|---|---|
max_stp_inst |
orchagent/StpOrch |
uint16 (文字列) | HW 依存 (SAI_SWITCH_ATTR_MAX_STP_INSTANCE - 1) |
スイッチ ASIC がサポートする最大 STP インスタンス数 |
コード由来の暗黙デフォルト¶
1. max_stp_inst — SAI 由来 HW 能力値¶
StpOrch::updateMaxStpInstance() (stporch.cpp:603-617) が SAI から取得した最大インスタンス数から -1 した値を書き込む:
bool StpOrch::updateMaxStpInstance(uint32_t max_stp_instances)
{
m_maxStpInstance = (sai_uint16_t)max_stp_instances - 1;
// STP インスタンス ID が 0-indexed であるため -1 補正
vector<FieldValueTuple> tuples;
FieldValueTuple tuple("max_stp_inst", to_string(m_maxStpInstance));
tuples.push_back(tuple);
m_stpTable->set("GLOBAL", tuples);
return true;
}
| フィールド | YANG default | コード実装デフォルト | 出典 |
|---|---|---|---|
max_stp_inst |
なし (STATE_DB に YANG 定義なし) | HW 依存: SAI_SWITCH_ATTR_MAX_STP_INSTANCE - 1 |
stporch.cpp:603-617 |
証跡: stporch.cpp:28-40, 603-617
2. stpmgrd フォールバック — 60 秒ポーリング後の固定値¶
StpMgr::getStpMaxInstances() (stpmgr.cpp:1381-1413) は起動時に STP_TABLE|GLOBAL を最大 60 秒ポーリングする。タイムアウトした場合は STP_DEFAULT_MAX_INSTANCES = 255 をフォールバック値として使用する:
// stpmgr.cpp:1407-1410
if(max_stp_instances == 0)
{
max_stp_instances = STP_DEFAULT_MAX_INSTANCES; // = 255
}
| 条件 | 値 | 出典 |
|---|---|---|
SAI 取得成功 (orchagent が先に起動) |
SAI_SWITCH_ATTR_MAX_STP_INSTANCE - 1 (HW 依存) |
stporch.cpp:603-617 |
60 秒タイムアウト (orchagent 未起動など) |
255 (固定フォールバック) |
stpmgr.h:38 |
証跡: stpmgr.cpp:1381-1413, stpmgr.h:38
3. SAI 取得失敗時 — STATE_DB 未書き込み¶
StpOrch コンストラクタで SAI_SWITCH_ATTR_MAX_STP_INSTANCE 取得に失敗した場合、updateMaxStpInstance() は呼ばれず、STP_TABLE|GLOBAL エントリは作成されない。この場合 stpmgrd は 60 秒待機後にフォールバック値 255 を使用する。
証跡: stporch.cpp:34-41
例外条件・特殊挙動¶
- -1 補正:
max_stp_instは SAI の返す最大数から -1 した値。STP インスタンス ID が 0 始まりのため、使用可能な最大インスタンス ID がmax_stp_instと一致する。 - 起動レース:
stpmgrdがorchagentより先に起動した場合、60 秒の待機ループが発動する。プロダクション環境では通常 orchagent が先に起動するためタイムアウトは稀。 - フォールバック値
255との関係: CONFIG_DBSTP_VLANの上限PVST_MAX_INSTANCES = 255(config/stp.py:136) および stpmgrd のSTP_DEFAULT_MAX_INSTANCES = 255(stpmgr.h:38) と整合する設計。実 HW の SAI 値が 255 以下の場合は SAI 値が優先される。 - フィールドは 1 本のみ:
STP_TABLE|GLOBALにはmax_stp_instのみ存在し、他のフィールドは書かれない。
確認コマンド¶
# STP_TABLE のエントリ確認
sonic-db-cli STATE_DB hgetall 'STP_TABLE|GLOBAL'
# 出典: https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/stporch.cpp#L603-L617
関連リファレンス¶
- CONFIG_DB:
STP— グローバル STP 設定 (PVST/MST タイマー、コード由来デフォルト詳細) - CONFIG_DB:
STP_VLAN— VLAN ごとの STP 設定 - CONFIG_DB:
STP_PORT— インタフェースごとの STP 設定 - CONFIG_DB:
STP_MST— MST 設定