コンテンツにスキップ

LLDP_ENTRY_TABLE / LLDP_LOC_CHASSIS テーブル (APPL_DB)

概要

LLDP_ENTRY_TABLElldp-syncdlldpd の受信 PDU 情報を APPL_DB に書き込む、実質的な LLDP neighbor cache テーブル1。CONFIG_DB への書き込みは存在せず、外部からの直接書き込みも行わない。

隣接ノードごとに 1 エントリが作成され、chassis ID / port ID / システム名 / 管理アドレス / 能力 TLV などが格納される。

LLDP_LOC_CHASSIS は自ノードのローカル LLDP 情報を保持する単一エントリテーブルで、同様に APPL_DB に存在する2

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

flowchart LR
  LLD["lldpd (open-lldp)"]
  SYN["lldp-syncd"]
  ADB[("APPL_DB<br/>LLDP_ENTRY_TABLE<br/>LLDP_LOC_CHASSIS")]
  SNMP["sonic-snmpagent<br/>(LLDP-MIB)"]
  REST["sonic-mgmt-common<br/>(OpenConfig LLDP)"]

  LLD -->|"LLDP PDU 受信"| SYN
  SYN -->|"hset"| ADB
  ADB -->|"hgetall"| SNMP
  ADB -->|"GetTable"| REST

凡例

APPL_DB への書き込みは lldp-syncd のみ。CONFIG_DB 経路なし。

key 構造

LLDP_ENTRY_TABLE|<ifname>      # 隣接情報 (per ポート)
LLDP_LOC_CHASSIS               # ローカル chassis 情報 (単一エントリ)
  • <ifname>: 自ノードの受信ポート名 (例: Ethernet0, eth0)

フィールド (LLDP_ENTRY_TABLE|<ifname>)

フィールド 典型値 説明
lldp_rem_chassis_id string "6a:c1:1c:fc:f7:38" 隣接ノードの chassis ID
lldp_rem_chassis_id_subtype string (int) "4" chassis ID の subtype (4=MAC, 5=NetworkAddr, 7=Local)
lldp_rem_port_id string "Ethernet1" 隣接ノードの port ID
lldp_rem_port_id_subtype string (int) "5" port ID の subtype (5=InterfaceName, 7=LocallyAssigned)
lldp_rem_port_desc string "" / "Port 1/1" 隣接ポートの Description TLV
lldp_rem_sys_name string "ARISTA01T1" 隣接ノードのシステム名
lldp_rem_sys_desc string "SONiC Software Version..." 隣接ノードのシステム説明
lldp_rem_sys_cap_supported string "28 00" 対応 capability ビットマスク (hex)
lldp_rem_sys_cap_enabled string "28 00" 有効 capability ビットマスク (hex)
lldp_rem_man_addr string "10.250.2.55" 管理アドレス。複数の場合カンマ区切り (IPv4, IPv6)
lldp_rem_time_mark string (int) "1765" SNMP TimeMark (sysUpTime の 10ms 単位)
lldp_rem_index string (int) "1" LLDP-MIB lldpRemIndex

フィールド (LLDP_LOC_CHASSIS)

フィールド 典型値 説明
lldp_loc_chassis_id_subtype string (int) "5" ローカル chassis ID subtype
lldp_loc_chassis_id string "00:11:22:AB:CD:EF" ローカル chassis ID
lldp_loc_sys_name string "SONiC" ローカルシステム名
lldp_loc_sys_desc string "SONiC Software Version..." ローカルシステム説明
lldp_loc_sys_cap_supported string "28 00" サポート capability ビットマスク (hex)
lldp_loc_sys_cap_enabled string "28 00" 有効 capability ビットマスク (hex)
lldp_loc_man_addr string "10.224.25.26,fe80::..." ローカル管理アドレス (カンマ区切り)

購読者

  • sonic-snmpagent (ieee802_1ab.py) — LLDP-MIB (IEEE 802.1AB) を SNMP で提供
  • sonic-mgmt-common (lldp_app.go) — OpenConfig LLDP を REST / gNMI で提供

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: LLDP, LLDP_PORT, PORT
  • 関連 YANG: sonic-lldp (CONFIG_DB 定義), OpenConfig LLDP
  • 関連 CLI: show lldp table, show lldp neighbors

関連リファレンス

引用元

関連ページ

運用ヒント

典型値

  • key 形式: LLDP_ENTRY_TABLE|Ethernet0
  • lldp_rem_chassis_id_subtype: 通常 4 (MAC Address)。
  • lldp_rem_man_addr: IPv4 のみ、または IPv4,IPv6 カンマ区切り。

確認コマンド

# 隣接テーブル一覧
sonic-db-cli APPL_DB keys 'LLDP_ENTRY_TABLE:*'

# 特定ポートの隣接情報
sonic-db-cli APPL_DB hgetall 'LLDP_ENTRY_TABLE:Ethernet0'

# ローカル chassis 情報
sonic-db-cli APPL_DB hgetall 'LLDP_LOC_CHASSIS'

# CLI での確認
show lldp table
show lldp neighbors Ethernet0

値依存挙動マトリクス

lldp_rem_chassis_id_subtype

意味 挙動
"4" MAC Address 最多。lldpd デフォルト。SNMP MIB の chassisIdSubtype=macAddress(4)
"5" Network Address IP ベースの chassis ID
"7" Locally Assigned ベンダー独自値。show lldp で文字列表示

lldp_rem_port_id_subtype

意味 挙動
"5" Interface Name SONiC 同士接続で多い
"7" Locally Assigned 一部ベンダー装置

lldp_rem_man_addr (複数値)

値形式 挙動
"10.x.x.x" IPv4 単一。SNMP の Management Address MIB に直接返す
"10.x.x.x,2001:db8::1" カンマ区切り複数。sonic-snmpagent は先頭 IPv4 を優先
"" (空文字列) update_rem_if_mgmt() が early return。SNMP の Management Address MIB エントリが欠落

lldp_rem_sys_cap_* (ビットマスク)

hex 値 解釈
"28 00" Bridge(bit3) + Router(bit5) が有効
"00 00" capability なし

例外条件・特殊挙動

条件 挙動
lldp_rem_man_addr が空文字列 sonic-snmpagentupdate_rem_if_mgmt() が early return。そのポートの Management Address SNMP MIB エントリが欠落する
lldp_rem_sys_cap_* フィールド欠落 KeyError をキャッチし、警告ログ (0 - b'LLDP_ENTRY_TABLE' missing attribute) のみ出力。MIB エントリは 0 として返す
lldp_rem_time_mark が欠落 lldp_rem_time_mark は SNMP TimeMark として使用。欠落時は int 変換に失敗し AttributeError、当該エントリの SNMP 応答が欠落する可能性
lldpd が TTL 切れエントリを削除 lldpd が TTL 超過時に lldp-syncd へ削除通知を送る。lldp-syncd が APPL_DB の当該エントリを削除。SONiC コード側では TTL 管理を行わない
ポートが down になった場合 lldpd がエントリを削除 → lldp-syncd が APPL_DB から削除。show lldp table からエントリが消える

実コンテナ動作トレース

段階 1 — LLDP PDU 受信

lldpd (docker-lldp コンテナ) が物理ポートで LLDP PDU を受信し、内部 DB に隣接情報を保持する。

段階 2 — APPL_DB への書き込み

lldp-syncd が lldpd の JSON イベント (lldpctl -f json) をポーリングし、差分を APPL_DB:LLDP_ENTRY_TABLE|<ifname>HSET で書き込む。削除通知受信時は DEL を実行。

段階 3 — Consumer による読み取り

sonic-snmpagent は SNMP walk 時に APPL_DB:LLDP_ENTRY_TABLE:*hgetall で読み出し、LLDP-MIB (lldpRemTable, lldpRemManAddrTable) として SNMP エージェントに返す。

sonic-mgmt-common lldp_app.goprocessGet 時に GetTable(neighTs) で全エントリを取得し、OpenConfig LLDP YANG モデルにマッピングして REST / gNMI レスポンスを生成する。

段階 4 — タイミングと副作用

書き込みタイミング: lldpd が PDU 受信後、lldp-syncd のポーリング周期 (デフォルト: lldpd TTL / 4 程度) で APPL_DB に反映。即時ではなく数秒の遅延が生じる場合がある。

削除タイミング: lldpd の TTL タイマーが切れると、lldpd が APPL_DB エントリを削除するよう lldp-syncd に通知。デフォルト hold time = 120 秒 (hello 30s × multiplier 4)。

書き込み入り口 (Direction A)

対象テーブル: LLDP_ENTRY_TABLE, LLDP_LOC_CHASSIS

自動書き込み (lldp-syncd)

  • lldp-syncd が lldpd の出力を購読して APPL_DB に書き込む。外部からの書き込み経路は存在しない

CLI / REST / gNMI

  • 読み取り専用。書き込み不可

db_migrator

  • なし (APPL_DB テーブルのため migrator 対象外)

ビルド時デフォルト

  • なし

コード由来の暗黙デフォルトと dead field

根拠: sonic-snmpagent/src/sonic_ax_impl/mibs/ieee802_1ab.py, sonic-mgmt-common/translib/lldp_app.go, sonic-snmpagent/tests/mock_tables/appl_db.json

dead field(APPL_DB に書けるが上位レイヤに伝わらないフィールド)

フィールド 理由
lldp_rem_time_mark sonic-snmpagent の SNMP エージェントは SNMP TimeMark として使用するが、lldp_app.go の REST/gNMI パスでは case LLDP_REMOTE_REM_TIME: /* Ignore Remote System time */ としてコメントアウトされており無視される
lldp_rem_sys_cap_enabled (lldp_app.go) getLldpNeighInfoFromInternalMap() は capability を lldpCapTableMap で別途管理する。lldp_rem_sys_cap_enabled / lldp_rem_sys_cap_supportedlldpNeighTableMap に入るが、switch-case の default: に落ちて "Not a valid attribute!" と判定され OpenConfig YANG モデルには設定されない。SNMP 経由では正常に提供される

暗黙デフォルトとハードコード固定値

フィールド / 設定 暗黙値 ソース
lldp_rem_chassis_id_subtype "4" (MAC Address) lldpd デフォルト。SONiC 同士では通常 4
lldp_rem_port_id_subtype "5" (Interface Name) lldpd.conf.j2 で configure lldp portidsubtype ifname をハードコード
lldp_rem_port_desc "" (空文字列) Description TLV が送信されない隣接装置からは空になる。SONiC 側は port alias を portid として送るが Description TLV 自体の送信は構成依存
lldp_rem_sys_cap_* の値 "28 00" Bridge + Router SONiC デフォルトの capability ビットマスク。28 00 = 0x2800 = bit3(Bridge) + bit5(Router)
lldp_rem_man_addr 複数値区切り カンマ , lldp-syncd が IPv4 と IPv6 をカンマ結合して 1 フィールドに格納。SNMP agent は先頭 IPv4 を優先して返す
エントリ TTL 管理 lldpd 依存 SONiC コードは TTL 計算を行わない。TTL 超過時のエントリ削除は lldpd が lldp-syncd に通知し、lldp-syncd が APPL_DB の DEL を実行

lldp_app.go の capability 処理(dead field の詳細)

sonic-mgmt-common/translib/lldp_app.gogetLldpNeighInfoFromInternalMap() は LLDP_ENTRY_TABLE の全フィールドを switch-case で処理するが、LLDP_REMOTE_CAP_ENABLED / LLDP_REMOTE_CAP_SUPPORTED に対応する case が存在しない。これらは default: の "Not a valid attribute!" に落ちる。

capability 情報は別途 lldpCapTableMap (bool map) として管理され、Router / Bridge / Repeater の 3 種類のみ OpenConfig YANG の capabilities リストとして公開される。それ以外の capability type は無視される。


  1. sonic-snmpagent mibs/__init__.pylldp_entry_table() 関数が 'LLDP_ENTRY_TABLE:' + if_name (APPL_DB) を返す。https://github.com/sonic-net/sonic-snmpagent/blob/329f1cc/src/sonic_ax_impl/mibs/__init__.py 

  2. sonic-snmpagent tests/mock_tables/appl_db.json — LLDP_ENTRY_TABLE / LLDP_LOC_CHASSIS のフィールドセットを確認。https://github.com/sonic-net/sonic-snmpagent/blob/329f1cc/tests/mock_tables/appl_db.json