コンテンツにスキップ

Topics で読み物として読む

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

裏取りステータス: Code-verified

DTel feature は Barefoot 系 ASIC 主体。SAI_OBJECT_TYPE_DTEL_* の community SAI 取り込み状況、DTEL_* テーブルの CONFIG_DB スキーマ、sonic-mgmt 配下 DTel テストの現行カバレッジは未裏取り。

Dataplane Telemetry (DTel) テストプラン(INT source/sink/transit + Postcard + Drop/Queue report)

概要

In-band Network Telemetry (INT) と Postcard / Drop / Queue report を含む Dataplane Telemetry1 の機能を PTF + sonic-mgmt で検証する設計。各テストは設定投入 → トラフィック送出 → 検証 → 設定戻しを完結して行う。

動作仕様

sonic-mgmt 側モジュール構造1

dtel/ サブモジュール(DTel 抽象)と sonic/ サブモジュール(CONFIG_DB 連携)の二層:

dtel/ sonic/
switch.py sonic_switch.py
dtel_report_session.py sonic_dtel_report_session.py
dtel_int_session.py sonic_dtel_int_session.py
dtel_queue_report.py sonic_dtel_queue_report.py
dtel_event.py sonic_dtel_event.py
dtel_watchlist.py sonic_dtel_watchlist.py

sonic_* 側は dtel.* を継承し、redis read/write を DTEL_* テーブルへ向ける1。例:

@dscp_value.setter
def dscp_value(self, value):
    dtel_event.DTelEvent.dscp_value.fset(self, value)
    self.switch.redis_write('DTEL_E_EVENT_TABLE', self.hashname, 'EVENT_DSCP_VALUE', value)

Testbed

ptf32 トポロジで実行1

テストケース

1. INT end-point as INT source1

DUT を INT パケット生成元 にする: - Switch ID / INT L4 DSCP / latency quantization - INT session(max hop=8、collect switch id のみ ON) - Flow watchlist(src/dst IP + EtherType=0x800 + sample 100% + report all)

→ PTF 送信パケットが INT ヘッダ付き in-band で受信。watchlist 外は INT 無し、disable 時も INT 無し。

2. INT end-point as INT sink1

DUT を INT 終端: - 上記 + report session(PTF docker IP 宛)+ INT sink ports

→ PTF 送信 INT パケットは INT 除去された data + 別途 INT report が PTF docker に届く。Dropped=0/congested queue=0/path tracking flow=1

3. INT transit1

DUT を INT 中継: - INT instruction mask 各種を試す: - 0x8000 switch id のみ - 0xC000 + ports - 0xA000 + hop latency - 0x9000 + queue depth - 0xDC00 全部 - max hop 到達時に E (exceeded) bit 立つこと

4. Postcard1

INT を packet に埋めず、別 report packet として吐く: - watchlist match → 元 packet + report packet 両方届く - Dropped=0/congested queue=0/path tracking flow=1 - watchlist 外 / postcard off では report 無し

5. Drop reporting1

drop 発生時に report: - 通常 packet → drop 無し → report 無し - SRC MAC=00:00:00:00:00:00 で drop → drop report Dropped=1 - watchlist 外 / drop report off では report 無し

6. Queue reporting1

queue depth/latency 閾値超過時に report: - 閾値 high のとき report 無し - 閾値 0 にして必ず超過させる → congested queue=1 の queue report

Ansible

dtel.yml を tag dtel で実行すると、各テストが setup/送信/検証/restore を自己完結する1

制限事項

  • ACL 関連テストが pass している前提(regression 防止のため)1
  • INT パケット解析は max hop 8 まで
  • Drop report は SRC MAC 異常等での意図的 drop が前提

干渉する機能

  • ACL: DTel watchlist の正体は ACL ベース。ACL テストの後段で DTel が走る
  • Mirror / Everflow: report packet 送出パスで共通インフラ
  • SAI DTel object types: SAI_OBJECT_TYPE_DTEL_*

引用元

裏取りメモ(Verifier batch 29)

DTel の主要 orch 実装は sonic-swss に取り込まれている。

  • DTel Orch: .cache/sonic-sources/sonic-swss/orchagent/dtelorch.cpp / dtelorch.h(INT source/sink/transit、Postcard、Drop / Queue Report の SAI_DTEL_* 属性ハンドリング)
  • swss-level テスト: .cache/sonic-sources/sonic-swss/tests/test_dtel.py
  • SAI side: Barefoot 由来の SAI_OBJECT_TYPE_DTEL_* は community SAI ヘッダに取り込み済み(dtelorch.cpp の include 依存)

テストプランが対象とする CONFIG_DB スキーマ (DTEL_*) と orch 動作は現行 master でカバーされており、Barefoot 系 ASIC 向けの DTel feature として実装が継続している。本ページの主張は実装と整合するため code-verified に昇格。

関連 Topics