コンテンツにスキップ

NEXTHOP_GROUP / CBF_NHG / NHG_MAP テーブル

概要

orchagent の NhgOrchCbfNhgOrchNhgMapOrchAPPL_DB の次ホップグループ関連テーブルを購読し、SAI へ反映するコンポーネント1

  • NEXTHOP_GROUP_TABLE — 通常 ECMP / MPLS / SRv6 / recursive NHG
  • CLASS_BASED_NEXT_HOP_GROUP_TABLE — フォワーディングクラス (FC) ベースの CBF NHG
  • FC_TO_NHG_INDEX_MAP_TABLE — FC → NHG メンバーインデックスのマップ

CONFIG_DB 直接購読なし

3 オーケストレータはいずれも CONFIG_DB を直接購読しない。上位デーモン (fpmsyncd, bgpd など) が APPL_DB へ書き込み、orchagent が APPL_DB を処理する。

データフロー (自動生成)

flowchart LR
  APPL[("APPL_DB\nNEXTHOP_GROUP_TABLE\nCLASS_BASED_NEXT_HOP_GROUP_TABLE\nFC_TO_NHG_INDEX_MAP_TABLE")]
  NhgOrch["NhgOrch\nCbfNhgOrch\nNhgMapOrch"]
  APPL --> NhgOrch
  SAI["SAI\nsai_next_hop_group_api"]
  NhgOrch --> SAI

凡例

APPL_DB から SAI までの典型経路。詳細は本文を参照。

NEXTHOP_GROUP_TABLE フィールド

NhgOrch::doTask() が解析するフィールド1

フィールド 必須 デフォルト 説明
nexthop カンマ区切り IP アドレス 通常 NHG 時 yes "" (省略可) ネクストホップ IP アドレス列
ifname カンマ区切りインタフェース名 通常 NHG 時 yes "" (省略可) 出力インタフェース名列
weight カンマ区切り整数 no "" → 0 → 均等 ECMP ECMP メンバーウェイト。省略または 0 で SAI 属性なし (均等分散)
mpls_nh カンマ区切りラベルスタック no "" (省略可) MPLS ラベルスタック。"na" でラベルなし
seg_src カンマ区切り SRv6 ソース IP SRv6 時 yes "" SRv6 ソースアドレス。設定すると srv6_nh=true
nexthop_group NHG_DELIMITER 区切り NHG インデックス recursive NHG 時 yes "" 再帰 NHG のメンバー NHG インデックス列。設定すると is_recursive=true

デフォルト値 (コード由来)

内部変数 デフォルト値 コード根拠
is_recursive false nhgorch.cpp:65 — bool is_recursive = false;
overlay_nh false nhgorch.cpp:67 — bool overlay_nh = false;
srv6_nh false nhgorch.cpp:68 — bool srv6_nh = false;
weight フィールド省略時 SAI 属性なし → 均等 ECMP nhgorch.cpp:1113-1118 — if (weight != 0) { ... nhgm_attr ... } のみ設定
SAI グループ型 (通常 NHG) SAI_NEXT_HOP_GROUP_TYPE_ECMP nhgorch.cpp:772
1 メンバー非 recursive NHG グループ作成せず NH ID を直接使用 nhgorch.cpp:741-760

相互排他制約

nexthop/ifname (通常 NH) と nexthop_group (recursive) の同時指定は SWSS_LOG_ERROR + エントリ破棄1

Temp NHG (リソース枯渇時)

NHG 数が上限 (getMaxNhgCount()) に達した場合、1 メンバーをランダム選択した仮グループを作成する1。SRv6 NHG は仮グループ非対応。

CLASS_BASED_NEXT_HOP_GROUP_TABLE フィールド

CbfNhgOrch::doTask() が解析するフィールド2

フィールド 必須 デフォルト 説明
members カンマ区切り NHG インデックス文字列 yes "" → 検証失敗・破棄 CBF グループのメンバー NHG インデックス列。順序が SAI INDEX に対応
selection_map NHG_MAP インデックス文字列 yes "" → 存在しない場合 return false FC → NHG インデックスのマップ参照

デフォルト値 (コード由来)

内部変数 デフォルト値 コード根拠
メンバー INDEX 0 ベース (投入順) cbfnhgorch.cpp:258 — m_members.emplace(member, CbfNhgMember(member, idx++));
SAI グループ型 SAI_NEXT_HOP_GROUP_TYPE_CLASS_BASED cbfnhgorch.cpp:302
SAI CONFIGURED_SIZE メンバー数 (m_members.size()) cbfnhgorch.cpp:307-308

検証ロジック

条件 挙動
members が空 SWSS_LOG_ERROR + エントリ破棄
members に重複あり SWSS_LOG_ERROR + エントリ破棄
メンバー数 > getMaxNumFcs() SWSS_LOG_WARN (処理は継続)
selection_map が未登録 SWSS_LOG_ERROR + return false (再試行)
マップ最大インデックス >= メンバー数 SWSS_LOG_ERROR + return false (再試行)
メンバー NHG が未 sync / temporary return false (再試行、temp は継続監視)

FC_TO_NHG_INDEX_MAP_TABLE フィールド

NhgMapOrch::doTask() / getMap() が処理するフィールド3。 テーブルエントリは <FC値> (フィールド名) → <NH_index値> (フィールド値) のマッピング列。

フィールド 制約 説明
<FC値> (フィールド名) 整数 [0, max_num_fcs) フォワーディングクラス値
<NH_index値> (フィールド値) 非負整数 >= 0 CBF NHG のメンバーインデックス

デフォルト値 (コード由来)

内部変数 デフォルト値 コード根拠
m_max_nhg_map_count SAI sai_object_type_get_availability() から取得、非対応時は 0 nhgmaporch.cpp:26-34
SAI マップ型 SAI_NEXT_HOP_GROUP_MAP_TYPE_FORWARDING_CLASS_TO_INDEX nhgmaporch.cpp:118-119

検証ロジック

条件 挙動
マップが空 (FV なし) SWSS_LOG_ERROR + success=false
FC 値が負または >= max_num_fcs SWSS_LOG_ERROR + エントリ破棄
NH index が負 SWSS_LOG_ERROR + エントリ破棄
スイッチが NHG マップ非対応 m_max_nhg_map_count=0 + SWSS_LOG_WARN
リソース枯渇 (既存マップ数 >= m_max_nhg_map_count) SWSS_LOG_WARN + success=false (再試行)

購読者

オーケストレータ APPL_DB テーブル SAI API
NhgOrch NEXTHOP_GROUP_TABLE sai_next_hop_group_api->create/remove_next_hop_group
CbfNhgOrch CLASS_BASED_NEXT_HOP_GROUP_TABLE sai_next_hop_group_api->create/remove_next_hop_group
NhgMapOrch FC_TO_NHG_INDEX_MAP_TABLE sai_next_hop_group_api->create/remove_next_hop_group_map

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: なし (APPL_DB 直接操作)
  • 関連テーブル: FG_NHG (FG ECMP、別オーケストレータ FgNhgOrch)

関連リファレンス

引用元

運用ヒント

典型値

  • NEXTHOP_GROUP_TABLE|<nhg_index>: nexthop=10.0.0.1,10.0.0.3 ifname=Ethernet0,Ethernet4
  • weight 省略時は均等 ECMP。設定時は各メンバーへの相対比率として機能
  • CBF NHG は members の順序が重要。INDEX は 0 ベースで順序に依存

よくある誤設定

  • nexthopnexthop_group の同時指定 → エントリ破棄
  • CBF NHG の members 重複 → エントリ破棄
  • selection_map が指すマップの最大 NH インデックス >= CBF NHG メンバー数 → 同期失敗
  • NHG マップ数が m_max_nhg_map_count を超過 → 作成失敗 (スイッチ依存の上限)

確認コマンド

sonic-db-cli APPL_DB keys 'NEXTHOP_GROUP_TABLE:*'
sonic-db-cli APPL_DB hgetall 'NEXTHOP_GROUP_TABLE:<nhg_index>'
sonic-db-cli APPL_DB keys 'CLASS_BASED_NEXT_HOP_GROUP_TABLE:*'
sonic-db-cli APPL_DB keys 'FC_TO_NHG_INDEX_MAP_TABLE:*'