解析Floodlight之LinkDiscoveryManager模块

前言

Floodlight作为一款比较成熟的SDN控制器,前期是备受瞩目的,可由于版本更新太慢,且在2014-2015年间又蹿红了新的竞争者如Opendaylight,Onos等控制器,使得Floodlight风光大不如前,不过这主要是企业对Floodlight的态度,而对于更关注SDN架构本身的高校研究者来说,Floodlight相比Opendaylight和Onos更加轻量易读,不需折腾太繁琐的环境和依赖,更有助于对算法的研究。最近几个月,总有小伙伴询问Floodlight的相关问题。说实话,好久没碰了,能记得的内容我会很快解答,有些忘了的还得花时间翻翻代码。去年的毕业论文,我写了对Floodlight 架构的理解。所以我打算将部分内容整理一下(主要是模块的工作流程),写出来以供参考或者备忘。本文即是Floodlight中链路发现模块的解析,如有不正之处,一定提出哈。

LinkDiscoverManager

Floodlight中链路发现功能的实现类是LinkDiscoveryManager模块。该模块的主要工作是:向交换机下发LLDP包和BDDP包以及处理交换机上传的LLDP包和BDDP包,以此来记录全网的链路信息,即每条链路的源/目的交换机MAC地址、源/目的端口号等。

其中,LLDP(Link Layer Discovery Protocol,链路发现协议)包,是一种二层数据包,该数据包标识了交换机的信息,邻居节点间相互广播LLDP来获取对方的存在,并将设备信息保存;BDDP包是BigSwitch公司定义的一种类似LLDP的数据包,BDDP包可以通过不受控制器管理的设备,用以发现一些不是直连的节点组合。比如两交换机中间有设备不受本控制器管理,由于LLDP是由控制器主动下发给交换机,所以这种情况下LLDP包是无法通过中间设备到达两交换机的,而这时控制器通过下发BDDP包通过中间设备来发现两交换机的连接关系。所以LLDP包和BDDP包的区别是前者可以发现直连的设备后者发现间接连接的设备。

解析LinkDiscoverManager多线程

LinkDiscovermanager模块初始化后会启动三个线程,如图所示:
LinkDiscovermanager
图中所示的链路发现模块启动后的处理流程,涉及到三个线程和一个主要方法:

  • 线程discoveryTask主要实现发送LLDP包的任务,每隔1秒运行方法discoverLinks(),discoverLinks()方法中指定了一个计时方法timeoutLinks(),首先会处理掉那些过时了的链路links,其次,每间隔15秒要求全部交换机在所有端口发送LLDP包即运行方法discoverOnAllPorts();
  • 线程bddpTask主要实现发送BDDP包的任务,遍历所有已经发送 LLDP 包的端口, 如果该端口还没有建立过连接, 就发送 BDDP 包;
  • 线程updatesThread主要负责更新消息回调,如果有链路或者端口发生变化,则处理这些更新并发布链路更新消息;
  • 方法handlePacketIn()主要处理交换机上传的Packet-in消息,解析LLDP包。

个人分析,欢迎指正,若转载请注明出处!