Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。
裏取りステータス: Code-verified
現行 master の sonic-swss/orchagent/copporch.cpp:99 で neighbor_miss → SAI_HOSTIF_TRAP_TYPE_NEIGHBOR_MISS マップ、line 106 の default_supported_trap_ids、line 199 の STATE_COPP_TRAP_CAPABILITY_TABLE_NAME、line 222-235 の updateTrapOperStatus (hw_status 公開)、line 239-287 の query_objecttype_implementation/enum_values_capability クエリ、sonic-buildimage/files/image_config/copp/copp_cfg.j2:66,135 の queue1_group3 / neighbor_miss 追加、sonic-utilities/show/copp.py:189-206 の show copp configuration CLI を確認済み(verified at: 2026-05-09)。
CoPP Neighbor Miss trap と enum capability query(show copp configuration)¶
これは何か(一行で)¶
CoPP に neighbor_miss trap(ARP/ND 未解決 IP パケット用)を追加し、SAI enum capability query で対応 trap を事前判定、hw_status を STATE_DB に出して show copp configuration で見える化する 4 点セットの改善1。
なぜ必要か¶
- ARP 解決前の IP トラフィックが CPU に殺到 → IP2ME など重要 trap を巻き添えにする問題があった
- SAI が知らない trap を投げて orchagent が落ちる事象を enum capability query で根絶
- 「自分の ASIC は BGP trap を install できているか?」が CLI で見えなかった →
hw_status列で公開
全体構造¶
flowchart LR
SAI[SAI] -->|enum capability query| CO[Copporch]
CO --> SUP[supported_trap_ids]
SUP --> ST1[("STATE_DB\nCOPP_TRAP_CAPABILITY_TABLE|traps")]
APPL[(APPL_DB\nCoPP trap 設定)] --> CO
CO --> CHK{supported?}
CHK -->|Yes| INS[create_hostif_trap\nhw_status=installed]
CHK -->|No| ERR[syslog ERR\nhw_status=not-installed]
INS --> ST2[("STATE_DB\nCOPP_TRAP_TABLE|<trap>")]
ERR --> ST2
CLI[show copp configuration] --> CFG[("CONFIG_DB / copp_cfg.json")]
CLI --> ST2
動作: Init と Config¶
Init 時の Copporch1:
sai_query_attribute_enum_values_capability(SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE)で対応値を取得- 結果を
supported_trap_idsに保持 - query 自体が非対応の SAI は
default_supported_trap_idsにフォールバック(後方互換) supported_trap_idsをSTATE_DB.COPP_TRAP_CAPABILITY_TABLE|trapsに出版
Config 時(APPL_DB から CoPP trap 設定が来た時):
supported_trap_idsに含まれるか確認- 含まれる → SAI に
create_hostif_trapで投入しhw_status=installed - 含まれない → syslog
ERR、hw_status=not-installed(試行せず)
これで「BGP 機能無効な T0 で BGP trap だけ未 install」のような状態が CLI で判別可能。
Neighbor miss trap デフォルト¶
copp_cfg.j2 に追加1:
"queue1_group3": {
"trap_action": "trap", "trap_priority": "1",
"queue": "1", "meter_type": "packets",
"mode": "sr_tcm", "cir": "200",
"cbs": "200", "red_action": "drop"
},
"neighbor_miss": {
"trap_ids": "neighbor_miss",
"trap_group": "queue1_group3",
"always_enabled": "true"
}
always_enabled=true なので feature flag に関わらず常時有効。CIR/CBS=200 pps、red_action=drop。
STATE_DB スキーマ¶
COPP_TRAP_CAPABILITY_TABLE|traps
trap_ids : "stp,lacp,eapol,lldp,...,neighbor_miss,...,bgp,bgpv6,bfd,..."
COPP_TRAP_TABLE|<trap_name>
state : "ok" | ...
hw_status : "installed" | "not-installed"
hw_status 列が今回の追加。COPP_TRAP_CAPABILITY_TABLE はテーブル新設1。
SAI API¶
新規 SAI API は無し。既存 API のみで実装1:
| API | 属性 | 値 |
|---|---|---|
sai_query_attribute_enum_values_capability |
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE |
(列挙値取得) |
create_hostif_trap_fn / remove_hostif_trap_fn |
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE |
SAI_HOSTIF_TRAP_TYPE_NEIGHBOR_MISS |
CLI¶
新設 show copp configuration:
サマリ出力1:
TrapId Trap Group Action CBS CIR Meter Type Mode HW Status
--------------- ------------- ------ ---- --- ---------- ------ -------------
arp_req queue4_group2 copy 600 600 packets sr_tcm installed
bgp queue4_group1 trap 6000 6000 packets sr_tcm not-installed
neighbor_miss queue1_group3 trap 200 200 packets sr_tcm installed
詳細:
show copp configuration detailed --trapid neighbor_miss
show copp configuration detailed --group queue1_group3
設定¶
CONFIG_DB¶
既存 COPP_TRAP / COPP_GROUP を使う。スキーマ変更なし(追加 default は copp_cfg.j2 テンプレ側)。
YANG¶
sonic-copp を再利用(変更なし)1。
Warm/fast boot¶
影響なし1。
制限事項¶
SAI_HOSTIF_TRAP_TYPE_NEIGHBOR_MISSの対応は ベンダー依存。未実装 ASIC ではhw_status=not-installeddefault_supported_trap_idsは古い SAI 向けフォールバック。新 trap を default に入れ忘れると未 install になる可能性- HLD デフォルト(CIR/CBS=200、queue=1)はデバイス・トラフィックに合わせて調整余地あり
- DHCP_L2 / DHCPv6_L2 トラップが COPP マップに未対応 (sonic-swss#1684): SAI では
SAI_HOSTIF_TRAP_TYPE_DHCP_L2/SAI_HOSTIF_TRAP_TYPE_DHCPV6_L2が追加されているが(opencomputeproject/SAI#1118)、SONiC の COPP トラップ ID マップにはこれらの L2 DHCP トラップが追加されていない。DHCP relay が L2 ブロードキャスト(DHCP Discover 等)を正しくトラップできない場合はこの制限が原因である可能性がある。 - SAI mandatory trap が未実装の場合がある (sonic-swss#559): SAI 仕様で mandatory とされているトラップ種別(例:
SAI_HOSTIF_TRAP_TYPE_STP、SAI_HOSTIF_TRAP_TYPE_OSPF)でも、BCM SAI 等のベンダー実装で未サポートのものがある。syncdログにSAI_STATUS_NOT_IMPLEMENTEDが記録される場合はプラットフォームのベンダー SAI が該当トラップを実装していないことを意味する。SAI spec の mandatory は「標準上の要件」であり「全 ASIC ベンダーが実装済み」を保証しない。
干渉する機能¶
Copporch: 主要変更箇所- 既存 trap (arp_req / bgp / lldp ...): 全 trap が
hw_statusを新規に持つ copp_cfg.j2: 新 group / trap 追加。既存設定との merge に注意- 既存スクリプト:
show系出力を parse しているもの(互換性確認)
トラブルシューティング¶
- ARP 解決前 IP トラフィックで CPU 高負荷 →
show copp configurationでneighbor_missのhw_status=installedを確認 - ある trap が
not-installedのまま →STATE_DB.COPP_TRAP_CAPABILITY_TABLE|traps.trap_idsに該当 trap があるか確認 - 設定したのに ASIC に反映されない → syslog の
CopporchERR を確認
確認コマンド例:
# neighbor_miss trap と hw_status / capability を確認
show copp configuration | grep -A2 neighbor_miss
redis-cli -n 6 hgetall 'COPP_TRAP_CAPABILITY_TABLE|traps'
redis-cli -n 6 hgetall 'COPP_TABLE|neighbor_miss'
docker logs swss 2>&1 | grep -i copporch | tail