这里完成一个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控制台中能够看到打印的信息,如图: