---
tags: SN1000
---
# SN1000智能網卡架構
以下說明SmartNIC的架構,協助開發人員編寫自己的Plugin所需的背景資訊
SN1000 SmartNIC的主要構成如下圖所示:

* 主機接口:
* 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

自定義邏輯連接到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)中涉及的主要組件如下所示:

* Plugin本身可以使用RTL、P4、HLS來編改內部應用
* 需要Plugin Driver來連接插件與控制x86 Host或Arm SoC插件
#### 控制和數據流
下圖說明插件可以訪問的重要接口,在x86主機或是Arm SoC上運行的插件應用程序(Plugin application)可能希望控制或監視Plugin。為此,它將插件控制消息(PCM**下圖虛線箭頭**)發送到網路管理控制器(NMC)上運行插件驅動程序。

插件驅動程序可以處理消息:
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.,將更新消息緩衝區傳遞回應用程序。
下圖說明了這個過程

#### 發送數據包
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進一步處理,以便將數據交付給應用程序
---