Floodlight 处理交换机加入/移除过程

Floodlight 使用的是Netty架构,在Controller.java 入口函数中显示创建ServerBootstrap,设置套接字选项,ChannelPipeline,此时监听套接字就准备好处理来自SW的各种消息;这里最核心的就是 OpenflowPipelineFactory ,会加入各个业务相关的Handler,代码如下:

public ChannelPipeline
getPipeline() throws Exception {

OFChannelState state = new OFChannelState();

ChannelPipeline pipeline = Channels. pipeline();

pipeline.addLast( "ofmessagedecoder", new OFMessageDecoder());

pipeline.addLast( "ofmessageencoder", new OFMessageEncoder());

pipeline.addLast( "idle", idleHandler );

pipeline.addLast( "timeout", readTimeoutHandler );

pipeline.addLast( "handshaketimeout",

new HandshakeTimeoutHandler(state, timer ,
15));

if (pipelineExecutor != null)

pipeline.addLast( "pipelineExecutor",

new ExecutionHandler(pipelineExecutor ));

//OFChannelHandler
是核心

pipeline.addLast( "handler", controller.getChannelHandler(state));

return pipeline;

}

接下来的main loop就是处理交换机或者Controller角色变化等消息,这是我们关注的地方,代码如下:

// main loop

// 不断处理阻塞队列中SW的更新信息

while (true )
{

try {

IUpdate update = updates.take();

update.dispatch();

catch (InterruptedException
e) {

return;

catch (StorageException
e) {

log.error("Storage
exception in controller "

+ "updates loop; terminating
process", e);

return;

catch (Exception
e) {

log.error("Exception
in controller updates loop", e);

}

}

那么Controller中的BlockingQueue中的更新信息是在何时加入的呢?这里只跟踪交换机加入的情况,很容易想到当监听套接字收到一个来自OF SW请求的时候。所以我们看 OFChannelHandler ,可以视为是业务相关的第一个UpstreamHandler,在通道连接的时候会回送一个HELLO消息,这里的重点看处理消息的过程,进入函数 messageReceived
接下来的处理流程(如下),在收到 GET_CONFIG_REPLY 消息之后说明这个SW准备好了(会把握手状态改为 HandshakeState.READY),而后会把这个SW加入到activeSwitches 和 updates中:

更新阻塞队列的代码是:

updateActiveSwitchInfo(sw);

SwitchUpdate update = new SwitchUpdate(sw, true);

try {

//
把update加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断

//
直到BlockingQueue里面有空间再继续.

this.updates .put(update);

catch (InterruptedException
e) {

log.error("Failure
adding update to queue" , e);

}

通过上面的分析,相当于有了一个生产消费者模型,生产者就是交换机的加入或者移除消息,消费者就是Controller的处理过程,取出消息进行计算,为拓扑更新服务。具体过程仍然是一个监听者模式,把SW的更新信息分发到各个订阅者中进行处理(看SwitchUpdate类),代码如下:

          public void dispatch()
{

if (log .isDebugEnabled())
{

log.debug("Dispatching
switch update {} {}", sw, added);

}

//
遍历这些listeners,处理加入或移除事件

if (switchListeners != null)
{

for (IOFSwitchListener
listener : switchListeners) {

if (added )

listener.addedSwitch( sw);

else

listener.removedSwitch( sw);

}

}

}

那么订阅 SwitchUpdate 消息的类是谁呢?LinkDiscoveryManager!交换机的加入或者移除活动肯定会带来链路信息的改变,当加入一个新SW的时候,就会通过发送 LLDP frame 来发现拓扑结构(参见 Floodlight Controller 路由原理 )。代码如下

     public void addedSwitch(IOFSwitch
sw) {

//这里的设计需要优化

//
It‘s probably overkill to send LLDP from all switches, but we don‘t

//
know which switches might be connected to the new switch.

//
Need to optimize when supporting a large number of switches.

sendLLDPTask.reschedule(2000,
TimeUnit.MILLISECONDS );

//
Update event history

evHistTopoSwitch(sw, EvAction. SWITCH_CONNECTED, "None");

}

转载注明出处:http://blog.csdn.net/vonzhoufz/article/details/38043111

时间: 2024-07-29 17:29:10

Floodlight 处理交换机加入/移除过程的相关文章

将标准交换机迁移到vSphere Distributed Switch

虽然我们建立VMware vSphere数据中心时,已经在每一台ESXi主机上设置好了标准交换机,但是这个过程不会直接配置分布式虚拟交换机,所以当重新设置分布式交换机时,会造成不必要的麻烦.VMware已经为vSphere数据中心考虑到此类问题,所有我们可以将标准交换机迁移到vSphere Distributed Switch中而不中断网络连接.但是在迁移的过程中要注意,一旦迁移一个ESXi上的VMkernel网络,一定要迁移其他对应主机的VMkernel网络.加入vCenter的ESXi服务器

floodlight搭建

先要执行如下命令否则会报错: sudo apt-get update 然后开始安装jdk和eclipse: sudo apt-get install build-essential default-jdk ant python-dev eclipse 然后就是漫长的安装过程... 下载最新floodlight源码树: git clone git://github.com/floodlight/floodlight.git 又是漫长的安装过程... 进入floodlight目录,执行如下命令: g

交换机应用之端口模式(access、trunk和hybird)、是否标记(tag、untag)、端口缺省vlan(pvid、native id)

一.概述 打不打标记Tag,untag以及交换机的各种端口模式是网络工程技术人员调试交换机时接触最多的概念了.标记tag就是指VLAN的标签,数据包属于哪个VLAN的.交换机三种端口模式Access vlan.Trunk vlan和Hybrid vlan三种,即以太网端口有三种链路类型:Access.Hybrid和Trunk.在Trunk和Hybird模式下,存在端口缺省vlan的概念(pvid.native vlan id). 二.打不打标记(Tag,untag) tag是指vlan的标签,即

交换机access和trunk的一些小结(转)

以太网端口有 3种链路类型:access.trunk.hybird Access类型端口只能属于1个VLAN 般用于连接计算机 端口: Trunk类型端口可以允许多个VLAN通过,可以接收和发送多个VLAN 报文,一般用于交换机之间的连接: Hybrid类型端口可以允许多个VLAN通过,可以接收和发送多个VLAN 报文,可以用于交换机的间连接也可以用于连接用户计算机. Hybrid端口和Trunk端口在接收数据时处理思路方法是一样的,唯一区别的处在于发送数据时:Hybrid端口可以允许多个VLA

交换机工作原理与配置

以太网交换机分类 2960系:入门级交换机 3560系列:企业级交换机. 4500系列:模块化交换机,可以支持扩展. 6500系列:高端级交换机,主要用于大型企业,电信网通运营商. 交换机的工作原理 1)学习 交换机在转发的过程中会查看自己的MAC地址表,地址表中有目标MAC地址对应的接口号.如果条目中没有源MAC地址,那就对应起来,形成MAC地址表. 2)广播 如果交换机没有在MAC地址表中找到目标数据帧所对应的条目,就不知道从那个接口转发出去,这时候就要广播,好比说:00-00-00-00-

hadoop手工移块

1.关于磁盘使用策略,介绍参考http://www.it165.net/admin/html/201410/3860.html 在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方式: 第一种是沿用hadoop1.0的磁盘目录轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java 第二种是选择可用空间足够多的磁盘方式存储,实现类:AvailableSpaceVolumeChoosingPolicy.java 选择策略对应的配置项是: <pro

交换机三种端口模式Access、Hybrid和Trunk的理解

untag就是普通的ethernet报文,普通PC机的网卡是可以识别这样的报文进行通讯:tag报文结构的变化是在源mac地址和目的mac地址之后,加上了4bytes的vlan信息,也就是vlan tag头:一般来说这样的报文普通PC机的网卡是不能识别的下图说明了802.1Q封装tag报文帧结构带802.1Q的帧是在标准以太网帧上插入了4个字节的标识.其中包含:2个字节的协议标识符(TPID),当前置0x8100的固定值,表明该帧带有802.1Q的标记信息.2个字节的标记控制信息(TCI),包含了

路由和交换机工作原理

路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种“互连”并没有什么实际意义.因此通常在谈到“互连”时,就已经暗示这些相互连接的计算机是可以进行通信的,也就是说,从功能上和逻辑上看,这些计算机网络已经组成了一个大型的计算机网络,或称为互联网络,也可简称为互联网.互连网. 将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继(relay)系统.根据中继系统所在的层次,可以有以下

交换机的Access端口和Trunk端口

交换机上生成的各VLAN(逻辑组)是互不相通的 实现VLAN间通信的方法: 使用路由器 使用三层交换机 VLAN的实现机制 IEEE 802.1Q帧 交换机的端口类型 802.1Q帧是由交换机来处理的,而不是由用户主机来处理的. 当交换机收到普通的以太网帧时,会将其插入4字节的VLAN标识,进而改变为802.1Q帧,简称为"打标签". 当交换机转发802.1Q帧时,可能会删除4字节VLAN标记,进而转变为普通以太网帧,简称"去标签". 在一条Access链路上运动的