コンテンツにスキップ

STP / STP_VLAN / STP_PORT テーブル — 暗黙デフォルト詳細

ページの位置付け

このページは STPSTP_VLANSTP_PORTSTP_VLAN_PORT テーブルの コード由来デフォルト値・ハードコード挙動・モード別差異 を詳述する Phase A 分析ページ。 SONiC は PVST (Per-VLAN Spanning Tree) と MSTP (Multiple Spanning Tree Protocol) の 2 モードをサポートする。

概要

STP 設定は stpmgrd (sonic-swss/cfgmgr/stpmgrd.cpp) が CONFIG_DB を購読し、Unix Domain Socket (/var/run/stpipc.sock) 経由で STP デーモンに IPC メッセージを送信する。 CLI の config spanning-tree コマンド (sonic-utilities/config/stp.py) が CONFIG_DB に書き込みを行う。

テーブル構成:

テーブル キー形式 役割
STP GLOBAL グローバル STP 設定 (mode, タイマー, rootguard_timeout)
STP_VLAN Vlan<vid> VLAN ごとの STP 設定 (タイマー, priority)
STP_PORT <intf_name> インタフェースごとの STP 設定 (guard, portfast 等)
STP_VLAN_PORT Vlan<vid>\|<intf> per-VLAN per-port の path_cost / priority

暗黙デフォルトとハードコード挙動

1. STP|GLOBAL — PVST 有効化時の書き込みデフォルト

config spanning-tree enable pvst 実行時に config/stp.py:520-528 で以下が一括書き込まれる:

fvs = {
    'mode': 'pvst',
    'rootguard_timeout': 30,   # STP_DEFAULT_ROOT_GUARD_TIMEOUT
    'forward_delay': 15,       # STP_DEFAULT_FORWARD_DELAY
    'hello_time': 2,           # STP_DEFAULT_HELLO_INTERVAL
    'max_age': 20,             # STP_DEFAULT_MAX_AGE
    'priority': 32768          # STP_DEFAULT_BRIDGE_PRIORITY
}
フィールド デフォルト値 有効範囲 備考
mode "pvst" pvst / mst PVST か MSTP を選択
rootguard_timeout 30 (秒) 5–600 PVST のみ有効
forward_delay 15 (秒) 4–30
hello_time 2 (秒) 1–10
max_age 20 (秒) 6–40
priority 32768 0–61440 (4096 の倍数) ブリッジプライオリティ

証跡: config/stp.py:116-134, 520-528


2. STP|GLOBAL — MST 有効化時は mode のみ書き込み

config spanning-tree enable mst 実行時 (config/stp.py:533-539) は mode: "mst" のみ書き込まれる。 タイマー類 (forward_delay, hello_time, max_age, max_hops) は STP_MST|GLOBAL テーブルに保存される。

PVST と MST でテーブルが異なる

グローバルタイマーの格納先が PVST は STP|GLOBAL、MST は STP_MST|GLOBAL と分かれている。

証跡: config/stp.py:533-539


3. STP_VLAN — PVST 有効化時に全 VLAN へ自動適用

PVST 有効化時に enable_stp_for_vlans() (config/stp.py:251-266) が全 VLAN に対して実行される。 各 VLAN エントリのデフォルト値は STP|GLOBAL の値を継承する:

fvs = {
    'enabled': 'true',
    'forward_delay': <STP|GLOBAL の値>,
    'hello_time': <STP|GLOBAL の値>,
    'max_age': <STP|GLOBAL の値>,
    'priority': <STP|GLOBAL の値>
}
フィールド デフォルト値 有効範囲 備考
enabled "true" true / false VLAN STP 有効化フラグ
forward_delay 15 4–30 グローバルから継承
hello_time 2 1–10 グローバルから継承
max_age 20 6–40 グローバルから継承
priority 32768 0–61440 (4096 の倍数) VLAN ブリッジプライオリティ

最大 VLAN 数: PVST_MAX_INSTANCES = 255 (config/stp.py:136)。255 VLAN を超えると logging.warning のみで警告なく追加が打ち切られる (silent truncation)。

証跡: config/stp.py:136, 251-266, 278-289


4. STP_VLAN — グローバルパラメータ変更時の同期ルール

update_stp_vlan_parameter() (config/stp.py:228-242) によりグローバル値を変更すると、各 VLAN のフィールドがグローバルの旧値と一致する場合のみ 新値に更新される:

if current_global_value == current_vlan_value:
    db.mod_entry('STP_VLAN', vlan, {param_type: new_value})

個別に変更された VLAN は同期されない (意図的な設計)。

証跡: config/stp.py:228-242


5. STP_PORT — PVST 時のデフォルト

enable_stp_for_interfaces() (config/stp.py:361-379) で L2 インタフェース (VLAN メンバ) に対して書き込まれる:

fvs = {
    'enabled': 'true',
    'root_guard': 'false',
    'bpdu_guard': 'false',
    'bpdu_guard_do_disable': 'false',
    'portfast': 'false',
    'uplink_fast': 'false'
}
フィールド デフォルト モード 備考
enabled "true" PVST / MST
root_guard "false" PVST / MST
bpdu_guard "false" PVST / MST
bpdu_guard_do_disable "false" PVST のみ MST では bpdu_guard_do
portfast "false" PVST のみ MST 時は設定不可 (fail)
uplink_fast "false" PVST のみ MST 時は設定不可 (fail)
path_cost 未設定 PVST 明示設定が必要 (range: 1-200000000)
priority 未設定 PVST 明示設定が必要 (range: 0-240)

証跡: config/stp.py:292-301, 361-379


6. STP_PORT — MST 時のデフォルト

enable_mst_for_interfaces() (config/stp.py:441-470) で書き込まれる:

fvs_port = {
    'edge_port': 'false',
    'link_type': 'auto',
    'enabled': 'true',
    'bpdu_guard': 'false',
    'bpdu_guard_do': 'false',     # ← PVST の bpdu_guard_do_disable とは別フィールド
    'root_guard': 'false',
    'path_cost': 1,               # MST_DEFAULT_PORT_PATH_COST
    'priority': 128               # MST_DEFAULT_PORT_PRIORITY
}
フィールド デフォルト 備考
edge_port "false" MST のみ; PVST 時は設定不可
link_type "auto" MST のみ; auto / p2p / shared
bpdu_guard_do "false" MST フィールド名 (PVST は bpdu_guard_do_disable)
path_cost 1 MST 有効化時のみ初期値設定 (range: 1-200000000)
priority 128 MST 有効化時のみ初期値設定 (range: 0-240)

証跡: config/stp.py:441-470


7. STP_VLAN_PORT — per-VLAN per-port 設定

STP_VLAN_PORT テーブルはデフォルト値では 初期書き込みされない。 CLI コマンドで明示設定した場合のみエントリが作成される:

フィールド 有効範囲 設定コマンド
path_cost 1–200000000 config spanning-tree vlan interface cost <vid> <intf> <cost>
priority 0–240 config spanning-tree vlan interface priority <vid> <intf> <prio>

doStpVlanPortTask() (stpmgr.cpp:408-442) では priority のデフォルトが -1 (未設定を示す sentinel) として IPC メッセージに設定される。

証跡: config/stp.py:1285-1321, stpmgr.cpp:408-442


8. bpdu_guard_do_disable vs bpdu_guard_do — フィールド名 discrepancy

PVST と MST でフィールド名が異なる:

モード フィールド名
PVST bpdu_guard_do_disable
MST bpdu_guard_do

同一の物理的機能 (BPDU guard 発動時にポートを shutdown するか否か) にもかかわらず、フィールド名が統一されていない。 stpmgr.cpp:processStpPortAttr() では bpdu_guard_do_disable のみ処理しており、MST の bpdu_guard_do は現在の実装では 処理されない可能性がある (YANG-実装 discrepancy)。

証跡: config/stp.py:294-298, 441-451, stpmgr.cpp:586-590


9. タイマー整合性制約: 2(fd-1) >= max_age >= 2(ht+1)

STP タイマーは validate_params() (config/stp.py:183-187) により以下の不等式を強制する:

2 * (forward_delay - 1) >= max_age >= 2 * (hello_time + 1)

デフォルト値での検証: 2*(15-1)=28 >= 20 >= 2*(2+1)=6 → 満足

この制約は STP|GLOBALSTP_VLAN の両方で個別にチェックされる。 stpmgrd 側での検証はなく、CONFIG_DB に不正値が書き込まれた場合の動作は未定義。

証跡: config/stp.py:183-207


10. stpmgrd 起動順序ガード — silent defer

doStpVlanTask() (stpmgr.cpp:182-184) は stpGlobalTask == false (グローバル設定未受信) または STP_PORT タスク未完の場合に return する (silent defer)。

同様に doStpVlanPortTask()stpGlobalTask, stpVlanTask, stpPortTask すべてが true になるまで処理を保留する。

起動時の書き込み順序がずれると設定が遅延適用される (エラーなし、syslog なし)。

証跡: stpmgr.cpp:81-86, 182-184, 448-450


11. PVST 最大インスタンス制限 — silent truncation

PVST_MAX_INSTANCES = 255 (config/stp.py:136) を超えた VLAN への STP 適用は logging.warning のみで停止する。 stpmgrd 側の STP_DEFAULT_MAX_INSTANCES = 255 (stpmgr.h:38) と整合している。

255 を超えるカウントは get_stp_enabled_vlan_count() で判定されるが、get_max_stp_instances() から返る値は常に固定値 255 である。 実行時の最大インスタンス数は State DB から取得可能 (getStpMaxInstances())。

証跡: config/stp.py:136, 260-265, stpmgr.h:38

発見された discrepancy / 暗黙デフォルト サマリー

# 種別 対象 内容
1 コードデフォルト STP\|GLOBAL rootguard_timeout PVST 有効化時に 30 を書き込み
2 コードデフォルト STP\|GLOBAL forward_delay PVST 有効化時に 15 を書き込み
3 コードデフォルト STP\|GLOBAL hello_time PVST 有効化時に 2 を書き込み
4 コードデフォルト STP\|GLOBAL max_age PVST 有効化時に 20 を書き込み
5 コードデフォルト STP\|GLOBAL priority PVST 有効化時に 32768 を書き込み
6 継承動作 STP_VLAN 全フィールド PVST 有効化時に STP\|GLOBAL から値を継承
7 silent truncation STP_VLAN 最大数 255 VLAN 超過時に警告のみで打ち切り
8 未設定フィールド STP_PORT path_cost (PVST) PVST 初期化時に書き込みなし、明示設定が必要
9 未設定フィールド STP_PORT priority (PVST) PVST 初期化時に書き込みなし、明示設定が必要
10 コードデフォルト STP_PORT path_cost (MST) MST 有効化時に 1 を書き込み
11 コードデフォルト STP_PORT priority (MST) MST 有効化時に 128 を書き込み
12 実装 discrepancy bpdu_guard_do_disable vs bpdu_guard_do PVST/MST でフィールド名が異なり stpmgrd 処理が非対称
13 未初期化テーブル STP_VLAN_PORT 明示 CLI 設定前はエントリなし
14 silent defer stpmgrd 起動順序 グローバル/VLAN/PORT タスク順序に依存した暗黙処理遅延
15 MST モード差異 STP\|GLOBAL タイマー MST では STP

引用元

関連ページ