本文只是针对bond相关的流程,每个函数中只关注bond相关的操作。
bond口添加
首先是ovs-vsctl add-bond
命令添加bond口,这里是配置到ovsdb里面,ovsdb-server进行处理的,我们暂时忽略,我们主要关注的是ovs-vswitchd进程监测到添加了bond口之后的操作。
调用路径如下,主要是bridge_run
函数从ovsdb-server进程得知端口发生了变化,就会去调用bridge_reconfigure
进行重新配置,看样子是配置所有的,我们只关注bond相关的。main-->bridge_run-->bridge_reconfigure
先将DPDK的多个端口添加到桥中,在ovs中的概念就是多个interface,一个port。最终会调用到netdev_dpdk_construct
.
bridge_reconfigure-->bridge_add_ports-->bridge_add_ports__-->iface_create-->iface_do_create-->netdev_open(rc->class->construct)-->netdev_dpdk_construct
接着是端口的配置了port_configure
- 开局先获取该port有多少个interface,即多少slave。
port_configure_lacp
首先是获取LACP的配置,有则调用iface_configure_lacp
配置每个interface。slave > 1
表示是bond口,调用port_configure_bond
- 最后调用
ofproto_bundle_register-->bundle_set
对bond口进行操作
来看一下bundle_set
- 调用
lacp_configure
配置LACP - 调用
bundle_add_port
添加端口 - 如果已经创建了bond口了,则调用
bond_reconfigure
重新配置bond口,没有则调用bond_create
创建bond口,里面也包含了配置。 - 调用
bond_slave_register
注册slave
以上主要就是端口添加的时候的操作,大部分都是数据结构添加和配置保存到结构中,已被运行的时候根据配置运行,接下来我们看一下bond口运行。bond口运行主要是非主线程的操作。
主线程bond口运行
调用流程如下:main-->bridge_run-->bridge_run__-->ofproto_run(p->ofproto_class->run)-->run
run
中有两个bond相关的操作
bundle_run
是bond口的基本操作- 如果需要rebalance的话,
bond_rebalance
会做该操作,这块暂时不看了,没看懂,主要是recirc有点吓datapath的混了,不知道是不是一个,主要就是根据统计的报文大小看情况要不要迁移。
bundle_run
- 如果是LACP协议的话,
lacp_run
主要是根据rx定时器更新slave信息,更新lacp的attache信息,tx定时器超时候,生成并且发送LACPDU报文,重置定时器。 - 是bond口的话,
bond_run
主要是监测连接状态,以防端口down掉不能接收发送报文。 - 如果有需要,
bundle_send_learning_packets
会发送学习报文,主要是自己的MAC和VLAN信息,当是SLB、主备或者是不带协商的LACP时需要发送。
不写了
Bond口的运行分析到这里就差不多,本来觉得应该还有接收发送报文时候的bond相关的接口,但是没有查看到相关的操作,猜测应该是该bond是针对流表的balance,当然是可以rebalance,也就是datapath流表还是有多个物理口,下流表的时候,流表balance给bond的几个口,然后收发报文就都是相当于没有bond口那样的操作了,最后如果有口down掉的时候,从数据结构中删除,然后流表部分做相应的调整(不知道是不是流量迁移),rebalance的时候,也可以流量迁移。
官方给出的bond后使用方式,一般都是normal流表,以后有时间可以从这块去看一下,normal流表的时候怎么去balance流表的。