コンテンツにスキップ

EXP_TO_FC_MAP テーブル

概要

MPLS EXP ビット (0..7) を Forwarding Class (FC) へマップする ingress QoS 分類定義1。Class-Based Forwarding (CBF) 機能で使用される。QosOrchSAI 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 構造

EXP_TO_FC_MAP|<name>|<exp>

<name> はマップ名(1..32 文字、[a-zA-Z0-9][-a-zA-Z0-9_]*)。<exp> は 0..7。

Redis 上の実際の格納形式:

HSET "EXP_TO_FC_MAP|AZURE" "0" "0" "1" "1" "2" "2" "3" "3" "4" "4" "5" "5" "6" "6" "7" "7"

フィールド一覧

フィールド 必須 説明
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 だが、qosorchstoi() に渡し例外 → 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 では fcpattern "[0-7]?" と定義(最大 7)。しかし実装は SAI_SWITCH_ATTR_MAX_NUMBER_OF_FORWARDING_CLASSES の返値次第で上限が異なる(テストでは 63 を使用 test_qos_map.py:314)。YANG は実装より保守的
silent drop convertFieldValuesToAttributes が false を返すと processWorkItemtask_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_ERRORtask_invalid_entry(エントリ全体を reject)
"8" 以上 value > EXP_MAX_VAL (7)SWSS_LOG_ERRORtask_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_MAPexp_to_fc_map フィールドで参照)
  • 関連 CLI: なし(CLI コマンドは未実装)
  • 関連 YANG: sonic-exp-fc-map

関連リファレンス

  • YANG: sonic-exp-fc-map (sonic-buildimage)
  • 関連: DSCP_TO_FC_MAP — DSCP 版の同等テーブル

引用元

関連 Topics

運用ヒント

典型値

EXP_TO_FC_MAP|AZURE
  "0": "0"
  "1": "1"
  "2": "2"
  "3": "3"
  "4": "4"
  "5": "5"
  "6": "6"
  "7": "7"

よくある誤設定

  • fc 値がスイッチの SAI_SWITCH_ATTR_MAX_NUMBER_OF_FORWARDING_CLASSES 上限以上の場合、エントリ全体が silent drop(ログのみ、CONFIG_DB は汚染されたまま)。
  • EXP 値 8 以上または負数を key に指定すると reject。
  • マップを定義しても PORT_QOS_MAPexp_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_ERRORtask_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.cppCFG_EXP_TO_FC_MAP_TABLE_NAME が tableNames に登録される。

段階 2 — CFG→APPL 翻訳

なし (orchagent が直接 CONFIG_DB を購読)

段階 3 — APPL→SAI

  1. handleExpToFcTableExpToFcMapHandler::processWorkItem
  2. convertFieldValuesToAttributes: EXP/FC 値を検証、SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LIST を構築
  3. addQosItem: SAI_QOS_MAP_ATTR_TYPE = SAI_QOS_MAP_TYPE_MPLS_EXP_TO_FORWARDING_CLASSsai_create_qos_map 呼び出し
  4. 生成された 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-utilitiesconfig 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 内に存在しない)

ランタイム注入 (デーモン自動書き込み)

  • なし