Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。
裏取りステータス: Code-verified
sonic-swss orchagent/aclorch.cpp L44 で STATE_DB_ACL_L3V4V6_SUPPORTED = "supported_L3V4V6" 定義、L240 で TABLE_TYPE_L3V4V6 を default table types に追加、L2737/L2739 で table 作成時に isAclL3V4V6TableSupported(stage) を判定、L3519/L3527 で m_L3V4V6Capability を ingress/egress 別に検出、L3541 でケーパビリティを SWSS_LOG に出力。aclorch.h L616 isAclL3V4V6TableSupported / L633 m_L3V4V6Capability マップを確認。CLI 側は sonic-utilities acl_loader/main.py L429-433 で is_table_l3v4v6、L780/L784 で L3V4V6 用 ethertype チェックを確認。YANG は sonic-yang-models sonic-types.yang.j2 L115 enum L3V4V6 を確認(verified at: 2026-05-09)。
L3V4V6 ACL テーブル型(v4 / v6 ルールを 1 SAI ACL テーブルに同居)¶
概要¶
従来 SONiC は IPv4 用 L3 と IPv6 用 L3V6 を 別々の SAI ACL テーブル として作成していた。多くの ASIC では同一 TCAM テーブルで v4 / v6 両方を扱える(IPv6 アドレス用に確保された 128bit 幅に IPv4 32bit を相乗り可能)ため、TCAM の使い切りが起こり得た1。
本 HLD は 新規組み込みテーブル型 L3V4V6 を導入し、この最適化を operator が選択的に有効化できるようにする1。MIRROR / MIRRORV6 で過去に行ったコンパイル時マージ最適化(Option-A)と異なり、ユーザに見える ACL テーブルが 1 つで済む点が利点。
動作仕様¶
検討された選択肢1¶
| Option | 内容 | 採否 |
|---|---|---|
| A | MirrorV4/V6 と同じく compile-time マージ | 不採用(テーブル数制約・bind ポート不一致) |
| B | 既存 L3V6 に v4 match field を増やす |
不採用(ユーザ設定書き換えが必要) |
| C | 新型 L3V4V6 を導入 |
採用 |
L3V4V6 の match / action / bind¶
サポート match1:
VLAN_ID,IP_TYPE,ETHER_TYPESRC_IPV6/DST_IPV6/SRC_IP/DST_IPICMPV6_TYPE/CODE/ICMP_TYPE/CODEIP_PROTOCOL/NEXT_HEADERL4_SRC_PORT/L4_DST_PORT/TCP_FLAGS
action: PACKET_ACTION / REDIRECT_ACTION(egress では REDIRECT 非対応な ASIC では PACKET_ACTION のみ)。bind: Port / LAG。
ACL ルールには IP_TYPE または ETHER_TYPE を含めることを推奨。Phase 2 で非対応 ASIC 上で内部的に v4 用 / v6 用の 2 枚に振り分ける際の判定キーになる1。
Phase 1 / Phase 2¶
flowchart TD
U[user creates<br>ACL_TABLE type=L3V4V6] --> O{platform supports<br>combined v4/v6?}
O -- yes --> S[1 SAI ACL table<br>Phase 1 動作]
O -- no Phase 1 --> E[orchagent syslog ERROR<br>テーブル作成失敗]
O -- no Phase 2 --> SP[内部で 2 SAI ACL tables<br>v4/v6 で分割]
SP --> U2[ユーザには 1 テーブルとして見える]
現状は Phase 1 のみ実装 され、非対応 ASIC では orchagent が syslog にエラーを出してテーブル作成を断る1。
STATE_DB capability 公開¶
hgetall "ACL_STAGE_CAPABILITY_TABLE|INGRESS"
...
supported_L3V4V6 -> "true"
hgetall "ACL_STAGE_CAPABILITY_TABLE|EGRESS"
...
supported_L3V4V6 -> "true"
operator はこのフィールドで platform 対応可否を確認できる1。
📋 検証エビデンス: sonic-net/SONiC/doc/acl/Extend-L3V6ACLs.md#L256-L325 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/acl/Extend-L3V6ACLs.md#L256-L325 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
AclOrch::init() -> initDefaultTableTypes() -> addAclTableType(TABLE_TYPE_L3V4V6)
... A new field called `supported_L3V4V6` is added to the ACL capability in STATE_DB ...
判断根拠: orchagent 側エントリポイントと STATE_DB capability キー名を引用
YANG / CLI¶
sonic-acl の ACL_TABLE.type enum に L3V4V6 を追加1。CLI:
設定例(v4 ルールと v6 ルールを同テーブルに混在):
{
"ACL_TABLE": {
"DATAACL": { "STAGE": "INGRESS", "TYPE": "L3V4V6", "PORTS": ["Ethernet0", "Ethernet1"] }
},
"ACL_RULE": {
"DATAACL|RULE1": { "ETHER_TYPE": "0x0800", "PRIORITY": "5",
"DST_IP": "20.2.2.2/32", "PACKET_ACTION": "DROP" },
"DATAACL|RULE2": { "IP_TYPE": "IPV6ANY", "PRIORITY": "6",
"DST_IPV6": "2001::2/64", "PACKET_ACTION": "DROP" }
}
}
制限事項¶
- ACL テーブル間の優先順位付けは未実装。1 ポートに複数 ACL テーブルが bind され action が衝突した場合の勝者は未定義。Phase 2 で
ACL_TABLEpriority 設定で対処予定1 L3V4V6テーブル内のルールにはIP_TYPEまたはETHER_TYPEを含めるのが望ましい- warm/fast-boot への影響は無し1
干渉する機能¶
- 既存 L3 / L3V6 テーブル: 共存可能。同一ポートに複数 ACL テーブル bind が発生しうる
- MIRROR / MIRRORV6: 既に compile-time マージで最適化済み。本機能は L3 系のみ