コンテンツにスキップ

APPL_DB FDB_TABLE

概要

APPL_DBFDB_TABLE動的学習 MAC エントリ静的プロビジョニング MAC エントリの両方を保持する実行時テーブルである1

CONFIG_DB の FDB テーブルが静的エントリの設定ソースであるのに対し、APPL_DB FDB_TABLE はカーネルの FDB 学習イベント (fdbsyncd) や swssconfig 投入、PAC/802.1X 認証 (VlanMgr) など複数の書き込み経路を持ち、orchagentFdbOrch が SAI FDB エントリへと変換する。

コード由来デフォルト

field: type

fdborch.cpp:770string type = "dynamic"; と初期化される。フィールドが APPL_DB に存在しない場合は "dynamic" がデフォルトとして使用される。

// sonic-swss/orchagent/fdborch.cpp:769-770
string port = "";
string type = "dynamic";

有効値: "static" / "dynamic" / "dynamic_local"(MCLAG ローカル扱い)。

fdborch.cpp:830 に assert チェックがある:

assert(type == "dynamic" || type == "dynamic_local" || type == "static");

無効な type 値は orchagent プロセスのクラッシュを引き起こす。

field: port

fdborch.cpp:769string port = ""; と初期化される。フィールドが省略されると空文字のまま addFdbEntry() に渡され、ポート解決に失敗して FDB エントリが登録されない。実装上は必須フィールド

field: discard

fdborch.cpp:775string discard = "false"; と初期化される。PAC/802.1X が設定した MAC エントリの破棄制御に使用する。フィールド不在時は "false"(破棄しない)と解釈される。

VlanMgr (PAC) 側の producer デフォルト

vlanmgr.cpp:806 での初期値は consumer 側と異なる点に注意:

// sonic-swss/cfgmgr/vlanmgr.cpp:806
string port, discard = "false", type = "static";

PAC/802.1X 経由の書き込みでは type デフォルトが "static" となる。

SAI 型マッピング

type origin SAI 型
"dynamic" LEARN / PROVISIONED SAI_FDB_ENTRY_TYPE_DYNAMIC
"static" PROVISIONED SAI_FDB_ENTRY_TYPE_STATIC
"dynamic_local" MCLAG_ADVERTIZED SAI_FDB_ENTRY_TYPE_DYNAMIC(aging 有効化目的)
"static" VXLAN_ADVERTIZED / MCLAG_ADVERTIZED SAI_FDB_ENTRY_TYPE_STATIC

key 構造

FDB_TABLE:<VlanName>:<MAC>
  • <VlanName>: Vlan<id> 形式 (例: Vlan100)
  • <MAC>: MAC アドレス (例: 00:11:22:33:44:55)

APPL_DB key 区切り文字

APPL_DB では key 区切り文字がコロン (:) であり、CONFIG_DB のパイプ (|) とは異なる。

フィールド一覧

フィールド 必須 デフォルト 説明
port string 実質必須 "" (空) 送出ポート名 (例: Ethernet0, PortChannel1)
type enum - "dynamic" エントリ種別: "static" / "dynamic" / "dynamic_local"
discard "true" | "false" - "false" "true" で該当 MAC パケットを破棄 (PAC 用)

VXLAN 経由エントリの追加フィールド

VXLAN_FDB_TABLE 起源のエントリのみ追加フィールドが付く:

フィールド デフォルト 説明
remote_vtep string (IP) "" リモート VTEP の IP アドレス
esi string "" Ethernet Segment Identifier (EVPN)
vni uint32 0 VXLAN Network Identifier

書き込み経路

書き込み元 コード箇所 type デフォルト 備考
fdbsyncd (動的学習) fdbsync.cpp — kernel netlink → APPL_DB 直書き "dynamic" MAC 学習イベントをリアルタイムに反映
swssconfig (手動投入) swssconfig -d -j fdb.json JSON に依存 CONFIG_DB FDBswssconfig → APPL_DB
VlanMgr / PAC vlanmgr.cpp:832 "static" 802.1X 認証後に投入
VXLAN FDB Sync fdbsync.cpp:676 "dynamic" VXLAN_FDB_TABLE 経由 → FdbOrch が統合

購読者

  • orchagent / FdbOrch: APP_FDB_TABLE_NAME を購読して SAI FDB エントリを作成・削除する (orchdaemon.cpp:227)
  • STATE_DB FDB_TABLE にローカル MAC の port / type を書き戻す(fdborch.cpp:1577-1582

データフロー

flowchart LR
  Kernel["カーネル FDB\n学習イベント"]
  fdbsyncd["fdbsyncd\n(netlink)"]
  swssconfig["swssconfig\n(手動投入)"]
  PAC["PAC / 802.1X\nVlanMgr"]
  APPDB[("APPL_DB\nFDB_TABLE")]
  FdbOrch["orchagent\nFdbOrch"]
  SAI["SAI\nsai_fdb_api"]
  StateDB[("STATE_DB\nFDB_TABLE")]

  Kernel --> fdbsyncd
  fdbsyncd --> APPDB
  swssconfig --> APPDB
  PAC --> APPDB
  APPDB --> FdbOrch
  FdbOrch --> SAI
  FdbOrch -->|"ローカル MAC のみ"| StateDB

例外条件・特殊挙動

  • port 省略時: addFdbEntry() でポート解決が失敗し、エントリが追加されない。エラーログ出力。
  • type の assert チェック: fdborch.cpp:830 で無効な type 値はプロセスクラッシュを引き起こす。
  • dynamic_local: MCLAG ピアから受信した MAC を aging 対象として扱うための内部値。ユーザーが直接設定することは想定されていない。
  • FDB_ORIGIN と type の組み合わせ: {"static", FDB_ORIGIN_LEARN} は無効な組み合わせとしてコメントされている (fdborch.h:57)。

関連 CONFIG_DB / YANG / CLI

  • CONFIG_DB: FDB(静的エントリのソース)、VLANVLAN_MEMBER
  • CLI: show mac (FDB テーブル表示)、sonic-clear fdb all (動的エントリクリア)

引用元


  1. sonic-swss-common/common/schema.h:52#define APP_FDB_TABLE_NAME "FDB_TABLE". https://github.com/sonic-net/sonic-swss-common/blob/master/common/schema.h