BUG-1134: Added TCP flag conversions between md-sal and openflowjava 07/7607/3
authorBrent Salisbury <brent.salisbury@gmail.com>
Mon, 2 Jun 2014 19:03:25 +0000 (15:03 -0400)
committerMichal Rehak <mirehak@cisco.com>
Wed, 4 Jun 2014 17:09:59 +0000 (19:09 +0200)
-Conversions from high level model (model-flow-base)
to low level models (ofjava).

-Test included in OpenflowpluginTestCommandProvider
as function addMDFlow f83() for testing.

-Test results here:
https://gist.github.com/04f96a080eb7ee32413b

---- Extensions info (see BUG-1133) ----
Support for extensions in OFPlugin is not going to be implemented
this way (for POC it is temporarily ok). Vendor specific messages
should be modeled in vendor bundle (augmenting MD-SAL or OFJAVA-API
models). Current strategy is based on trasnparent forwarding of
vendor messages through OFPlugin.
More info will be shortly at
https://wiki.opendaylight.org/view/OpenDaylight_OpenFlow_Plugin:Backlog:Extensibility

Change-Id: Ifaa835a43ec8e0b2fb23e84abf121aefdbcde339
Signed-off-by: Brent Salisbury <brent.salisbury@gmail.com>
Signed-off-by: Michal Rehak <mirehak@cisco.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java
test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java

index 30a5ef028d157045164c0f102560c5b65324cbe3..6636c4f0731136fc6bc88d7997a68226d4acc29f 100644 (file)
@@ -85,6 +85,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbI
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
@@ -539,6 +540,10 @@ public class TableFeaturesConvertor {
             } else if (currMatchType
                     .equals(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid.class)) {
                 setMatchEntry(matchEntryBuilder, VlanVid.class, currMatch.isHasMask());
+            } else if (currMatchType
+                    .equals(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlag.class)) {
+                //FIXME: move to extensible support
+                setMatchEntry(matchEntryBuilder, TcpFlag.class, currMatch.isHasMask());
             }
             matchEntriesList.add(matchEntryBuilder.build());
         }
index 7422003e12a66d6574cb9d7971cd05d8b3197083..f40fc6cf3f95e539826da8b2af6e47b42892870c 100644 (file)
@@ -78,6 +78,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbI
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
@@ -473,6 +474,9 @@ public class TableFeaturesReplyConvertor {
                 salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp.class;
             } else if (ofMatchField.equals(VlanVid.class)) {
                 salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid.class;
+            } else if (ofMatchField.equals(TcpFlag.class)) {
+                //FIXME: move to extensible support
+                salMatchField = org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlag.class;
             }
 
             setFieldMatchBuilder.setMatchType(salMatchField);
index 4d3d3d7b1399e8a695e98d372b7683de4afefaba..ad0c7e50483ce3ac78093eadf2d27a7dc293643b 100644 (file)
@@ -55,6 +55,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
@@ -118,6 +120,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcpFlagMatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcpFlagMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
@@ -157,11 +161,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Meta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpFlag;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
@@ -397,6 +403,14 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
             }
         }
 
+        //FIXME: move to extensible support
+        TcpFlagMatch tcpFlagMatch = match.getTcpFlagMatch();
+        if (tcpFlagMatch != null) {
+            if (tcpFlagMatch.getTcpFlag() != null) {
+                matchEntriesList.add(toOfTcpFlag(tcpFlagMatch.getTcpFlag()));
+            }
+        }
+
         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel = match
                 .getTunnel();
         if (tunnel != null) {
@@ -552,6 +566,7 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
         Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
         ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+        TcpFlagMatchBuilder tcpFlagMatchBuilder = new TcpFlagMatchBuilder();
 
         List<MatchEntries> swMatchList = swMatch.getMatchEntries();
 
@@ -885,6 +900,13 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
                     }
                     matchBuilder.setTunnel(tunnelBuilder.build());
                 }
+            } else if (ofMatch.getOxmMatchField().equals(TcpFlag.class)) {
+                //FIXME: move to extensible support
+                TcpFlagMatchEntry tcpFlagMatch = ofMatch.getAugmentation(TcpFlagMatchEntry.class);
+                if (tcpFlagMatch != null) {
+                    tcpFlagMatchBuilder.setTcpFlag(tcpFlagMatch.getTcpFlag());
+                    matchBuilder.setTcpFlagMatch(tcpFlagMatchBuilder.build());
+                }
             }
         }
         return matchBuilder.build();
@@ -1206,6 +1228,18 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
         return matchEntriesBuilder.build();
     }
 
+    //FIXME: move to extensible support
+    private static MatchEntries toOfTcpFlag(Integer tcpFlag) {
+        MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder();
+        matchBuilder.setOxmClass(Nxm1Class.class);
+        matchBuilder.setHasMask(false);
+        matchBuilder.setOxmMatchField(TcpFlag.class);
+        TcpFlagMatchEntryBuilder tcpFlagBuilder = new TcpFlagMatchEntryBuilder();
+        tcpFlagBuilder.setTcpFlag(tcpFlag);
+        matchBuilder.addAugmentation(TcpFlagMatchEntry.class, tcpFlagBuilder.build());
+        return matchBuilder.build();
+    }
+
     private static void addMaskAugmentation(final MatchEntriesBuilder builder, final byte[] mask) {
         MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();
         maskBuilder.setMask(mask);
index 620efed161b185f5422e97c372f10b676eabecf8..fd38c206f4e5b5092b6738ff4e0f0be0df928b81 100644 (file)
@@ -164,6 +164,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
@@ -660,6 +661,11 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider {
             flow.setMatch(createToSMatch().build());
             flow.setInstructions(createOutputInstructions().build());
             break;
+        case "f83":
+            id += 83; // Test TCP_Flag Match
+            flow.setMatch(createTcpFlagMatch().build());
+            flow.setInstructions(createDropInstructions().build());
+            break;
         default:
             LOG.warn("flow type not understood: {}", flowType);
         }
@@ -3201,6 +3207,44 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider {
         return match;
     }
 
+    /**
+     * Test match for TCP_Flags
+     * @return match containing Ethertype (0x0800), IP Protocol (TCP), TCP_Flag (SYN)
+     */
+    //FIXME: move to extensible support
+    private static MatchBuilder createTcpFlagMatch() {
+        MatchBuilder match = new MatchBuilder();
+
+        // Ethertype match
+        EthernetMatchBuilder ethernetType = new EthernetMatchBuilder();
+        EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+        ethTypeBuilder.setType(new EtherType(0x0800L));
+        ethernetType.setEthernetType(ethTypeBuilder.build());
+        match.setEthernetMatch(ethernetType.build());
+
+        // TCP Protocol Match
+        IpMatchBuilder ipMatch = new IpMatchBuilder(); // ipv4 version
+        ipMatch.setIpProtocol((short) 6);
+        match.setIpMatch(ipMatch.build());
+
+        // TCP Port Match
+        PortNumber dstPort = new PortNumber(80);
+        TcpMatchBuilder tcpMatch = new TcpMatchBuilder();
+        tcpMatch.setTcpDestinationPort(dstPort);
+        match.setLayer4Match(tcpMatch.build());
+        /**
+        * Defined TCP Flag values in OVS v2.1+
+        * TCP_FIN 0x001 / TCP_SYN 0x002 / TCP_RST 0x004
+        * TCP_PSH 0x008 / TCP_ACK 0x010 / TCP_URG 0x020
+        * TCP_ECE 0x040 / TCP_CWR 0x080 / TCP_NS  0x100
+        */
+        TcpFlagMatchBuilder tcpFlagMatch = new TcpFlagMatchBuilder();
+        tcpFlagMatch.setTcpFlag(0x002);
+        match.setTcpFlagMatch(tcpFlagMatch.build());
+
+        return match;
+    }
+
     public void _removeMDFlow(CommandInterpreter ci) {
         DataModification<InstanceIdentifier<?>, DataObject> modification = dataBrokerService.beginTransaction();
         NodeBuilder tn = createTestNode(ci.nextArgument());