APPL_DB FDB_TABLE¶
概要¶
APPL_DB の FDB_TABLE は動的学習 MAC エントリと静的プロビジョニング MAC エントリの両方を保持する実行時テーブルである1。
CONFIG_DB の FDB テーブルが静的エントリの設定ソースであるのに対し、APPL_DB FDB_TABLE はカーネルの FDB 学習イベント (fdbsyncd) や swssconfig 投入、PAC/802.1X 認証 (VlanMgr) など複数の書き込み経路を持ち、orchagent の FdbOrch が SAI FDB エントリへと変換する。
コード由来デフォルト¶
field: type¶
fdborch.cpp:770 で string type = "dynamic"; と初期化される。フィールドが APPL_DB に存在しない場合は "dynamic" がデフォルトとして使用される。
有効値: "static" / "dynamic" / "dynamic_local"(MCLAG ローカル扱い)。
fdborch.cpp:830 に assert チェックがある:
無効な type 値は orchagent プロセスのクラッシュを引き起こす。
field: port¶
fdborch.cpp:769 で string port = ""; と初期化される。フィールドが省略されると空文字のまま addFdbEntry() に渡され、ポート解決に失敗して FDB エントリが登録されない。実装上は必須フィールド。
field: discard¶
fdborch.cpp:775 で string discard = "false"; と初期化される。PAC/802.1X が設定した MAC エントリの破棄制御に使用する。フィールド不在時は "false"(破棄しない)と解釈される。
VlanMgr (PAC) 側の producer デフォルト¶
vlanmgr.cpp:806 での初期値は consumer 側と異なる点に注意:
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 構造¶
<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 FDB → swssconfig → 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(静的エントリのソース)、VLAN、VLAN_MEMBER - CLI:
show mac(FDB テーブル表示)、sonic-clear fdb all(動的エントリクリア)
引用元¶
-
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 ↩