#controller模塊
controller模塊爲多數應用實現了一些普通通途的功能
1.發現網絡狀態和事件(拓撲結構,設備,流量)
2.能夠控制網絡交換機(network switches)通信(例如,OpenFlow協議)
3.管理floodlight模塊,共享存儲,線程,測試等資源
4.提供一個web界面和debug服務器(Jython)
一下是目前實現的controller模塊:
DeviceManagerImpl (Dev)
LinkDiscoveryManager (Dev)
TopologyService (Dev)
RestApiServer (Dev)
ThreadPool (Dev)
MemoryStorageSource (Dev)
Flow Cache (API only)
acket Streamer
#綜述
DeviceManagerImpl跟蹤設備在網絡中的移動並且爲新流量定義目的設備
#提供的服務
#依賴的服務
IRestApiService
ICounterStoreService
IThreadPoolService
IFlowReconcileService
IFloodlightProviderService
#java文件
net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl.
#工作原理
設備管理器通過請求包學習設備。它從包中提取信息並根據設置的實體分類器分類設備。默認地實體分類器使用mac地址和vlan定義一個設備。
這兩個屬性可以定義一個唯一的設備。設備管理器會學習其他的屬性,例如IP地址。一個重要的地方是設備附件(連接)點,如果見環境交換機上
接收到一個包,一個連接點就會爲這個設備創建。一個設備在每個Openflow island上可以有一個或者多個連接點。OpenFlow Island定義爲
與相同Floodlight Controller交互的一組OpenFlow的強連接集合。設備自身和連接點、ip都會老化,上一次時間戳用來管理其成長過程。
#限制
設備是不可變的。這意味這不能持有設備的引用,設備必須通過 IDeviceService接口查詢獲取。
#配置
本模塊默認啓用,無需更改配置。
#配置選項
無
#REST API
URI Description Arguments
/wm/device/ List of all devices tracked by the controller. This includes MACs, IPs, and attachment points. Passed as GET parameters: mac (colon-separated hex-encoded), ipv4 (dotted decimal),vlan, dpid attachment point DPID (colon-separated hex-encoded) and port the attachment 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,等)轉發到監聽模塊的次序。然後模塊
決定是否處理消息並傳遞到下一個監聽者或者停止處理消息。
#提供的服務
#依賴服務
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/<statType>/json
Retrieve aggregate stats across all switches.statType: port, queue, flow, aggregate, desc, table, features, host
/wm/core/switch/<switchId>/<statType>/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/<counterTitle>/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/<switchId>/<counterName>/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 略。