NEXTHOP_GROUP / CBF_NHG / NHG_MAP テーブル¶
概要¶
orchagent の NhgOrch・CbfNhgOrch・NhgMapOrch が APPL_DB の次ホップグループ関連テーブルを購読し、SAI へ反映するコンポーネント1。
NEXTHOP_GROUP_TABLE— 通常 ECMP / MPLS / SRv6 / recursive NHGCLASS_BASED_NEXT_HOP_GROUP_TABLE— フォワーディングクラス (FC) ベースの CBF NHGFC_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,Ethernet4weight省略時は均等 ECMP。設定時は各メンバーへの相対比率として機能- CBF NHG は
membersの順序が重要。INDEX は 0 ベースで順序に依存
よくある誤設定¶
nexthopとnexthop_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:*'
-
NhgOrch::doTask()実装:sonic-swss/orchagent/nhgorch.cpp. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/nhgorch.cpp ↩↩↩↩ -
CbfNhgOrch::doTask()実装:sonic-swss/orchagent/cbf/cbfnhgorch.cpp. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/cbf/cbfnhgorch.cpp ↩ -
NhgMapOrch::doTask()実装:sonic-swss/orchagent/cbf/nhgmaporch.cpp. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/cbf/nhgmaporch.cpp ↩