L2switch架构概述
L2switch作为odl的网络基础模块,依赖于openflowplugin模块的消息,同时也调用它的流表下发功能,整个L2switch模块的架构可以粗略的理解为以下架构图。
其中packethandler、hosttracker、addresstracker模块已在上一篇文章《http://www.sdnlab.com/18285.html》中详细介绍过,此文主要介绍L2switch组件中剩余的其他三个模块: loopremover、l2switch-main、arphandler模块。
ArpHandler模块
Arphandler模块主要是处理openflow交换机以packetin方式上送的arp报文,在54-arphandler.xml配置文件当中有一个设置开关,可以设置arp报文的两种处理方式,一种是is-proactive-flood-mode(主动flood模式),如果设置为true,则new一个ProactiveFloodFlowWriter,而该类实现了OpendaylightInventoryListener以及DataChangeListener接口,针对每一个up的交换机端口安装Flood 流表,如果一个数据包没有匹配其他任意的流表那么这个包就会被广播出去。
如果is-proactive-flood-mode设置为false,则new一个InitialFlowWriter,该类实现了OpendaylightInventoryListener,当发生onNodeUpdated事件之后,每台交换机上安装一个把所有Arp包送到控制器的流(addInitialFlows),同时new一个ArpPacketHandler,用于处理控制器发送来的ARP包,而ArpPacketHandler采用PacketDispatcher发送arp回网络(包括单播sendPacketOut与泛洪floodPacket)。而采用InventoryReader来决定给哪个连接的节点发送数据包。
先分析第一种情况,当is-proactive-flood-mode设置成true时,此时采用的是主动flood模式,在交换机上每个端口都下发一条flood到其他非互联端口的流表,这样arp报文上到交换机时,没有匹配流表,就走flood流表,交换机直接将该报文flood到其他端口。代码入口为ArpHandlerModule .java的createInstance函数。
进入ProactiveFlood模式,new出ProactiveFloodFlowWriter对象,并且注册登记OpendaylightInventoryListener接收器,以及注册监听/Nodes/Node/NodeConnector/ StpStatusAwareNodeConnector数据树的变化。
当交换机连上odl控制器,openflowplugin会发出onNodeUpdated的通知事件,此时进入到flood流表下发流程。
当数据树/Nodes/Node/NodeConnector/StpStatusAwareNodeConnector发生变化,也会进入flood流表下发流程,这里是使用StpStatusDataChangeEventProcessor开一个线程来做。