package edu.usc.enl.dynamicmeasurement.floodlight;
import net.floodlightcontroller.core.*;
import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.core.util.SingletonTask;
import net.floodlightcontroller.threadpool.IThreadPoolService;
import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 11/7/13
* Time: 2:14 PM <br/>
* Just a simple class to make sure the barrier algorithm is implemented right
*/
public class BarrierTest implements IFloodlightModule, IOFSwitchListener, IOFMessageListener {
protected IFloodlightProviderService floodlightProvider;
protected IThreadPoolService threadPool;
@Override
public Collection<Class<? extends IFloodlightService>> getModuleServices() {
return null;
}
@Override
public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
return null;
}
@Override
public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
Collection<Class<? extends IFloodlightService>> l = new ArrayList<>();
l.add(IFloodlightProviderService.class);
l.add(IThreadPoolService.class);
return l;
}
@Override
public void init(FloodlightModuleContext context) throws FloodlightModuleException {
floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
threadPool = context.getServiceImpl(IThreadPoolService.class);
}
@Override
public void startUp(FloodlightModuleContext context) throws FloodlightModuleException {
floodlightProvider.addOFSwitchListener(this);
floodlightProvider.addOFMessageListener(OFType.BARRIER_REPLY, this);
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
}
@Override
public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
System.out.println(sw + "-->" + msg);
return Command.CONTINUE;
}
@Override
public String getName() {
return "BarrierTest";
}
@Override
public boolean isCallbackOrderingPrereq(OFType type, String name) {
return false;
}
@Override
public boolean isCallbackOrderingPostreq(OFType type, String name) {
return false;
}
@Override
public void switchAdded(long switchId) {
Map<OFType, List<IOFMessageListener>> listeners = floodlightProvider.getListeners();
for (Map.Entry<OFType, List<IOFMessageListener>> entry : listeners.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
final IOFSwitch sw = floodlightProvider.getSwitch(switchId);
ScheduledExecutorService ses = threadPool.getScheduledExecutor();
MyRunnable task = new MyRunnable(sw);
SingletonTask flowInfoTask = new SingletonTask(ses, task);
task.setFlowInfoTask(flowInfoTask);
flowInfoTask.reschedule(2, TimeUnit.SECONDS);
}
@Override
public void switchRemoved(long switchId) {
}
@Override
public void switchActivated(long switchId) {
}
@Override
public void switchPortChanged(long switchId, ImmutablePort port, IOFSwitch.PortChangeType type) {
}
@Override
public void switchChanged(long switchId) {
}
private class MyRunnable implements Runnable {
private final IOFSwitch sw;
private SingletonTask flowInfoTask;
public MyRunnable(IOFSwitch sw) {
this.sw = sw;
}
private void setFlowInfoTask(SingletonTask flowInfoTask) {
this.flowInfoTask = flowInfoTask;
}
@Override
public void run() {
OFMessage barrierMsg = floodlightProvider.getOFMessageFactory().getMessage(OFType.BARRIER_REQUEST);
barrierMsg.setXid(sw.getNextTransactionId());
try {
sw.write(barrierMsg, null);
} catch (IOException e) {
e.printStackTrace();
}
sw.flush();
flowInfoTask.reschedule(2, TimeUnit.SECONDS);
}
}
}