[ONOS-7493] Segment routing may uninstall forwarding with no next id
Change-Id: Id78b9ed94633b7e96fdeebe185e28d6de386e3ec
diff --git a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
index f0d27f35..8d97f20 100644
--- a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
@@ -30,6 +30,7 @@
import org.onosproject.net.pi.runtime.PiActionParam;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
/**
* Test for fabric interpreter.
@@ -125,6 +126,17 @@
assertEquals(expectedAction, mappedAction);
}
+ /**
+ * Map empty treatment for forwarding block to nop action.
+ */
+ @Test
+ public void testEmptyForwardingTreatment() throws Exception {
+ TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+ PiAction mappedAction = interpreter.mapTreatment(treatment,
+ FabricConstants.TBL_UNICAST_V4_ID);
+ assertNull(mappedAction);
+ }
+
/* Next control block */
/**
diff --git a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
index e65e30b..d29beaa 100644
--- a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
@@ -169,6 +169,18 @@
}
@Test
+ public void testIPv4UnicastWithNoNextId() {
+ TrafficSelector selector = DefaultTrafficSelector.builder()
+ .matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPDst(IPV4_UNICAST_ADDR)
+ .build();
+ TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
+ .matchIPDst(IPV4_UNICAST_ADDR)
+ .build();
+ testSpecificForward(FabricConstants.TBL_UNICAST_V4_ID, expectedSelector, selector, null);
+ }
+
+ @Test
@Ignore
public void testIPv4Multicast() {
TrafficSelector selector = DefaultTrafficSelector.builder()
@@ -234,15 +246,21 @@
private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
TrafficSelector selector, Integer nextId) {
- PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
- ImmutableByteSequence.copyFrom(nextId.byteValue()));
- PiAction setNextIdAction = PiAction.builder()
- .withId(FabricConstants.ACT_FORWARDING_SET_NEXT_ID_ID)
- .withParameter(nextIdParam)
- .build();
- TrafficTreatment setNextIdTreatment = DefaultTrafficTreatment.builder()
- .piTableAction(setNextIdAction)
- .build();
+ TrafficTreatment setNextIdTreatment;
+ if (nextId == null) {
+ // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
+ setNextIdTreatment = DefaultTrafficTreatment.builder().build();
+ } else {
+ PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
+ ImmutableByteSequence.copyFrom(nextId.byteValue()));
+ PiAction setNextIdAction = PiAction.builder()
+ .withId(FabricConstants.ACT_FORWARDING_SET_NEXT_ID_ID)
+ .withParameter(nextIdParam)
+ .build();
+ setNextIdTreatment = DefaultTrafficTreatment.builder()
+ .piTableAction(setNextIdAction)
+ .build();
+ }
testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
@@ -250,16 +268,19 @@
private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
TrafficSelector selector, Integer nextId, TrafficTreatment treatment) {
- ForwardingObjective fwd = DefaultForwardingObjective.builder()
+ ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
.withSelector(selector)
.withPriority(PRIORITY)
.fromApp(APP_ID)
.makePermanent()
- .withFlag(ForwardingObjective.Flag.SPECIFIC)
- .nextStep(nextId)
- .add();
+ .withTreatment(treatment)
+ .withFlag(ForwardingObjective.Flag.SPECIFIC);
- PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
+ if (nextId != null) {
+ fwd.nextStep(nextId);
+ }
+
+ PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd.add());
List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();