アーキテクチャ¶
PINS の data path は「コントローラ → P4RT App → APPL_DB → P4Orch → SAI → ASIC」と、その逆方向の応答 / PacketIO の 2 系統で構成されます。ここでは controller から orchagent までの流れを通しで掴むための地図を作ります。各コンポーネントの細部は既存 HLD ページに移譲します。
controller から ASIC までの流れ¶
flowchart LR
Ctrl[SDN Controller] -- "gRPC port 9559<br/>P4Runtime v1.3.0" --> P4RT[p4rt-app Docker]
P4RT -- "PI → 内部表現" --> Cache[(entity_cache_<br/>= 旧 table_entry_cache_)]
P4RT -- "P4RT_TABLE entries" --> APPL[(APPL_DB)]
APPL --> P4Orch[P4Orch<br/>各 Manager]
P4Orch -- "SAI 同期呼び出し" --> SAI[SAI / syncd]
SAI --> ASIC[(ASIC_DB / ASIC)]
P4Orch -- "成否 + 属性反映" --> STATE[(APPL_STATE_DB<br/>DB 14)]
STATE --> P4RT
P4RT -- "gRPC Response" --> Ctrl
- P4RT App は受け取った Platform Independent (PI) メッセージを APPL_DB の
P4RT_TABLE系エントリに翻訳します。詳細は P4RT App HLD を参照してください。 - P4Orch は
APPL_DBを購読する orchagent 内のクラス群で、各 Manager(router_interface / neighbor / next_hop / wcmp / route / acl_table / acl_rule / mirror_session / l3_admit / gre_tunnel / tunnel_decap_group / ext_tables / tables_definition / ip_multicast / l3_multicast)が SAI 呼び出しを担当します。詳細は P4Orch HLD を参照してください。 - APPL_STATE_DB は同期書き込みの結果をコントローラに返すための専用 DB(
APPL_STATE_DB=14)です。
Read 経路と entity_cache_¶
Read は AppDb (Redis) を毎回叩くと 16,000 フローで約 1.3 秒かかるため、PI 形式そのままを保持する entity_cache_(HLD では table_entry_cache_)を p4rt-app プロセス内に持ち、Read はキャッシュから直接返します。実測で約 40 倍(1.3s → 40ms)高速化します。Write の INSERT / MODIFY / DELETE はキャッシュも同時更新し、VerifyState() がキャッシュと AppDb の整合を確認します。詳細は Read キャッシュ HLD を参照してください。
PacketIO の経路¶
PacketIO は CPU と controller の間にもう一系統のチャネルを足します。
- Receive: controller が install した punt flow にマッチしたパケットだけが、CoPP の
genetlink_name/genetlink_mcgrp_nameを持つ trap group 経由で generic netlink に流れ、p4rt-app が受信して controller に転送します。copporchのcreateGenetlinkHostIf()が SAI hostif を作成する経路です。 - Transmit (Direct): 送信先 port が決まっているケースで、対応する netdev のソケットへ書きます。
- Transmit (Send to Ingress): ASIC の ingress pipeline に再注入し、ECMP / WCMP / queue を ASIC に判定させます。
PortsOrch::addSendToIngressHostIf()がAPP_SEND_TO_INGRESS_PORT_TABLE_NAME経由でSAI_HOSTIF_TYPE_NETDEV属性の hostif を作成します。
詳細は PacketIO HLD と Send to Ingress HLD を参照してください。
DB の整理¶
| DB | 用途 | 補足 |
|---|---|---|
APPL_DB (0) |
P4RT_TABLE 系の購読対象 |
P4RT App が書く |
APPL_STATE_DB (14) |
P4Orch の同期応答(成否、属性反映) | P4RT App が読む |
ASIC_DB (1) |
sairedis 経由の SAI オブジェクト | 通常 SONiC と同じ |
P4RT_TABLE の具体 schema や DB layout の追加点は PINS HLD を参照してください。