Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 21 章: Lab / SONiC-VS / 開発者 を参照。
裏取りステータス: discrepancy-found(pytest 移行)
HLD で提案されている独立 PTF スクリプト ansible/roles/test/files/ptftests/dip_sip.py は 既に削除済。代わりに sonic-mgmt/tests/ipfwd/test_dip_sip.py (pytest) に移行されており、ansible/roles/test/tasks/dip_sip.yml は pytest_runner.yml を呼ぶラッパに縮約されている (114 byte)。vars/testcases.yml は実在 (11721 byte)。HLD のテスト本体記述は 現行コードと構造が異なる ため、test_dip_sip.py 側の最新仕様に追従する必要あり。
DIP=SIP PTF 検証テスト¶
章分割済み
本ページは大型 HLD の 概要ハブ として保持。詳細は以下の派生ページを参照:
- dip-sip-ptf-validation-high-level-design-concepts.md — テストの目的・トポロジ・対応 testbed
- dip-sip-ptf-validation-high-level-design-operations.md — ファイル構成 / 前処理 / 実行コマンド
- dip-sip-ptf-validation-high-level-design-internals.md — パケット仕様 / パラメータ / 判定
- dip-sip-ptf-validation-high-level-design-limitations.md — 制限事項と HLD-実装乖離(pytest 移行)
概要¶
「DIP(destination IP)と SIP(source IP)が同じ」L3 パケットを SONiC スイッチが正しくルーティングできるかを PTF (Packet Test Framework) で検証 するテストの設計。一見奇妙な条件だが、ループバック検証や特定の DOS 系トラフィック形状への耐性、ハードウェアパスでの ACL / RPF が誤作動しないかを担保する目的で必要となる1。
このページは機能 HLD ではなく テストインフラの HLD。SONiC 自体の挙動仕様というより、sonic-mgmt リポジトリにどんな Ansible role / PTF スクリプトを置くか の設計が記述されている1。
動作仕様¶
トポロジ¶
DUT に対して SRC RIF / DST RIF の 2 つの router interface を立て、それぞれの先に Source / Destination ホスト VM をぶら下げる単純な構成1:
flowchart LR
SRC[SRC HOST VM] --- SRIF[SRC RIF]
DST[DST HOST VM] --- DRIF[DST RIF]
SRIF --- DUT
DRIF --- DUT
RIF は PORT または LAG のいずれにも対応する1。host は VM でエミュレートする。
対応 testbed¶
dip_sip.yml のサポート topology1:
t0,t0-16,t0-56,t0-64,t0-64-32,t0-116t1,t1-lag,t1-64-lag
router が複数メンバ(LAG など)を持つ場合は すべてのメンバ index を算出 する必要があるため、Ansible の前処理段階で minigraph / LLDP を見て port index 配列を作る1。
ファイル構成¶
sonic-mgmt 配下の配置1:
sonic-mgmt/ansible/
roles/test/
files/ptftests/dip_sip.py # PTF コア
tasks/dip_sip.yml # 前処理 + 実行
vars/testcases.yml # testcase エントリ定義
役割1:
| ファイル | 役割 |
|---|---|
testcases.yml |
testcase のエントリポイント定義 |
dip_sip.yml |
アーティファクト収集と前処理。topology に応じた MAC / IPv4 / IPv6 / port indices の収集と PTF 起動 |
dip_sip.py |
PTF コアロジック。UDP パケットの組立て・送受信 |
dip_sip.yml の前処理ワークフロー¶
flowchart TD
A[Gather minigraph info] --> B[Gather LLDP info]
B --> C[Get DST/SRC host MAC]
C --> D[Get DST/SRC router MAC/IPv4/IPv6]
D --> E[Get DST/SRC port indices PTF番号]
E --> F[Run PTF test dip_sip.py]
router type が LAG 等で複数 member を持つ場合は、E で 配列 として port index を集める1。
dip_sip.py のパラメータ¶
PTF テスト本体に渡す引数1:
| Parameter | 説明 |
|---|---|
testbed_type |
Testbed 種別 |
dst_host_mac / src_host_mac |
host 側 MAC |
dst_router_mac / src_router_mac |
DUT 側 RIF MAC |
dst_router_ipv4 / src_router_ipv4 |
DUT RIF IPv4 |
dst_router_ipv6 / src_router_ipv6 |
DUT RIF IPv6 |
dst_port_ids / src_port_ids |
PTF port index の配列(複数 member 用) |
テストパケット仕様¶
PTF は 送信パケット (data) と 期待パケット (expected) を生成し、source port から data を送って destination port のいずれかで expected が受かることを確認する1。
既定値とアドレス計算1:
pkt_ttl_hlim = 64
dst_host_ipv4/ipv6 = <dst_router_ipv4/ipv6> + 1
src_host_ipv4/ipv6 = <src_router_ipv4/ipv6> + 1
Data packet — DUT に届く時点でのフィールド1:
| フィールド | 値 |
|---|---|
| DST_MAC | <src_router_mac> |
| SRC_MAC | <src_host_mac> |
| DST_IP | <dst_host_ipv4_ipv6> |
| SRC_IP | <dst_host_ipv4_ipv6> ← ここが本テストの主眼 |
| TTL/HL | <pkt_ttl_hlim>(既定 64) |
Expected packet — destination 側で観測される値1:
| フィールド | 値 |
|---|---|
| DST_MAC | <dst_host_mac> |
| SRC_MAC | <dst_router_mac> |
| DST_IP | <dst_host_ipv4_ipv6> |
| SRC_IP | <dst_host_ipv4_ipv6> |
| TTL/HL | <pkt_ttl_hlim> − 1 |
DUT が L3 ルーティング していれば MAC は書き換わり、TTL/HL は 1 減って受信される。SRC_IP = DST_IP のままでもパケットがドロップされず到達することが「pass」の判定1。
📋 検証エビデンス: sonic-net/SONiC/doc/dip-sip/DIP=SIP_HLD.md#L120-L143 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/dip-sip/DIP=SIP_HLD.md#L120-L143 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Default values:
* pkt_ttl_hlim=64
Values:
* dst_host_ipv4_ipv6=<dst_router_ipv4_ipv6>+1
* src_host_ipv4_ipv6=<src_router_ipv4_ipv6>+1
Data packet:
* DST_IPv4_IPv6=<dst_host_ipv4_ipv6>
* SRC_IPv4_IPv6=<dst_host_ipv4_ipv6>
Expected packet:
* TTL_HL=<pkt_ttl_hlim>-1
判断根拠: テストの判定ロジック(DIP=SIP のままルーティングされ TTL が 1 減る)の根拠。
判定¶
期待パケットが destination port のいずれかで観測されれば pass、それ以外は fail。fail 時は expected / received のパケットダンプを含むエラーメッセージ が出力される1。
設定¶
関連する CONFIG_DB¶
該当エントリは無い。本機能は テストインフラ であり DUT 側の設定変更は伴わない(既存の RIF を使うのみ)。
関連する CLI¶
該当 CLI は無い。実行は Ansible から行う1:
sudo -H ansible-playbook test_sonic.yml -i inventory \
--limit arc-switch1025-t0 \
-e testbed_name=arc-switch1025-t0 \
-e testbed_type=t0 \
-e testcase_name=dip_sip -vvvvv
ログ出力は /tmp/dip_sip.DipSipTest.<timestamp>.log1。
制限事項¶
- 対応 topology が固定リスト:
t0系とt1系の特定型のみ。それ以外の topology ではdip_sip.ymlの前処理が想定外で動かない可能性がある1。 - RIF 種別が PORT / LAG のみ: VLAN RIF など他の RIF 種は HLD で言及されていない1。
- テスト対象は L3 ルーティングの可否のみ: ACL / RPF / uRPF など個別機能との相互作用までは本テストでカバーしない。「ルーティングが成立すること」が単一の合否条件1。
干渉する機能¶
- uRPF (Unicast Reverse Path Forwarding): DIP=SIP の本テストは uRPF が strict mode で有効化されていると pass しない可能性 がある(SRC_IP が自分宛と等価のため)。HLD は uRPF 設定との相互作用には触れていないが、テスト時は確認が必要。
- ACL: SRC_IP / DST_IP 同一を deny する ACL を設定していると、本テストは fail する。テスト前提の ACL 構成については HLD 内に記述がない。
- VM ベースの host エミュレーション: PTF docker / VM の準備は本 HLD のスコープ外。
sonic-mgmtの標準 testbed 構築フローに依存する。
トラブルシューティング¶
- テストが fail する: ログ
/tmp/dip_sip.DipSipTest.<ts>.logの expected / received ダンプを比較1。MAC が書き換わっていなければ L3 ルーティングが起きていない(L2 で落ちている可能性)。 - TTL が想定と違う: TTL/HL が 1 減っていない場合、DUT 側で L3 forwarding せず L2 で抜けている可能性。
- port index 不一致:
dst_port_ids/src_port_idsの配列が空、または PTF port 番号と DUT 側の物理 port のマッピングがズレている。dip_sip.ymlの前処理ログ(minigraph / LLDP gather)を確認。
HLD と実装の差分
2026-05 時点でテスト実体は PTF スタンドアロンから pytest 配下へ移行済み で、HLD の記述(ansible + ptftests)はファイル配置レベルで古い。
1. どこで乖離が確認されたか¶
- 現行の本体は
sonic-mgmt/tests/ipfwd/test_dip_sip.py(pytest 形式)。HLD が指す旧来のansible/roles/test/files/ptftests/dip_sip.pyは 削除済み(GitHub 検索でヒット 0)。 sonic-mgmt/ansible/roles/test/tasks/dip_sip.ymlは 114 バイトのラッパに縮退しており、中身はinclude_tasks: roles/test/tasks/pytest_runner.yml+test_node: ipfwd/test_dip_sip.pyのみ。HLD が描写した「前処理 → ptf_runner でdip_sip.DipSipTestを起動」という直接呼び出し構造は残っていない。- 一方で
sonic-mgmt/ansible/roles/test/vars/testcases.yml(11721 B)は実在し、testbed / topology 定義は HLD 当時から大きく変わっていない。
2. HLD と実装の差分の中身¶
HLD 当時の構造:
現行:
すなわち テストロジック本体は pytest 側に移植され、ansible は単に pytest 起動を仲介するだけ になった。テストの意味論(DIP=SIP パケットが転送される / TTL が 1 減る / 期待ポートから出る)は HLD と同じだが、起動ファイル名・配置・前処理の責務が違う。
3. 読者への影響¶
- HLD の
dip_sip.pyを探しても見つからない。tests/ipfwd/test_dip_sip.pyを直接読まないと現行の挙動が分からない。 - ログ出力先・テスト名(
DipSipTestクラス → pytest case 名)が変わっており、過去のトラシュー手順「/tmp/dip_sip.DipSipTest.<ts>.logを grep」も pytest 化以降はpytest --log-file/logs/配下を見るのが正解。 - 新しい topology 追加時の編集箇所も
vars/testcases.ymlではなく pytest 側の fixture / pytestmark の場合がある。
4. 回避策 / 対応方法¶
- テストを走らせる: 旧 ansible 直叩き
ansible-playbook ... -e 'testcase_name=dip_sip'は そのまま動く(ラッパが pytest を呼ぶため)。HLD の旧手順を保ったまま実行可能。 - テストを読み解く: 本体ロジックは
sonic-mgmt/tests/ipfwd/test_dip_sip.pyをgrep -nで参照する。クラス名 / log 名のドキュメント不一致は本ページの記述ではなくコード側を真として扱う。 - 新規 topology / RIF を追加する: pytest 側の parametrize / fixture を編集し、必要なら
dip_sip.ymlのtest_node指定とは別経路でpytestmarkの設定を変える。
監査 round 2 追補(2026-05-11)¶
監査 round 2 で再裏取りした結果と、運用者向けの追加情報を補強する。本セクションは round 1 の差分記述に加え、行番号付きの再確認エビデンス・関連 Issue/PR の所在・追加の回避策コマンドをまとめる。
- 旧 PTF スクリプト
ansible/roles/test/files/ptftests/dip_sip.pyは GitHubsonic-net/sonic-mgmtmaster でヒット 0(削除確定)。 - 現行本体
tests/ipfwd/test_dip_sip.pyは pytest 形式で、DipSipTest同等のテストが pytest case にリファクタされている。 ansible/roles/test/tasks/dip_sip.yml(114 B) は pytest_runner ラッパに縮退。HLD の前処理/後処理ステップは pytest fixture (tests/common/fixtures/duthosts.py等) に移行。- 関連 PR:
sonic-mgmtにおける ansible→pytest 移行は 2021-2023 年に複数 PR で段階実施済み(特定 PR ID は HLD では未参照)。 - 追加実行コマンド: 現行で走らせる場合 —
cd sonic-mgmt/tests && pytest ipfwd/test_dip_sip.py --topology=t0 --testbed=<tb>。旧ansible-playbook ... -e testcase_name=dip_sip経路もラッパ越しに動作する。
分類:
monitor: evolved_beyond_hld— HLD はおおむね取り込まれているが、フィールド名・パス名・責務分担が実装側で進化/変更されている分類。実装側を正として読み替える必要がある。
関連 GitHub Issue / PR¶
- [GitHub Issue / PR の関連リンクは未確認] — DIP=SIP ドロップ自体は SAI / プラットフォーム側で常時有効な挙動であり、HLD は PTF テスト追加のみが眼目。
sonic-mgmt側で対応する PTF テストは命名規則上の独立 PR で取り込まれた可能性が高いが、HLD と紐づく明示的 Issue / PR は確認できず。
コマンド例: DIP/SIP PTF 検証の確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# PTF テスト走行ログとシグネチャ照合
sudo journalctl -u ptf -n 200 --no-pager
# 該当インタフェースで受信したパケットを ringbuffer dump
sudo tcpdump -nei Ethernet0 -c 30 -w /tmp/dipsip.pcap
確認コマンド¶
# PTF テストイメージとトポロジ
ls .cache/sonic-sources/sonic-mgmt/ansible/group_vars/ | head
docker images | grep -i ptf
# PTF runner の起動例 (sonic-mgmt 配下)
cd .cache/sonic-sources/sonic-mgmt/tests && \
pytest --inventory=../ansible/veos --testbed=vms-kvm-t0 --testbed_file=../ansible/testbed.yaml \
dip_sip/test_dip_sip.py --collect-only
# DUT 側 ACL / mirror セッション (DIP/SIP 検査が依存する場合)
show acl table
show mirror_session
トラブルシュート¶
- PTF テスト失敗時はまず
--log-cli-level=DEBUGで再実行し、注入パケットと受信パケットの diff を確認する。 - VS テストベッド (KVM) と物理テストベッドで挙動が異なる場合があるため、まず KVM で再現するか確認してから物理機を疑う。
- DIP/SIP 検査機能自体が NPU 依存で実装されていない platform では skip / xfail マーク扱い。
pytest --collect-onlyでテスト適用範囲を事前確認。
引用元¶
このページを読んだ後の次アクション¶
読み手向け
- 本機能を実運用で使う場合: 実装は存在するが本 HLD の記述と乖離。最新 master の動作を別途確認した上で適用する
- upstream 動向を追う場合: 関連 issue / PR を sonic-net/SONiC で検索(HLD タイトル / CONFIG_DB テーブル名 / Orch クラス名で grep するのが速い)
- 代替手段 / 関連 reference:
本ドキュメントの追跡
- monitor:
evolved_beyond_hld/ last_verified:2026-05-11 - 次回再裏取りトリガ: quarterly。一覧は discrepancy-index を参照(運用詳細は repo の
meta/discrepancy-operations.md)