COPP port-binding (genetlink フィールド)¶
概要¶
COPP_GROUP テーブルの genetlink_name / genetlink_mcgrp_name フィールドは、CoPP トラップグループをカーネル genetlink ホストインタフェース(例: psample)に束ねる port-binding 機能を提供する1。
これらのフィールドが設定されたグループに属する trap は、SAI_HOSTIF_TABLE_ENTRY_CHANNEL_TYPE_GENETLINK 経由でカーネルの genetlink ソケットへ転送される。sflow のパケットサンプリング(sample_packet trap)に使用され、queue2_group1 がその典型例。
YANG モデル (sonic-copp.yang) にはこれらフィールドの定義がなく、APPL_DB 経由の拡張フィールドとして実装されている。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>COPP_GROUP")]
DM["coppmgrd"]
CDB --> DM
APPDB[("APP_DB<br/>APP_DB")]
DM --> APPDB
OA["orchagent<br/>CoppOrch"]
APPDB --> OA
SAI["SAI<br/>sai_hostif_api<br/>(GENETLINK)"]
OA --> SAI
凡例
CONFIG_DB から SAI までの典型経路。genetlink_name が存在する場合は SAI_HOSTIF_TYPE_GENETLINK 型の HostIf が作成され、trap ごとに HOSTIF_TABLE_ENTRY (CHANNEL_TYPE_GENETLINK) が紐付けられる。
key 構造¶
genetlink_name / genetlink_mcgrp_name は COPP_GROUP テーブルのフィールド。COPP_PORT という独立テーブルは存在しない。
port-binding フィールド¶
| フィールド | 型 | 必須 | 既定 | 説明 |
|---|---|---|---|---|
genetlink_name |
string | no | (フィールドなし) | 紐付ける SAI genetlink HostIf 名。例: psample。存在しない場合 genetlink HostIf は未作成 |
genetlink_mcgrp_name |
string | no | SAI 実装依存 | genetlink multicast group 名。例: packets。genetlink_name と併用 |
動作フロー¶
coppmgrがCOPP_GROUPエントリを APPL_DBAPP_COPP_TABLEに書き込むCoppOrch::processCoppTrapGroup()がgetAttribsFromTrapGroup()でgenetlink_attribsを収集genetlink_attribsが空でない場合、createGenetlinkHostIf()でSAI_HOSTIF_TYPE_GENETLINKの HostIf を作成createGenetlinkHostIfTable()で配下 trap_id ごとにSAI_HOSTIF_TABLE_ENTRY_CHANNEL_TYPE_GENETLINKの table entry を作成
デフォルト設定 (copp_cfg.j2)¶
queue2_group1 のみが genetlink フィールドを持つ:
"queue2_group1": {
"cbs": "1000",
"cir": "1000",
"genetlink_mcgrp_name": "packets",
"genetlink_name": "psample",
"meter_type": "packets",
"mode": "sr_tcm",
"queue": "2",
"red_action": "drop",
"trap_action": "trap",
"trap_priority": "1"
}
他のグループ (default, queue4_group*, queue1_group*) には genetlink_name / genetlink_mcgrp_name フィールドが存在しない。
制約¶
genetlink_nameのみ設定しgenetlink_mcgrp_nameを省略した場合、SAI HostIf は作成されるがSAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAMEが未設定となり、SAI 実装依存の挙動となるgenetlink_nameなしでgenetlink_mcgrp_nameのみ設定するとSAI_HOSTIF_ATTR_TYPEが未設定のままcreate_hostif()が呼ばれ、SAI 実装によっては失敗するgenetlink_nameの値はsizeof(chardata)-1バイトに切り詰められる(末尾 NUL 保証)
例外条件・特殊挙動¶
- genetlink HostIf 作成失敗 → task_failed:
sai_hostif_api->create_hostif()がSAI_STATUS_SUCCESS以外を返した場合、handleSaiCreateStatus()によりエラー処理され、プロセス終了に至る可能性がある。 - genetlink HostIfTable 作成失敗 → task_failed:
create_hostif_table_entry()失敗時も同様のエラーパスを通る。 - DEL → 自動復元:
COPP_GROUPエントリが削除されても init cfg (copp_cfg.j2由来) に同名エントリが存在する場合、coppmgrdが init 値で APPL_DB に再書き込みし、genetlink HostIf が再作成される。 - YANG 未定義フィールド:
genetlink_name/genetlink_mcgrp_nameはsonic-copp.yangに定義がなく、YANG バリデーション対象外。不正な値は SAI レイヤでのみ検出される。
値依存挙動マトリクス¶
| フィールド | 値 | 挙動 |
|---|---|---|
genetlink_name |
なし | genetlink HostIf 未作成。trap はデフォルト NETDEV_PHYSICAL_PORT チャネルで処理 |
genetlink_name |
"psample" 等 |
SAI_HOSTIF_TYPE_GENETLINK の HostIf を作成。trap_id ごとに HOSTIF_TABLE_ENTRY (GENETLINK) を作成 |
genetlink_mcgrp_name |
なし | SAI HostIf 作成時に mcgrp_name を渡さない。SAI 実装のデフォルト適用 |
genetlink_mcgrp_name |
"packets" 等 |
SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME を設定してカーネル psample/packets グループに転送 |
購読者¶
coppmgr(docker-swss内): CONFIG_DBCOPP_GROUPを読み APPL_DBAPP_COPP_TABLEへ書き込むorchagentのCoppOrch: APPL_DB を購読し SAI genetlink HostIf を作成
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
COPP_GROUP、COPP_TRAP - 関連 CLI:
config copp、show copp - 関連 YANG:
sonic-copp(genetlink フィールドは YANG 未定義)
関連リファレンス¶
引用元¶
関連 Topics¶
運用ヒント¶
典型値¶
genetlink_name:"psample"— sflow パケットサンプリング用カーネルモジュール名genetlink_mcgrp_name:"packets"— psample の multicast group 名
確認コマンド¶
よくある誤設定¶
genetlink_nameのみ設定しgenetlink_mcgrp_nameを省略すると、SAI HostIf は作成されるが sflow サンプリングが機能しない場合がある(SAI 実装依存)- sflow 機能が無効の場合、
sample_packettrap はcoppmgrによって APPL_DB から除外されるため、genetlink HostIf が作成されても trap は来ない
実コンテナ動作トレース¶
段階 1 — Consumer 登録¶
coppmgrd が CONFIG_DB の COPP_GROUP テーブルを購読する。genetlink_name フィールドが含まれるエントリを検知すると APPL_DB APP_COPP_TABLE に全フィールドを書き込む。
段階 2 — CFG→APPL 翻訳¶
APP_COPP_TABLE に書き込み。genetlink_name / genetlink_mcgrp_name はそのまま APPL_DB に転記される(coppmgr は genetlink フィールドを特別扱いしない)。
段階 3 — APPL→SAI¶
CoppOrch::getAttribsFromTrapGroup() で genetlink_name / genetlink_mcgrp_name を genetlink_attribs に収集。processCoppTrapGroup() の op == SET_COMMAND パスで:
createGenetlinkHostIf()→sai_hostif_api->create_hostif()(SAI_HOSTIF_TYPE_GENETLINK)createGenetlinkHostIfTable()→ 各 trap_id にsai_hostif_api->create_hostif_table_entry()(CHANNEL_TYPE_GENETLINK)
段階 4 — タイミングと副作用¶
適用タイミング: CONFIG_DB 変化を coppmgrd が検知後 APPL_DB に書き込み → CoppOrch が SAI HostIf を更新。
副作用: genetlink HostIf の削除・再作成中は sflow サンプリングが一時停止する。
書き込み入り口 (Direction A)¶
対象テーブル: COPP_GROUP (genetlink フィールド)
CLI¶
config copp— COPP_GROUP の更新(genetlink フィールドの直接 CLI サポートは限定的)
ビルド時デフォルト (init_cfg / j2 テンプレート)¶
files/image_config/copp/copp_cfg.j2がqueue2_group1にgenetlink_name: psample/genetlink_mcgrp_name: packetsを設定
ハードコードデフォルト¶
- なし(YANG 未定義フィールドのため)
ランタイム注入 (デーモン自動書き込み)¶
- なし
派生・条件付き登録 (Phase 6/7)¶
Phase 6: 値による他フィールド自動派生¶
| 条件 | 派生先 | evidence |
|---|---|---|
genetlink_name フィールドあり |
SAI_HOSTIF_ATTR_TYPE = GENETLINK が genetlink_attribs に追加される |
copporch.cpp L1267-1268 |
genetlink_name フィールドあり |
SAI_HOSTIF_ATTR_NAME = <値> が genetlink_attribs に追加される |
copporch.cpp L1271-1275 |
genetlink_mcgrp_name フィールドあり |
SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME = <値> が genetlink_attribs に追加される |
copporch.cpp L1281-1285 |
Phase 7: 条件付き module/manager 登録¶
| 条件 | 登録 module | evidence |
|---|---|---|
genetlink_attribs が空でない |
createGenetlinkHostIf() が呼ばれ SAI GENETLINK HostIf を作成 |
copporch.cpp L833-844 |
COPP_GROUP DEL かつ m_trap_group_hostif_map に存在 |
removeGenetlinkHostIf() が呼ばれ SAI HostIf を削除 |
copporch.cpp L1099-1119 |
Phase 8: Handler メソッド内分岐¶
| Manager / Handler | メソッド | 分岐条件 | 効果 | evidence |
|---|---|---|---|---|
CoppOrch |
getAttribsFromTrapGroup() |
fvField == "genetlink_name" |
SAI_HOSTIF_ATTR_TYPE=GENETLINK + SAI_HOSTIF_ATTR_NAME を genetlink_attribs に追加 |
copporch.cpp L1265-1276 |
CoppOrch |
getAttribsFromTrapGroup() |
fvField == "genetlink_mcgrp_name" |
SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME を genetlink_attribs に追加 |
copporch.cpp L1279-1286 |
CoppOrch |
processCoppTrapGroup() |
!genetlink_attribs.empty() |
createGenetlinkHostIf() + createGenetlinkHostIfTable() を呼び出し |
copporch.cpp L833-848 |
CoppOrch |
processCoppTrapGroup() |
op == DEL_COMMAND かつ m_trap_group_hostif_map に存在 |
removeGenetlinkHostIf() で HostIf + table entry を削除 |
copporch.cpp L1099-1119 |
スキャン証跡:
getAttribsFromTrapGroupL1154-1294 全行読了、processCoppTrapGroupL730-872 + L1099-1151 読了。4 件分岐抽出。
コード由来の暗黙デフォルト (Phase A)¶
genetlink_name — フィールド不在 = genetlink HostIf 未作成¶
COPP_GROUP エントリに genetlink_name フィールドが存在しない場合、getAttribsFromTrapGroup() は genetlink_attribs リストに何も追加しない。processCoppTrapGroup() は genetlink_attribs.empty() を確認し、空の場合は createGenetlinkHostIf() / createGenetlinkHostIfTable() を呼ばない。結果として当該グループの trap は initDefaultHostIntfTable() で作成された SAI_HOSTIF_TABLE_ENTRY_CHANNEL_TYPE_NETDEV_PHYSICAL_PORT チャネル(wildcard エントリ)経由で処理される。
genetlink_mcgrp_name — フィールド不在 = SAI 実装デフォルト適用¶
genetlink_name が存在するが genetlink_mcgrp_name が存在しない場合、SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME は設定されずに create_hostif() が呼ばれる。SAI 実装(ベンダー依存)のデフォルト multicast group 名が適用される。psample の場合は通常 "packets" がデフォルトだが、SAI 仕様上は保証されない。
genetlink_name の文字列長上限 — sizeof(chardata)-1 バイト切り詰め¶
genetlink_name の値は sai_attribute_t::value.chardata に格納される。strncpy(attr.value.chardata, fvValue(*i).c_str(), size - 1) により最大 sizeof(chardata)-1 バイトに切り詰められ、末尾 NUL が保証される。sizeof(chardata) は SAI ヘッダ定義次第だが通常 32 バイト。31 文字超の名前は切り詰められ、SAI HostIf 作成失敗の原因となる。同様に genetlink_mcgrp_name も同じ処理が適用される。
init cfg のデフォルト (queue2_group1)¶
copp_cfg.j2 において genetlink_name / genetlink_mcgrp_name を持つグループは queue2_group1 のみ。値は genetlink_name="psample" / genetlink_mcgrp_name="packets"。これらは sflow (sample_packet trap) 専用。他の全グループにはこれらフィールドが存在せず、genetlink port-binding は適用されない。
DEL 後の genetlink HostIf 自動復元¶
COPP_GROUP|queue2_group1 が CONFIG_DB から削除されても、coppmgrd が init cfg 値で APPL_DB に再書き込みし、CoppOrch が genetlink HostIf を再作成する。sflow が有効な場合、一時的な停止後に自動復旧する。
スキャン証跡: copporch.cpp L1154-1295 (getAttribsFromTrapGroup 全行)、copporch.cpp L302-330 (initDefaultHostIntfTable)、copporch.cpp L419-493 (createGenetlinkHostIfTable/removeGenetlinkHostIfTable)、copporch.cpp L657-714 (createGenetlinkHostIf/removeGenetlinkHostIf)、copporch.cpp L730-872 (processCoppTrapGroup)、copp_cfg.j2 全行、coppmgr.cpp L898-921。発見 5 件。
-
CoppOrch実装:sonic-swss/orchagent/copporch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/copporch.cpp ↩