コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 08 章: QoS / Buffer / PFC を参照。

裏取りステータス: code-verified (2026-05-11)

Asymmetric PFC 本体機能の swss 取り込みを sonic-swss/orchagent/portsorch.cpp L2519-L2573 PortsOrch::setPortPfcAsym() で確認した(SAI_PORT_ATTR_PRIORITY_FLOW_CONTROL_MODESEPARATE / COMBINED を切り替える経路、CONFIG_DB.PORT.pfc_asym のパースは L5407-L5434)。本テストプランは機能 HLD ではなく テスト仕様であり、sonic-mgmt 配下のテストスクリプト一致は確認スコープ外(ローカル .cache に sonic-mgmt が含まれていないため)。

Asymmetric PFC テストプラン(PTF + sonic-mgmt fixtures)

概要

Asymmetric PFC は SONiC 機能だが、本ドキュメントはその 機能テスト計画 を扱う。既存の PTF テスト(sonic-mgmt/ansible/roles/test/files/saitests/pfc_asym.py)を再構成し、sonic-mgmt の pytest fixtures から呼び出して、SONiC DUT と Fanout 上の PFC パケットジェネレータ (pfc_gen.py) を組み合わせて検証する1

対象テストベッド: T0-x 系列(全 T0 構成)。SONiC DUT は RPC image が必須1

動作仕様

テスト構成

flowchart LR
  Fanout[Fanout switch<br>pfc_gen.py 動作] -->|PFC frames<br>大量送信| DUT[SONiC DUT]
  PTF[PTF host<br>pfc_asym.py] --> Fanout
  PTF -->|traffic + check| DUT

pfc_gen.py は Fanout 上で動かす PFC パケット送信器。pfc_asym.py (PTF) はトラフィック注入とドロップ/受け入れの確認を担当する1

既存 PTF コードのリファクタ

pfc_asym.py には以下の改修が必要1:

  1. 送信速度向上: threading.Threadmultiprocessing.Process に置換(GIL 回避)。L83 周辺。
  2. ARP responder 設定生成の冗長削除: L56 のループで毎回ファイル生成しているのを 1 回だけにする。

新規 pytest test suite

tests/pfc_asym/pfc_asym.py を新規追加1。グローバル定数:

PFC_GEN_FILE      = "pfc_gen.py"
PFC_FRAMES_NUMBER = 1000000   # 送信 pause frame 数
PFC_QUEUE_INDEX   = 0xff      # 非ゼロ pause time を載せる priority マスク

Pytest fixtures

Fixture 役割
deploy_pfc_gen (scope=module, autouse) pfc_gen.py を Fanout に配備
setup DUT と Fanout の前処理
pfc_storm_template PFC ストーム用テンプレ生成
pfc_storm_runner PFC ストーム実行
enable_pfc_asym DUT で Asymmetric PFC を有効化
flush_neighbors テスト間で ARP/ND テーブルクリア

pfc_gen.py の Fanout 配備

プラットフォームごとに配備手順が違う1:

Mellanox

Fanout デプロイ ansible playbook (fanout.yml) の pfcwd_config タグに含まれており、自動配備される。

ansible-playbook -i lab fanout.yml -l ${FANOUT} --become --tags pfcwd_config -vvvv

Arista

手動コピーが必要1:

  1. /mnt/flash/ がなければ作成
  2. pfc_gen.py/mnt/flash/pfc_gen.py に配置

新プラットフォーム追加

新たな Fanout SKU 対応では roles/test/files/helpers/pfc_gen.py の配置パスとデプロイ手順を deploy_pfc_gen fixture に追加する1

📋 検証エビデンス: sonic-net/SONiC/doc/pfc_asym/PFC_Asymmetric_Test_HLD.md#L96-L120 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

出典:

sonic-net/SONiC/doc/pfc_asym/PFC_Asymmetric_Test_HLD.md#L96-L120 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

抜粋:

deploy_pfc_gen (scope="module", autouse=True)
To simulate that neighbors are overloaded (send many PFC frames) there is used PFC packets generator which is running on Fanout switch.
File location - roles/test/files/helpers/pfc_gen.py

判断根拠: pfc_gen.py の役割と配備 fixture の根拠。

PTF テストケース実行

tests/ptf_runner.py モジュールを使って既存 PTF テストケースをラップする1

設定

関連する CONFIG_DB / CLI / YANG

該当なし(テスト計画文書)。

設定例(テスト実行)

# sonic-mgmt 側
cd sonic-mgmt/tests
pytest pfc_asym/pfc_asym.py --topology=t0

具体的な引数は sonic-mgmt の標準 testbed パラメタに従う。

制限事項

  • T0 トポロジ専用: HLD は T0-x 系列を対象としており、T1 等の他トポロジは別途検討が必要1
  • RPC image 必須: 通常リリースイメージでは動作しない1
  • Fanout 構成依存: Mellanox / Arista それぞれの Fanout で pfc_gen.py 配備手順が違う。新ベンダ Fanout では拡張作業が必要。

干渉する機能

  • PFC watchdog: 同じ PFC ストームで誤発火する可能性。テスト中は PFC-WD を無効化または計算外にする想定。
  • PFC Asymmetric 機能本体: 機能 HLD は別文書(PFC-Asymmetric.md など)で扱われる。本ページはそのテスト計画。
  • ARP responder: PTF テスト中の ARP 応答に依存。flush_neighbors fixture で各テストケース前にリセット。

トラブルシューティング

  • ストーム送信レートが期待値に届かない: multiprocessing 化が反映されているか、Fanout 側 CPU の制約を確認1
  • pfc_gen.py が Fanout で見つからない: deploy_pfc_gen fixture のプラットフォーム別ロジック、対象 Fanout の OS / パスを確認。
  • ARP responder の応答が無い: 設定ファイルの 1 回生成パッチが当たっているか、ARP responder プロセスのログを確認。

確認コマンド例:

# Asymmetric PFC mode と PFC カウンタを確認
show pfc asymmetric
redis-cli -n 4 hget 'PORT|Ethernet0' pfc_asym
pfcstat
docker exec swss supervisorctl status | grep orchagent

裏取り済み実装位置 (2026-05-11)

  • Asymmetric PFC mode set: sonic-swss/orchagent/portsorch.cpp L2519-L2573 setPortPfcAsym()SAI_PORT_ATTR_PRIORITY_FLOW_CONTROL_MODESEPARATE/COMBINEDSAI に書き込む)
  • CONFIG_DB.PORT.pfc_asym パース&適用: 同 portsorch.cpp L5407-L5434(mode の妥当性チェックと setPortPfcAsym() 呼び出し、unsupported 時のスキップログ)
  • 初期 attribute セット: 同 portsorch.cpp L1347-L1361(SAI_PORT_ATTR_PRIORITY_FLOW_CONTROL への XOFF 値書き込み)
  • Port 構造体: sonic-swss/orchagent/port/portcnt.h L89 pfc_asym メンバ

sonic-mgmt ツリーは本ローカルキャッシュにクローンされていないため、テストスクリプト本体の一致確認は別バッチで実施する。

引用元

関連 Topics


  1. sonic-net/SONiC doc/pfc_asym/PFC_Asymmetric_Test_HLD.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06