FloodLight--Module
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(Class<T> service)
的方式來取得其他的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>
的成員,用來存取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<IOFMessageListener>> 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