如何寫一個Floodlight模塊

目標

這裏完成一個floodligth模塊,這個模塊可以監聽新的MAC地址,並且打印出新的MAC地址以及發現這些MAC地址的交換機的DPID信息.

事前準備

  • 已經裝好floodlight,並且把floodlight導入到eclipse中

  • 已經安裝了mininet或者是物理ovs交換機

創建一個listener

在eclipse中增加一個類

1. 在eclipse項目中增加一個package,叫做net.floodlightcontroller.mactracker

2. 在這個package下增加一個類,叫做MACTracker

(或者以上兩步也可直接合爲一步來做,即直接創建一個類)

3.MACTracker需要實現IOFMessageListener, IFloodlightModule兩個接口。

 

以上步驟詳細具體的做法是:

a). 將“floodlight”項目導入Eclipse中,並在包管理器中展開,然後找到“src/main/java”目錄。
b). 右鍵單擊“src/main/java”目錄,選擇“New / Class”(即 步驟1,2 合爲一步進行)。
c). 在“Package”框中輸入“net.floodlightcontroller.mactracker”。(即 包名)
d). 在“Name”框中輸入“MACTracker”。(即 類名)
e). 接下來找到“Interface”那一欄,點擊旁邊的“Add...”按鈕。
f). 添加“IOFMessageListener”和“IFloodlightModule”,如果點開是一片空白的話,直接在“choose interfaces”裏面搜索這兩個接口的名字即可,再add一下,然後點擊“OK”按鈕。

h). 注意這裏勾選“Inherited abstract methods” 最後點擊對話框上的“Finish”按鈕。

                         




創建好MACTracker類之後,我們在eclipse中會得到如下代碼:

package net.floodlightcontroller.mactracker;
 
import java.util.Collection;
import java.util.Map;
 
import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFType;
import org.projectfloodlight.openflow.types.MacAddress;
 
import net.floodlightcontroller.core.FloodlightContext;
import net.floodlightcontroller.core.IOFMessageListener;
import net.floodlightcontroller.core.IOFSwitch;
import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService;
 
public class MACTracker implements IOFMessageListener, IFloodlightModule {
 
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public boolean isCallbackOrderingPrereq(OFType type, String name) {
        // TODO Auto-generated method stub
        return false;
    }
 
    @Override
    public boolean isCallbackOrderingPostreq(OFType type, String name) {
        // TODO Auto-generated method stub
        return false;
    }
 
    @Override
    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public void init(FloodlightModuleContext context)
            throws FloodlightModuleException {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public void startUp(FloodlightModuleContext context) {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
        // TODO Auto-generated method stub
        return null;
    }
 
}

設置模塊的依賴和初始化函數

在開始前,我們需要引入一些依賴包。使用像eclipse一樣的工具可以很方便的添加,如果你沒有使用eclipse,只需要將下面的代碼添加到類的前面

import net.floodlightcontroller.core.IFloodlightProviderService;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.Set;
import net.floodlightcontroller.packet.Ethernet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

下面往MACTracker這個類中增加三個成員變量,如下

protected IFloodlightProviderService floodlightProvider;
protected Set<Long> macAddresses;
protected static Logger logger;

爲了監聽OpenFlow消息,所以需要一個FloodlightProvider(IFloodlightProviderService class)對象.
爲了保存當前發現的mac地址,需要一個set對象來保存mac地址。
爲了顯示日誌信息,打印mac地址以及交換機的信息,所以需要要給Logger對象
下面我們在getModuleDependencies函數中告訴floodlight,我們需要依賴那些模塊。代碼如下:

@Override
public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
    Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
    l.add(IFloodlightProviderService.class);
    return l;
}

下面修改init函數,init函數在startup函數之前被調用。init函數的作用是加載依賴項以及初始化成員變量。如下:

@Override
public void init(FloodlightModuleContext context) throws FloodlightModuleException {
    floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
    macAddresses = new ConcurrentSkipListSet<Long>();
    logger = LoggerFactory.getLogger(MACTracker.class);
}

處理Packet-In消息

下面來實現基本監聽功能。首先在startUp函數中註冊PACKET_IN消息的處理,負責處理的對象就是this,也就是MacTracerk。這邊在startUp中,可以保證所有的依賴項都已經加載完畢。

@Override
public void startUp(FloodlightModuleContext context) {
    floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
}

對與這個OFMessage監聽器,我們也給他起個名字,覆蓋父類的getName函數,如下:

@Override
public String getName() {
    return MACTracker.class.getSimpleName();
}

下面來實現具體的處理邏輯


@Override
   public net.floodlightcontroller.core.IListener.Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
        Ethernet eth = IFloodlightProviderService.bcStore.get(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
 
        Long sourceMACHash = eth.getSourceMACAddress().getLong();
        if (!macAddresses.contains(sourceMACHash)) {
            macAddresses.add(sourceMACHash);
            logger.info("MAC Address: {} seen on switch: {}",
                    eth.getSourceMACAddress().toString(),
                    sw.getId().toString());
        }
        return Command.CONTINUE;
    }

處理完成之後,爲了讓後續的流程可以繼續處理OFMessage,我們需要return一個Command.CONTINUE;

註冊模塊

首先告訴floodlight我們的模塊存在
修改 src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule文件,在結尾增加包名net.floodlightcontroller.mactracker.MACTracker。如圖

告訴floodlight啓動的時候,把我們的模塊啓動起來。修改src/main/resources/floodlightdefault.properties,增加類名net.floodlightcontroller.mactracker.MACTracker(注意這裏一定要保證所以模塊都變藍),如圖所示:

這樣新的模塊就已經完成。

 

檢驗模塊功能(把mininet連接到floodlight上)

1.啓動floodlight

2. 建立網絡拓撲

打開mininet虛擬機,輸入命令

sudo mn --topo single,3 --controller=remote,ip=<你本機的ip地址>,port=6653 --switch ovsk,protocols=OpenFlow13

結果如下圖所示:

3 查看floodlight輸出結果

在Eclipse的控制檯輸出信息裏,查找MACTracker,可以看到如下信息,可以看到網絡中新接入設備的MAC地址和相關交換機

 


參考:
https://www.jianshu.com/p/30b7f46fdc35

https://segmentfault.com/a/1190000008965431

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章