Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 10 章: gNMI / OpenConfig / 管理プレーン を参照。
裏取りステータス: Code-verified(SONiC 共通基盤)
copporch の genetlink_name / genetlink_mcgrp_name フィールドと createGenetlinkHostIf()、portsorch の APP_SEND_TO_INGRESS_PORT_TABLE_NAME 登録と addSendToIngressHostIf()、copp_cfg.j2 の queue2_group1 に genetlink_mcgrp_name: "packets" / genetlink_name: "psample" を確認。kernel genl_packet filter のベンダ側実装はリポジトリ外でスコープ外 (verified at: 2026-05-09)。
P4Runtime PacketIO¶
読み手が知りたいこと¶
- 通常の netdev PacketIO で何が足りなくて、なぜ別経路が必要なのか
- 受信側で input port + 期待 egress port メタデータをどう運ぶか
send_to_ingressとは何で、どこで設定するか- ベンダ ASIC ドライバに何を実装してもらう必要があるか
なぜ PacketIO に拡張が要るか¶
通常 netdev では すべての punt パケット が同じ経路に来てしまい、メタデータも input port のみ。P4Runtime(PINS / SDN コントローラ)は次が必要1:
- Receive: controller が install した punt flow にマッチする 専用チャネル、input port + target egress port のメタデータ付き
- Transmit: 任意 port への directed transmit、および
send_to_ingress(ASIC pipeline 再注入で egress 選択を ASIC に任せる送信モード)
Receive 側設計(generic netlink + user-defined trap)¶
通常 netdev とは別に SAI_HOSTIF_TYPE_GENETLINK 型 hostif を作り、user-defined trap を HOSTIF_TABLE_ENTRY で bind する1。
| SAI 属性 | 用途 |
|---|---|
SAI_HOSTIF_TYPE_GENETLINK |
generic netlink hostif |
SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME |
listen する multicast group 名 |
sFlow / psample と同じ仕組みを流用。
sequenceDiagram
participant P4 as P4Runtime
participant CO as CoppOrch
participant SAI
participant KDR as kernel driver
P4->>CO: punt flow install (user-defined trap)
CO->>SAI: create_hostif (GENETLINK)
CO->>SAI: hostif_table_entry: trap → hostif
KDR->>KDR: header tag を判定
alt tag == user-defined
KDR->>P4: genetlink multicast (metadata 付き)
else
KDR->>KDR: 既存 netdev へ
end
CoppOrch は CPU queue ごとの新 trap group を処理し、ACL entry 単位で trap を作る1。
ベンダ kernel driver の責務(3 つ)¶
-
経路判定: punt パケット header の識別子で netdev か genetlink か振り分け。
knet_filter_cbでGENL_PACKET_NAMEを分岐: -
メタデータ正規化: ベンダ固有 (unit / port) を
ifindex等の汎用表現に変換(sFlow 実装の流用想定)。 - generic netlink で送出:
ingress_ifindex/egress_ifindexをパックし multicast socket へ。
Transmit 側設計¶
Directed transmit¶
特別な変更不要。P4Runtime が init 時に各 netdev port socket を作り write()1。
send_to_ingress¶
CPU port に紐づく新 netdev port を作り、そこに書いたパケットを ASIC pipeline の入口 に再注入する1:
graph LR
P4[P4Runtime] -->|write socket| NDV[send_to_ingress netdev]
NDV --> CPU["CPU port (ASIC)"]
CPU --> PIPE[forwarding pipeline]
PIPE --> EGR[egress port 自動選択]
設定は CONFIG_DB の SEND_TO_INGRESS_PORT:
PortsOrch がこれを購読し、SAI create_hostif を CPU port に対して 呼ぶ(netdev type hostif を CPU port に紐づける)1。
ベンダ Transmit 拡張¶
通常 SAI hostif (netdev) は physical port / VLAN / LAG にのみ作成可能。CPU port 用に作れるようベンダ SAI の拡張が必要1。CPU port ingress を ASIC が forward するベンダ固有設定もセットで要る。
設定¶
CONFIG_DB¶
| Table | Key | フィールド | 説明 |
|---|---|---|---|
SEND_TO_INGRESS_PORT |
send_to_ingress |
(空) | CPU port を ingress として使う netdev port を作る |
SAI¶
| 機能 | 利用 |
|---|---|
SAI_HOSTIF_TYPE_GENETLINK |
Receive チャネル |
SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME |
multicast group 名 |
create_hostif (CPU port) |
send_to_ingress netdev(ベンダ拡張) |
CLI¶
本 HLD は CLI 拡張を伴わない1。P4Runtime / PINS コントローラ経由で操作する。
設定例¶
制限事項¶
- ベンダ kernel driver の対応必須。
generic_filter_cbが無い ASIC では receive metadata が出ない1 - send_to_ingress は SAI hostif の CPU port 対応 が前提
- P4Runtime / PINS スタック前提、汎用 SDN 用途ではない
SEND_TO_INGRESS_PORTの table 名 / フィールドが固定- punt パケットへのメタデータ付与は ベンダ独自 packet header tag に依存(標準フォーマット未定)
干渉する機能¶
- CoppOrch: user-defined trap + genetlink hostif 生成主体
- PortsOrch:
SEND_TO_INGRESS_PORT処理 + CPU port netdev 作成 - 既存 sFlow /
psample: genetlink 仕様を共有 - ベンダ ASIC SDK / kernel driver: receive 経路と CPU port ingress を実装
- 既存 CoPP (
copp_cfg.j2): trap group / queue マッピングの拡張
トラブルシューティング¶
- punt が genetlink に出ない → kernel driver filter 登録、user-defined trap の SAI 作成を
dmesgで確認 - send_to_ingress から forward されない → ベンダ SAI の CPU port ingress 対応、
ip linkで netdev 確認 - メタデータ ifindex が 0 → kernel driver の metadata 抽出未実装の可能性
- 通常 netdev と重複受信 → trap → hostif マッピング適用確認
確認コマンド例:
# Host-CPU packet I/O / send-to-ingress 確認
ip -s -s link show eth0
redis-cli -n 4 hgetall 'HOST_INTERFACE|<name>'
docker logs swss 2>&1 | grep -i 'hostif' | tail
引用元¶
関連ページ¶
関連 Topics¶
運用入口¶
この HLD に対応する運用面の入口(CLI / CONFIG_DB / YANG / Runbook)を以下にまとめる。
関連 CONFIG_DB¶
SEND_TO_INGRESS_PORT