--- tags: SN1000 --- # SN1000智能網卡架構 以下說明SmartNIC的架構,協助開發人員編寫自己的Plugin所需的背景資訊 SN1000 SmartNIC的主要構成如下圖所示: ![](https://i.imgur.com/KXMRQKB.png) * 主機接口: * EF100網路設備 * 虛擬網路 * Virtio模塊 * Memory interfaces * PCIe * DMA 系統 * DDR. * Memory fabric * Streaming Subsystem 流媒體子系統: 提供處理網路數據包的數據路徑,支持offloads(卸載)和虛擬交換,並提供可以附加自定義Plugin的plugin sockets * 開發人員主要的開發的對象為Plugin這個區塊的功能,Plugin 透過soft Hub連接到流子系統(Streaming Subsystem)。Plugin本身可以使用RTL、P4、HLS來編改內部應用。Plugin需要由NMC(網路管理控制器)運行Plugin driver來控制來自x86主機或Arm SoC的Plugin 應用。 * Network Management Controller (NMC)網管控制器: NMC是一個嵌入式處理器,可以管理資源與配置硬體並提供控制接口驅動嵌入式處理器 * Arm System on Chip(SoC) Arm SoC透過PCIe連接x86主機,運行第三方應用程序,如:軟體定義的網路和儲存控制器 --- ## **Streaming Subsystem** 以下介紹流子系統(Streaming Subsystem),該系統相鄰在Plugin旁,主要功能為處理網路數據包。 #### Streaming Subsystem提供以下功能: * 虛擬網卡 * Stateless offloads (TCP segmentation, checksums) * Flow steering * RSS * 數據包分類 * 統計資料 * 虛擬交換機 * 添加或分解封裝 (VLANs, overlays) * 在完整的外部和内部 IPv4/IPv6 TCP/UDP 數據包上遮蔽匹配 * 第二層交換 * 遵循規則的轉發 * 訪問控制列表 (connection tracking, firewalling) * 網路地址轉換(NAT) * 統計資料 * 處理數據路徑中的數據包各個Plugin sockets * Plugins,是在FPGA架構中實現自定義數據包處理套件: * 支持新協議和封装 * 支持新的網路/驅動程序卸载 * 應用程序卸載 * 網路監控 * 加密、解密 ## **Plugin介紹** 下圖顯示了Plugin 如何連接到Streaming Subsystem ![](https://i.imgur.com/0tzUKPo.jpg) 自定義邏輯連接到Streaming Subsystem的地方,稱之為Plugin Socket 添加的組件稱之為Plugin,插件可以在運行之前或運行時加載到FPGA架構中。 插件使用Soft Hub 連接,Soft Hub是Xilinx所提供的IP模塊,可直接連接到Plugin Socket,提供了插件所需的服務,包括: * 介面適配 * 入口和出口緩衝 * 可調動 這些服務不需要作為插件設計的一部分。 創建插件時soft hubs已經與插件連接在一起。 #### 省略soft hubs 構件插件時,如果它們各自的Plugin Socket未使用,則IP模塊會自動刪除節省資源。 #### 緩衝 插件可能需要緩衝,例如:插件有時可能跟不上上游數據路徑提供的那樣快速處理數據,或者它可能會受到下游數據路徑沒有足夠快地消耗數據,所以入口緩衝區與出口緩衝區是必要的。 soft hubs為插件提供緩衝。 ## 插件(Plugin)概述 插件(Plugin)中涉及的主要組件如下所示: ![](https://i.imgur.com/mOxwyuC.jpg) * Plugin本身可以使用RTL、P4、HLS來編改內部應用 * 需要Plugin Driver來連接插件與控制x86 Host或Arm SoC插件 #### 控制和數據流 下圖說明插件可以訪問的重要接口,在x86主機或是Arm SoC上運行的插件應用程序(Plugin application)可能希望控制或監視Plugin。為此,它將插件控制消息(PCM**下圖虛線箭頭**)發送到網路管理控制器(NMC)上運行插件驅動程序。 ![](https://i.imgur.com/KXMRQKB.png) 插件驅動程序可以處理消息: 1. Plugin應用程序使用ef_vi_extension_send _message() API發送PCM (**由Xilinx Onload 應用加速軟件的ef_vi組件提供**) 2. 網路驅動程序使用MCDI協議(管理CPU驅動程序接口)通過PCIe將消息轉發到NMC。 3. NMC將消息轉發給Plugin Driver。這將運行已作為插件開發的一部分,通常執行以下操作: (1). 解析並驗證消息 (2). 分配任何必要的資源 (3). 同時修改消息已添加返回值,例如分配的ID,並更新將返回給發送PCM的應用程序的其他信息 (4). 如果需要,讀取和寫入NCM內存的SmartNIC插件暫存器或執行其他操作,如插件驅動程序API中所述。 4. 該插件通過其AXI-Lite 總線處理暫存器訪問並對其進行操作,根據需要修改其內部狀態 5. 如果請求失敗,PCM處理程序立即必須撤銷它先前所做的任何設定和分配。 6. PCM處理程序通過上面1.、2.,將更新消息緩衝區傳遞回應用程序。 下圖說明了這個過程 ![](https://i.imgur.com/pG5d65B.jpg) #### 發送數據包 1. x86 主機或Arm SoC上的插件應用程序使用任何標準平台API發送數據 2. API可能會添加標頭和/或將數據重新打包成數據包 3. 數據包使用NIC的DMA引擎通過PCI發送,並作為膠囊(Capsules)注入Streaming Subsystem 4. 膠囊(Capsules)穿過Streaming Subsystem,在plugin writer控制下通過插件路由 5. 膠囊(Capsules)換作數據包退出Streaming Subsystem,通常到網路端口 6. 數據包通過網路從網路端口發送 #### 接收數據包 1. 數據包通過網路端口到達,並轉換成膠囊(Capsules)注入Streaming Subsystem 2. 膠囊(Capsules)穿過Streaming Subsystem,在plugin writer控制下通過插件路由 3. 膠囊(Capsules)轉換為數據包退出Streaming Subsystem,通常到DMA控制器 4. 數據包從DMA子系統通過PCI發送到主機排隊等候 5. 管理列隊的主機軟件使用其正常接收API進一步處理,以便將數據交付給應用程序 ---