在VPP中,報文以向量批處理的形式在節點之間以流水線的方式處理,可以更加高效的利用CPU的i-cache,節點可以動態生成並加入到轉發圖中,節點分為多種類型,如VLIB_NODE_TYPE_INPUT,為輸入節點。可以按照VPP的框架自定義節點如:
其中最重要的是回調函數snat_out2in_node_fn與next_nodes數組,snat_out2in_node_fn代表當數據包進入本node中,node對於一組數據包具體的處理過程。而next_nodes數組則表示該node執行完畢后,選擇執行的下一個節點,在該選擇上本地node節點有絕對的控制權。於是疑問就出現了,在上述的node定義結構體中並沒有選擇該本地node輸入節點的接口。
在vpp中的L3實現中,利用feature框架完成了一個三層轉發子圖。該子圖的初始節點為ip4-input,終止節點為ip4-lookup,其中子圖實現的功能有ip4-acl、ip4-source-check等,其作用為執行數據包進入L3 但在轉發forward之前的一些列的L3動作,例如snat的功能在這個子圖中完成。典型的注冊如下所示:
而snat node輸入node的定義則利用了L3 feature框架
最終L3 node的全貌如下:
其中runs_before表明該node的動態下一個節點,而在上述node結構體定義中的next_nodes則為該節點的靜態下一個節點。而該node的輸入節點則由rx_feature_out2in的值決定,而該值則是有方向的,即網卡的收報方向;換而言之只有從相應的網卡收報才會進入到本地的node處理中,於是利用該特性就可以獲取到本地node的輸入節點。可以用命令行vppctl show ip features顯示。有了FD.io VPP這樣相對成熟的框架我們就可以把Neutron中的dataplane組件用VNF來實現,不僅可以獲取高性能還避免了用DPDK完全開發,大大減少了工作量,不失為一種很好的Neutron datapl