Floodlight把module分成core跟application兩個方向為主
core的部分提供的都是比較核心的功能,譬如PacketIN,PacketOUt,或是拓樸的更動…等
而application則是用這些core的功能來達到一些進階的功能
如防火牆、最短路徑搜尋….等
這邊就簡單研究一下Core Module中的相關功能。
#Core Module#
##FloodlightProvider##
相關檔案
- FloodlightProvider.java
- IFloodlightProviderService.java
- Controller.java (主要功能實現)
###FloodlightProvider.java###
實作 IFloodlightModule
並且override五個function
getModuleServices()
回傳一個含有 IFloodlightProviderService.class 的 Collection Container。getServiceImpls()
回傳一個型態為key = <Class<? extends IFloodlightService> value = IFloodlightService
的map container,已包含一個成員,其value 為 Controler()。
在FloodlightModuleLoader中會執行initModules此function,會把所有要用到的module都產生一份物件,並且透過floodlightModuleContext.addService
把這些物件都收集起來,這樣所有的module就可以透過floodlightModuleContext.getServiceImpl(Classservice)的方式來取得其他的module物件。 getModuleDependencies()
回傳這個module會用到的相關module,在FloodlightModuleLoader中會執行使用BFS的方式來取得所有用到的module,接者才會去執行module相關的初始化行為。init()
module的初始,是個internal的初始化,這個步驟中可以去取得其他module所提供的service以及初始化本module會使用到的data structure。
會在initModules中依序執行每個module的init。startup()
module的初始,是個external的初始,此時可以與其他module進行相關操作,如取得其他module的相關結構,是module相關設定的最後一步驟。
在startupModules中會依序執行毎個module的startup()。
註:初始化的順序是依據BFS跑出來的結果的,沒有任何規律。
###IFloodlightProviderService.java###
繼承自IFloodlightService並且提供一些基本功能,這邊列出幾個重要功能。
bcStore 是一個FloodlightContextStore
的成員,用來存取Ethernet的值,包含了MAC address,VlanID,Ehternet Type。
存取時會用到IFloodlightService 所定義的一個變數CONTEXT_PI_PAYLOADaddOFMessageListener(OFType type, IOFMessageListener listener)
註冊成為OpenFlow message Listener。
OFType 共有
(HELLO
ERROR
ECHO_REQUEST
ECHO_REPLY
VENDOR
FEATURES_REQUEST
FEATURES_REPLY
GET_CONFIG_REQUEST
GET_CONFIG_REPLY
SET_CONFIG
ACKET_IN FLOW_REMOVED
PORT_STATUS
PACKET_OUT
FLOW_MOD
PORT_MOD
STATS_REQUEST
STATS_REPLY
BARRIER_REQUEST
BARRIER_REPLY
QUEUE_GET_CONFIG_REQUEST
QUEUE_GET_CONFIG_REPLY)
IOFMessageListener 則是一個Interface,必須實做該介面並override下列function。public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx);
removeOFMessageListener(OFType type, IOFMessageListener listener)
取消註冊,與(2)對應。Map<OFType, List
> getListeners();
取得所有Listener。Map<Long, IOFSwitch> getSwitches()
取得所有連上的switch與其IDpublic void addOFSwitchListener(IOFSwitchListener listener);
加入一個Switch Listener,這樣此module就可以聽取相關Switch 相關 event。
IOFSwitchListener 是一個Interface,必須實做該介面並且override下列function。public void addedSwitch(IOFSwitch sw);
public void removedSwitch(IOFSwitch sw);
public void switchPortChanged(Long switchId);
public String getName();
removeOFSwitchListener(IOFSwitchListener listener);
取消註冊,與(7)對應public boolean injectOfMessage(IOFSwitch sw, OFMessage msg);
把某個OpenFlow Message送回controller重新處理一次。public void handleOutgoingMessage(IOFSwitch sw, OFMessage m,FloodlightContext bc);
還不是很確定public void addInfoProvider(String type, IInfoProvider provider);
加入一個Info Provider。
IInfoProvider是個介面,必須override下列function。public Map<String, Object> getInfo(String type);
當rest API發出 特定type的請求時,就會呼叫到getInfo(type)。public void removeInfoProvider(String type, IInfoProvider provider);
取消一個Provider,與(10)對應。
###Controller.java###
##DeviceManager##
##LinkDiscoveryManager##
##TopologyService##
##RestApiServer##
##ThreadPool##
##MemoryStorageSource##
##FlowCatch##
##PacketStreamer##
#Application Modules#
##Forwarding##
##Firewall##
#Reference#
For Developers - Floodlight Controller - OpenFlowHub - OpenFlow news and projects