1、ovs支持bond现状
ovs 支持自身bond接口,命令操作如下:
ovs-vsctl add-bond br0 dpdkbond dpdk0 dpdk1 -- set Interface dpdk0 type=dpdk -- set Interface dpdk1 type=dpdk
以下说法引用于:http://blog.csdn.net/hliyuxin/article/details/52155136的bond部分
物理网卡需要和原网络结构兼容,需要两个port支持bond协议,但现在dpdk接管网卡。一种方案是用ovs 本身的bond, 但是这样对于ovs,看到的还是两个port, 如果加流表规则, 需要加两份,这样不便于控制管理。另一种方案,使用dpdk 的bond,为ovs添加支持dpdk-bond类型port的代码, 类似dpdk, dpdk-vhost-user, tap类型。 这里我们对ovs代码进行修改,支持了dpdk bond类型的port。同时也fix了部分dpdk bond代码的bug。
上面是美团人员总结,但并没有说具体的修改方案,我在简单分析了ovs代码后,修改部分代码,实现了上面说的另一种方案,但只做实验用,稳定性不做保证。
2、ovs+dpdk bond修改点
图1
有两种方法:
2.1、方法1
思想是直接在运行ovs前让dpdk就bond接口
a、修改点是添加ovs参数,
参数的主要目的就是传入dpdk本身支持bond功能的参数,详情参考dpdk参数
在启动ovs前设置参数ovs-vsctl --no-wait set Open_vSwitch . other_config:
dpdk-vdev='eth_bond0,mode=2,slave=0000:81:00.1,slave=0000:82:00.1,xmit_policy=l34'
上面的命令最后做的操作其实就是把“eth_bond0,mode=2,slave=0000:81:00.1,slave=0000:82:00.1,xmit_policy=l34”传给了dpdk库
“dpdk-vdev”是我自己添加的参数,
“eth_bond0,mode=2,slave=0000:81:00.1,slave=0000:82:00.1,xmit_policy=l34”是dpdk的配置参数(详情查看dpdk配置),
上面的命令是把bond口设置成0号port,所以在使用的时候直接使用0号就行了,当然你可以遍历所有port,然后判断它是不是bond,
是的话再检查bond口里的slave pci号也是可以的,做这些操作必须有dpdk相关知识,不然可能看不懂,
b、添加接口时使用命令:
ovs-vsctl add-br br-bond_virt -- set bridge br-bond_virt datapath_type=netdev
ovs-vsctl add-port br-bond_virt dpdkb0 -- set Interface dpdkb0 type=dpdkb
2.2、方法2
让ovs代码添加bond接口,这个主要是调用dpdk的接口bond,bond制定port
上面2种方法只是思路,2种方法的共同点是都要添加dpdkb接口类型
在修改代码时添加了dpdkb的接口类型,它与dpdk类型的接口基本相同,不同的请参考代码
ovs-vsctl add-port br-bond_virt dpdkb0 -- set Interface dpdkb0 type=dpdkb
这里的dpdkb0中的0可不是随便的值,0必须和图一中 “Create bonded device eth_bond0 onport 0 in mode 2 on socket 0”
中port 0中的值对应。dpdk类型的接口是以dpdk加上port值组成的,所以我改代码时dpdkb类型的接口也是dpdkb加port值组成。
3、测试
添加成功后,显示如图2
图2
测试拓扑:
接口A0-----------接口A1
服务器1 服务器B
接口B0-----------接口B1
测试结果,:
4、代码下载
OVS版本:openvswitch-2.6.1
修改文件路径:/openvswitch-2.6.1/lib/netdev-dpdk.c
(2017-1-18号更新,根据intel的patch做了修改,不需要参数,直接添加dpdkb类型接口就是,ovs默认将dpdk port 0和1作为slave port)(作废)
5、纠正(2017-3-7)
intel的patch可能没有给完整,导致ovs挂掉或是数据发不出去,我还是退回到我自己的版本,
http://pan.baidu.com/s/1hsOIjdi
6、备注
上面的2种方法都是我通过dpdk库的bond实现添加到ovs 代码里的,最新的ovs是不是支持这两种,我还没有研究,在这我只是提供思路,若是有同学想直接拿来用,估计有困难。上面说的核心还是在dpdk bond功能的实现,ovs添加网络设备,所以要搞清楚bond的实现,第一是了解dpdk bond(传参数或是调用bond 接口)的实现,第二是了解在ovs里添加网络设备。看代码才是真感情,否则就是耍流氓。