rework sfc flows
authorSam Hague <shague@redhat.com>
Thu, 12 Nov 2015 17:30:30 +0000 (12:30 -0500)
committerSam Hague <shague@redhat.com>
Thu, 12 Nov 2015 17:30:30 +0000 (12:30 -0500)
Change-Id: I1789ce135a8b08de4c4321fdd69cec73bc4a638c
Signed-off-by: Sam Hague <shague@redhat.com>
openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/NetvirtSfcWorkaroundOF13Provider.java
openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/SfcClassifierService.java
openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcIT.java

index 4f5b5d49d2b1df30345b2e6ca2cecfd75393f3e0..4d13ddb7e58a5f33b2851f4588ef43c79a9e7070 100644 (file)
@@ -131,14 +131,11 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
             return;
         }
 
-        handleIngressClassifier(rsp, entry);
-        //handleEgressClassifier();
-        //handleSfLoopback();
-        //sfArp and ingressSfLoopback uses linux stack
+        handleRenderedServicePath(rsp, entry);
     }
 
-    private void handleIngressClassifier(RenderedServicePath rsp, Ace entry) {
-        LOG.info("handleIngressClassifier: RSP: {}", rsp);
+    private void handleRenderedServicePath(RenderedServicePath rsp, Ace entry) {
+        LOG.info("handleRenderedServicePath: RSP: {}", rsp);
 
         Matches matches = entry.getMatches();
         if (matches == null) {
@@ -148,14 +145,14 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
 
         List<RenderedServicePathHop> pathHopList = rsp.getRenderedServicePathHop();
         if (pathHopList.isEmpty()) {
-            LOG.warn("handleIngressClassifier: RSP {} has empty hops!!", rsp.getName());
+            LOG.warn("handleRenderedServicePath: RSP {} has empty hops!!", rsp.getName());
             return;
         }
-        LOG.info("handleIngressClassifier: pathHopList: {}", pathHopList);
+        LOG.info("handleRenderedServicePath: pathHopList: {}", pathHopList);
 
         final List<Node> bridgeNodes = nodeCacheManager.getBridgeNodes();
         if (bridgeNodes == null || bridgeNodes.isEmpty()) {
-            LOG.warn("handleIngressClassifier: There are no bridges to process");
+            LOG.warn("handleRenderedServicePath: There are no bridges to process");
             return;
         }
         for (Node bridgeNode : bridgeNodes) {
@@ -180,8 +177,8 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
             RenderedServicePathFirstHop firstRspHop = SfcProviderRenderedPathAPI
                     .readRenderedServicePathFirstHop(rsp.getName());
 
-            LOG.info("handleIngressClassifier: firstRspHop: {}", firstRspHop);
-            LOG.debug("handleIngressClassifier: First Hop IPAddress = {}, Port = {}",
+            LOG.info("handleRenderedServicePath: firstRspHop: {}", firstRspHop);
+            LOG.debug("handleRenderedServicePath: First Hop IPAddress = {}, Port = {}",
                     firstRspHop.getIp().getIpv4Address().getValue(),
                     firstRspHop.getPort().getValue().intValue());
 
@@ -209,7 +206,7 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
             //sfcUtils.getSfIp(firstHop.getServiceFunctionName().getValue());
             nshHeader.setNshTunIpDst(sfIpAddress.getIpv4Address());
             nshHeader.setNshTunUdpPort(firstRspHop.getPort());
-            LOG.debug("handleIngressClassifier: NSH Header = {}", nshHeader);
+            LOG.debug("handleRenderedServicePath: NSH Header = {}", nshHeader);
 
             sfcClassifierService.programIngressClassifier(dataPathId, entry.getRuleName(), matches,
                     nshHeader, vxGpeOfPort, true);
@@ -220,7 +217,7 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
 
             String sfMac = getMacFromExternalIds(bridgeNode, sfDplName);
             String sfIpString = new String(sfIpAddress.getValue());
-            LOG.info("handleIngressClassifier: sfDplName: {}, sfMac: {}, sfOfPort: {}, sfIpAddress: {}",
+            LOG.info("handleRenderedServicePath: sfDplName: {}, sfMac: {}, sfOfPort: {}, sfIpAddress: {}",
                     sfDplName, sfMac, sfOfPort, sfIpString);
             if (sfMac != null) { // install if the sf is on this bridge, expand when using multiple bridges
                 sfcClassifierService.program_sfIngress(dataPathId, GPE_PORT, sfOfPort, sfIpString, sfDplName, true);
@@ -237,12 +234,6 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider
         }
     }
 
-    private String getSfPortName(SfName sfName) {
-        String sfPortName = null;
-
-        return sfPortName;
-    }
-
     private RenderedServicePath getRenderedServicePath (Ace entry) {
         RedirectToSfc sfcRedirect = entry.getActions().getAugmentation(RedirectToSfc.class);
         LOG.debug("Processing ACL entry = {} sfcRedirect = {}", entry.getRuleName(), sfcRedirect);
index 693104d76de6219a7f9c6ca6ec145b69b571c7aa..c597e5eb22d815f1364f22ef6ed3d2f45688269e 100644 (file)
@@ -26,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.cont
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
@@ -35,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti
 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.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
@@ -54,6 +54,14 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
     private static final Logger LOG = LoggerFactory.getLogger(SfcClassifierService.class);
     private static final short TABLE_0 = 0;
     private static final short UDP_SHORT = 17;
+    private static int cookieCounter = 0;
+    private static final int FLOW_INGRESSCLASS = 1;
+    private static final int FLOW_SFINGRESS = 2;
+    private static final int FLOW_SFEGRESS = 3;
+    private static final int FLOW_SFARP = 4;
+    private static final int FLOW_EGRESSCLASS1 = 5;
+    private static final int FLOW_EGRESSCLASS2 = 6;
+    private static final int FLOW_SFCTABLE = 7;
 
     public SfcClassifierService(Service service) {
         super(service);
@@ -71,6 +79,11 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
     @Override
     public void setDependencies(Object impl) {}
 
+    private BigInteger getCookie(int index) {
+        String indexString = new String().format("%02d0000000000%04d", index, cookieCounter++);
+        return new BigInteger(indexString, 16);
+    }
+
     @Override
     public void programIngressClassifier(long dataPathId, String ruleName, Matches matches,
                                          NshUtils nshHeader, long vxGpeOfPort, boolean write) {
@@ -92,6 +105,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_INGRESSCLASS)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_INGRESSCLASS)));
 
         if (write) {
             ActionBuilder ab = new ActionBuilder();
@@ -146,6 +161,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
         flowBuilder.setPriority(1000);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_SFCTABLE)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_SFCTABLE)));
 
         if (write) {
             InstructionsBuilder isb = new InstructionsBuilder();
@@ -184,6 +201,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_EGRESSCLASS1)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_EGRESSCLASS1)));
 
         if (write) {
             InstructionsBuilder isb = new InstructionsBuilder();
@@ -219,6 +238,7 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         }
     }
 
+    // add 3: same match, add in_port sf, priority=40k, move c2 to tun_id, reg0-1, nsp=0,nsi=0
     @Override
     public void programEgressClassifier2(long dataPathId, long vxGpeOfPort, long nsp, short nsi,
                                          int tunnelOfPort, int tunnelId, boolean write) {
@@ -227,6 +247,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
 
         MatchBuilder matchBuilder = new MatchBuilder();
         MatchUtils.createInPortMatch(matchBuilder, dataPathId, vxGpeOfPort);
+        MatchUtils.addNxRegMatch(matchBuilder,
+                new MatchUtils.RegMatch(FlowUtils.REG_FIELD, FlowUtils.REG_VALUE_FROM_LOCAL)).build();
         MatchUtils.addNxNspMatch(matchBuilder, nsp);
         flowBuilder.setMatch(MatchUtils.addNxNsiMatch(matchBuilder, nsi).build());
 
@@ -239,6 +261,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_EGRESSCLASS2)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_EGRESSCLASS2)));
 
         if (write) {
             InstructionsBuilder isb = new InstructionsBuilder();
@@ -246,9 +270,16 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
             List<Action> actionList = Lists.newArrayList();
 
             ActionBuilder ab = new ActionBuilder();
+
+            // don't do this, need it to match on the resubmit side and get past table 10 so it isn't reclassified
+            //ab.setAction(ActionUtils.nxSetNspAction((long)(0)));
+            //ab.setOrder(0);
+            //ab.setKey(new ActionKey(0));
+            //actionList.add(ab.build());
+
             ab.setAction(ActionUtils.nxResubmitAction(tunnelOfPort, TABLE_0));
-            ab.setOrder(0);
-            ab.setKey(new ActionKey(0));
+            ab.setOrder(actionList.size());
+            ab.setKey(new ActionKey(actionList.size()));
             actionList.add(ab.build());
 
             ApplyActionsBuilder aab = new ApplyActionsBuilder();
@@ -290,6 +321,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_SFEGRESS)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_SFEGRESS)));
 
         if (write) {
             InstructionBuilder ib = new InstructionBuilder();
@@ -330,6 +363,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_SFINGRESS)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_SFINGRESS)));
 
         if (write) {
             InstructionBuilder ib = new InstructionBuilder();
@@ -372,6 +407,8 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con
         flowBuilder.setFlowName(flowId);
         flowBuilder.setHardTimeout(0);
         flowBuilder.setIdleTimeout(0);
+        flowBuilder.setCookie(new FlowCookie(getCookie(FLOW_SFARP)));
+        flowBuilder.setCookieMask(new FlowCookie(getCookie(FLOW_SFARP)));
 
         if (write == true) {
             InstructionBuilder ib = new InstructionBuilder();
index 1629bde4ffead693fd2047ae47b2f5c8e0f5b8a9..b11229488209acc704c7c528d2351760161da569 100644 (file)
@@ -569,7 +569,7 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase {
         long datapathId = southbound.getDataPathId(bridgeNode);
 
         Map<String, String> externalIds = Maps.newHashMap();
-        externalIds.put("attached-mac", "01:02:03:04:05:06");
+        externalIds.put("attached-mac", "f6:00:00:0f:00:01");
         southboundUtils.addTerminationPoint(bridgeNode, null, SF1DPLNAME, "internal", null, externalIds);
         southboundUtils.addTerminationPoint(bridgeNode, null, "vm1", "internal");
         southboundUtils.addTerminationPoint(bridgeNode, null, "vm2", "internal");