#controller模块

controller模块为多数应用实现了一些普通通途的功能

1.发现网络状态和事件(拓扑结构,设备,流量)

2.能够控制网络交换机(network switches)通信(例如,OpenFlow协议)

3.管理floodlight模块,共享存储,线程,测试等资源

4.提供一个web界面和debug服务器(Jython)

一下是目前实现的controller模块:

FloodlightProvider (Dev)
DeviceManagerImpl (Dev)
LinkDiscoveryManager (Dev)
TopologyService (Dev)
RestApiServer (Dev)
ThreadPool (Dev)
MemoryStorageSource (Dev)
Flow Cache (API only)
acket Streamer


#综述

DeviceManagerImpl跟踪设备在网络中的移动并且为新流量定义目的设备


#提供的服务

IDeviceService

#依赖的服务

IStorageSourceService
IRestApiService
ICounterStoreService
IThreadPoolService
IFlowReconcileService
IFloodlightProviderService

#java文件


Java代码  
  1. net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl.  


#工作原理

设备管理器通过请求包学习设备。它从包中提取信息并根据设置的实体分类器分类设备。默认地实体分类器使用mac地址和vlan定义一个设备。

这两个属性可以定义一个唯一的设备。设备管理器会学习其他的属性,例如IP地址。一个重要的地方是设备附件(连接)点,如果见环境交换机上

接收到一个包,一个连接点就会为这个设备创建。一个设备在每个Openflow island上可以有一个或者多个连接点。OpenFlow Island定义为

与相同Floodlight Controller交互的一组OpenFlow的强连接集合。设备自身和连接点、ip都会老化,上一次时间戳用来管理其成长过程。


#限制

设备是不可变的。这意味这不能持有设备的引用,设备必须通过 IDeviceService接口查询获取。


#配置

本模块默认启用,无需更改配置。


#配置选项

#REST API

REST API
URI Description Arguments
/wm/device/ List of all devices tracked by the controller. This includes MACs, IPs, and p_w_upload points. Passed as GET parameters: mac (colon-separated hex-encoded), ipv4 (dotted decimal),vlan, dpid p_w_upload point DPID (colon-separated hex-encoded) and port the p_w_upload point port.
Sample REST calls with curl
Getting all devices

curl -s http://localhost:8080/wm/device/

Getting a device with the IP of 1.1.1.1

curl -s http://localhost:8080/wm/device/?ipv4=1.1.1.1


#综述

FloodlightProvider提供两个主要的功能性模块。它处理交换机连接并将OpenFlow消息转换为事件(events)以使其他模块能够监听。

第二个大的功能是它决策某些特定OpenFlow消息(例如,PacketIn, FlowRemoved, PortStatus,等)转发到监听模块的次序。然后模块

决定是否处理消息并传递到下一个监听者或者停止处理消息。


#提供的服务

IFloodlightProviderService


#依赖服务

IStorageSourceService
IPktinProcessingTimeService
IRestApiService
ICounterStoreService
IThreadPoolService



#java文件

本模块在net.floodlightcontroller.core.FloodlightProvider中实现


#工作原理

FloodlightProvider使用Netty处理线程和交换机连接。每个OpenFlow消息会被一个Netty线程处理,并在所有模块中执行该消息相关的逻辑。

其他模块也能注册特定的事件,例如交换机连接、断开连接和端口状态通知等。FloodlightProvider会把这些电报协议的通知转换为其他模块

能够处理的基于Java的消息。要注册OpenFlow消息的模块必须实现IOFMessageListener接口。


#限制


#配置

本模块默认启用,加载本模块无需更改配置


#配置选项

openFlowPortint6633支持OpenFlow设备连接的Tcp监听端口

workerthreadsint2*cpuNumnetty可创建的线程数,默认为0,表示cpu个数的2倍

controlleridStringlocalhostcontroller的ID

roleStringmaster可以使master、slave、equal。Slave controller不会接收来自交换机的连接,它在一边晾着。

#Rest API

REST API

URI Description Arguments

/wm/core/switch/all//json

Retrieve aggregate stats across all switches.statType: port, queue, flow, aggregate, desc, table, features, host


/wm/core/switch///json

Retrieve per switch stats.switchId: Valid Switch DPID (XX:XX:XX:XX:XX:XX:XX:XX)

statType: port, queue, flow, aggregate, desc, table, features, host


/wm/core/controller/switches/json List of all switch DPIDs connected to the controller. none

/wm/core/role/json Gets the current controller role. None.

/wm/core/counter//json List of global traffic counters in the controller (across all switches).counterTitle: "all" or something of the form DPID_Port#OFEventL3/4_Type.  See CounterStore.java for details.

/wm/core/counter///json

List of traffic counters per switch.switchId: Valid Switch DPID

CounterTitle: see above

/wm/core/memory/json

Current controller memory usage. none

/wm/core/module/{all}/json Returns information about modules and their dependencies.all: "all" or "loaded".



#综述

link discovery服务负责发现和维护OpenFlow网络(链路)links的状态


#提供的服务

ILinkDiscoveryService


#依赖的服务

IStorageSourceService

IThreadPoolService

IFloodlightProviderService


#java文件

net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager


#工作原理

link discovery服务使用LLDPsP和广播(也即BDDPs)来探测链路。LLDP目的MAC是01:80:c2:00:00:0e,BDDP目的MAC是ff:ff:ff:ff:ff:ff

(广播地址)。LLDP和BDDP的以太类型分别是0x88cc和0x8999。为了正确理解这个技术做了以下两个假设。

1。任何交换机(包括OpenFlow交换机)都会消耗一个link-local包(LLDP)

2。Honors layer 2 broadcast (第二层广播)

Links(连接)可以是直接(direct)或者广播(broadcast)。如果一个LLDP被从一个端口发出并且在相同的LLDP在另外的端口被收到则直连就会

被建立。这意味着端口是直接连接的。如果一个BDDP从一个端口发出并再其他端口收到则广播连接就被建立了。这意味这有一个二层交

换机的这两个端口不在controller的控制之下。


#限制

#配置

默认自启,不需要更改配置即可加载该模块

#配置选项


REST API

URI Description Arguments

/wm/topology/links/json List of all links detected by the controller. None.

Sample REST calls with curl

Getting all devices


curl -s http://localhost:8080/wm/topology/links/json


#综述

PacketStreamer是一个报文流服务,它能选择性的将Openflow交换报文在任意交换机和它的控制器直接进行流向。它包含两个功能接口:

1。基于rest的接口,定义了openflow消息的特征。也即filter,2.基于thrift的接口,过滤包的流向。


#综述

REST API Server允许模块通过HTTP暴露rest api。

#提供的服务

IRestApiService

#依赖的服务

#java文件

net.floodlightcontroller.restserver.RestApiServer.


#工作原理

rest aip Server使用restlet。更过文档在restlet上。其他模块可以依赖rest server,实现restletRoutable来暴露自己的aip。

每个RestletRoutable包含了一个路由,该路由绑定了restlet资源(最普遍的就是serverResource)。为了处理特定url的请求用户可以

附加它们自己的继承了restlet的resource类。在resource注解中比如@GET、@PUT等是选择使用哪种HTTP请求方法。

序列化是通过jackson完成的,jackson库包含在restlet库中。jackson有两种序列化对象的方法。一个是自动使用对象可用的getter方法

序列化这些域,另一中自定义的序列化方式可用在class之上创建和注解。


#限制

基础路径不能重叠且必须唯一

restlet只能通过服务接口访问模块数据,如果一个模块需要通过rest server暴露数据,它得开放一个获取那个数据的接口。


#配置

无需配置,默认加载

#配置选项

portint8080 rest的http端口


#综述

topologyService为controller维护拓扑信息,同时寻找网络中的路由


#提供的服务

ITopologyService

IRoutingService

#依赖的服务

ILinkDiscoveryService

IThreadPoolService

IFloodlightProviderService

IRestApiService


#java文件

net.floodlightcontroller.topology.TopologyManager


#工作原理

Topology Service在ILinkDiscoveryService中学到的连接信息(link information)的基础上计算拓扑结构。一个重要概念是TopologyService keeps

就是OpenFlow island的概念。island的定义是一组在相同Floodlight实例下的OpenFlow交换机的强连接。islands可以使用非OpenFlow交换机在相同的

2层域中相互连通。举个例子:

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

两个island会被topology Service处理,island1包含交换机1和交换机2,而island2仅包含交换机3

全部的当前拓扑结构被存储在一个叫做topology实例不可变的数据结构中。如果拓扑结构有任何变化,新实例会被创建并且拓扑结构发生变化的通知消息

会被调用。如果其他模块想见他拓扑结构的变化的话,它们可以实现ITopologyListener接口。


#限制

尽管可以有冗余的连接进入OpenFlow island,但是不可以有冗余连接从非OpenFlow交换机进入一个OpenFlow island。


#配置

不需要额外配置,本模块默认加载。

#配置选项

REST API

URI Description Arguments

/wm/topology/switchclusters/json Lists the switch clusters computed by the controller. None.

Sample REST calls with curl

Getting all devices


curl -s http://localhost:8080/wm/topology/switchclusters/json


#综述

Flowcache API概念上被定义为在网络中需要处理的一段不同类型的事件,这决定了在floodlight之上的sdn应用何时以及如何处理

这些事件。例如,处理流量的交换机/连接失败事件是多数应用的典型需求。


floodlight定义了一个flow cache API和一组骨架方法作为应用开发者的通用框架,来实现他们应用需求的定制化解决方案。


过些时候我们会把api公布到floodlight网站上,同时api调用的简单解释可以再flowcache源码中找到。


#switch/link down 事件例子

对于flow cache目的的高层解释,我们可以学习switch/link down事件的生命周期来了解相关设计到的模块。


1.目前当LinkDiscoverManager探测到一个下行(down)的连接或者端口,该事件会被TopologyManager中的

“NewInstanceWorker”线程处理。注意,线程最后会调用informListeners,它会通知其他有兴趣处理该事件的模块。

2.所以,第一步你应该创建一个实现了ITopologyListener接口的模块(实现topologyChanged()方法),并调用

TopologyManager.addListener将该模块加入到监听器(listeners)列表中。

3.在你的模块中,你可以通过调用TopologyManager.getLastUpdates()方法获取到所有之前发现的拓扑变更信息。

并且可以对这些事件排序找到有趣的事件。一个失败的交换机导致相邻交换机的连接下线(down),所以你应该查找ILinkDiscoery.UpdateOperation.LINK_REMOVED

事件(每个受影响的交换机一个事件)。找到的元素会告知你涉及到得交换机端口。

4.下一步是查询每个受影响的交换机当前匹配的受影响端口所承载的全部流量。query是个OFSatisticsRequest 消息,

通过sw.sendStatsQuery()发送到交换机sw。

5.一旦查询送出,等待稍后收到响应。为了收到一个OF包的响应,你的模块也应该事先IOFMessageListener接口,并且指定

为OFType.STATS_REPLY消息。当你获得回应后,就可以在响应中看到全部流量。现在你可以决定是否要创建一个删除流量模型(flowmods)来清空流量了。


OK,这个问题似乎已经解决了。但是目前为止我们还没有用到flowcache和与之相关的服务接口。

flow cache的概念是为controller维持一个全部活动流量的记录,当controller的不同模块观察到事件或者不时地查询交换机

时,flow cache会被更新。它将不同模块流量更新和流量查询整合到了一起。

当查询和响应(依据flow cache)在api中出现时,flow cache 数据结构为实现者决策。每个查询也可指定自己的处理器。

流量协调类清空缓存和交换机的流量。你可以有多个模块处理不同的事件,每个都实现了IFlowReconcileListener 接口和

reconcileFlows方法。本方法导致直接动作,或者可以通过OFMatchReconcil 对象把决策传递给另外的模块。模块中也有保持

跟踪查询等待队列的接口。



#综述

VirtualNetworkFilter模块是基于网络虚拟化的简单二层(MAC)。它允许你在单个二层域中创建多个逻辑二层网络。本模块能用于

OpenStack部署。

#提供的服务

IVirtualNetworkService

#依赖的服务

IDeviceService

IFloodlightProviderService

IRestApiService

#java文件

net.floodlightcontroller.virtualnetwork.VirtualNetworkFilter.

#工作原理

Floodlight启动时没有创建虚拟网络,结果是主机之间不能相互通讯。一旦用户创建了虚拟网络主机,就可以把它加入其中。本模块会

在包消息处理链转发前,将自己插入其中。包接收到后它会查找源mac地址和目的mac地址。如果两个mac地址在相同的虚拟网络中,模块会

返回继续命令(Command.CONTINUE),流量就会继续被处理。如果源mac地址和目的mac地址在不同的网络中,模块会返回停止命令(

Command.STOP),包就被丢弃了。

#限制

物理网络必须在同一个二层域中。

每个虚拟网络仅能有一个网关(它可以被多个虚拟网络共享)

多播和广播没有被隔离

允许所有的DHCP流量

#配置

本模块默认未启用。要加载本模块必须在配置文件中添加配置并重启floodlight。简单的配置文件公布在下面。默认使用的配置文件

在/src/main/resource/quantum.properties

# The default configuration for openstack

floodlight.modules = net.floodlightcontroller.storage.memory.MemoryStorageSource,\

net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,\

net.floodlightcontroller.forwarding.Forwarding,\

net.floodlightcontroller.jython.JythonDebugInterface,\

net.floodlightcontroller.counter.CounterStore,\

net.floodlightcontroller.perfmon.PktInProcessingTime,\

net.floodlightcontroller.ui.web.StaticWebRoutable,\

net.floodlightcontroller.virtualnetwork.VirtualNetworkFilter

net.floodlightcontroller.restserver.RestApiServer.port = 8080

net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633

net.floodlightcontroller.jython.JythonDebugInterface.port = 6655


如果你正在使用floodlight VM,其配置文件已经存在,简单的执行这些命令就可以启用它。

floodlight@localhost:~$ touch /opt/floodlight/floodlight/feature/quantum

floodlight@localhost:~$ sudo service floodlight stop

floodlight@localhost:~$ sudo service floodlight start


restaip and examples 略。