vpp之node节点分析一: dual类型节点
vpp中node節點是數據包的處理流程,數據包在不同節點之間流動進行處理
vpp所有的node節點無論里面的邏輯如何處理,轉發流程都分為兩種,主要是為了性能優化,本篇文章介紹第一種dual類型
首先創建一個dual類型的插件,名字為testdual,查看node.c文件
注:一般來說處理數據包的代碼文件名都是node.c,但是如果一個模塊功能過于復雜就會根據相應類型取名,例如ip4的處理
1.第一個知識點,當前node是如何確定數據包的下一個node節點的
這兩個要放在一起看
VLIB_REGISTER_NODE這個宏表示注冊 testdual這個節點
name表示該節點的名字,其中vpp會給該node分配一個node index作為標識,和名稱一一對應
type表示節點的類型,這個會在別的文章中分享,處理數據包的節點都是該類型
重點來了
n_next_nodes表示當前node節點的下一個節點有多少個,這個值就是上面枚舉類型的最后一個
next_nodx表示當前node節點下一個節點有哪些,在代碼中會變成char *next_nodes[] 數組,記錄下每一個節點的名字,其中數組下標對應上面的枚舉類型,具體代碼中使用的下面講解
2.第二個知識點,當前節點是如何處理數據包并控制轉發的
我把相關說明以注釋的形式放在代碼中
注: 該代碼是vpp處理數據的基礎,務必全部理解,基本上分析源碼障礙就少了很多
3.dual類型與qs類型的區別
dual類型適合當前node節點的轉發節點有很多個,同時在處理的過程中數據包會根據條件發送到不同的節點去
dual類型轉發數據包的流程
(1)調用vlib_get_next_frame獲取下一個節點的frame
(2)通過vlib_validate_buffer_enqueue_x系列函數(宏)轉發到指定node
(3)通過vlib_put_next_frame函數設置frame狀態等待vpp調度
如果想搞懂區別,必須理解vlib_validate_buffer_enqueue_x在做什么
為了方便理解,這里以vlib_validate_buffer_enqueue_x1為例
?問題就在于為什么要先調用一次vlib_put_next_frame
需要分析一下vlib_put_next_frame函數
原因就是前面已經通過to_next把數據包存放到next_index指向的node,但是實際上數據包需要轉發到next0指向的node,所以通過?vlib_put_next_frame重置一下next_index指向node的數據,證據就是調用vlib_put_next_frame函數時傳入數據包個數是?n_left_to_next + 1,由于程序是在最后調用vlib_put_next_frame把當前節點收到的所有數據把統一發走,所以n_left_to_next + 1一定等于VLIB_FRAME_SIZE
接著循環結束,把這一個數據包轉發到next_index,但是此時的next_index已經變成了next0
繼續分析,x2和x4又在做什么呢
2個包和4個包情況就復雜了,其中如果有一個包不跟next_index表示的node一致,就需要把數據包發走
這里以x4為例
?通過vlib_set_next_frame_buffer函數
繼續通過vlib_set_next_frame函數
這里可以看出把數據包發送到next0指向的node
關于qs的處理放在下篇文章講解
總結
以上是生活随笔為你收集整理的vpp之node节点分析一: dual类型节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xvidcore-1.3.2编译
- 下一篇: 飞机订票系统- c语言课程设,C语言课程