VPP和Linux内核协议栈通信的方法

时间:2024-03-30 10:43:08

背景介绍

    基于VPP开发一款网络设备,除使用VPP框架实现端口数据报文转发外,还需要对设备进行配置和管理,比较常用的是要实现ssh、web等相关服务,另外,由于VPP并未实现dhcp server的功能,控制面可能还需移植isc-dhcp类似的dhcp server。相关的用户态程序是基于Linux内核的socket来收发包的,因此,需要实现VPP和Linux内核协议栈通信的方法,可以将访问控制面的报文由VPP上送至Linux协议的协议栈。

实现原理

   VPP和Linux内核协议栈通信有两种方法,分别是基于Linux的TAP/TUN和VETH两种机制,对这两种机制不了解的朋友,建议先阅读下如下两个衔接的内容:

   TUN/TAP:https://segmentfault.com/a/1190000009249039

   VETH:https://segmentfault.com/a/1190000009251098

基于TAP/TUN的方法:

  VPP和Linux内核协议栈通信的方法

  如上图,PC的地址是192.168.1.2,Linux Kernel的管理接口地址是192.168.1.1,需要PC通过VPP可以ping同Linux内核的192.168.1.1地址。

   技术原理图如上,物理网卡对应VPP中的GE4/0/0,VPP创建tap接口,使用l2 bridge机制将GE4/0/0和tap桥接,进入GE4/0/0的报文通过l2 bridge转发到TAP,VPP的TAP相当于用户态进程,另一端对应的是Linux内核中的TAP接口,报文通过TAP机制重入到Linux内核,实现了VPP到控制面的通信。

   实现命令:

vpp#set int l2 bridge GigabitEthernet4/0/0 1
vpp#set int state GigabitEthernet4/0/0 up
vpp#tap connect lstack
vpp#set int l2 bridge tap-0 1
vpp#set int state tap-0 up

  上述操作完成后,在linux后台,ifconfig发现多了一个lstack接口,给lstack接口配置好IP地址,就可以实现PC和设备的通信了。

 

基于VETH方法:

VPP和Linux内核协议栈通信的方法

    VETH技术原理如上图,通过在vpp上创建host-interface的方式实现,使用VETH方式的效率更高,实际使用时推荐此种方法。

  配置步骤如下:

linux后台配置:

~# ip netns add ns0
~# ip link add vpp0 type veth peer name vethns0
~# ip link set vethns0 netns ns0
~# ip netns exec ns0 ip link set lo up
~# ip netns exec ns0 ip link set vethns0 up
~# ip netns exec ns0 ip addr add 192.168.1.1/24 dev vethns0
~# ip netns exec ns0 ethtool -K vethns0 rx off tx off

  VPP配置:

vpp# set int l2 bridge GigabitEthernet4/0/0 1
vpp# set int state GigabitEthernet4/0/0 up
vpp# create host-interface name vpp0
vpp# set interface state host-vpp0 up
vpp# set interface l2 bridge host-vpp0 1