NEXTHOP_GROUP_TABLE (APPL_DB)¶
概要¶
NEXTHOP_GROUP_TABLE は APPL_DB に置かれる ECMP nexthop group テーブルである1。schema.h では APP_NEXTHOP_GROUP_TABLE_NAME "NEXTHOP_GROUP_TABLE" と定義されており、APP_ プレフィックスの通り CONFIG_DB ではなく APPL_DB に属する。
fpmsyncd (routesync.cpp) が FRR/Zebra から kernel netlink 経由で受信した ECMP ルートを変換して書き込む。NhgOrch が APPL_DB を購読し、SAI の sai_next_hop_group_api を使って next hop group を作成・更新する。
データフロー¶
flowchart LR
FRR["FRR / Zebra"]
FS["fpmsyncd\n(routesync)"]
ADB[("APPL_DB\nNEXTHOP_GROUP_TABLE")]
NH["NhgOrch\n(orchagent)"]
SAI["SAI\nsai_next_hop_group_api"]
FRR -->|netlink| FS
FS --> ADB
ADB --> NH
NH --> SAI
注意
NEXTHOP_GROUP_TABLE は CONFIG_DB ではなく APPL_DB に存在する。本ページは参照の便宜上 docs/reference/config-db/ 以下に配置しているが、書き込み元は CLI・minigraph ではなく fpmsyncd (ルーティングデーモン連携) である。
key 構造¶
<nhg_id> は fpmsyncd が kernel netlink のグループ ID を文字列化したもの (例: group123)。ルートテーブル (ROUTE_TABLE) の nexthop_group フィールドからこのキーを参照する。
フィールド一覧¶
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
nexthop |
comma-separated IP addresses | yes | ECMP メンバーのゲートウェイ IP アドレス一覧 |
ifname |
comma-separated interface names | yes | 各 nexthop に対応する出力インタフェース名一覧 |
weight |
comma-separated integers | no | ECMP メンバーごとの重み (UCMP 用、省略時は均等分散) |
mpls_nh |
comma-separated MPLS labels or na |
no | MPLS ラベルスタック (na = MPLS なし) |
seg_src |
comma-separated IPv6 addresses | SRv6 時 yes | SRv6 ソースアドレス。存在時に SRv6 モードに自動切替 |
nexthop_group |
comma-separated NHG index names | 再帰 NHG 時 yes | 再帰 NHG モード: メンバー NHG のインデックス名一覧 |
購読者¶
NhgOrch: APPL_DB のNEXTHOP_GROUP_TABLEを購読。SET で SAI next hop group を作成または更新、DEL で削除 (参照カウント 0 のとき)。
関連テーブル¶
ROUTE_TABLE(APPL_DB):nexthop_groupフィールドで本テーブルのキーを参照するルートCLASS_BASED_NEXT_HOP_GROUP_TABLE(APPL_DB): CBF NHG がメンバー NHG として本テーブルのエントリを参照FG_NHG(CONFIG_DB): Fine-Grained ECMP の定義。本テーブルとは独立した別経路 (FgNhgOrchが処理)
関連リファレンス¶
引用元¶
コード由来の暗黙デフォルト (Phase A)¶
注意:
NEXTHOP_GROUP_TABLEは APPL_DB テーブルである。APP_NEXTHOP_GROUP_TABLE_NAMEとしてschema.hで定義され、fpmsyncd(routesync.cpp) が FRR/Zebra から受信した netlink ECMP ルートを変換して書き込む。NhgOrchが APPL_DB を購読して SAI next hop group を作成する。CONFIG_DB には存在しない。
| フィールド | 省略/未設定時の実装動作 | コードロケーション |
|---|---|---|
weight |
省略時は全メンバー均等 (weight=1 相当)。weights が空文字列の場合 NextHopGroupKey の各メンバーに weight=1 が割り当てられる。fpmsyncd 側でも weights.empty() なら weight フィールドを書き込まない。 |
nhgorch.cpp doTask L79-80; routesync.cpp updateNextHopGroupDb L3415-3418 |
mpls_nh |
省略または na 指定時は MPLS ラベルなし。通常 IP forwarding 経路として NHG を構築。 |
nhgorch.cpp doTask L230-234 |
seg_src |
省略時は SRv6 なし (通常 IP NHG)。seg_src フィールドが存在すると srv6_nh=true に自動設定されて SRv6 コードパスへ分岐。nexthop 数と seg_src 数が不一致の場合は SWSS_LOG_ERROR → エントリ破棄。 |
nhgorch.cpp L85-89, L209-214 |
nexthop_group |
省略時は通常 IP/MPLS NHG。存在すると再帰 NHG モード (is_recursive=true)。nexthop/ifname と混在は SWSS_LOG_ERROR → エントリ即破棄 (再試行なし)。 |
nhgorch.cpp L91-102 |
| NHG 数上限 | getMaxNhgCount() 到達時、非 SRv6 NHG は代表 1 NH の temporary group を作成してルートを暫定解決。SRv6 NHG はスキップ (再試行待ち)。temporary group は resources 解放後に自動昇格。 |
nhgorch.cpp L252-264 |
| 再帰 NHG の部分メンバー | メンバー NHG の一部が未解決でも利用可能分で即時 partial NHG を作成。全メンバー未解決の場合は skip → リソース登録後に再試行。 | nhgorch.cpp L131-163 |
| DEL 時の参照カウント | 参照元ルートが存在する間は NHG を削除できない。getRefCount() > 0 でブロックされ m_toSync に残り再試行。 |
nhgorch.cpp DEL_COMMAND ブロック |
書込み順依存¶
- 再帰 NHG のメンバー NHG が
m_syncdNextHopGroupsに存在しない場合はスキップされる。メンバー NHG 登録後に部分的に再構築される (partial NHG として即時適用)。 - NHG を参照するルートが存在する間は DEL_COMMAND で NHG を削除できない。ルートを先に削除してから NHG を削除する必要がある。
fpmsyncdが NHG エントリを書き込む前にROUTE_TABLEのnexthop_groupフィールドが先に届いた場合、RouteOrchは NHG 解決を pending にして待機する。
既知の注意点¶
overlay_nhフラグはnhgorch.cppL67 でfalseに初期化されるが、APPL_DB のフィールドとして明示的にセットするパスは現実装にない。再帰 NHG のメンバーから派生する場合のみ使用される。NEXTHOP_GROUP_TABLEには YANG モデルが存在しない (APPL_DB テーブルのため)。バリデーションはすべて orchagent 側の実装ロジックに依存する。- 再帰 NHG のメンバーが recursive または temporary な NHG であった場合は
SWSS_LOG_ERROR→ エントリ即破棄。2 段ネストの再帰 NHG は許可されない。
-
schema.h:#define APP_NEXTHOP_GROUP_TABLE_NAME "NEXTHOP_GROUP_TABLE". https://github.com/sonic-net/sonic-swss-common/blob/master/common/schema.h;orchdaemon.cpp:gNhgOrch = new NhgOrch(m_applDb, APP_NEXTHOP_GROUP_TABLE_NAME). https://github.com/sonic-net/sonic-swss/blob/4305596/orchagent/orchdaemon.cpp ↩