Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SONiCにて使用されているSAIの実際

 SONiCにて使用されているSAIの実際

SONiCにて使用されているSAIの実際
APRESIA Systems株式会社
桑田斉

SONiC Workshop Japan 2025
https://sonic.connpass.com/event/345182/

Tweet

More Decks by SONiC Users Group Japan

Other Decks in Technology

Transcript

  1. 2 SONiC Workshop 2025 ◆所属 ◊APRESIA Systems株式会社 技術開発本部 開発第三部 ◆経歴

    ◊2003年 日立電線株式会社に入社 − 日立電線株式会社のNW事業が合併を経て、2016年にAPRESIA Systems 株式会社として独立 ◊入社以降、自社ブランドスイッチのAPRESIAシリーズのソフト ウェア開発に従事 ◊2018年にホワイトボックススイッチの台湾ベンダであるEdgecore 社のプレミアムディストリビューターになったことから、ホワイト ボックススイッチ関連の活動に従事 【自己紹介】 桑田 斉 (くわた ひとし)
  2. 3 SONiC Workshop 2025 イベント プレゼン 2019年 JANOG44 OSSなWhitebox用NOSのSONiCが商用で使われている理由を考える 2020年

    JANOG46 SONiC + P4によるマルチテナントSRv6サービスチェイニングの実現 … 2024年 日本P4ユーザ会 SONiC DASH アップデート 2024年 SONiC Workshop GNS3上でコミュニティSONiCの仮想マシンを動かす小ネタ集 2024年 OCP Global Summit Experience of SONiC Commercial Deployment and Operation in Japan 過去のSONiC関連プレゼン OCP Global Summit 2024にて、日本のSONiC事例を紹介
  3. 4 SONiC Workshop 2025 ◆本資料の目的 ◊SONiCのSAIの理解を深めること − SAI (Switch Abstraction

    Interface) とは、SONiC内部で、ス イッチデバイスの差分を隠蔽するために定義されたインタフェース ◆先に結論 ◊SONiCのSAIは、C/C++にて利用可能なSONiCデバイス 制御ソフトウェア(ライブラリ)のAPI ◊SAI内部では、各種設定はオブジェクトとして保存 − SAIオブジェクト間でお互いのリンクを保持することで設定間の依存 関係をプログラミング可能 ◊SAIはデバイスの設定を行うためのインタフェースであって、 データプレーン(パケットの中継処理)の動作をプログラミン グするものではない 概要 SONiC ホワイトボックススイッチ デバイス Linux (OS) RedisDB Syncd デバイス制御ソフト SAI SONiCアプリ(コンテナ)
  4. 5 SONiC Workshop 2025 ◆SAIの管理団体 ◊SAIはOCP(Open Compute Project)のネットワークプロジェクトにて定義 − https://www.opencompute.org/projects/sai

    − SONiCは現在はLinux Foundationに所属(もともとはOCPのネットワークプロジェクト) ◆SAIの情報ソース ◊githubにて、ドキュメントとC/C++のAPI定義(ヘッダファイル)が公開されている − https://github.com/opencomputeproject/SAI − SAIの下のデバイス制御ソフトは各スイッチベンダが開発しているものであり、ソースコードは公開されてい ないことが多い(代わりに、ビルド済のバイナリを公開) ◆SAIの対象範囲 ◊当初はイーサネットスイッチが対象 ◊最近はDASH(Disaggregated APIs for SONiC Hosts)プロジェクトによって、サーバの NPU/DPUの制御もSAIの対象に − https://github.com/sonic-net/DASH SAIの概要
  5. 6 SONiC Workshop 2025 ◆SAIのヘッダ定義 ◊ https://github.com/opencomputeproject/SAI/blob /master/inc/sai.h ◊ C/C++で使用可能なヘッダファイル

    ◊ sai.hから、各機能のヘッダファイルをインクルード SAIのAPI定義 ◆各機能のSAIの定義(例:saivlan.h) ◊ https://github.com/opencomputeproject/SAI/blob /master/inc/saivlan.h ◊ 上位のアプリから実行可能なAPIを定義 SAIオブジェクトの操作API (例:VLAN)
  6. 7 SONiC Workshop 2025 ◆SAI APIのプログラミング ◊sai_api_queryにて設定対象のAPIを取得 ◊以降は、取得したAPI (createやremoveなど)を実行 SAIのAPIを実行するプログラムのイメージ

    SAI+デバイスの初期化 SwitchのSAI APIを取得 Switchオブジェクトを生成する ためのパラメータを設定 create_switch()のAPIを実行 sai_api_initialize(); sai_api_query(SAI_API_SWITCH, (void**)&sai_api.sw); attr[].id = SAI_SWITCH_ATTR_INIT_SWITCH; attr[].value.booldata = true; attr[].id = SAI_SWITCH_ATTR_SRC_MAC_ADDRESS; _macaddr2bytes("02:dd:00:11:22:33", (uint8_t *)&attr[].value.mac); sai_api.sw->create_switch(&gSwitchId,,attr); 説明のため簡素化しています(プログラムとしては正確ではありません)
  7. 8 SONiC Workshop 2025 ◆SAI内部では情報はオブジェクトとして存在し、以下の4つの操作(CRUD) が可能(一部はbulkによる一括処理も可能) ◊create: SAIオブジェクトの新規作成 ◊remove: SAIオブジェクトを消去

    ◊set: 既に存在するSAIオブジェクトのパラメータを変更 ◊get: 既に存在するSAIオブジェクトの情報を取得 ◆SAIオブジェクト間のリンク ◊SAIオブジェクトは生成された際にユニークIDとしてOIDを保持 ◊SAIオブジェクトのパラメータにて、他SAIオブジェクトのID(OID)を保存することで、SAI オブジェクト間の参照関係を定義可能 SAIプログラミングのルール SAIオブジェクトA OID: A 参照パラメータX: OID B SAIオブジェクトB OID: B 参照
  8. 9 SONiC Workshop 2025 EVPN/VXLAN SAIオブジェクトの例:VXLANネットワーク ◆Community SONiC 202405 ブランチの仮想マシンで実験

    Spine1 Spine2 Leaf1 Leaf2 VTEP: 1.1.1.1 VTEP: 1.1.1.2 VLAN 101 10.0.10.1/24 VLAN 102 10.0.20.1/24 Host1 10.0.10.11/24 Host2 10.0.20.11/24 Host2宛の通信 VXLANフレーム Host1とHost2間 にて通信している 状態でSAIを確認
  9. 10 SONiC Workshop 2025 ◆Leaf1のルーティング情報(FRRoutingが保持)の確認 SAIオブジェクトの例:VXLANネットワーク leaf01# show ip route

    vrf Vrf1 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued, r - rejected, b - backup t - trapped, o - offload failure VRF Vrf1: C>* 10.0.10.0/24 is directly connected, Vlan101, 02:08:49 B>* 10.0.20.11/32 [20/0] via 1.1.1.2, Vlan4001 onlink, weight 1, 00:01:27 leaf01# Host2のIPアドレス 10.0.20.11のルート情報が登録されている (宛先はLeaf2のVTEP 1.1.1.2)
  10. 11 SONiC Workshop 2025 SAIオブジェクトの例:VXLANネットワーク Spine1 Leaf1 VTEP1 1.1.1.1 VLAN

    101 10.0.10.1/24 Host1 10.0.10.11/24 Host2宛の通信 VXLANフレーム Host1とHost2間にて通信 している状態でSAIを確認 Spine2 Leaf2 VTEP2 1.1.1.2 VLAN 101 10.0.20.1/24 Host2 10.0.20.11/24 Ether Dst MAC Leaf1 Src MAC Host1 IP Dst IP Host2 Src IP Host1 Ether Dst MAC Spine1/Spine2 Src MAC Leaf1 IP Dst IP VTEP2 Src IP VTEP1 VXLAN VNI L3VNI Ether Dst MAC VTEP2 Src MAC VTEP1 IP Dst IP Host2 Src IP Host1 VXLANカプセル化 (Symmetric IRB) データプレーンでは、Dst IPをKeyに して、VXLANカプセル化を実行 書き換わるデータ ⇒ デバイスに設定されるデータ ⇒ SAIにて登録されるデータ
  11. 12 SONiC Workshop 2025 ◆Leaf1のSAIオブジェクトのダンプの取得コマンド ◊sonic-db-dump -n ASIC_DB SAIオブジェクトの例:VXLAN {

    "ASIC_STATE:SAI_OBJECT_TYPE_SCHEDULER_GROUP:oid:0x17000000000394": { "type": "hash", "value": { "NULL": "NULL" }, "ttl": -0.001, "expireat": 1745051041.660418 }, "ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x150000000000f8": { "type": "hash", "value": { "NULL": "NULL", "SAI_QUEUE_ATTR_TYPE": "SAI_QUEUE_TYPE_MULTICAST", "SAI_QUEUE_ATTR_INDEX": "11" }, "ttl": -0.001, "expireat": 1745051041.6604483 }, "ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x1500000000026a": { "type": "hash", "value": { "NULL": "NULL", "SAI_QUEUE_ATTR_TYPE": "SAI_QUEUE_TYPE_UNICAST", "SAI_QUEUE_ATTR_INDEX": "1" }, "ttl": -0.001, "expireat": 1745051041.6604662 }, … "ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF_TRAP:oid:0x220000000005fe": { "type": "hash", "value": { "SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE": "SAI_HOSTIF_TRAP_TYPE_DHCP", "SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP": "oid:0x110000000005fc", "SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_TRAP", "SAI_HOSTIF_TRAP_ATTR_TRAP_PRIORITY": "4" }, "ttl": -0.001, "expireat": 1745051041.6604846 }, "ASIC_STATE:SAI_OBJECT_TYPE_SCHEDULER_GROUP:oid:0x17000000000392": { "type": "hash", "value": { "NULL": "NULL" }, "ttl": -0.001, "expireat": 1745051041.660497 }, "ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x1500000000021f": { "type": "hash", "value": { "NULL": "NULL", "SAI_QUEUE_ATTR_TYPE": "SAI_QUEUE_TYPE_UNICAST", "SAI_QUEUE_ATTR_INDEX": "6" }, "ttl": -0.001, "expireat": 1745051041.6605082 }, …
  12. 13 SONiC Workshop 2025 SAIオブジェクトの例:VXLAN (オーバーレイ) "ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY:{¥"dest¥":¥"10.0.20.11/32¥",¥"switch_id¥":¥"oid:0x21000000000000¥",¥"vr¥":¥"oid:0x30000… "type": "hash", "value":

    { "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID": "oid:0x4000000000653" }, }, 対象のルート Next Hop IDを参照 "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP:oid:0x4000000000653": { "type": "hash", "value": { "SAI_NEXT_HOP_ATTR_TYPE": "SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP", "SAI_NEXT_HOP_ATTR_IP": "1.1.1.2", "SAI_NEXT_HOP_ATTR_TUNNEL_ID": "oid:0x2a000000000616", "SAI_NEXT_HOP_ATTR_TUNNEL_VNI": "104001", "SAI_NEXT_HOP_ATTR_TUNNEL_MAC": "22:53:6E:88:22:C0" }, }, "ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL:oid:0x2a000000000616": { "type": "hash", "value": { "SAI_TUNNEL_ATTR_TYPE": "SAI_TUNNEL_TYPE_VXLAN", "SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE": "oid:0x600000…, "SAI_TUNNEL_ATTR_DECAP_MAPPERS": "2:oid:0x290000000…, "SAI_TUNNEL_ATTR_ENCAP_MAPPERS": "2:oid:0x290000000…, "SAI_TUNNEL_ATTR_ENCAP_SRC_IP": "1.1.1.1", "SAI_TUNNEL_ATTR_PEER_MODE": "SAI_TUNNEL_PEER_MODE_P2MP" }, "ttl": -0.001, "expireat": 1745051041.6696587 }, SAI内部の10.0.20.11のルート情報(ROUTE_ENTRY) SAI内部のNext Hop情報 SAI内部のトンネル情報 参照 参照 Next HopはVXLANカプセル化した上で、 Underlayの1.1.1.2(VTEPのIP)に転送
  13. 14 SONiC Workshop 2025 "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP:oid:0x5000000000650": { "value": { "TYPE": "DYNAMIC_ORDERED_ECMP"

    SAIオブジェクトの例:VXLAN (アンダーレイ) "ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY:{¥"dest¥":¥"1.1.1.2/32¥",¥"switch_id¥":¥"oid:0x21000000000000¥",¥"vr¥":¥"oid:0x30000000… "value": { "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID": "oid:0x5000000000650" 対象のルート Next Hop IDを参照 SAI内部の1.1.1.2のルート情報(ROUTE_ENTRY) 参照 SAI内部のNext Hop情報 "NEXT_HOP_GROUP_MEMBER:oid:0x2d000000000651": { "value": { "NEXT_HOP_GROUP_ID": "oid:0x5000000000650", "NEXT_HOP_ID": "oid:0x400000000063b", "SEQUENCE_ID": "1" "NEXT_HOP_GROUP_MEMBER:oid:0x2d000000000652": { "value": { "NEXT_HOP_GROUP_ID": "oid:0x5000000000650", "NEXT_HOP_ID": "oid:0x4000000000636", "SEQUENCE_ID": "2" "NEXT_HOP:oid:0x400000000063b": { "value": { "TYPE": "SAI_NEXT_HOP_TYPE_IP", "IP": "169.254.0.1", "ROUTER_INTERFACE_ID": "oid:0x6000000000606" "NEXT_HOP:oid:0x4000000000636": { "value": { "TYPE": "SAI_NEXT_HOP_TYPE_IP", "IP": "169.254.0.1", "ROUTER_INTERFACE_ID": "oid:0x600000000061f" SAI内部のNext Hop Group Member情報 SAI内部のNext Hop Group Member情報 SAI内部のNext Hop情報 SAI内部のNext Hop情報 参照 参照 参照 参照 参照 参照 ※本スライドでは冗長な文字列を削除しています Next HopはSpine1とSpine2が存在 するため、ECMPにて分散
  14. 17 SONiC Workshop 2025 ◆APRESIAにてテクニカルブログとしてSONiC関連 の情報も発信中 ◊https://www.apresiatac.jp/blog/ − Edgecore SONiC向けAnsibleプレイブックのご紹介、利用方法

    − SONiC DASHのテスト環境を仮想マシンで作ってみた − SONiCのconfig apply-patchを試してみた − SONiCとWedge100BF-32Xを使ったインバンドネットワークテレ メトリ(INT)によるマイクロバースト検知 − Edgecore SONiCをZabbixの標準テンプレートにて監視してみ る − SONiC YANGを使った設定パラメータの確認方法 − SONiCの物理インタフェースのカウンタをPrometheusで監視す るスクリプトを書いてみた − JANOG46のSRv6デモ動画を公開しました − SONiC ZTPを仮想マシン環境で試してみた − Whiteboxスイッチ用NOSであるSONiCの仮想試験環境を構築 してみた その他、SONiCの参考情報