APPL_DB MCLAG/ICCP 関連テーブル¶
概要¶
MC-LAG (Multi-Chassis Link Aggregation) の実行時状態は mclagsyncd が管理する1。mclagsyncd は iccpd(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_TABLE・MCLAG_LOCAL_INTF_TABLE・MCLAG_REMOTE_INTF_TABLE)は mclagsyncd が直接行うが、本ページでは APPL_DB を対象とする。
MCLAG_FDB_TABLE¶
key 構造¶
例: 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¶
ポート分離(ピアリンク経由ループ防止)に使用する。プラットフォームが broadcom・barefoot・centec・clounix・marvell-prestera・marvell-teralynx のいずれかの場合に書き込まれる1。
key 構造¶
キーは "MCLAG_ISO_GRP" 固定(1 エントリのみ)。
フィールド¶
| フィールド | 型 | 値 |
|---|---|---|
DESCRIPTION |
string | "Isolation group for MCLAG"(ハードコード) |
TYPE |
string | "bridge-port"(ハードコード) |
PORTS |
string | 分離元ポート名(MCLAG インタフェース) |
MEMBERS |
string | 分離先PortChannel 名(カンマ区切り)。全リモートが down のとき空文字列 |
MEMBERS は Ethernet で始まるポートが除外された 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_TABLE の mclag エントリを 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 は port と type の 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 を検出した際にも同値がセットされる。
引用元¶
-
mclagsyncd 実装:
sonic-swss/mclagsyncd/mclaglink.cpp,mclaglink.h,mclag.h. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/mclagsyncd/mclaglink.cpp ↩↩↩↩↩↩↩↩↩↩ -
テーブル名定数:
sonic-swss-common/common/schema.h. https://github.com/sonic-net/sonic-swss-common/blob/158de8d3463ff4b841653f6d57190bb142b80d9c/common/schema.h ↩↩ -
keepalive/timeout 定数:
sonic-buildimage/src/iccpd/include/scheduler.h. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/iccpd/include/scheduler.h ↩ -
iccpd CSM 初期化:
sonic-buildimage/src/iccpd/src/iccp_csm.c. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/iccpd/src/iccp_csm.c ↩