コンテンツにスキップ

STATE_DB STP_TABLE(STP 状態テーブル)

概要

STATE_DBSTP_TABLE は、スイッチ ASIC のハードウェア STP インスタンス上限を格納する 読み取り専用 の状態テーブル。orchagentStpOrch が 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 構造

STP_TABLE|GLOBAL

エントリは 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 と一致する。
  • 起動レース: stpmgrdorchagent より先に起動した場合、60 秒の待機ループが発動する。プロダクション環境では通常 orchagent が先に起動するためタイムアウトは稀。
  • フォールバック値 255 との関係: CONFIG_DB STP_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 設定

関連 Topics