コンテンツにスキップ

DSCP_TO_PG_MAP テーブル

このテーブルは SONiC に存在しない

DSCP_TO_PG_MAP という CONFIG_DB テーブルは SONiC master ブランチに存在しない。DSCP 値から Priority Group (PG) へのマッピングは 2 段構成 で実現される。

概要

SONiC の QoS アーキテクチャでは DSCP 値を PG に直接マッピングするテーブルを持たない。実際の経路は以下のとおり:

DSCP (0-63)
  ──→ Traffic Class  (DSCP_TO_TC_MAP テーブル)
  ──→ Priority Group (TC_TO_PRIORITY_GROUP_MAP テーブル)

PORT_QOS_MAP テーブルの dscp_to_tc_map leaf と tc_to_pg_map leaf を組み合わせることで、入口ポートの DSCP 値が最終的に ingress buffer priority group へ到達する。

実際のアーキテクチャ

データフロー

flowchart LR
  PKT["受信パケット<br/>DSCP 0-63"]
  D2T[("CONFIG_DB<br/>DSCP_TO_TC_MAP")]
  T2P[("CONFIG_DB<br/>TC_TO_PRIORITY_GROUP_MAP")]
  PORT[("CONFIG_DB<br/>PORT_QOS_MAP")]
  ORC["QosOrch"]
  SAI["SAI<br/>sai_qos_map_api"]

  PORT -->|dscp_to_tc_map| D2T
  PORT -->|tc_to_pg_map| T2P
  D2T --> ORC
  T2P --> ORC
  ORC --> SAI
  PKT -->|ingress| SAI

段階 1 — DSCP → Traffic Class

DSCP_TO_TC_MAP|<name> テーブルに DSCP 値(0-63)→ Traffic Class 値(0-7)のエントリを定義する。PORT_QOS_MAP.<port>.dscp_to_tc_map から参照される。qosorchSAI_QOS_MAP_TYPE_DSCP_TO_TC オブジェクトを生成する。

詳細: DSCP_TO_TC_MAP

段階 2 — Traffic Class → Priority Group

TC_TO_PRIORITY_GROUP_MAP|<name> テーブルに TC 値(0-7)→ PG 値(0-7)のエントリを定義する。PORT_QOS_MAP.<port>.tc_to_pg_map から参照される。qosorchSAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP オブジェクトを生成する。

詳細: TC_TO_PRIORITY_GROUP_MAP

コード証拠

qosorch.cpp:80-96m_qos_maps 初期化リストには以下のテーブルが登録されているが、DSCP_TO_PG_MAP は含まれない1:

type_map QosOrch::m_qos_maps = {
    {CFG_DSCP_TO_TC_MAP_TABLE_NAME, ...},              // "DSCP_TO_TC_MAP"
    {CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME, ...},    // "TC_TO_PRIORITY_GROUP_MAP"
    // DSCP_TO_PG_MAP に対応するエントリはない
    ...
};

qosorch.cpp:1329,1342 の handler 登録でも対応なし:

m_qos_handler_map.insert(qos_handler_pair(CFG_DSCP_TO_TC_MAP_TABLE_NAME, &QosOrch::handleDscpToTcTable));
m_qos_handler_map.insert(qos_handler_pair(CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME, &QosOrch::handleTcToPgTable));
// DSCP_TO_PG_MAP ハンドラは存在しない

sonic-buildimage/src/sonic-yang-models/yang-models/ には sonic-dscp-pg-map.yang も存在しない2

暗黙デフォルト・コード由来挙動

DSCP_TO_PG_MAP テーブル自体が存在しないため、フィールドデフォルトは定義されない。2 段マッピングを構成する各テーブルのデフォルトは以下のとおり:

DSCP_TO_TC_MAP のデフォルト(段階 1)

フィールド デフォルト有無 内容
name プラットフォーム依存 ストレージバックエンドプラットフォームのみ qos_config.j2AZURE / AZURE_UPLINK という名前のマップを自動注入する
dscp (key) なし 0-63 の値を明示的に設定する必要あり
tc なし 0-7 の Traffic Class 値を明示的に設定する必要あり

qos_config.j2 フォールバック AZURE マップのデフォルト値(抜粋):

DSCP TC 備考
3, 4 3, 4 lossless クラス
8 0 CS1: best-effort
46 5 EF: expedited forwarding
48 6 CS6: network control
その他 1 低優先度デフォルト

TC_TO_PRIORITY_GROUP_MAP のデフォルト(段階 2)

フィールド デフォルト有無 内容
name プラットフォーム依存 qos_config.j2generate_tc_to_pg_map() マクロが platform 別に生成
tc (key) なし 0-7 の Traffic Class 値を明示的に設定する必要あり
pg なし pattern "[0-7]?" — 0-7 または空文字を許可する YANG 制約

qosorch.cpp:895 では (uint8_t)stoi(fvValue(*i)) で pg 値を変換しており、例外処理なし。非整数文字列が CONFIG_DB に書き込まれると std::invalid_argument が伝播する。

Evidence: qosorch.cpp:80-96 (m_qos_maps 初期化), qosorch.cpp:1329,1342 (handler 登録), qosorch.cpp:880-910 (TcToPgMapHandler), sonic-port-qos-map.yang:85-91,129-134 (leafref)

制約

  • DSCP_TO_PG_MAP テーブルは存在しないため、このキー名で CONFIG_DB に書き込んでも qosorch は無視する
  • 実際の DSCP → PG 経路を設定するには DSCP_TO_TC_MAPTC_TO_PRIORITY_GROUP_MAPPORT_QOS_MAP の 3 テーブルを適切に設定する必要がある

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: DSCP_TO_TC_MAPTC_TO_PRIORITY_GROUP_MAPPORT_QOS_MAP
  • 関連 CLI: config qos
  • 関連 YANG: sonic-dscp-tc-mapsonic-tc-priority-group-map

引用元

関連ページ


  1. QosOrch m_qos_maps 初期化: sonic-swss/orchagent/qosorch.cpp:80-96. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/qosorch.cpp 

  2. YANG モデル一覧: sonic-buildimage/src/sonic-yang-models/yang-models/. https://github.com/sonic-net/sonic-buildimage/tree/master/src/sonic-yang-models/yang-models