本文只是针对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流表的。

最后修改:2021 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏