CABLE_LENGTH テーブル¶
概要¶
ポートごとのケーブル長を保持し、バッファマネージャ (buffermgr / buffermgrdyn) が lossless Priority Group (PG) の headroom サイズを計算するために参照する1。dynamic buffer モードでは buffermgrdyn が speed・mtu と組み合わせてリアルタイムに BUFFER_PG プロファイルを生成する。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>CABLE_LENGTH")]
BM["buffermgr / buffermgrdyn"]
CDB --> BM
APPL[("APPL_DB<br/>BUFFER_PG / BUFFER_PROFILE")]
BM --> APPL
SAI["SAI<br/>buffer API"]
APPL --> SAI
凡例
CONFIG_DB から SAI までの典型経路を示すミニ図。詳細・例外は本ページ本文を参照。
key 構造¶
<name> はケーブル長設定グループ名。デフォルトでは AZURE が使われる(後述)。
主要フィールド¶
| フィールド | 型 | YANG default | 説明 |
|---|---|---|---|
<ifname> (フィールド名) |
string ([0-9]+m) |
— | ポート名をキーとし、ケーブル長 (40m 等) を値とする。PORT_LIST.name への leafref |
テーブル構造の特殊性
このテーブルは「フィールド名 = ポート名、値 = ケーブル長」という構造。
例: CABLE_LENGTH|AZURE → {"Ethernet0": "40m", "Ethernet4": "5m"}
購読者¶
buffermgr(sonic-swss/cfgmgr/buffermgr.cpp): static buffer モード。pg_profile_lookup.iniを参照して PG プロファイルを設定。buffermgrdyn(sonic-swss/cfgmgr/buffermgrdyn.cpp): dynamic buffer モード (buffer_model=dynamic)。speed・mtu と組み合わせてリアルタイムに headroom 計算しBUFFER_PG/BUFFER_PROFILEを生成。
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
BUFFER_PG、BUFFER_PROFILE、BUFFER_POOL、DEVICE_METADATA(buffer_model) - 関連 CLI:
config interface cable-length <ifname> <length>(dynamic buffer モードのみ) - 関連 YANG:
sonic-cable-length
関連リファレンス¶
- YANG:
sonic-cable-length - CONFIG_DB:
BUFFER_PG、BUFFER_PROFILE
引用元¶
運用ヒント¶
典型値¶
- key 形式:
CABLE_LENGTH|AZURE - フィールド:
{"Ethernet0": "40m", "Ethernet4": "5m", "Ethernet8": "300m"} - dynamic buffer モードのみ CLI で変更可能:
config interface cable-length Ethernet0 40m
よくある誤設定¶
"0m"を設定すると lossless PG が削除される(DPC ポート向け特殊値)。誤って通常ポートに設定しないこと。- static buffer モードで CLI を使うと「dynamic buffer が必要」エラーになる。
確認コマンド¶
sonic-db-cli CONFIG_DB hgetall 'CABLE_LENGTH|AZURE'
show buffer configuration
show buffer information
例外条件・特殊挙動¶
length = "0m"→ lossless PG 削除:buffermgr.cpp:159およびbuffermgrdyn.cpp:1492で"0m"は「lossless PG を削除する」特殊値として扱われる。DPC ポート向け意図的設定。length = "None"→ silent skip:buffermgr.cpp:104で"None"は更新をスキップ。エラーなし。- エントリが存在しない場合:
buffermgrdynは speed や admin_up が来ても cable_length が空なら headroom 計算を延期する (buffermgrdyn.cpp:2157-2159)。WARN ログが出るが retry はしない。 - admin down ポート: cable_length が更新されても
PORT_ADMIN_DOWN状態のポートはrefreshPgsForPortをスキップ (buffermgrdyn.cpp:2191-2194)。 - mtu 未設定時の仮計算: cable_length と speed が揃っているが mtu がない場合、
DEFAULT_MTU_STR = "9100"で headroom を仮計算する (buffermgrdyn.cpp:2174)。mtu が後で設定されると再計算。
値依存挙動マトリクス¶
length 値 |
挙動 |
|---|---|
"0m" |
lossless PG を削除。lossy PG は維持。DPC ポートや headroom 不要ポート向け |
"None" |
buffermgr が更新をスキップ (silent no-op) |
"5m" 〜 "500m" |
speed・mtu と組み合わせて headroom 計算。dynamic モードは pg_lossless_<speed>_<length>_profile を自動生成 |
| 未設定 (空) | headroom 計算を延期。speed・mtu が揃っても計算されない |
CDB → 実コンテナ動作トレース¶
段階 1: Consumer 登録¶
- buffermgr / buffermgrdyn が
CABLE_LENGTHテーブルを購読 (CFG_PORT_CABLE_LEN_TABLE_NAME)。
段階 2: CFG → キャッシュ¶
buffermgr:doCableTask()でポート→ケーブル長のm_cableLenLookupマップを更新。その後doSpeedUpdateTask()を呼び PG プロファイルを選択。buffermgrdyn:handleCableLenTable()でportInfo.cable_lengthを更新。speed・mtu が揃っていればrefreshPgsForPort()を即時呼び出す。
段階 3: headroom 計算 → APPL_DB¶
- static モード (
buffermgr):pg_profile_lookup.iniから speed + cable_length に対応するエントリを引いてBUFFER_PROFILEを設定。 - dynamic モード (
buffermgrdyn):allocateProfile()が speed/cable/mtu/threshold を引数に headroom ツール (generate_headroom_info.pyor 内部計算) を呼び出し、BUFFER_PROFILEとBUFFER_PGを APPL_DB に書き込む。
段階 4: APPL → SAI¶
bufferorchが APPL_DB のBUFFER_PG・BUFFER_PROFILEを購読し、SAI buffer API (sai_buffer_api) を通じてチップの PG headroom を設定。
書き込み入り口 (Direction A)¶
CABLE_LENGTH テーブルへの書き込みが発生するコード経路。
sonic-cfggen / Jinja テンプレート (初期化)¶
buffers_config.j2:231-239がCABLE_LENGTH|AZUREエントリを生成。ポートの neighbor role とports2cableテーブルでケーブル長を決定。- ロールが不明な場合は HWSKU の
buffers_defaults_*.j2で定義されたdefault_cableを使用。
CLI (dynamic buffer モードのみ)¶
config interface cable-length <ifname> <length>→config/main.py:6326→config_db.mod_entry("CABLE_LENGTH", keys[0], ...)でポート単位に上書き。
config load_minigraph (マージ)¶
config/main.py:3886-3915でテンプレート値と DB 既存値をポート単位にマージ。DB 側の既存ポートは保持され、テンプレート側のポートが追加/上書き。
コード由来の暗黙デフォルト (Phase A)¶
YANG default と別に、コード側で「フィールド不在時の fallback」が実装されている field を全列挙する。
| field | YANG default | コード default | 適用箇所 | 種別 | evidence |
|---|---|---|---|---|---|
name (エントリキー) |
— | "AZURE" ハードコード |
buffers_config.j2:232 |
ハードコード固定値 | buffers_config.j2:232 |
name (複数エントリ) |
— | CLI は keys[0] のみ更新 (2番目以降 silent drop) |
config/main.py:6349 |
silent drop | config/main.py:6344 |
length |
— | "None" → buffermgr が更新スキップ (silent no-op) |
buffermgr.cpp:104 |
silent drop | buffermgr.cpp:104 |
length |
— | "0m" → lossless PG 削除 (特殊値) |
buffermgr.cpp:159, buffermgrdyn.cpp:1492 |
値依存挙動乖離 | buffermgr.cpp:159 |
length |
— | DPC ポート → 強制 "0m" (neighbor role 無視) |
buffers_config.j2:109 |
ハードコード固定値 | buffers_config.j2:109 |
length |
— | Ethernet-BP (VoQ backplane) → "5m" |
buffers_config.j2:115 |
ハードコード固定値 | buffers_config.j2:115 |
length |
— | ロール別デフォルト: torrouter_server=5m, leafrouter_torrouter=40m, spinerouter_leafrouter=300m, lowerspinerouter_leafrouter=500m 等 |
buffers_config.j2:54-72 |
ハードコード固定値 | buffers_config.j2:54 |
length |
— | HWSKU default_cable: td2→0m, th(t0)→5m, th(t1)→40m, th5→5m, th2/7260(t1)→300m 等 (プラットフォーム依存) |
buffers_defaults_*.j2 |
プラットフォーム依存 | device/common/profiles/ |
length (間接) |
— | mtu 未設定時に DEFAULT_MTU_STR="9100" で仮 headroom 計算 (後で mtu 設定時に再計算) |
buffermgrdyn.cpp:2174 |
fallback / 経路依存乖離 | buffermgrdyn.h:15 |
| (エントリ全体) | — | config load_minigraph: DB + template をポート単位 partial merge (DB 側の既存ポートは維持) |
config/main.py:3911-3915 |
書き込み時 vs 実行時乖離 | config/main.py:3911 |
該当なし field (探したが fallback 無し)¶
lengthの YANG パターン ([0-9]+m) 違反値 → YANG バリデーションで拒否される (コード側 fallback なし)