Added a feature to optimize the tunnel for AVOID policy ([101, 103, 104, 106]->[101,104,106] in fish topo)
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 0eee543..c11d604 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -274,8 +274,8 @@
             }
         });
 
-        //testMode = TEST_MODE.POLICY_AVOID;
-        //testTask.reschedule(20, TimeUnit.SECONDS);
+        testMode = TEST_MODE.POLICY_AVOID;
+        testTask.reschedule(20, TimeUnit.SECONDS);
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyAvoid.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyAvoid.java
index 162b1c0..478eeb6 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyAvoid.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyAvoid.java
@@ -89,19 +89,36 @@
 
         Switch srcNode = srManager.getSwitchFromNodeId(
                 labelStack.get(0).toString());
-        Switch dstNode = srManager.getSwitchFromNodeId(
-                labelStack.get(labelStack.size()-1).toString());
+
+        int i = 2;
+        boolean violated = false;
         Switch nodeToCheck = srManager.getSwitchFromNodeId(
-                labelStack.get(labelStack.size()-2).toString());
-
+                labelStack.get(labelStack.size()-i).toString());
+        ECMPShortestPathGraph ecmpGraph = new ECMPShortestPathGraph(srcNode);
         while (!nodeToCheck.getDpid().equals(srcNode)) {
-
-
+            List<Path> paths = ecmpGraph.getECMPPaths(nodeToCheck);
+            for (Path path: paths) {
+                for (LinkData link: path) {
+                    if (link.getSrc().getDpid().equals(switchToAvoid.getDpid())) {
+                        violated = true;
+                        break;
+                    }
+                }
+                if (violated)
+                    break;
+            }
+            if (violated) {
+                i++;
+                nodeToCheck = srManager.getSwitchFromNodeId(
+                        labelStack.get(labelStack.size()-i).toString());
+            }
+            // remove the rest of the label Ids and stop here
+            else {
+                for (int j=1; j<i; j++) {
+                    labelStack.remove(j);
+                    return;
+                }
+            }
         }
-
-
-
-
     }
-
 }