コンテンツにスキップ

APPL_DB MCLAG/ICCP 関連テーブル

概要

MC-LAG (Multi-Chassis Link Aggregation) の実行時状態は mclagsyncd が管理する1mclagsyncdiccpd(ICCP デーモン)から Unix ソケット経由で IPC メッセージを受信し、ProducerStateTable 経由で APPL_DB に書き込む。

書き込まれるテーブルは 5 種類2:

APPL_DB テーブル 目的
MCLAG_FDB_TABLE ピア同期 MAC アドレスエントリ
ISOLATION_GROUP_TABLE ポート分離グループ(対応プラットフォームのみ)
ACL_TABLE_TABLE / ACL_RULE_TABLE ポート分離 ACL(非対応プラットフォームのフォールバック)
LAG_TABLE PortChannel の MAC 学習モード・トラフィック分散制御
PORT_TABLE 物理ポートの MAC 学習モード制御
INTF_TABLE インタフェースの MAC アドレス上書き

STATE_DB への書き込み(MCLAG_TABLEMCLAG_LOCAL_INTF_TABLEMCLAG_REMOTE_INTF_TABLE)は mclagsyncd が直接行うが、本ページでは APPL_DB を対象とする。


MCLAG_FDB_TABLE

key 構造

MCLAG_FDB_TABLE|Vlan<vid>:<mac>

例: MCLAG_FDB_TABLE|Vlan100:00:01:02:03:04:05

フィールド

フィールド 説明
port string MAC エントリが所属するインタフェース名(PortChannel 名など)
type string エントリ種別。"static" / "dynamic" / "dynamic_local"

type の値は iccpd が IPC で送る MCLAG_FDB_TYPE 列挙値に基づく1:

列挙値 type 文字列
MCLAG_FDB_TYPE_STATIC 1 "static"
MCLAG_FDB_TYPE_DYNAMIC 2 "dynamic"
MCLAG_FDB_TYPE_DYNAMIC_LOCAL 3 "dynamic_local"

dynamic_local は aging が有効なローカルエントリとして ASIC に書き込む際に使用する。


ISOLATION_GROUP_TABLE

ポート分離(ピアリンク経由ループ防止)に使用する。プラットフォームが broadcombarefootcentecclounixmarvell-presteramarvell-teralynx のいずれかの場合に書き込まれる1

key 構造

ISOLATION_GROUP_TABLE|MCLAG_ISO_GRP

キーは "MCLAG_ISO_GRP" 固定(1 エントリのみ)。

フィールド

フィールド
DESCRIPTION string "Isolation group for MCLAG"(ハードコード)
TYPE string "bridge-port"(ハードコード)
PORTS string 分離元ポート名(MCLAG インタフェース)
MEMBERS string 分離先PortChannel 名(カンマ区切り)。全リモートが down のとき空文字列

MEMBERSEthernet で始まるポートが除外された PortChannel 名のみが設定される1。ICCP セッションが down で全リモートインタフェースが down の場合は MEMBERS を空にしてエントリを保持し、ICCP セッション自体が切断 (is_iccp_up == false) の場合はエントリを DEL する。


ACL フォールバック(非対応プラットフォーム)

上記プラットフォーム以外では isolation group の代わりに ACL を使用する1:

ACL_TABLE_TABLE

キー フィールド
mclag policy_desc "Mclag egress port isolate acl"
type "L3"
ports 分離元ポート名

ACL_RULE_TABLE

キー フィールド
mclag:mclag IP_TYPE "ANY"
OUT_PORTS 分離先 Ethernet ポート名(PortChannel 除外後)
PACKET_ACTION "DROP"

分離先ポートが空(op_len == 0)の場合は ACL_TABLE_TABLEmclag エントリを DEL する。


LAG_TABLE

MAC 学習モード

setPortMacLearnMode() がポートが PortChannel の場合に LAG_TABLE へ書き込む1:

フィールド
learn_mode string "hardware" または "disable"

MCLAG_SUB_OPTION_TYPE_MAC_LEARN_ENABLE"hardware"MCLAG_SUB_OPTION_TYPE_MAC_LEARN_DISABLE"disable"

トラフィック分散制御

mclagsyncdSetTrafficDisable() が PortChannel のトラフィック分散を制御する1:

フィールド
traffic_disable string "true" または "false"

MCLAG_MSG_TYPE_SET_TRAFFIC_DIST_DISABLE"true"(分散無効化)、ENABLE"false"


PORT_TABLE

物理ポートの MAC 学習モード。PortChannel でないポートに setPortMacLearnMode() が書き込む1:

フィールド
learn_mode string "hardware" または "disable"

INTF_TABLE

setIntfMac() がインタフェースの MAC アドレスを書き込む1:

フィールド 説明
mac_addr string ICCP が決定したシステム MAC アドレス

ICCP のロール(active / standby)確定後に iccpd が MCLAG_MSG_TYPE_SET_INTF_MAC メッセージで通知する。


書き込み主体・消費者

書き込み元 テーブル 消費者
mclagsyncd MCLAG_FDB_TABLE fdborch (orchagent)
mclagsyncd ISOLATION_GROUP_TABLE isolationGroupOrch
mclagsyncd ACL_TABLE_TABLE / ACL_RULE_TABLE aclOrch
mclagsyncd LAG_TABLE lagOrch
mclagsyncd PORT_TABLE portOrch
mclagsyncd INTF_TABLE intfOrch

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

以下はコード精読により判明した APPL_DB MCLAG 関連フィールドのコード由来デフォルト12

MCLAG_FDB_TABLE — フィールドのデフォルトなし

setFdbEntry() L465–521 は porttype の 2 フィールドを必ず明示的に書き込む。省略ロジックは存在しない。

フィールド 省略ルール iccpd 送信側デフォルト
port 省略なし(常に SET) なし(必須フィールド)
type 省略なし(常に SET) "dynamic" (最頻値)

ISOLATION_GROUP_TABLE — DESCRIPTION・TYPE は固定値

// mclaglink.cpp L235, L236, L272, L273
fvts.emplace_back("DESCRIPTION", "Isolation group for MCLAG");
fvts.emplace_back("TYPE", "bridge-port");
フィールド コード由来デフォルト 変更可否
DESCRIPTION "Isolation group for MCLAG" 不可(ハードコード)
TYPE "bridge-port" 不可(ハードコード)
MEMBERS "" (空文字列) — リモート全断時 ICCP up 時は実値

LAG_TABLE.learn_mode — ENABLE/DISABLE の 2 値のみ

// mclaglink.cpp L393, L397
if (op_hdr->op_type == MCLAG_SUB_OPTION_TYPE_MAC_LEARN_ENABLE)
    learn_mode = "hardware";
else if (op_hdr->op_type == MCLAG_SUB_OPTION_TYPE_MAC_LEARN_DISABLE)
    learn_mode = "disable";

MCLAG は起動時にリモート側PortChannel の MAC 学習を "disable" にし、ICCP セッション確立後は "hardware" に戻す。中間状態は存在せず、値は必ず "hardware""disable" のいずれか。

LAG_TABLE.traffic_disable — ICCP ロール確定前は書き込みなし

// mclaglink.cpp L1308, L1310
if (msg_type == MCLAG_MSG_TYPE_SET_TRAFFIC_DIST_DISABLE)
    traffic_dist_disable = "true";
else
    traffic_dist_disable = "false";

iccpd からのメッセージがある場合のみ書き込まれる。フィールド不在時の orchagent 側デフォルトは "false"(分散有効)。

CONFIG_DB keepalive_interval / session_timeout のデフォルト(iccpd 内)

MCLAG_DOMAIN テーブルの keepalive_interval / session_timeout が省略(空文字列)の場合、mclagsyncd は値 -1 として iccpd へ送信し、iccpd 内でデフォルト値にフォールバックする34:

CONFIG_DB フィールド 省略時の iccpd 内部デフォルト 定数
keepalive_interval 1 CONNECT_INTERVAL_SEC (scheduler.h:40)
session_timeout 15 HEARTBEAT_TIMEOUT_SEC (scheduler.h:42)
// iccp_csm.c L125-L126
csm->keepalive_time  = CONNECT_INTERVAL_SEC;   // = 1
csm->session_timeout = HEARTBEAT_TIMEOUT_SEC;  // = 15

フォールバックは mlacp_link_handler.c L3108, L3120, L3137, L3142 で -1 を検出した際にも同値がセットされる。

引用元