Added new class files
Change-Id: Iaf24992560e59e7552e39fd4610d5c669d0afaa7
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyTunnel.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyTunnel.java
new file mode 100644
index 0000000..91f3d29
--- /dev/null
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingPolicyTunnel.java
@@ -0,0 +1,136 @@
+package net.onrc.onos.apps.segmentrouting;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.floodlightcontroller.core.IOF13Switch;
+import net.onrc.onos.apps.segmentrouting.SegmentRoutingTunnel.TunnelRouteInfo;
+import net.onrc.onos.core.matchaction.MatchAction;
+import net.onrc.onos.core.matchaction.MatchActionId;
+import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
+import net.onrc.onos.core.matchaction.MatchActionOperations.Operator;
+import net.onrc.onos.core.matchaction.action.Action;
+import net.onrc.onos.core.matchaction.action.DecNwTtlAction;
+import net.onrc.onos.core.matchaction.action.GroupAction;
+import net.onrc.onos.core.matchaction.match.PacketMatch;
+import net.onrc.onos.core.util.SwitchPort;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.esotericsoftware.minlog.Log;
+
+public class SegmentRoutingPolicyTunnel extends SegmentRoutingPolicy {
+
+ private static final Logger log = LoggerFactory
+ .getLogger(SegmentRoutingPolicyTunnel.class);
+
+ private String tunnelId;
+
+ public SegmentRoutingPolicyTunnel(SegmentRoutingManager srm, String pid,
+ PolicyType type, PacketMatch match, int priority, String tid) {
+ super(srm, pid, type, match, priority);
+ this.tunnelId = tid;
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public boolean createPolicy() {
+
+ SegmentRoutingTunnel tunnelInfo = srManager.getTunnelInfo(tunnelId);
+
+ List<TunnelRouteInfo> routes = tunnelInfo.getRoutes();
+
+ for (TunnelRouteInfo route : routes) {
+ List<Action> actions = new ArrayList<>();
+
+ // Check PHP was done by stitching
+ // If no MPLS label is added, then NW TTL needs to be decremented
+ if (route.getRoute().isEmpty()) {
+ DecNwTtlAction decNwTtlAction = new DecNwTtlAction(1);
+ actions.add(decNwTtlAction);
+ }
+
+ GroupAction groupAction = new GroupAction();
+ groupAction.setGroupId(route.getGroupId());
+ actions.add(groupAction);
+
+ MatchAction matchAction = new MatchAction(new MatchActionId(
+ srManager.getNextMatchActionID()),
+ new SwitchPort((long) 0, (short) 0), match, priority,
+ actions);
+ MatchActionOperationEntry maEntry =
+ new MatchActionOperationEntry(Operator.ADD, matchAction);
+
+ IOF13Switch sw13 = srManager.getIOF13Switch(route.getSrcSwDpid());
+
+ if (sw13 != null) {
+ srManager.printMatchActionOperationEntry(sw13, maEntry);
+ try {
+ sw13.pushFlow(maEntry);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+ else {
+ Log.warn("Cannot find the target switch {}", route.getSrcSwDpid());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean removePolicy() {
+
+ List<Action> actions = new ArrayList<>();
+ int gropuId = 0; // dummy group ID
+ GroupAction groupAction = new GroupAction();
+ groupAction.setGroupId(gropuId);
+ actions.add(groupAction);
+
+ MatchAction matchAction = new MatchAction(new MatchActionId(
+ srManager.getNextMatchActionID()),
+ new SwitchPort((long) 0, (short) 0), match, priority,
+ actions);
+ MatchActionOperationEntry maEntry =
+ new MatchActionOperationEntry(Operator.REMOVE, matchAction);
+
+ SegmentRoutingTunnel tunnel = srManager.getTunnelInfo(tunnelId);
+ if (tunnel == null) {
+ log.warn("Cannot find the tunnel {} for the policy {}", tunnelId,
+ policyId);
+ return false;
+ }
+ List<TunnelRouteInfo> routes = tunnel.getRoutes();
+
+ for (TunnelRouteInfo route : routes) {
+ IOF13Switch sw13 = srManager.getIOF13Switch(route.getSrcSwDpid());
+ if (sw13 == null) {
+ log.warn("Cannt find the switch {}", route.getSrcSwDpid());
+ return false;
+ }
+ else {
+ srManager.printMatchActionOperationEntry(sw13, maEntry);
+ try {
+ sw13.pushFlow(maEntry);
+ } catch (IOException e) {
+ e.printStackTrace();
+ log.debug("policy remove failed due to pushFlow() exception");
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+
+ public String getTunnelId(){
+ return this.tunnelId;
+ }
+
+}