[CORD-2582] Adding ARP support to T3
Change-Id: Ie027c47d58cbb473caf065dba75b46f316ac75e9
(cherry picked from commit 236b70250169db9f3231c5e6923fbcb191174d53)
diff --git a/src/test/java/org/onosproject/t3/impl/T3TestObjects.java b/src/test/java/org/onosproject/t3/impl/T3TestObjects.java
index 15cee5f..744b19b 100644
--- a/src/test/java/org/onosproject/t3/impl/T3TestObjects.java
+++ b/src/test/java/org/onosproject/t3/impl/T3TestObjects.java
@@ -51,7 +51,7 @@
*/
final class T3TestObjects {
- private T3TestObjects(){
+ private T3TestObjects() {
//banning construction
}
@@ -106,6 +106,28 @@
static final ConnectPoint SAME_OUTPUT_FLOW_CP = ConnectPoint.deviceConnectPoint(SAME_OUTPUT_FLOW_DEVICE + "/" + 1);
+ //ARP
+ static final DeviceId ARP_FLOW_DEVICE = DeviceId.deviceId("ArpDevice");
+
+ private static final TrafficSelector ARP_FLOW_SELECTOR = DefaultTrafficSelector.builder()
+ .matchInPort(PortNumber.portNumber(1))
+ .matchEthType(EthType.EtherType.ARP.ethType().toShort())
+ .build();
+
+ private static final TrafficTreatment ARP_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
+ .setOutput(PortNumber.CONTROLLER).build();
+ private static final FlowRule ARP_FLOW = DefaultFlowEntry.builder().forDevice(ARP_FLOW_DEVICE)
+ .forTable(0)
+ .withPriority(100)
+ .withSelector(ARP_FLOW_SELECTOR)
+ .withTreatment(ARP_FLOW_TREATMENT)
+ .fromApp(new DefaultApplicationId(0, "TestApp"))
+ .makePermanent()
+ .build();
+ static final FlowEntry ARP_FLOW_ENTRY = new DefaultFlowEntry(ARP_FLOW);
+
+ static final ConnectPoint ARP_FLOW_CP = ConnectPoint.deviceConnectPoint(ARP_FLOW_DEVICE + "/" + 1);
+
//Dual Flow Test
static final DeviceId DUAL_FLOW_DEVICE = DeviceId.deviceId("DualFlowDevice");
@@ -323,10 +345,10 @@
static final FlowEntry HARDWARE_ETH_FLOW_ENTRY = new DefaultFlowEntry(HARDWARE_ETH_FLOW);
-
-
//helper elements
+ static final String MASTER_1 = "Master1";
+
static final Host H1 = new DefaultHost(ProviderId.NONE, HostId.hostId(HOST_ONE), MacAddress.valueOf(100),
VlanId.NONE, new HostLocation(SINGLE_FLOW_DEVICE, PortNumber.portNumber(2), 0),
ImmutableSet.of(IpAddress.valueOf("127.0.0.2")));
@@ -348,6 +370,12 @@
.matchIPDst(IpPrefix.valueOf("127.0.0.3/32"))
.build();
+ static final TrafficSelector PACKET_ARP = DefaultTrafficSelector.builder()
+ .matchInPort(PortNumber.portNumber(1))
+ .matchIPDst(IpPrefix.valueOf("255.255.255.255/32"))
+ .matchEthType(EthType.EtherType.ARP.ethType().toShort())
+ .build();
+
static final TrafficSelector PACKET_FAIL = DefaultTrafficSelector.builder()
.matchInPort(PortNumber.portNumber(1))
.matchIPSrc(IpPrefix.valueOf("127.0.0.1/32"))
diff --git a/src/test/java/org/onosproject/t3/impl/TroubleshootManagerTest.java b/src/test/java/org/onosproject/t3/impl/TroubleshootManagerTest.java
index a8f6524..7ca5136 100644
--- a/src/test/java/org/onosproject/t3/impl/TroubleshootManagerTest.java
+++ b/src/test/java/org/onosproject/t3/impl/TroubleshootManagerTest.java
@@ -24,6 +24,8 @@
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.mastership.MastershipServiceAdapter;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.DefaultDevice;
@@ -32,6 +34,7 @@
import org.onosproject.net.DeviceId;
import org.onosproject.net.Host;
import org.onosproject.net.Link;
+import org.onosproject.net.PortNumber;
import org.onosproject.net.device.DeviceServiceAdapter;
import org.onosproject.net.driver.DefaultDriver;
import org.onosproject.net.driver.Driver;
@@ -79,6 +82,7 @@
mngr.driverService = new TestDriverService();
mngr.groupService = new TestGroupService();
mngr.deviceService = new TestDeviceService();
+ mngr.mastershipService = new TestMastershipService();
assertNotNull("Manager should not be null", mngr);
@@ -120,6 +124,22 @@
log.info("trace {}", traceFail.resultMessage());
}
+ /**
+ * Tests ARP to controller.
+ */
+ @Test
+ public void arpToController() {
+ StaticPacketTrace traceSuccess = mngr.trace(PACKET_ARP, ARP_FLOW_CP);
+ assertNotNull("Trace should not be null", traceSuccess);
+ assertTrue("Trace should be successful",
+ traceSuccess.resultMessage().contains("Packet goes to the controller"));
+ assertTrue("Master should be Master1",
+ traceSuccess.resultMessage().contains(MASTER_1));
+ ConnectPoint connectPoint = traceSuccess.getGroupOuputs(ARP_FLOW_DEVICE).get(0).getOutput();
+ assertEquals("Packet Should go to CONTROLLER", PortNumber.CONTROLLER, connectPoint.port());
+ log.info("trace {}", traceSuccess.resultMessage());
+ }
+
/**
* Tests failure on device with no flows.
@@ -285,6 +305,8 @@
return ImmutableList.of(HARDWARE_ETH_FLOW_ENTRY, HARDWARE_FLOW_ENTRY);
} else if (deviceId.equals(SAME_OUTPUT_FLOW_DEVICE)) {
return ImmutableList.of(SAME_OUTPUT_FLOW_ENTRY);
+ } else if (deviceId.equals(ARP_FLOW_DEVICE)) {
+ return ImmutableList.of(ARP_FLOW_ENTRY);
}
return ImmutableList.of();
}
@@ -400,4 +422,11 @@
return true;
}
}
+
+ private class TestMastershipService extends MastershipServiceAdapter {
+ @Override
+ public NodeId getMasterFor(DeviceId deviceId) {
+ return NodeId.nodeId(MASTER_1);
+ }
+ }
}
\ No newline at end of file