這裏完成一個floodligth模塊,這個模塊能夠監聽新的MAC地址,而且打印出新的MAC地址以及發現這些MAC地址的交換機的DPID信息.java
已經裝好floodlight,而且把floodlight導入到eclipse中eclipse
已經安裝了mininet或者是物理ovs交換機ide
在eclipse項目中增長一個package,叫作net.floodlightcontroller.mactracker
函數
在這個package下增長一個類,叫作MACTracker
this
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); }
下面來實現基本監聽功能。首先在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.modul
文件,在結尾增長包名net.floodlightcontroller.mactracker.MACTracker
。如圖
告訴floodlight啓動的時候,把咱們的模塊啓動起來。修改src/main/resources/floodlightdefault.properties
,增長類名net.floodlightcontroller.mactracker.MACTracker
,如圖所示:
這樣新的模塊就已經完成。
啓動floodlight
啓動mininetsudo mn --controller=remote,ip=127.0.0.1,port=6653
.執行pingall
,在eclipse控制檯中能夠看到打印的信息,如圖: