TIMER_INTERVAL = timer_interval;
}
}
FloodlightModuleContext fmCntx = new FloodlightModuleContext();
MockFloodlightProvider mfp = new MockFloodlightProvider();
OFMessageFilterManager mfm = new MyOFMessageFilterManager(100);
MockThreadPoolService mtp = new MockThreadPoolService();
fmCntx.addService(IOFMessageFilterManagerService.class, mfm);
fmCntx.addService(IFloodlightProviderService.class, mfp);
fmCntx.addService(IThreadPoolService.class, mtp);
String sid = null;
mfm.init(fmCntx);
mfm.startUp(fmCntx);
ConcurrentHashMap <String, String> filter;
int i;
//Adding the filter works -- adds up to the maximum filter size.
for(i=mfm.getMaxFilterSize(); i > 0; --i) {
filter = new ConcurrentHashMap<String,String>();
filter.put("mac", String.format("00:11:22:33:44:%d%d", i,i));
sid = mfm.setupFilter(null, filter, 60);
assertTrue(mfm.getNumberOfFilters() == mfm.getMaxFilterSize() - i +1);
}
// Add one more to see if you can't
filter = new ConcurrentHashMap<String,String>();
filter.put("mac", "mac2");
mfm.setupFilter(null, filter, 10*1000);
assertTrue(mfm.getNumberOfFilters() == mfm.getMaxFilterSize());
// Deleting the filter works.
mfm.setupFilter(sid, null, -1);
assertTrue(mfm.getNumberOfFilters() == mfm.getMaxFilterSize()-1);
// Creating mock switch to which we will send packet out and
IOFSwitch sw = createMock(IOFSwitch.class);
expect(sw.getId()).andReturn(new Long(0));
// Mock Packet-in
IPacket testPacket = new Ethernet()
.setSourceMACAddress("00:44:33:22:11:00")
.setDestinationMACAddress("00:11:22:33:44:55")
.setEtherType(Ethernet.TYPE_ARP)
.setPayload(
new ARP()
.setHardwareType(ARP.HW_TYPE_ETHERNET)
.setProtocolType(ARP.PROTO_TYPE_IP)
.setHardwareAddressLength((byte) 6)
.setProtocolAddressLength((byte) 4)
.setOpCode(ARP.OP_REPLY)
.setSenderHardwareAddress(Ethernet.toMACAddress("00:44:33:22:11:00"))
.setSenderProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.1"))
.setTargetHardwareAddress(Ethernet.toMACAddress("00:11:22:33:44:55"))
.setTargetProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.2")));
byte[] testPacketSerialized = testPacket.serialize();
// Build the PacketIn
OFPacketIn pi = ((OFPacketIn) BasicFactory.getInstance().getMessage(OFType.PACKET_IN))
.setBufferId(-1)
.setInPort((short) 1)
.setPacketData(testPacketSerialized)
.setReason(OFPacketInReason.NO_MATCH)
.setTotalLength((short) testPacketSerialized.length);
// Mock Packet-out
OFPacketOut packetOut =
(OFPacketOut) mockFloodlightProvider.getOFMessageFactory().getMessage(OFType.PACKET_OUT);
packetOut.setBufferId(pi.getBufferId())
.setInPort(pi.getInPort());
List<OFAction> poactions = new ArrayList<OFAction>();
poactions.add(new OFActionOutput(OFPort.OFPP_TABLE.getValue(), (short) 0));
packetOut.setActions(poactions)
.setActionsLength((short) OFActionOutput.MINIMUM_LENGTH)
.setPacketData(testPacketSerialized)
.setLengthU(OFPacketOut.MINIMUM_LENGTH+packetOut.getActionsLength()+testPacketSerialized.length);
FloodlightContext cntx = new FloodlightContext();
IFloodlightProviderService.bcStore.put(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD, (Ethernet) testPacket);
// Let's check the listeners.
List <IOFMessageListener> lm;
// Check to see if all the listeners are active.
lm = mfp.getListeners().get(OFType.PACKET_OUT);
assertTrue(lm.size() == 1);
assertTrue(lm.get(0).equals(mfm));
lm = mfp.getListeners().get(OFType.FLOW_MOD);
assertTrue(lm.size() == 1);
assertTrue(lm.get(0).equals(mfm));
lm = mfp.getListeners().get(OFType.PACKET_IN);
assertTrue(lm.size() == 1);
assertTrue(lm.get(0).equals(mfm));
HashSet<String> matchedFilters;
// Send a packet in and check if it matches a filter.
matchedFilters = mfm.getMatchedFilters(pi, cntx);
assertTrue(matchedFilters.size() == 1);
// Send a packet out and check if it matches a filter
matchedFilters = mfm.getMatchedFilters(packetOut, cntx);
assertTrue(matchedFilters.size() == 1);
// Wait for all filters to be timed out.
Thread.sleep(150);
assertEquals(0, mfm.getNumberOfFilters());
}