Giant patch of changes to support OpenFlow 1.3
The following people have contributed to this patch:
- Ali Al-Shabibi <alshabibi.ali@gmail.com>
- Ayaka Koshibe <ayaka@onlab.us>
- Brian O'Connor <bocon@onlab.us>
- Jonathan Hart <jono@onlab.us>
- Matteo Gerola <mgerola@create-net.org>
- Michele Santuari <michele.santuari@create-net.org>
- Pavlin Radoslavov <pavlin@onlab.us>
- Saurav Das <sauravdas@alumni.stanford.edu>
- Toshio Koide <t-koide@onlab.us>
- Yuta HIGUCHI <y-higuchi@onlab.us>
The patch includes the following changes:
- New Floodlight I/O loop / state machine
- New switch/port handling
- New role management (incl. Role.EQUAL)
- Added Floodlight debug framework
- Updates to Controller.java
- Move to Loxigen's OpenflowJ library
- Added OF1.3 support
- Added support for different switches (via DriverManager)
- Updated ONOS modules to use new APIs
- Added and updated unit tests
Change-Id: Ic70a8d50f7136946193d2ba2e4dc0b4bfac5f599
diff --git a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
index 5f22091..7e552ed 100644
--- a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
@@ -39,8 +39,13 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.openflow.protocol.OFPacketIn;
-import org.openflow.protocol.OFType;
+import org.projectfloodlight.openflow.protocol.OFFactories;
+import org.projectfloodlight.openflow.protocol.OFFactory;
+import org.projectfloodlight.openflow.protocol.OFPacketIn;
+import org.projectfloodlight.openflow.protocol.OFPacketInReason;
+import org.projectfloodlight.openflow.protocol.OFType;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.types.OFPort;
/**
* Unit tests for the Host Manager module (HostManger).
@@ -61,6 +66,7 @@
private IEventChannel<Long, Host> eventChannel;
private IFloodlightProviderService floodlightProvider;
private Date lastSeenTimestamp;
+ private OFFactory ofact;
@Override
@Before
@@ -102,6 +108,8 @@
modContext.addService(IFloodlightProviderService.class, floodlightProvider);
modContext.getServiceImpl(IFloodlightProviderService.class);
sw1Dpid = 1L;
+ ofact = OFFactories.getFactory(OFVersion.OF_10);
+
sw1 = createMockSwitch(sw1Dpid);
replay(sw1);
@@ -121,10 +129,8 @@
.setTtl((byte) 128)
.setSourceAddress("192.168.10.1")
.setDestinationAddress("192.168.255.255")
- .setPayload(new UDP()
- .setSourcePort((short) 5000)
- .setDestinationPort((short) 5001)
- .setPayload(new Data(new byte[]{0x01}))));
+ .setPayload(getUDP(new Data(new byte[]{0x01}))));
+
/*
* Normal IPv4 packet
*/
@@ -137,10 +143,8 @@
.setTtl((byte) 128)
.setSourceAddress("192.168.1.1")
.setDestinationAddress("192.168.1.2")
- .setPayload(new UDP()
- .setSourcePort((short) 5000)
- .setDestinationPort((short) 5001)
- .setPayload(new Data(new byte[]{0x01}))));
+ .setPayload(getUDP(new Data(new byte[]{0x01}))));
+
/*
* Same MAC header as pkt1,but not IP address set
*/
@@ -151,10 +155,8 @@
.setPayload(
new IPv4()
.setTtl((byte) 128)
- .setPayload(new UDP()
- .setSourcePort((short) 5000)
- .setDestinationPort((short) 5001)
- .setPayload(new Data(new byte[]{0x01}))));
+ .setPayload(getUDP(new Data(new byte[]{0x01}))));
+
/*
* DHCP packet
*/
@@ -167,11 +169,7 @@
.setTtl((byte) 128)
.setSourceAddress("192.168.1.1")
.setDestinationAddress("192.168.1.2")
- .setPayload(new UDP()
- .setSourcePort((short) 5000)
- .setDestinationPort((short) 5001)
- .setChecksum((short) 0)
- .setPayload(
+ .setPayload(getUDP(
new DHCP()
.setOpCode(DHCP.OPCODE_REPLY)
.setHardwareType(DHCP.HWTYPE_ETHERNET)
@@ -204,9 +202,8 @@
.setTargetProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.2")));
- this.pktIn = new OFPacketIn().setInPort((short) sw1DevPort);
-
- this.pktIn2 = new OFPacketIn().setInPort((short) sw1DevPort2);
+ this.pktIn = getPacketIn((short) sw1DevPort);
+ this.pktIn2 = getPacketIn((short) sw1DevPort2);
lastSeenTimestamp = new Date(1);
}
@@ -230,7 +227,8 @@
Ethernet eth = (Ethernet) pkt1;
Host srcHost = hostManager.getSourceHostFromPacket(eth, sw1Dpid, sw1DevPort);
- floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(HostManager.class));
+ floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
+ EasyMock.isA(HostManager.class));
srcHost.setLastSeenTimestamp(lastSeenTimestamp);
assertEquals(lastSeenTimestamp, srcHost.getLastSeenTimestamp());
}
@@ -278,7 +276,8 @@
hostManager.init(modContext);
hostManager.startUp(modContext);
- Command cmd = hostManager.processPacketIn(sw1, pktIn, (Ethernet) pkt1);
+ Command cmd = hostManager.processPacketIn(
+ sw1, pktIn, (Ethernet) pkt1, (short) sw1DevPort);
assertEquals(Command.CONTINUE, cmd);
EasyMock.verify(floodlightProvider);
@@ -297,7 +296,8 @@
hostManager.init(modContext);
hostManager.startUp(modContext);
- Command cmd = hostManager.processPacketIn(sw1, pktIn2, (Ethernet) pkt1);
+ Command cmd = hostManager.processPacketIn(
+ sw1, pktIn2, (Ethernet) pkt1, (short) sw1DevPort2);
assertEquals(Command.CONTINUE, cmd);
EasyMock.verify(floodlightProvider);
@@ -308,7 +308,8 @@
*/
@Test
public void testProcessPacketInStop() {
- Command cmd = hostManager.processPacketIn(sw1, pktIn, (Ethernet) pkt0);
+ Command cmd = hostManager.processPacketIn(
+ sw1, pktIn, (Ethernet) pkt0, (short) sw1DevPort);
assertEquals(Command.STOP, cmd);
}
@@ -322,7 +323,8 @@
Long longmac = eth.getSourceMAC().toLong();
Host srcHost = hostManager.getSourceHostFromPacket(eth, sw1Dpid, sw1DevPort);
- floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(HostManager.class));
+ floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
+ EasyMock.isA(HostManager.class));
EasyMock.expectLastCall();
floodlightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
EasyMock.expectLastCall();
@@ -344,7 +346,8 @@
Ethernet eth = (Ethernet) pkt1;
Host srcHost = hostManager.getSourceHostFromPacket(eth, sw1Dpid, sw1DevPort);
- floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(HostManager.class));
+ floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
+ EasyMock.isA(HostManager.class));
EasyMock.expectLastCall();
floodlightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
EasyMock.expectLastCall();
@@ -366,7 +369,8 @@
Ethernet eth = (Ethernet) pkt1;
MACAddress mac = eth.getSourceMAC();
- floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(HostManager.class));
+ floodlightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
+ EasyMock.isA(HostManager.class));
EasyMock.expectLastCall();
floodlightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
EasyMock.expectLastCall();
@@ -378,4 +382,23 @@
EasyMock.verify(floodlightProvider);
}
+
+ /**
+ * Helper for building PacketIns. Defaults to a flowtable miss.
+ * @param inport the inport field value
+ * @return a PacketIn
+ */
+ private OFPacketIn getPacketIn(int inport) {
+ return ofact.buildPacketIn()
+ .setInPort(OFPort.of(inport))
+ .setReason(OFPacketInReason.NO_MATCH)
+ .build();
+ }
+
+ private UDP getUDP(IPacket payload) {
+ return (UDP) new UDP()
+ .setSourcePort((short) 5000)
+ .setDestinationPort((short) 5001)
+ .setPayload(payload);
+ }
}