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

  1. getModuleServices()
    回傳一個含有 IFloodlightProviderService.class 的 Collection Container。

  2. getServiceImpls()
    回傳一個型態為 key = <Class<? extends IFloodlightService> value = IFloodlightService的map container,已包含一個成員,其value 為 Controler()。
    在FloodlightModuleLoader中會執行initModules此function,會把所有要用到的module都產生一份物件,並且透過floodlightModuleContext.addService把這些物件都收集起來,這樣所有的module就可以透過floodlightModuleContext.getServiceImpl(Class service)的方式來取得其他的module物件。

  3. getModuleDependencies()
    回傳這個module會用到的相關module,在FloodlightModuleLoader中會執行使用BFS的方式來取得所有用到的module,接者才會去執行module相關的初始化行為。

  4. init()
    module的初始,是個internal的初始化,這個步驟中可以去取得其他module所提供的service以及初始化本module會使用到的data structure。
    會在initModules中依序執行每個module的init。

  5. startup()
    module的初始,是個external的初始,此時可以與其他module進行相關操作,如取得其他module的相關結構,是module相關設定的最後一步驟。
    在startupModules中會依序執行毎個module的startup()。

註:初始化的順序是依據BFS跑出來的結果的,沒有任何規律。

###IFloodlightProviderService.java###
繼承自IFloodlightService並且提供一些基本功能,這邊列出幾個重要功能。

  1. bcStore 是一個FloodlightContextStore 的成員,用來存取Ethernet的值,包含了MAC address,VlanID,Ehternet Type。
    存取時會用到IFloodlightService 所定義的一個變數CONTEXT_PI_PAYLOAD

  2. addOFMessageListener(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);

  3. removeOFMessageListener(OFType type, IOFMessageListener listener)
    取消註冊,與(2)對應。

  4. Map> getListeners();
    取得所有Listener。

  5. Map getSwitches()
    取得所有連上的switch與其ID

  6. public 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();

  7. removeOFSwitchListener(IOFSwitchListener listener);
    取消註冊,與(7)對應

  8. public boolean injectOfMessage(IOFSwitch sw, OFMessage msg);
    把某個OpenFlow Message送回controller重新處理一次。

  9. public void handleOutgoingMessage(IOFSwitch sw, OFMessage m,FloodlightContext bc);
    還不是很確定

  10. public void addInfoProvider(String type, IInfoProvider provider);
    加入一個Info Provider。
    IInfoProvider是個介面,必須override下列function。
    public Map<String, Object> getInfo(String type);
    當rest API發出 特定type的請求時,就會呼叫到getInfo(type)。

  11. 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