BUG3903: Fix for incorrect egress as well as incorrect VNID. 79/25079/3
authorKeith Burns (alagalah) <alagalah@gmail.com>
Mon, 10 Aug 2015 00:00:53 +0000 (17:00 -0700)
committerKeith Burns <alagalah@gmail.com>
Mon, 10 Aug 2015 16:35:19 +0000 (16:35 +0000)
Change-Id: I0c8b3a7d73f638d584f0e93e438fc20f9b040660
Signed-off-by: Keith Burns (alagalah) <alagalah@gmail.com>
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/ChainActionFlows.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java

index 28509761561b02e1ee1505d165ef804282518949..80f8f43fd0d119ede762f822cea99fd658689c27 100644 (file)
@@ -4,38 +4,33 @@ import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtil
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxNspMatch;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxRegMatch;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxTunIdMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxTunIpv4DstMatch;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.applyActionIns;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.gotoTableIns;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.instructions;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadNshc1RegAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadNshc2RegAction;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadRegAction;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIPv4Action;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIdAction;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxOutputRegAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadNshc1RegAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadNshc2RegAction;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.outputAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxTunIpv4DstMatch;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ChainAction.isSrcEpConsumer;
 
 import java.math.BigInteger;
-import java.util.List;
 
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.RegMatch;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.OrdinalFactory.EndpointFwdCtxOrdinals;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.NetworkElements;
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ChainAction;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
@@ -44,7 +39,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev14
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlanGpe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,16 +52,12 @@ public class ChainActionFlows {
     }
 
     public static void createChainTunnelFlows(SfcNshHeader sfcNshHeader, NetworkElements netElements, FlowMap flowMap,
-            OfContext ctx, boolean swap) {
+            OfContext ctx) {
 
         NodeId localNodeId = netElements.getLocalNodeId();
         NodeId destNodeId = netElements.getDstEp().getAugmentation(OfOverlayContext.class).getNodeId();
         EndpointFwdCtxOrdinals epOrds = netElements.getSrcEpOrds();
 
-        if (swap) {
-            destNodeId = netElements.getSrcEp().getAugmentation(OfOverlayContext.class).getNodeId();
-        }
-
         NodeConnectorId localNodeTunPort = ctx.getSwitchManager().getTunnelPort(localNodeId, TunnelTypeVxlanGpe.class);
         NodeConnectorId destNodeTunPort = ctx.getSwitchManager().getTunnelPort(destNodeId, TunnelTypeVxlanGpe.class);
         if (localNodeTunPort == null || destNodeTunPort == null) {
@@ -85,7 +75,7 @@ public class ChainActionFlows {
                 localNodeId,
                 ctx.getPolicyManager().getTABLEID_EXTERNAL_MAPPER(),
                 createExternalFlow(sfcNshHeader, localNodeTunPort, netElements, ctx.getPolicyManager()
-                    .getTABLEID_EXTERNAL_MAPPER(), ctx, swap));
+                    .getTABLEID_EXTERNAL_MAPPER(), ctx));
 
         flowMap.writeFlow(
                 destNodeId,
@@ -127,29 +117,16 @@ public class ChainActionFlows {
     }
 
     private static Flow createExternalFlow(SfcNshHeader sfcNshHeader, NodeConnectorId tunPort,
-            NetworkElements netElements, short tableId, OfContext ctx, boolean swap) {
+            NetworkElements netElements, short tableId, OfContext ctx) {
 
         Integer priority = 1000;
-        BigInteger destTunnelId;
-        int matchTunnelId;
-        NodeId destNodeId;
-        Long l3c;
-        if (swap) {
-            destTunnelId = BigInteger.valueOf(netElements.getSrcEpOrds().getTunnelId());
-            l3c = Long.valueOf(netElements.getDstEpOrds().getL3Id());
-            matchTunnelId = netElements.getSrcEpOrds().getTunnelId();
-            destNodeId = netElements.getDstEp().getAugmentation(OfOverlayContext.class).getNodeId();
-
-        } else {
-            destTunnelId = BigInteger.valueOf(netElements.getDstEpOrds().getTunnelId());
-            l3c = Long.valueOf(netElements.getSrcEpOrds().getL3Id());
-            matchTunnelId = netElements.getDstEpOrds().getTunnelId();
-            destNodeId = netElements.getSrcEp().getAugmentation(OfOverlayContext.class).getNodeId();
-        }
+        int matchTunnelId=sfcNshHeader.getNshMetaC2().intValue();
+        Long l3c=Long.valueOf(netElements.getSrcEpOrds().getL3Id());
+
         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadC1 = nxLoadNshc1RegAction(sfcNshHeader.getNshMetaC1());
         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadC2 = nxLoadNshc2RegAction(sfcNshHeader.getNshMetaC2());
         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadChainTunVnid = nxLoadTunIdAction(
-                destTunnelId, false);
+                BigInteger.valueOf(sfcNshHeader.getNshMetaC2()), false);
         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadChainTunDest = nxLoadTunIPv4Action(
                 sfcNshHeader.getNshTunIpDst().getValue(), false);
 
@@ -158,9 +135,9 @@ public class ChainActionFlows {
         addNxTunIdMatch(mb, matchTunnelId);
         addNxNspMatch(mb, sfcNshHeader.getNshNspToChain());
         addNxNsiMatch(mb, sfcNshHeader.getNshNsiToChain());
-        if (!destNodeId.equals(netElements.getLocalNodeId())) {
+        if (!netElements.getDstNodeId().equals(netElements.getSrcNodeId())) {
             addNxTunIpv4DstMatch(mb, ctx.getSwitchManager()
-                .getTunnelIP(destNodeId, TunnelTypeVxlan.class)
+                .getTunnelIP(netElements.getDstNodeId(), TunnelTypeVxlanGpe.class)
                 .getIpv4Address());
             priority = 1500;
         }
index cae002bd193403fd10238d1d9458a96a3e2e39db..07c60b5a01b2133d0fd2068a74308bd2ed60cb40 100644 (file)
@@ -19,7 +19,6 @@ package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.ChainActionFlows.createChainTunnelFlows;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxSetNsiAction;
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxSetNspAction;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ChainAction.isSrcEpConsumer;
 
 import java.util.List;
 import java.util.Map;
@@ -74,7 +73,7 @@ import com.google.common.collect.Iterables;
 /**
  * Chain action for the OpenFlow Overlay renderer
  * TODO: separate the generic definition from the concrete
- * implementation for the OpenFlow Ovelray renderer
+ * implementation for the OpenFlow Overlay renderer
  */
 public class ChainAction extends Action {
 
@@ -169,16 +168,6 @@ public class ChainAction extends Action {
             renderedServicePath = rsp;
         }
 
-        NodeId tunnelDestNodeId;
-        if (netElements.getDstNodeId().equals(netElements.getLocalNodeId())) {
-            // Return destination is here
-            tunnelDestNodeId = netElements.getLocalNodeId();
-        } else {
-            tunnelDestNodeId = netElements.getDstNodeId();
-        }
-
-        Long returnVnid = (long) netElements.getSrcEpOrds().getTunnelId();
-
         try {
             if (sfcPath.isSymmetric() && direction.equals(Direction.Out)){
                 rspName = rspName + "-Reverse";
@@ -193,15 +182,6 @@ public class ChainAction extends Action {
                 } else {
                     renderedServicePath = rsp;
                 }
-                if(isSrcEpConsumer(netElements.getSrcEp(), policyPair.getConsumerEpgId(), ctx)) {
-                    if (netElements.getSrcNodeId().equals(netElements.getLocalNodeId())) {
-                        // Return destination is here
-                        tunnelDestNodeId = netElements.getLocalNodeId();
-                    } else {
-                        tunnelDestNodeId = netElements.getSrcNodeId();
-                    }
-                    returnVnid = (long) netElements.getDstEpOrds().getTunnelId();
-                }
             }
         } catch (Exception e) {
             LOG.error("updateAction: Attemping to determine if srcEp {} was consumer.", netElements.getSrcEp().getKey(), e);
@@ -214,6 +194,10 @@ public class ChainAction extends Action {
             return null;
         }
 
+        NodeId tunnelDestNodeId=netElements.getDstNodeId();
+
+        Long returnVnid = (long) netElements.getSrcEpOrds().getTunnelId();
+
         IpAddress tunnelDest = ctx.getSwitchManager().getTunnelIP(tunnelDestNodeId, TunnelTypeVxlanGpe.class);
         if (tunnelDest == null || tunnelDest.getIpv4Address() == null) {
             LOG.error("updateAction: Invalid tunnelDest for NodeId: {}", tunnelDestNodeId);
@@ -238,41 +222,10 @@ public class ChainAction extends Action {
         // chained packets.
         actions = addActionBuilder(actions, nxSetNsiAction(sfcNshHeader.getNshNsiToChain()), order);
         actions = addActionBuilder(actions, nxSetNspAction(sfcNshHeader.getNshNspToChain()), order);
-        boolean swap=false;
-        if ((direction.equals(Direction.Out) && !(isSrcEpConsumer(netElements.getSrcEp(), policyPair.getConsumerEpgId(), ctx)))
-         || (direction.equals(Direction.In) && (isSrcEpConsumer(netElements.getSrcEp(), policyPair.getConsumerEpgId(), ctx)))){
-            swap = true;
-        }
-        createChainTunnelFlows(sfcNshHeader, netElements, flowMap, ctx, swap);
+        createChainTunnelFlows(sfcNshHeader, netElements, flowMap, ctx);
         return actions;
     }
 
-    private boolean usesReversePath(Direction direction, PolicyPair policyPair, NetworkElements netElements, OfContext ctx) {
-        boolean isConsumer;
-        isConsumer = isSrcEpConsumer(netElements.getSrcEp(), policyPair.getConsumerEpgId(), ctx);
-        if (isConsumer && direction.equals(Direction.In)) {
-            return true;
-        }
-        if (!isConsumer && direction.equals(Direction.Out)) {
-            return true;
-        }
-        return false;
-    }
-
-    public static boolean isSrcEpConsumer(Endpoint srcEp, int consumerEpgOrdId, OfContext ctx ){
-        for (EgKey egKey: ctx.getEndpointManager().getEgKeysForEndpoint(srcEp)) {
-            try {
-                if(OrdinalFactory.getContextOrdinal(egKey.getTenantId(),egKey.getEgId()) == consumerEpgOrdId) {
-                    return true;
-                }
-            } catch (Exception e) {
-                LOG.error("isSrcEpConsumer: Could not determine if srcEp {} was consumer", srcEp.getKey());
-                return false;
-            }
-        }
-        return false;
-    }
-
     private RenderedServicePath createRsp(ServiceFunctionPath sfcPath, String rspName) {
         CreateRenderedPathInput rspInput = new CreateRenderedPathInputBuilder().setParentServiceFunctionPath(
                 sfcPath.getName())