默认编译OpenFastPath时慢平面是启用的,慢平面的功能之一是通过netlink方式向内核查询路由表,这是用内核公开的接口,不需要另开发内核驱动。
慢平面的一个局限,比方电脑只有一张网卡,而这块网卡已被dpdk绑定,网络包就不会在内核中被解析,此时慢平面的路由功能也就无效,所以干脆通过
1 | ./configure ... --enable-sp=no |
将慢平面功能去掉。
而此时我们跑在ofp上的应用就没有路由表了么?
不是的。首先应用的本机ip地址是通过
1 | myApp -i 0 -f ofp.cli |
中的ofp.cli配置的。如
1 2 3 | debug 0 loglevel set debug ifconfig fp0 192.168.56.33/24 |
中的192.168.56.33就是本机地址。
而通过arp协议获取其它机器ip与mac关系的路由表是由
1 | ofp_start_cli_thread(instance, app_init_params.linux_core_id, params.cli_file); |
这个线程在dpdk绑定的网卡上进行解析维护。
一个很好的例子就是ofp/example/webserver。
ofp和dpdk都可完全编译成静态库运行,不要为了LD_PRELOAD的那一点便利一门心思去编译出动态库。在自已的源码中加一层宏翻译,静态库与epoll api兼容性也很好。
github上的odp与dpdk-odp的区别是前者现在只包含了odp-linux,一种对linux系统api的包装,后者是对dpdk的包装,所以高性能选后者。原话见
doc/users-guide/users-guide.adoc
refer to:
https://github.com/OpenFastPath/ofp
https://github.com/OpenDataPlane/odp-dpdk
https://my.oschina.net/u/4361425/blog/3269917