EXP_TO_FC_MAP テーブル¶
概要¶
MPLS EXP ビット (0..7) を Forwarding Class (FC) へマップする ingress QoS 分類定義1。Class-Based Forwarding (CBF) 機能で使用される。QosOrch が SAI QoS map (SAI_QOS_MAP_TYPE_MPLS_EXP_TO_FORWARDING_CLASS) を生成し、ポートにバインドする (PORT_QOS_MAP.exp_to_fc_map)。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>EXP_TO_FC_MAP")]
DM["QosOrch<br/>(ExpToFcMapHandler)"]
CDB --> DM
SAI["SAI<br/>sai_qos_map_api"]
DM --> SAI
PORT["PORT_QOS_MAP<br/>exp_to_fc_map 参照"]
PORT --> DM
凡例
CONFIG_DB から SAI までの典型経路。詳細・例外は本ページ本文を参照。
key 構造¶
<name> はマップ名(1..32 文字、[a-zA-Z0-9][-a-zA-Z0-9_]*)。<exp> は 0..7。
Redis 上の実際の格納形式:
フィールド一覧¶
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name (key: outer) |
string (1..32) | ✅ | マップ名 |
exp (key: inner) |
string "[0-7]" |
✅ | MPLS EXP ビット値 (0..7) |
fc |
string "[0-7]" |
✅ | 対応 Forwarding Class (0..max_num_fcs-1) |
YANG 上は親子 list 構造 (EXP_TO_FC_MAP_LIST / EXP_TO_FC_MAP)。Redis に展開すると EXP_TO_FC_MAP|<name> の hash field として <exp>: <fc> ペアが格納される。
フィールド別コード由来デフォルト / 暗黙挙動¶
exp (key フィールド)¶
| 発見種別 | 詳細 |
|---|---|
| ハードコード上限 | #define EXP_MAX_VAL 7 (qosorch.cpp:120)。value < 0 または value > 7 は SWSS_LOG_ERROR を出して task_invalid_entry を返す(エントリ全体が silent drop) |
| YANG 制約との乖離 | YANG では pattern "[0-7]?" — ? により空文字列も YANG 上は valid だが、qosorch は stoi() に渡し例外 → task_invalid_entry で reject。実質空文字列は不可 |
| 書込み順依存なし | key は Redis hash field として atomic に格納される |
fc (value フィールド)¶
| 発見種別 | 詳細 |
|---|---|
| 実行時上限(プラットフォーム依存) | NhgMapOrch::getMaxNumFcs() が SAI_SWITCH_ATTR_MAX_NUMBER_OF_FORWARDING_CLASSES を初回 SAI 問い合わせで取得しキャッシュ。FC 値は [0, max_num_fcs) の範囲外なら reject |
| 静的初期値 | static int max_num_fcs = -1 — 初回呼び出しまで未初期化。スイッチが FC 未サポートなら max_num_fcs = 0 となり 全 FC 値が invalid になる (nhgmaporch.cpp:319: SWSS_LOG_WARN("Switch does not support FCs")) |
| YANG 制約との乖離 | YANG では fc を pattern "[0-7]?" と定義(最大 7)。しかし実装は SAI_SWITCH_ATTR_MAX_NUMBER_OF_FORWARDING_CLASSES の返値次第で上限が異なる(テストでは 63 を使用 test_qos_map.py:314)。YANG は実装より保守的 |
| silent drop | convertFieldValuesToAttributes が false を返すと processWorkItem は task_invalid_entry を返す。orchagent はエラーログを出力するが CONFIG_DB からエントリは削除しない(次回再試行なし) |
マップ名 (name key)¶
| 発見種別 | 詳細 |
|---|---|
| YANG パターン | [a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31}) — 先頭英数字必須、最大 32 文字 |
| デフォルト名なし | ハードコードされたデフォルトマップ名は存在しない。プラットフォーム初期設定 (qos_config.j2) で定義される場合あり |
エントリ数(スパース定義)¶
| 発見種別 | 詳細 |
|---|---|
| 未定義 EXP の fallback | EXP_TO_FC_MAP に EXP 値を記述しない場合、その EXP ビットに対する FC は未定義。ASIC 実装依存(多くは FC=0 にフォールバック) |
| 空マップ | kfvFieldsValues が空でも YANG は reject しないが、SAI map count=0 で sai_create_qos_map を呼ぶ。SAI の動作は ASIC 依存 |
値依存挙動マトリクス¶
exp (key: string "0".."7")¶
| 値 | 挙動 |
|---|---|
"0".."7" |
stoi() でパース → list_attr.value.qosmap.list[ind].key.mpls_exp に設定 |
| 負の整数文字列 | SWSS_LOG_ERROR → task_invalid_entry(エントリ全体を reject) |
"8" 以上 |
value > EXP_MAX_VAL (7) → SWSS_LOG_ERROR → task_invalid_entry |
| 空文字列・非整数 | stoi() が invalid_argument → catch → task_invalid_entry |
fc (value: string, 実行時上限あり)¶
| 値 | 挙動 |
|---|---|
0 .. max_num_fcs - 1 |
list_attr.value.qosmap.list[ind].value.fc に設定 |
| 負の整数 | reject |
max_num_fcs 以上 |
reject(スイッチ FC 未サポート時は全値が reject) |
| 非整数 | stoi() 例外 → task_invalid_entry |
重要:
max_num_fcsはプラットフォーム依存(YANG の[0-7]制約より広い場合も狭い場合もある)。スイッチが FC を未サポートの場合はmax_num_fcs=0となり、fc値 0 を含む全エントリが reject される。
購読者¶
qosorch(ExpToFcMapHandler): SAI QoS map 生成 (sai_create_qos_map/sai_remove_qos_map)- 生成された SAI オブジェクトは
PORT_QOS_MAP.exp_to_fc_map経由でポートに適用 →SAI_PORT_ATTR_QOS_MPLS_EXP_TO_FORWARDING_CLASS_MAP
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
PORT_QOS_MAP(exp_to_fc_mapフィールドで参照) - 関連 CLI: なし(CLI コマンドは未実装)
- 関連 YANG:
sonic-exp-fc-map
関連リファレンス¶
- YANG:
sonic-exp-fc-map(sonic-buildimage) - 関連:
DSCP_TO_FC_MAP— DSCP 版の同等テーブル
引用元¶
関連 Topics¶
運用ヒント¶
典型値¶
よくある誤設定¶
fc値がスイッチのSAI_SWITCH_ATTR_MAX_NUMBER_OF_FORWARDING_CLASSES上限以上の場合、エントリ全体が silent drop(ログのみ、CONFIG_DB は汚染されたまま)。- EXP 値 8 以上または負数を key に指定すると reject。
- マップを定義しても
PORT_QOS_MAPでexp_to_fc_mapを参照しない限り SAI に反映されない。
確認コマンド¶
sonic-db-cli CONFIG_DB hgetall 'EXP_TO_FC_MAP|AZURE'
sonic-db-cli CONFIG_DB hgetall 'PORT_QOS_MAP|Ethernet0'
例外条件・特殊挙動¶
| consumer | 条件 | 挙動 |
|---|---|---|
| orchagent | DEL 時に PORT_QOS_MAP から参照中 | m_pendingRemove=true を立てて task_need_retry を返す(qosorch.cpp:181-186) |
| orchagent | FC 値が max_num_fcs 以上 |
SWSS_LOG_ERROR → task_invalid_entry(CONFIG_DB からは削除されない) |
| orchagent | スイッチが FC 未サポート (max_num_fcs=0) |
全エントリが reject。SWSS_LOG_WARN("Switch does not support FCs") のみ出力 |
| orchagent | SAI sai_create_qos_map 失敗 |
SWSS_LOG_ERROR("Failed to create exp_to_fc map") → task_failed |
| YANG validator | EXP または FC の値が [0-7]? パターン違反 |
YANG レベルで reject(DB への書き込み自体が失敗) |
| 実装 vs YANG 乖離 | YANG fc は [0-7] 最大、実装上限は SAI 問い合わせ結果(最大 255) |
実装がより広い値域を許容する可能性あり |
Evidence: sonic-swss
orchagent/qosorch.cpp:1132-1213;orchagent/cbf/nhgmaporch.cpp:299-325;orchagent/qosorch.h:33
実コンテナ動作トレース¶
段階 1 — Consumer 登録¶
QosOrch (orchagent 直接 CFG 購読) が CONFIG_DB の EXP_TO_FC_MAP テーブルを購読する。orchdaemon.cpp で CFG_EXP_TO_FC_MAP_TABLE_NAME が tableNames に登録される。
段階 2 — CFG→APPL 翻訳¶
なし (orchagent が直接 CONFIG_DB を購読)
段階 3 — APPL→SAI¶
handleExpToFcTable→ExpToFcMapHandler::processWorkItemconvertFieldValuesToAttributes: EXP/FC 値を検証、SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LISTを構築addQosItem:SAI_QOS_MAP_ATTR_TYPE = SAI_QOS_MAP_TYPE_MPLS_EXP_TO_FORWARDING_CLASSでsai_create_qos_map呼び出し- 生成された SAI oid を
m_qos_maps[CFG_EXP_TO_FC_MAP_TABLE_NAME]にキャッシュ
段階 4 — タイミングと副作用¶
適用タイミング: orchagent が CONFIG_DB 変化を検知後即座に SAI QoS map を作成/更新。ポートへの割り当ては PORT_QOS_MAP.exp_to_fc_map 設定後。
副作用: EXP→FC マップ変更はそのマップを使用するすべてのポートの CBF 分類に即座に影響。MPLS パケットの Forwarding Class 判定が変化する。
書き込み入り口 (Direction A)¶
対象テーブル: EXP_TO_FC_MAP
CLI¶
- 現時点で専用 CLI コマンドなし(
sonic-utilitiesにconfig qos map exp-fc相当は未実装) sonic-db-cliによる直接書き込みまたは JSON import (config load) が主な手段
minigraph / sonic-cfggen¶
- なし(minigraph テンプレートに EXP_TO_FC_MAP 生成は未確認)
REST / gNMI (sonic-mgmt-common)¶
- なし(対応 OpenConfig/SONiC YANG transformer なし)
db_migrator¶
- なし
ビルド時デフォルト (init_cfg / j2 テンプレート)¶
- プラットフォーム固有の
qos_config.j2で定義される場合あり(platform 依存)
ハードコードデフォルト¶
- なし(デフォルトマップは qosorch 内に存在しない)
ランタイム注入 (デーモン自動書き込み)¶
- なし