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可执行如下命令。

0. 官方文档建议如下

当前VPP版本采用20.01

1.netlink编译

1.1 编译netlink

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

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

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

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

2.Router编译

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

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

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中,结构如下:

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行添加如下代码

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

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_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个想法

发表评论

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