Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。
裏取りステータス: Code-verified(Stage 1 のみ)
sonic-swss-common/common/schema.h L183 で APP_DASH_PREFIX_TAG_TABLE_NAME = "DASH_PREFIX_TAG_TABLE" を確認。sonic-swss/orchagent/dash/dashaclorch.cpp L111-112 で APP_DASH_PREFIX_TAG_TABLE_NAME の SET/DEL を taskUpdateDashPrefixTag / taskRemoveDashPrefixTag が処理、L283-310 で tag CRUD ハンドラを確認。tests/dash/test_dash_acl.py L186-194/L511 で PrefixTag proto による tag CRUD テストを確認(verified at: 2026-05-09)。Stage 2(SAI API でタグを ASIC へ)は本 HLD の対象外。
DASH ACL タグ(DASH_PREFIX_TAG_TABLE と DASH_ACL_RULE_TABLE 拡張)¶
なぜ必要か¶
DASH (Disaggregated APIs for SONiC Hosts) の ACL では、サービスタグ が「あるサービスに属する IP プレフィックス群」を表す抽象として使われる。タグメンバが変わってもタグ自体の更新だけで済み、これを参照する ACL ルールは無変更でよい。プレフィックスを各ルールに複製する必要が無くなり、メモリ効率も上がる1。
実装は 2 段階1:
| Stage | 内容 |
|---|---|
| Stage 1 | SWSS 内のソフト展開のみ。ルール作成時にタグをプレフィックス列に展開(SAI 変更なし) |
| Stage 2 | SAI API 経由でタグを ASIC へ(本 HLD 対象外) |
本 HLD は Stage 1 を定義する。
要件 (Stage 1)1:
- orchagent で ACL タグ設定をサポート
- 1 プレフィックスは 複数タグに所属可
- タグからプレフィックス追加 / 削除は いつでも
- ルール生成時に タグ → プレフィックス列に展開
スケール目標1: 総タグ 4k、タグあたり最大プレフィックス 24k、ACL ルールあたり最大タグ 4k。
スキーマ¶
APP_DB.DASH_PREFIX_TAG_TABLE(新規)1¶
DASH_PREFIX_TAG_TABLE:<tag_name>
"ip_version": "ipv4" | "ipv6"
"prefix_list": "<prefix1>,<prefix2>,..."
tag_nameは uniqueprefix_listは空も許される(マッチするパケットなしを意味)
APP_DB.DASH_ACL_RULE_TABLE 拡張1¶
DASH_ACL_RULE_TABLE:<group_id>:<rule_num>
"priority": INT32 ; 小さいほど優先
"action": "allow" | "deny"
"terminating": "true" | "false"
"protocol": INT list OPTIONAL
"src_tag": tag 名リスト ',' 区切り OPTIONAL
"dst_tag": tag 名リスト ',' 区切り OPTIONAL
"src_addr": prefix リスト ',' 区切り OPTIONAL
"dst_addr": prefix リスト ',' 区切り OPTIONAL
"src_port": port range リスト OPTIONAL
"dst_port": port range リスト OPTIONAL
制約: 同種の tag と prefix を同一ルールに同時設定しない(src_tag + src_addr 不可、src_tag + dst_addr のような 異種混在は OK)1。
DashAclOrch の責務¶
APP_DB.DASH_PREFIX_TAG_TABLE と DASH_ACL_RULE_TABLE を購読し、タグ / ルールの CRUD と タグ → プレフィックス展開 を処理する1。
タグのライフサイクル¶
- add tag: 設定の妥当性検証 → 保存
- remove tag: ACL ルールから参照中なら 削除拒否 (retry)
flowchart LR
R[remove DASH_PREFIX_TAG_TABLE] --> C{rule に attached?}
C -->|yes| RT[retry / 削除保留]
C -->|no| D[タグ削除]
- update tag (prefix_list 変更): 影響を受けるルールが ENI に bind 済 group に属するなら「コピー → 新 group bind → 旧 group 削除」、未 bind なら in-place 更新1:
flowchart TD
U[DASH_PREFIX_TAG update] --> A[影響 ACL group 列挙]
A --> B{ENI に bind 済?}
B -->|yes| NG[新 group 作成 → rule コピー → ENI 再 bind → 旧削除]
B -->|no| INL[各 rule を in-place 更新]
ACL rule のライフサイクル¶
- create: 参照する全 tag が
DASH_PREFIX_TAG_TABLEに存在 → タグをプレフィックス列に展開して rule 作成。未存在 tag があればretryを返し延期 - remove / update: 所属 ACL group が ENI に bind 済なら エラー拒否。未 bind の group のみ変更可1
sequenceDiagram
participant App as controller
participant ADB as APP_DB
participant DAO as DashAclOrch
App->>ADB: DASH_PREFIX_TAG create
App->>ADB: DASH_ACL_RULE create (src_tag=...)
ADB->>DAO: notify
alt 全 tag 存在
DAO->>DAO: tag → prefix 展開 → rule 作成
else 未存在
DAO-->>ADB: retry
end
展開例¶
DASH_PREFIX_TAG_TABLE:Tag1 prefix_list = 1.1.1.0/24,1.1.2.0/24
DASH_PREFIX_TAG_TABLE:Tag2 prefix_list = 2.2.2.0/24
DASH_PREFIX_TAG_TABLE:Tag3 prefix_list = 3.3.3.0/24
DASH_ACL_RULE_TABLE:AclGroup1:AclRule1
src_addr = "Tag1,Tag2" # tag 参照
dst_addr = "Tag3"
# DashAclOrch 内部展開後:
# src_tag → 1.1.1.0/24,1.1.2.0/24,2.2.2.0/24
# dst_tag → 3.3.3.0/24
設定¶
| 種別 | 名前 | 説明 |
|---|---|---|
| APP_DB | DASH_PREFIX_TAG_TABLE |
tag 単位の prefix 集合 |
| APP_DB | DASH_ACL_RULE_TABLE |
src_tag / dst_tag を新たに受理 |
CLI / YANG 拡張・CONFIG_DB 変更は 無し。コントローラが APP_DB に直接書き込む設計1。
DASH_PREFIX_TAG_TABLE:Tag1 ip_version=ipv4 prefix_list=1.1.1.0/24,1.1.2.0/24
DASH_ACL_RULE_TABLE:AclGroup1:AclRule1
priority=1 action=allow terminating=false
src_addr="Tag1,Tag2" dst_addr="3.3.3.0/24"
制限事項¶
- Stage 1 は SAI 不使用。ASIC からはタグの存在は見えない
- warm / fast reboot 未サポート(DPU SONiC 自体が未対応)
- ENI bind 済 group のルール削除 / 更新は不可。タグ更新は group コピー方式
- 同種 tag と prefix の併用不可(
src_tag + src_addr等) - 未存在 tag 参照は retry 延期。controller は投入順序を意識
DASH_PREFIX_TAG_TABLEの scope(global / per-ENI) は Open Item
干渉する機能¶
DashAclOrch: 主体。tag 展開 + ENI bind 状態管理- DASH ENI 管理: bind/unbind 状態が tag update 時のフローを左右
- APP_DB スキーマ:
src_tag/dst_tagを消費する controller / CLI
トラブルシューティング¶
sonic-db-cli APPL_DB keys 'DASH_PREFIX_TAG_TABLE:*'
sonic-db-cli APPL_DB keys 'DASH_ACL_RULE_TABLE:*'
# DashAclOrch ログに retry が出ていないか
- rule が作成されない → 参照 tag が存在するか、syslog の retry を確認
- tag 削除不可 → 参照ルールを先に削除
- prefix_list 更新が反映されない → ENI bind 済なら新 group 再生成が走る。古い group が残っていないか
関連 Topics¶
- 13-dash-smartswitch/concept: DASH / SmartSwitch の全体像
- 07-acl-copp-mirror/concept: ACL と DASH ACL の置き場所