コンテンツにスキップ

IPv6 Link-local モード

概要

ipv6_use_link_local_only フィールドは INTERFACE / PORTCHANNEL_INTERFACE / VLAN_INTERFACE テーブルの属性ロウに共通して存在し、対象インターフェースで IPv6 link-local アドレス自動生成 (EUI-64) を有効にする1

有効化すると、手動でグローバル IPv6 アドレスを設定しない場合でも FE80::/64 の link-local アドレスが自動生成される。BGP unnumbered ピアリング (RFC 5549) や ICMPv6 近隣探索 (NDP) を利用する IPv6 データセンターネットワークで使われる。

データフロー

flowchart LR
  CDB[("CONFIG_DB\nINTERFACE|EthernetX\nipv6_use_link_local_only")]
  intfmgr["intfmgrd\n(swss)"]
  APPDB[("APP_DB\nINTF_TABLE")]
  neighsyncd["neighsyncd\n(swss)"]
  NEIGH[("APP_DB\nNEIGH_TABLE")]

  CDB --> intfmgr
  intfmgr --> APPDB
  neighsyncd -->|"isLinkLocalEnabled()\ncheck"| CDB
  APPDB -->|link-local neigh 追加| NEIGH

凡例

CONFIG_DB から APP_DB までの経路。SAI への転送は ipv6_use_link_local_only フィールド自体では発生しない (orchagent は本フィールドを SAI に転送しない)。

key 構造

INTERFACE|<name>                    # 属性ロウ (Ethernet ポート)
PORTCHANNEL_INTERFACE|<name>        # 属性ロウ (PortChannel)
VLAN_INTERFACE|<name>               # 属性ロウ (VLAN)

ipv6_use_link_local_only は属性ロウ (IP プレフィクスロウではなく) に格納される。

フィールド

フィールド YANG default 説明
ipv6_use_link_local_only mode-status (enable/disable) disable IPv6 link-local アドレス自動生成の on/off

mode-status 型は sonic-types.yang で定義: enum enable | enum disable

フィールド暗黙デフォルト (Phase A — コード由来)

YANG default disable はスキーマ上の宣言であり、DB エントリ自体がない場合のランタイム fallback はコードで決まる。

状況 挙動 コード根拠
CONFIG_DB にフィールドなし (エントリ自体存在) intfmgr は APP_DB に書かない (silent skip) intfmgr.cpp:L913 if (!ipv6_link_local_mode.empty())
CONFIG_DB にフィールドなし (エントリも存在しない) neighsyncm_cfgInterfaceTable.get() が false → link-local neigh を無視 neighsync.cpp:L215-219
"disable" を明示設定し他属性なし mod_entry でなく set_entry(None)エントリごと CONFIG_DB から削除 config/main.py:L9484
"disable" を明示設定し他属性あり (VRF/IP) mod_entry"disable" を書く (エントリは残る) config/main.py:L9482
"enable" 設定後 DEL_COMMAND m_ipv6LinkLocalModeList.erase() + delIpv6LinkLocalNeigh() で link-local neigh 自動削除 intfmgr.cpp:L1081-1086
warm restart 後 m_ipv6LinkLocalModeList がリセットされ CONFIG_DB replay で再 insert される intfmgr.cpp:L917

HLD との乖離: HLD (doc/ipv6/ipv6_link_local.md) は APP_DB にも "disable" が書かれると示唆するが、実装ではフィールドが空の場合は APP_DB への書き込みをスキップする。

orchagent (dead consumer): IntfsOrch は APP_DB の ipv6_use_link_local_only フィールドを受け取っても SAI に転送しない。IPv6 link-local 自体は Linux カーネルの IPv6 スタックと intfmgr の sysctl 制御で実現するため、SAI 側の RIF 属性変更は不要。

neighsync の silent drop パターン: - Ethernet / PortChannel / Vlan で始まらないインターフェース名 (例: eth0, lo, docker0) → isLinkLocalEnabled() が即 false 返却 - 値が "enable" 以外 ("disable" 含む) → false 返却 → link-local neigh は APP_DB に登録されない - 属性ロウのエントリ自体が CONFIG_DB に存在しない → false → 同様に登録しない

重複設定の no-op: set_ipv6_link_local_only_on_interface()curr_mode == mode の場合 early return する。未設定に "disable" を設定した場合も no-op になる。

購読者

コンポーネント 役割 テーブル
intfmgrd (swss) CONFIG_DB を購読し m_ipv6LinkLocalModeList を更新、APP_DB に転送 INTERFACE / PORTCHANNEL_INTERFACE / VLAN_INTERFACE
neighsyncd (swss) link-local neigh の ADD/DEL 時に isLinkLocalEnabled() を参照し、無効なら NEIGH_TABLE への書き込みをスキップ CONFIG_DB 直接参照
orchagent IntfsOrch APP_DB INTF_TABLE を購読するが ipv6_use_link_local_only は SAI に転送しない (dead consumer) APP_DB

CLI

# 個別インターフェースに設定
config interface ipv6 enable use-link-local-only Ethernet0
config interface ipv6 disable use-link-local-only Ethernet0

# 全インターフェースに一括設定 (VLAN member / PortChannel member は除外)
config ipv6 enable link-local
config ipv6 disable link-local

# 確認
show ipv6 link-local-mode

config ipv6 enable link-local は VLAN member ポートおよび PortChannel member ポートを自動スキップする。Loopback (lo) と OOB (eth0) は対象外。

show ipv6 link-local-mode は PORT / PORTCHANNEL / VLAN テーブルを基準に表示するため、Loopback は表示されない。INTERFACE エントリが存在しないポートは Disabled 表示。

関連制約

  • VLAN member として登録されたポートへの enable は CLI で拒否される (明示エラー)
  • PortChannel member として登録されたポートへの enable は CLI で拒否される (明示エラー)
  • use-link-local-only が有効なポートを VLAN member として登録しようとすると拒否される ("is a router interface" エラー)

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: INTERFACEPORTCHANNEL_INTERFACEVLAN_INTERFACE
  • 関連 CLI: config interface ipv6 enable/disable use-link-local-onlyconfig ipv6 enable/disable link-local
  • 関連 YANG: sonic-interfacesonic-portchannelsonic-vlan

関連リファレンス

引用元

関連ページ