VPPSandBox中netlink和router编译

  1. vpp自版本更新到19以上修改较大,很多东西无法支持,需要重新探索。例如我们计划采用的方案vppsb。
  2. 在解决数据平面和控制平面分离的方案中,官方只有匹配VPP18.04版本的vppsb,19以上未支持。并官方bug罗列中表示无多余人在开发这块vppsb,日期为2019年7月。

官方Git源 https://gerrit.fd.io/r/admin/repos/vppsb
GitHub源 https://github.com/volkyr/vppsb
相关编译文献 https://segmentfault.com/a/1190000019613730
数据平面与管理平面分离方案 https://github.com/FRRouting/frr/wiki/Alternate-forwarding-planes%3A-VPP

  本文已将编译修改的源码集成进vpp20.01,可以通过git命令下载查看。其中router以plugin形式作为插件使用,同时添加了部分netns支持,优化tap映射展示,待进一步完善指定网卡的tap-inject映射,功能将更完善。如果读者想进一步优化,可以修改src/plugins/router目录中文件。项目clone可执行如下命令。

git clone -b  stable/2001 https://gitee.com/turbock/vpp.git

0. 官方文档建议如下

yum install -y python-cffi python-pycparser
$cd /vpp
//确定版本后,18.1以上;
PATH=$PATH:/root/vppsb/netlink:/root/vppsb/router
$ ln -sf ../vppsb/netlink
$ ln -sf ../vppsb/router
$ ln -sf ../vppsb/netlink/netlink.mk build-data/packages/
$ ln -sf ../vppsb/router/router.mk build-data/packages/

$ cd build-root/
$ ./bootstrap.sh
$ ls /root/vpp/build-data/packages/

$ make install-dep
$ make install-ext-deps
$ make build-release        //make V=0 PLATFORM=vpp TAG=vpp build-release

$ make pkg-rpm
$ make pkg-rpm  netlink-install router-install

///////修改PATH环境变量,对添加头文件目录无影响
export PATH=/usr/lib64/qt-3.3/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/root/vppsb/router:/root/vppsb/netlink
export PATH=$PATH:/root/vppsb/router:/root/vppsb/netlink
export PATH=$PATH:/root/vppsb/router/librntl

当前VPP版本采用20.01

1.netlink编译

1.1 编译netlink

进入要编译模块目录中执行以下命令

libtoolize
aclocal
autoconf
#autoheader (此步骤执行有error,对后面的运行没有影响,可忽略error)
automake --add-missing
#chmod +x configure
./configure
make
sudo make install

如果没有安装VPP,而是在另一个目录中构建的,可以使用VPP_DIR 'configure' 参数。

./configure VPP_DIR=<path/to/vpp/directory>
make
make install

1.2 修改注释掉两个宏 RTNLGRP_MPLS_ROUTE & RTA_VIA

之后执行netlink中编译命令,可以正常编译;

2.Router编译

  本文采用VPP为20.01stable版本,所以根据其中src路径指定依赖头文件路径。

2.1.Makefile文件中,添加头文件路径,因为router依赖netlink,所以需要先编译netlink。

#223    CPPFLAGS = -I /root/vppsb/netlink -I /root/vpp/src

同时在router/tap_inject_netlink.c:19:34文件中,将
#include <vnet/ip/ip6_neighbor.h>改为#include <vnet/ip-neighbor/ip6_neighbor.h>
#include <vnet/ethernet/arp.h>改为#include  <vnet/arp/arp.h>

2.2.修改结构体名称更新导致问题(router/tap_inject_netlink.c)

  修改tap_inject_netlink.c中函数static void add_del_neigh ()的#114行。clib_memcpy (&a.ethernet, n->lladdr, ETHER_ADDR_LEN);其中&a.ethernet改为a.mac。 ethernet_arp_ip4_over_ethernet_address_t结构体在vpp/src/vnet/ethernet/arp_packet.h中,结构如下:

typedef CLIB_PACKED (struct {
  mac_address_t mac;
  ip4_address_t ip4;
}) ethernet_arp_ip4_over_ethernet_address_t;
/* *INDENT-ON* */

2.3.因编译器问题,修改变量定义位置(router/tap_inject_netlink.c)

修改#154,201行for(int i = 1; label != 0; i++) {...}部分,添加结构体定义。将i定义放入外部,并变量定义放在最上面;
int i;
for(i = 1; label != 0; i++) {...}

2.4.注释无用字段(router/tap_inject_netlink.c)

router/tap_inject_netlink.c:228:33中的,注释掉#123行,该宏 else if (r->rtm.rtm_family == AF_MPLS){...}

2.5.添加宏(router/tap_inject_node.c)

因VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX定义在vpp16左右版本,在20版本中无定义;所以在tap_inject_node.c的#183行添加如下代码

#define VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX 0

2.6.编译连接netlink库函数,无法找到librtnl.so

/usr/bin/ld: cannot find -lrtnl
collect2: error: ld returned 1 exit status
make: *** [router.la] 错误 1

MakeFile中,LIBS = 添加如下信息,为netlink函数库lrtnl。其中-L与后面路径无空格。
LIBS = -L/root/vppsb/netlink/.libs

3.vppsb编译后,router.so集成到VPP项目中

  注意:本文插件集成拷贝方式虽然正确可行,但是因VPPSB中各个插件采用旧版VPP的plugin模板方式,所以与vpp 19以上所有版本都不兼容,无法使用,需要将netlink以及router模块修改到新版本的plugin框架中,才可行。

  拷贝router.so文件到运行vpp依赖库位置,根据情况选择:

  1. 拷贝sample_plugin.so到 vpp默认的plugin路径(/usr/lib/vpp_plugins)
  2. 拷贝sample_test_plugin.so到vat默认的plugin路径(/usr/lib/vpp_api_test_plugins)
/vpp/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins中
/usr/lib/debug/usr/lib/vpp_plugins
/usr/lib/x86_64-linux-gnu/vpp_plugins
/usr/lib/vpp_plugins

$ cd /root/vppsb/router/
$ ln -snf /root/vppsb/router/.libs/router.so /usr/lib/vpp_plugins/router.so
$ ln -snf /root/vppsb/router/.libs/librtnl.so /usr/lib/vpp_plugins/librtnl.so

$ ln -snf /root/vppsb/router/.libs/testrtnl_plugin.so /usr/lib/vpp_api_test_plugins/testrtnl_plugin.so

$ ln -sf ../vppsb/router/router.mk build-data/packages/

./vpp -c startup.conf
vlib_plugin_early_init:361: plugin path /vpp/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins

 $ systemctl start vpp,启动vpp后台进程
 $ vpp_api_test,执行vat测试命令

  vpp_api_test运行时,看到如下提示,说明插件加载成功 load_one_plugin:63: Loaded plugin: /usr/lib/vpp_api_test_plugins/sample_test_plugin.so
  执行插件命令:
  sample_plugin加载OK,可执行插件中注册的命令
  vat# help sample_macswap_enable_disable
  usage: sample_macswap_enable_disable [disable]

《VPPSandBox中netlink和router编译》有2个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注