DPDK Kernel NIC Interface(KNI)允許用戶空間應用程序訪問Linux *控制面。
使用DPDK KNI的好處是:
- 比現有的Linux TUN / TAP接口更快(通過消除系統調用和copy_to_user()/copy_from_user()操作)。
- 允許使用標准Linux網絡工具(如ethtool,ifconfig和tcpdump)管理DPDK端口。
- 允許與內核網絡堆棧的接口。
使用DPDK內核NIC接口的應用程序的組件如圖所示。

21.1.DPDK KNI內核模塊
KNI內核可加載模塊支持兩種類型的設備:
- 其他設備:
- 創建網絡設備(通過ioctl調用)。
- 維護所有KNI實例共享的內核線程上下文(模擬網絡驅動程序的RX端)。
- 對於單內核線程模式,維護所有KNI實例共享的內核線程上下文(模擬網絡驅動程序的RX端)。
- 對於多個內核線程模式,為每個KNI實例(模擬新驅動程序的RX側)維護一個內核線程上下文。
- 網絡設備:
- 通過實現由struct net_device定義的諸如netdev_ops,header_ops,ethtool_ops之類的幾個操作提供的Net功能,包括支持DPDK mbufs和FIFO。
- 接口名稱由用戶空間提供。
- MAC地址可以是真正的NIC MAC地址或隨機的。
21.2. KNI創建及刪除
KNI接口由DPDK應用程序動態創建。接口名稱和FIFO詳細信息由應用程序通過ioctl調用使用rte_kni_device_info結構提供,該結構包含:
- 接口名稱。
- 相關FIFO的相應存儲器的物理地址。
- Mbuf mempool詳細信息,包括物理和虛擬(計算mbuf指針的偏移量)。
- PCI信息。
- Core。
有關詳細信息,請參閱DPDK源代碼中的rte_kni_common.h。
物理地址將重新映射到內核地址空間,並存儲在單獨的KNI上下文中。
內核RX線程(單線程和多線程模式)的親和力由force_bind和core_id配置參數控制。
創建后,DPDK應用程序可以動態刪除KNI接口。此外,所有未刪除的KNI接口將在雜項設備(DPDK應用程序關閉時)的釋放操作中被刪除。
21.3.DPDK緩沖區流
為了最小化在內核空間中運行的DPDK代碼的數量,mbuf mempool僅在用戶空間中進行管理。內核模塊可以感知mbufs,但是所有mbuf分配和釋放操作將僅由DPDK應用程序處理。

21.4.用例: Ingress
在DPDK RX側,mbuf由PMD在RX線程上下文中分配。該線程將mbuf入隊到rx_q FIFO中。 KNI線程將輪詢所有KNI活動設備。如果mbuf出隊,它將被轉換為sk_buff,並通過netif_rx()發送到網絡協議棧。必須釋放出隊的mbuf,將指針返回到free_q FIFO中。
RX線程在相同的主循環中輪詢該FIFO,並在出隊之后釋放mbuf。
21.5.用例: Egress
對於數據包出口,DPDK應用程序必須首先入隊幾個mbufs才能在內核端創建一個mbuf緩存。
通過調用kni_net_tx()回調,從Linux網絡堆棧接收數據包。mbuf出隊(因為使用緩存,所以無需等待),並填充了來自sk_buff的數據。然后釋放sk_buff,並將mbuf發送到tx_q FIFO。
DPDK TX線程執行mbuf出隊,並將其發送到PMD(通過rte_eth_tx_burst())。 然后將mbuf放回緩存中。
21.6.以太網工具
Ethtool是Linux專用工具,在內核中具有相應的支持,每個網絡設備必須為支持的操作注冊自己的回調。目前的實現使用igb / ixgbe修改的Linux驅動程序進行ethtool支持。i40e和VM(VF或EM設備)不支持Ethtool。
21.7.鏈路狀態及MTU改變
鏈路狀態和MTU變化是通常通過ifconfig完成的網絡接口操作。該請求是從內核端(在ifconfig進程的上下文中)發起的,由用戶空間DPDK應用程序處理。應用程序輪詢請求,調用應用程序處理程序並將響應返回到內核空間。
應用處理程序可以在創建接口時注冊,也可以在運行時再注冊/卸載。這提供了多進程方案(其中KNI在primary process中創建,在secondary process中處理回調)的靈活性。約束是單個進程可以注冊和處理請求