如何寫一個floodlight模塊

[譯]如何寫一個floodlight模塊

目標

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

事前準備

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

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

建立一個listener

在eclipse中增長一個類

  1. 在eclipse項目中增長一個package,叫作net.floodlightcontroller.mactracker函數

  2. 在這個package下增長一個類,叫作MACTrackerthis

  3. MACTracker須要實現IOFMessageListener, IFloodlightModule兩個接口,建立好MACTracker類以後,咱們在eclipse中會獲得以下代碼:spa

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;
    }
 
}

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

下面往MACTracker這個類中增長三個成員變量,以下日誌

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

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

@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;

註冊模塊

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

  2. 告訴floodlight啓動的時候,把咱們的模塊啓動起來。修改src/main/resources/floodlightdefault.properties,增長類名net.floodlightcontroller.mactracker.MACTracker,如圖所示:

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

把mininet鏈接到floodlight上

  1. 啓動floodlight

  2. 啓動mininetsudo mn --controller=remote,ip=127.0.0.1,port=6653.執行pingall,在eclipse控制檯中能夠看到打印的信息,如圖:

相關文章
相關標籤/搜索