VPP概述彙總

1、背景介紹

http://www.360doc.com/content/18/0428/20/53742993_749517107.shtmlhtml

《高性能網關設備及服務實踐》這篇博文,介紹了傳統內核網絡協議棧技術的瓶頸及怎麼突破,從而引入DPDK + VPP這種處理方式。node

2、高性能

性能提高方法。算法

架構:DPDK使用巨頁、NUMAD-cache優化,VPP I-cache優化;bootstrap

算法:Bihash,查表lockless數組

代碼:Vector 、宏構造函數、結構體cacheline對齊、線程綁核、指令預取、指令優化;網絡

3、轉發流程圖譜

3.1 VPP轉發圖譜

https://blog.csdn.net/icebluechao/article/details/51208811數據結構

 

層二轉發圖譜:多線程

 

層三轉發圖譜:架構

 

 

3.2 Linux內核報文收發流程

https://zhaozhanxu.com/2016/07/14/Linux/2016-07-14-Linux-Kernel-Pkts_Processing3/app

層二轉發:

 

層三轉發:

 

 

4、Node節點及初始化

https://blog.csdn.net/Illina/article/details/82224918

 

 

node的基礎數據結構如上圖所示,__bootstrap_vlib_main_vector是最頂級的全局變量,此變量下的vm是一個vec結構,每thread一個vlib_main_t,對於node結構來說,比較重要的是node_main,對應vlib_node_main_t結構體,在vlib_node_main_t中,nodes成員以vec數據結構組織,用來真正保存一個個註冊在VPP系統中的nodevlib_node_t結構中存儲了node節點的全部信息。

   爲查找方便高效,vlib_node_main_t有成員node_by_name,以hash的方式組織,可按name快速hashnodeindex

   node_registrations是提供給初始化函數使用的,是一個單鏈表的結構,VLIB_REGISTER_NODE宏註冊的node在初始化前就預先掛載在這個成員變量中。

 

 

函數流程如上圖,vlib_unix_main是初始化入口,函數默認會啓動一個線程,在thread0中完成node結構的註冊和node graph的建立,vlib_register_all_static_nodes函數用來將vlib_node_registration_t結構下node_registrations鏈表中的node真正放到vlib_node_main_t結構下的node池中。

 

   vlib_node_main_init函數用來根據註冊node提供的next node信息,創建一個完整的node graph,在VPP運行正確後,經過命令show vlib graph能夠查看全部註冊的nodenode之間的關係。

5、Main過程

http://www.javashuo.com/article/p-yfnpjqln-w.html

5.1 vpp/vnet main.c

1.main 首先解析參數,再須要初始化堆,插件的初始化將由他提供。

2.vpe_main_init 初始化各類插件,經過宏函數VLIB_INIT_FUNCTION(X),能夠經過遍歷單鏈表、動態連接的方式指定不一樣的初始化類型如早期的配置、功能等

3.調用 vilb_unix_main

5.2 vilb_unix_mian

vlib_plugin_early_init (vlib_load_one_plugins) 從配置文件中讀取插件的路徑而不用從新編譯.

vlib_thread_stack_init 建立主線程的線程棧,對於線程的管理,經過了數組的形式,因此每次使用地址能夠直接經過偏移量來找到他

clib_call_jmp 這裏執行了main線程(thread0)的回調函數。

5.3 vlib_main

cli_time_init 用於多線程時間輪調度

vlib_register_all_static nodes 一樣也是經過遍歷單鏈表的方式對全部的節點分配內存、初始化等等。

vlib_call_all_init_fountions 這裏的初始化不一樣於最開始時的初始化,這裏是創建節點圖,經過函數指針計算矢量,也就是在節點圖的下一跳(對於不一樣類型的數據包所造成的路徑也是不一樣的)。

vlib_buffer_get_or_create_free_list 建立默認的緩衝區,dpdk使用了特定的緩衝區的格式,vpp在其頭部添加信息使二者相對隔離,給網絡棧和空間存儲提供了便利。

vlib_call_all_config_functions 進入主循環前最後一次進行配置

進入 vlib_main_loop

5.4 vlib_main_loop

dispatch_process

dispatch_node(PRE_INPUT) 目前只有一個epoll node,對socket相關邏輯提供服務,主要使用在控制業務上。能夠處理CLI命令以及能夠在中斷模式和輪詢模式中切換。

dispatch_node(INPUT) 須要從其餘容器中得到input方法(dpdk_input),由以前構建好的節點圖進行矢量跳轉,

queue_signal_pending 用戶能夠自行定義信號後會調用回調函數

中斷模式和時間輪計算

dispatch_pending_node 因爲咱們以前已經定義好了數據包的矢量,如今要作的就是跳轉到我收到包後如今要作的事情。(p.s.有對於trace版本的優化以及debug版本顯示更多信息,同時也能夠在gdb中看出數據包的流

dispatch_node(INTERNAL)

node->function 調用節點指定的動做(對於dpdk來講這裏就是發包)

 

 

 

6、CLI命令

https://blog.csdn.net/Illina/article/details/81666935

例子:使用VPP做爲家庭路由器,經過這個例子,能夠看到用VPP能夠完成路由轉發功能。

comment { bring the WAN interface up, then change the MAC address. Otherwise the rx filter will be misprogrammed! }

 

set int state GigabitEthernet3/0/0 upVPP

set int mac address GigabitEthernet3/0/0 <desired-mac-address>

set dhcp client intfc GigabitEthernet3/0/0 hostname vppgate

 

comment { create the IRB loopback interface, give it the usual local network IP address }

loopback create

set int l2 bridge loop0 1 bvi

set int ip address loop0 192.168.1.1/24

set int state loop0 up

 

comment { add other inside addresses to the IRB bridge group }

set int l2 bridge GigabitEthernet4/0/0 1

set int state GigabitEthernet4/0/0 up

 

set int l2 bridge GigabitEthernet0/14/0 1

set int state GigabitEthernet0/14/0 up

 

set int l2 bridge GigabitEthernet0/14/1 1

set int state GigabitEthernet0/14/1 up

 

set int l2 bridge GigabitEthernet0/14/2 1

set int state GigabitEthernet0/14/2 up

 

comment { create a tap interface for dhcp server and host-stack access }

tap connect lstack address 192.168.1.2/24

  

set int l2 bridge tap-0 1

set int state tap-0 up

 

comment { Configure the snat plugin }

   

nat44 add interface address GigabitEthernet3/0/0

set interface nat44 in loop0 out GigabitEthernet3/0/0

 

comment { create static outside-to-inside port mappings }

 

comment { Send traffic received on the WAN interface DHCP address, <REDACTED-outside-port> to 192.168.1.xxx, <REDACTED-inside-port>

nat44 add static mapping local 192.168.1.xxx <REDACTED-inside-port> external GigabitEthernet3/0/0 <REDACTED-outside-port> tcp

 

comment { Enable the vpp DNS caching name resolver }

 

comment { nat44 add identity mapping external GigabitEthernet3/0/0 udp 53053  }

comment { bin dns_name_server_add_del 8.8.8.8 }

comment { bin dns_enable_disable }

相關文章
相關標籤/搜索