Completing ipflows
Change-Id: I708abeda057c5001481f5fd3948cce0d47b2be28
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index 961a913..5053163 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -54,6 +54,7 @@
import org.json.JSONArray;
import org.json.JSONException;
+import org.projectfloodlight.openflow.types.EthType;
import org.projectfloodlight.openflow.types.IPv4Address;
import org.projectfloodlight.openflow.util.HexString;
import org.slf4j.Logger;
@@ -494,7 +495,7 @@
if (fwdSws.size() == 1) {
String fwdSw = fwdSws.get(0);
if (mplsLabel.equals(getMplsLabel(fwdSw))) {
- PopMplsAction popAction = new PopMplsAction();
+ PopMplsAction popAction = new PopMplsAction(EthType.IPv4);
CopyTtlInAction copyTtlInAction = new CopyTtlInAction();
actions.add(popAction);
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
index d722da8..61c7de9 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -27,6 +27,7 @@
import net.onrc.onos.core.configmanager.SegmentRouterConfig;
import net.onrc.onos.core.matchaction.MatchAction;
import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
+import net.onrc.onos.core.matchaction.MatchActionOperations;
import net.onrc.onos.core.matchaction.MatchActionOperations.Operator;
import net.onrc.onos.core.matchaction.action.Action;
import net.onrc.onos.core.matchaction.action.CopyTtlInAction;
@@ -823,17 +824,26 @@
ofAction = factory.actions().buildSetField()
.setField(lid).build();
} else if (action instanceof PopMplsAction) {
-
+ EthType ethertype = ((PopMplsAction) action).getEthType();
+ ofAction = factory.actions().popMpls(ethertype);
} else if (action instanceof GroupAction) {
- ofAction = factory.actions().buildGroup()
- .setGroup(OFGroup.of(0)) // TODO fail
- .build();
+ NeighborSet ns = ((GroupAction) action).getDpids();
+ EcmpInfo ei = ecmpGroups.get(ns);
+ if (ei != null) {
+ int gid = ei.groupId;
+ ofAction = factory.actions().buildGroup()
+ .setGroup(OFGroup.of(gid))
+ .build();
+ } else {
+ log.error("Unable to find ecmp group for neighbors {} at "
+ + "switch {}", ns, getStringId());
+ }
} else if (action instanceof DecNwTtlAction) {
-
+ ofAction = factory.actions().decNwTtl();
} else if (action instanceof DecMplsTtlAction) {
-
+ ofAction = factory.actions().decMplsTtl();
} else if (action instanceof CopyTtlInAction) {
-
+ ofAction = factory.actions().copyTtlIn();
} else if (action instanceof CopyTtlOutAction) {
ofAction = factory.actions().copyTtlOut();
} else {
@@ -861,20 +871,35 @@
priority = MAX_PRIORITY;
}
- // set flow-mod XXX - This is only ADD (not doing DELETE yet)
- OFMessage ipFlow = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_IPv4_UNICAST))
- .setMatch(match)
- .setInstructions(instructions)
- .setPriority(priority)
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
-
+ // set flow-mod
+ OFMessage ipFlow = null;
+ if (op == MatchActionOperations.Operator.ADD) {
+ ipFlow = factory.buildFlowAdd()
+ .setTableId(TableId.of(TABLE_IPv4_UNICAST))
+ .setMatch(match)
+ .setInstructions(instructions)
+ .setPriority(priority)
+ .setBufferId(OFBufferId.NO_BUFFER)
+ .setIdleTimeout(0)
+ .setHardTimeout(0)
+ .setXid(getNextTransactionId())
+ .build();
+ } else {
+ ipFlow = factory.buildFlowDeleteStrict()
+ .setTableId(TableId.of(TABLE_IPv4_UNICAST))
+ .setMatch(match)
+ .setInstructions(instructions)
+ .setPriority(priority)
+ .setBufferId(OFBufferId.NO_BUFFER)
+ .setIdleTimeout(0)
+ .setHardTimeout(0)
+ .setXid(getNextTransactionId())
+ .build();
+ }
write(ipFlow, null);
- log.debug("Adding ip-rule {}-{} in sw {}", match, writeActions,
+ log.debug("{} ip-rule {}-{} in sw {}",
+ (op == MatchActionOperations.Operator.ADD) ? "Adding" : "Deleting",
+ match, writeActions,
getStringId());
}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
index 8e59988..38f5617 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
@@ -1,8 +1,15 @@
package net.onrc.onos.core.matchaction.action;
+import org.projectfloodlight.openflow.types.EthType;
+
public class PopMplsAction implements Action {
+ private final EthType ethtype;
- public PopMplsAction() {
+ public PopMplsAction(EthType ethtype) {
+ this.ethtype = ethtype;
+ }
+ public EthType getEthType() {
+ return ethtype;
}
}