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;
     }
 }