コンテンツにスキップ

APPL_DB ROUTE_TABLE テーブル

概要

ROUTE_TABLEAPPL_DB 上に存在する転送経路テーブル。FRR の FPM(Forwarding Plane Manager)ソケットを受信した fpmsyncd が書き込み主体となり、unicast・blackhole・EVPN・SRv6 の各種経路を格納する1orchagent 内の RouteOrch がこのテーブルを購読し、SAI sai_route_api を通じてハードウェア転送テーブルへ反映する2。テーブル名の定数は schema.hAPP_ROUTE_TABLE_NAME = "ROUTE_TABLE" と定義されている3

key 構造

ROUTE_TABLE|<prefix>
ROUTE_TABLE|Vrf<name>:<prefix>
key 要素 説明
<prefix> IPv4 または IPv6 prefix(例 10.0.0.0/242001:db8::/32
Vrf<name>: VRF-aware 経路のプレフィクス。Vrf で始まる VRF デバイス名 + :

VRF-aware 経路では VRF 名が key に埋め込まれる(コロン区切り)。Vrf プレフィクスを持たないインタフェース(eth0、docker0、eth1-midplane)宛ての経路は fpmsyncd が DEL に変換してスキップする1

主要フィールド

フィールド 既定値 説明
protocol string 省略(空文字列) 経路学習プロトコル。"static" / "bgp" / "ospf" / "isis" 等。空の場合はフィールドなし
blackhole string 省略(= "false" "true" の場合は blackhole 経路(パケット破棄)。"false" 相当のときフィールド省略
nexthop string 省略(空文字列) nexthop IP アドレス。ECMP はカンマ区切り。nexthop_group と排他
ifname string 省略(空文字列) 出力 interface 名。ECMP はカンマ区切り
weight string 省略(空文字列) ECMP 重み。カンマ区切り整数
nexthop_group string 省略(空文字列) NHG(NextHop Group)テーブルのキー文字列。nexthop と排他
mpls_nh string 省略(空文字列) MPLS ラベルスタック(カンマ区切り)
vni_label string 省略(空文字列) EVPN VNI 値
router_mac string 省略(空文字列) EVPN 宛先ルータ MAC
segment string 省略(空文字列) SRv6 SID-list テーブルキー
seg_src string 省略(空文字列) SRv6 source address

書き込み主体

書き込み元 経路種別
fpmsyncd (RouteSync) unicast / blackhole / MPLS / EVPN IP Prefix / SRv6 VPN
bgpcfgd StaticRouteMgr STATIC_ROUTE CONFIG_DB から変換した静的経路(VRF-aware)

購読者

  • orchagent / RouteOrch: ROUTE_TABLEConsumerStateTable で購読。sai_route_api->create_route_entry() でハードウェアに経路を書き込む。ECMP の場合は sai_next_hop_group_api と連携。
  • warmRestartHelper: ウォームリブート時に APPL_DB エントリを一時保持し、FRR 再接続後に再生する。

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

flowchart LR
  FRR["FRR bgpd / zebra"]
  FPMSYNCD["fpmsyncd"]
  FRR -->|FPM socket| FPMSYNCD
  APPDB[("APPL_DB<br/>ROUTE_TABLE")]
  FPMSYNCD --> APPDB
  ORCHAGENT["orchagent<br/>RouteOrch"]
  APPDB --> ORCHAGENT
  SAI["SAI<br/>sai_route_api"]
  ORCHAGENT --> SAI

凡例

FRR から SAI までの転送経路。fpmsyncd が APPL_DB の書き込み主体となる。

制約

  • nexthop_groupnexthop / ifname は排他。両方を指定するとエラー2
  • blackhole"true" の場合、nexthop / ifname は不要かつ無視される。
  • VRF-aware 経路の key は Vrf<name>: プレフィクスを含む(コロン区切り)。Vrf で始まらない VRF 名は fpmsyncd がエラーログを出して処理を中断する1
  • EVPN IP Prefix 経路では nexthopvni_labelrouter_macifname が揃っていない場合は ROUTE_TABLE への書き込みをスキップする1

引用元

フィールドの暗黙デフォルト (Phase A)

以下はコード精読により判明した APPL_DB ROUTE_TABLE フィールドのコード由来デフォルト。fpmsyncd が非 ZMQ パスで書き込む際の省略ロジックと、orchagent (consumer) 側の初期値を対比する12

フィールド省略ロジック(fpmsyncd 非 ZMQ パス)

RouteTableFieldValueTupleWrapper::fieldValueTupleVector() (routesync.cpp L1019-L1051) は値がデフォルトと同じ場合はフィールドを APPL_DB に送信しない:

フィールド struct 初期値 省略条件 orchagent 側初期値
protocol "" (空文字列) 空文字列のとき省略 "" (未設定)
blackhole "false" "false" と等しいとき省略 false (bool)
nexthop "" 空文字列のとき省略 ""
ifname "" 空文字列のとき省略 ""
nexthop_group "" 空文字列のとき省略 ""
mpls_nh "" 空文字列のとき省略 — (別処理)
weight "" 空文字列のとき省略 ""
vni_label "" 空文字列のとき省略
router_mac "" 空文字列のとき省略
segment "" 空文字列のとき省略 ""
seg_src "" 空文字列のとき省略 ""

ZMQ 有効時(Northbound ZMQ パス)は全フィールドを空文字列含めて常に送信する。

blackhole の重要な挙動

  • フィールド不在 = false: routeorch.cpp L765-L766 で blackhole フィールドが absent の場合、bool blackhole = false として扱われる。
  • RTN_BLACKHOLE タイプの場合: fpmsyncd は fvw.blackhole = "true" を明示的にセットし、nexthop / ifname は省略する(L2176-L2178)。

protocol フィールドの変換

getProtocolString() が Linux rtm_protocol 番号を文字列に変換する。代表値:

rtm_protocol protocol 文字列
RTPROT_STATIC (4) "static"
RTPROT_BGP (186) "bgp"
RTPROT_OSPF (188) "ospf"
RTPROT_ISIS (187) "isis"
不明 / 未登録 空文字列 → フィールド省略

nexthop のデフォルト nexthop アドレス

NHG(NextHop Group)が単一 nexthop でかつ nexthop アドレスが空の場合、fpmsyncd は:

// routesync.cpp L2214
string nexthops = nhg.nexthop.empty()
    ? (rtnl_route_get_family(route_obj) == AF_INET ? "0.0.0.0" : "::")
    : nhg.nexthop;

IPv4 connected 経路 → "0.0.0.0"、IPv6 connected 経路 → "::" が nexthop として設定される。

weight — 等コスト時は省略

weight が全 nexthop で等しい(ECMP 均等)場合、getNextHopWt() が空文字列を返し weight フィールドは省略される。orchagent は weight なし = 均等 ECMP と解釈する。