FloodlightProvider

描述:

FloodlightProvider提供了两个主要部分的功能:(1)它处理交换机之间的连接并且将OpenFlow的消息转化成其他模块可以监听的事件。(2)决定某些特定的OpenFlow消息(即PacketInFlowRemovedPortStatus等)被分派到该侦听消息的模块的顺序。然后模块可以决定允许该消息进入下一个监听对象或停止处理消息。

工作原理:

FloodlightProvider使用Netty库来处理到交换机的线程和连接,每个OpenFlow消息将通过一个Netty的线程进行处理,并执行与所有模块的消息相关联的所有逻辑。其他模块也可以注册类似交换机连接或断开和端口状态通知特定事件。FloodlightProvider将把这些线协议通知转换成基于Java的消息,以便其它模块可以处理。为了使模块注册为基于OpenFlow消息的,他们必须实现IOFMessageListener接口。

LinkDiscoveryManager (Dev)

描述:

链接发现服务负责发现和维护OpenFlow网络中的网络链接的状态。

工作原理:

链路发现服务使用LLDPs和广播包检测链路。LLDP的目的MAC01:80C200:00:0 eBDDP目的MACFFFFFFFFFFFF(广播地址),LLDPBDDP的以太类型为 0x88cc 和 0x8999。为了使拓扑结构被正确的学习,还有两个假设:

A).任何交换机(包括OpenFlow交换机)将包括一个本地链路包(LLDP)

B).Honors layer 2 broadcasts

链路可以是直接的或广播的,如果一个LLDP从一个端口被送出并被另一个端口接受,则建立直接的链路,这意味着端口是直连的。如果一个BDDP从一个端口发出,被另一个端口接受,这意味着还有另外一个二层交换机没有这在两个端口之间的控制器的控制下。

TopologyService

描述:

TopologyService为控制器维护拓扑信息,以及在网路中寻找路由。

工作原理:

拓扑服务基于从lLinkDiscoveryService学习到的链路信息进行计算拓扑,该TopologyService保持的一个重要概念是OpenFlow的“island”的想法。一个island被定义为一组同一floodlight实例下强连接dOpenFlow交换机。isLand可以使用在同一个2层域中非OpenFlow的交换机进行互连,例如:

[OF switch 1] -- [OF switch 2] -- [traditional L2 switch] -- [OF switch 3]

两个island将由拓扑服务来形成,isLand1包含switch1switch2,而island2只包含switch3

当前的拓扑信息将被存储在称为拓扑实例的不可变的数据结构中,在拓扑结构中如果有任何变化,一个新的实例将被创建并且拓扑变化通知消息将被调用。如果其他模块想监听拓扑结构的变化,它们需要实现 ITopologyListener接口。

RestApiServer(不解)

描述:

REST API服务器允许模块通过HTTP暴露REST API

工作原理:

REST API服务使用Restlets library。通过REST服务器作为一个依赖的其他模块通过添加一个实现RestletRoutable的类进行公开API。每个RestletRoutable包含附加一个Restlet资源的路由器(最常见的是ServerResource)。用户会附上自己的类扩展Restlet的资源,以处理特定URL的请求。里面的资源注释,如@ GET,@ PUT等,都是选择哪个方法将被用于HTTP请求。序列化通过包含在Restlet库中的Jackson library实现。Jackson可以通过两种方式进行序列化对象,第一,它会自动使用可用的getter对对象进行序列化这些字段,否则,自定义序列化可以创建和注释在类的顶部。

ThreadPool

描述:

ThreadPool是一个floodlight模块被封装为一个JavaScheduledExecutorService,它可用于使线程在特定的时间或周期性地运行。

MemoryStorageSource

描述:

MemoryStorageSource是在内存中的NoSQL风格的存储源。也支持更改通知数据库

Flow Cache

flowCache API 由于记住在网络中一系列不同类型的事件的需要而被定义,而事件的处理,以及如何处理往往构建于不同的Floodlight SDN应用程序。例如,处理交换机/链路故障事件流是大多数应用程序最典型的需要。

Floodlight定义了一个流缓存API和一组框架方法作为通用框架为应用程序开发人员实现适合他们的应用需求的解决方案。

我们正在努力的编写API,晚些时候会提交到floodlight的官方网站上,与此同时,API调用简洁的说明也可以在flow cache源中找到。

 

交换机/链路故障事件的例子:

对于流缓存目的的一个更高层次的解释,我们可以通过switch/link中断事件的生命周期来了解各种被调用的模块。

1.目前,当LinkDiscoveryManager检测到链路或端口出现故障,该事件由在TopologyManager中的一个“NewInstanceWorker”线程处理。请注意,在线程结束时,它调用informListeners,这是一个标记用于告知此事件于其它对处理此事件有兴趣的模块。

2.所以,你会从实现一个实现了ITologyListener接口和topologyChanged()方法的模块开始,并且通过调用TopologyManager.addListener将此模块添加到侦听器列表中。

3.在这个模块中你可以通过 Topology.getLastLinkUpdates()方法获取所有的之前发现的拓扑变化,并对事件进行排序去查看你感兴趣的事件。一个交换机出现故障导致相邻交换机链路断开,所以你应该寻找ILinkDiscoery.UpdateOperation.LINK_REMOVED事件(每个受影响的交换机有一个事件),找到的条目将告诉你所涉及的交换机端口。

4.接下来是要查询每一个受影响的交换机中所有的流表和受影响的端口进行匹配。该查询应该是一个OFStatisticsRequest消息,该消息将通过sw.sendStatsQuery()被送到交换机。

5.一旦查询被发送出去,稍后你会收到响应,为了能够接收到OF包的响应,你的模块必须实现IOFMessageListener接口以及OFType.STATS_REPLY消息。一旦你接收到响应,你会看到它所有的流表项。现在你可以决定是否想要创建删除流表修改消息来清理流表项。

 

这似乎已经解决了这个问题,但我们还没有用到过流缓存以及与其相关的服务接口呢。

流缓存的概念是为了使控制器记录所有有效流,并且当事件被一个控制器的其它模块观察或者实时查询交换机时,此流缓存记录会更新。这种方式整合了不同模块更新和检索流记录。

流高速缓冲存储器的数据结构是留给实现者来决定的,而查询和响应(反流高速缓冲存储器)格式显示在API中。每个查询也可以指定其处理程序。

Flow reconcile类是为了清理缓存以及交换机中的流表项,你可以由多个模块来处理不同的事件,每个模块将实现IFlowReconcileListene接口和reconcileFlows方法。这种方法既可以立即产生操作,你也可以通过OFMatchReconcile对象将决定传递给另一个模块。也有一些接口被定义为保持挂起的查询。

 

Packet Streamer

描述:

Packetstreamer是包流服务,可以选择性的在交换机和控制器之间流式传输OpenFlow包。它包含了两个功能性接口:

1).基于REST的接口来定义自己感兴趣的OpenFlow消息的特性,被称为过滤器

2)一个基于Thrift接口的流过滤的数据包