コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 10 章: gNMI / OpenConfig / 管理プレーン を参照。

裏取りステータス: Code-verified(SONiC 共通基盤)

copporchgenetlink_name / genetlink_mcgrp_name フィールドと createGenetlinkHostIf()portsorchAPP_SEND_TO_INGRESS_PORT_TABLE_NAME 登録と addSendToIngressHostIf()copp_cfg.j2queue2_group1genetlink_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 に任せる送信モード)

通常 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 つ)

1

  1. 経路判定: punt パケット header の識別子で netdev か genetlink か振り分け。knet_filter_cbGENL_PACKET_NAME を分岐:

    if (strncmp(kf->desc, GENL_PACKET_NAME, ...) == 0)
        return generic_filter_cb(...);
    
  2. メタデータ正規化: ベンダ固有 (unit / port) を ifindex 等の汎用表現に変換(sFlow 実装の流用想定)。

  3. 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_DBSEND_TO_INGRESS_PORT:

{"SEND_TO_INGRESS_PORT": {"send_to_ingress": {}}}

PortsOrch がこれを購読し、SAI create_hostifCPU 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 コントローラ経由で操作する。

設定例

// /etc/sonic/config_db.json 抜粋
{"SEND_TO_INGRESS_PORT": {"send_to_ingress": {}}}

制限事項

  • ベンダ 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

  1. sonic-net/SONiC doc/pins/Packet_io.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06