NXM_NX_NSI openflow extended match support. 29/9929/1
authorMadhu Venugopal <mavenugo@gmail.com>
Wed, 13 Aug 2014 20:32:08 +0000 (13:32 -0700)
committerMadhu Venugopal <mavenugo@gmail.com>
Wed, 13 Aug 2014 20:32:08 +0000 (13:32 -0700)
Sample output:
[root@localhost ~]# ovs-ofctl dump-flows br-int -O OpenFlow13
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x0, duration=3.639s, table=1, n_packets=0, n_bytes=0, send_flow_rem ip,nsp=1000,nsi=250,nw_dst=1.1.1.1 actions=set_nsp:0x3e8,set_nsi:45

Change-Id: I449b8179add3eb164eab45e97f8886cb4d8ed23f
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraExtensionsRegistrator.java
of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NiciraMatchCodecs.java
of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NsiCodec.java [new file with mode: 0644]
of-extension/nx-ofjava/src/main/yang/ovs-nx-match.yang
of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/NiciraExtensionProvider.java
of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/MatchUtil.java
of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NsiConvertor.java [new file with mode: 0644]
of-extension/nx-sal/src/main/yang/ovs-nx-sal-match.yang

index a7ce3f27442d36798242d2f518163ff0a24f2abd..769f761fbf172f11398c785a286dee29fdd70d8d 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.ovs.nx.ofjava.codec.action.SetNsiCodec;
 import org.opendaylight.ovs.nx.ofjava.codec.action.SetNspCodec;
 import org.opendaylight.ovs.nx.ofjava.codec.match.NiciraMatchCodecs;
 import org.opendaylight.ovs.nx.ofjava.codec.match.NspCodec;
+import org.opendaylight.ovs.nx.ofjava.codec.match.NsiCodec;
 
 import com.google.common.base.Preconditions;
 
@@ -39,6 +40,10 @@ public class NiciraExtensionsRegistrator implements AutoCloseable {
 
         registrator.registerMatchEntrySerializer(NspCodec.SERIALIZER_KEY, NiciraMatchCodecs.NSP_CODEC);
         registrator.registerMatchEntryDeserializer(NspCodec.DESERIALIZER_KEY, NiciraMatchCodecs.NSP_CODEC);
+
+        registrator.registerMatchEntrySerializer(NsiCodec.SERIALIZER_KEY, NiciraMatchCodecs.NSI_CODEC);
+        registrator.registerMatchEntryDeserializer(NsiCodec.DESERIALIZER_KEY, NiciraMatchCodecs.NSI_CODEC);
+
     }
 
     public void unregisterExtensions() {
@@ -52,6 +57,8 @@ public class NiciraExtensionsRegistrator implements AutoCloseable {
 
         registrator.unregisterMatchEntrySerializer(NspCodec.SERIALIZER_KEY);
         registrator.unregisterMatchEntryDeserializer(NspCodec.DESERIALIZER_KEY);
+        registrator.unregisterMatchEntrySerializer(NsiCodec.SERIALIZER_KEY);
+        registrator.unregisterMatchEntryDeserializer(NsiCodec.DESERIALIZER_KEY);
     }
 
     @Override
index 26c22467a9347412b41765e80b8294f753efe88c..785e68545f596640257e79fbd1d24e810caaca7e 100644 (file)
@@ -10,4 +10,5 @@
 package org.opendaylight.ovs.nx.ofjava.codec.match;
 public class NiciraMatchCodecs {
     public static final NspCodec NSP_CODEC = new NspCodec();
+    public static final NsiCodec NSI_CODEC = new NsiCodec();
 }
diff --git a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NsiCodec.java b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NsiCodec.java
new file mode 100644 (file)
index 0000000..9d81305
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+
+package org.opendaylight.ovs.nx.ofjava.codec.match;
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.openflowjava.nx.codec.match.AbstractMatchCodec;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.NxmNxNsi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.OfjAugNxMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.OfjAugNxMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.ofj.nxm.nx.match.nsi.grouping.NsiValuesBuilder;
+
+public class NsiCodec extends AbstractMatchCodec {
+
+    private static final int VALUE_LENGTH = 1;
+    private static final int NXM_FIELD_CODE = 38;
+    public static final MatchEntrySerializerKey<Nxm1Class, NxmNxNsi> SERIALIZER_KEY = new MatchEntrySerializerKey<>(
+            EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxNsi.class);
+    public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey(
+            EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE);
+
+    @Override
+    public void serialize(MatchEntries input, ByteBuf outBuffer) {
+        serializeHeader(input, outBuffer);
+        Short nsi = input.getAugmentation(OfjAugNxMatch.class).getNsiValues().getNsi();
+        outBuffer.writeByte(nsi.byteValue());
+    }
+
+    @Override
+    public MatchEntries deserialize(ByteBuf message) {
+        MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message);
+        OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder();
+        augNxMatchBuilder.setNsiValues(new NsiValuesBuilder().setNsi(message.readUnsignedByte()).build());
+        matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build());
+        return matchEntriesBuilder.build();
+    }
+
+    @Override
+    public int getNxmFieldCode() {
+        return NXM_FIELD_CODE;
+    }
+
+    @Override
+    public int getOxmClassCode() {
+        return OxmMatchConstants.NXM_1_CLASS;
+    }
+
+    @Override
+    public int getValueLength() {
+        return VALUE_LENGTH;
+    }
+
+    @Override
+    public Class<? extends MatchField> getNxmField() {
+        return NxmNxNsi.class;
+    }
+
+    @Override
+    public Class<? extends OxmClassBase> getOxmClass() {
+        return Nxm1Class.class;
+    }
+}
index 2c2db1f05bda2f95c413cdb0e8b4650810a51b5f..9391d409ef3922a2e924a2982798b15237004c23 100644 (file)
@@ -20,6 +20,10 @@ module ovs-nx-match {
         base ofoxm:match-field;
     }
 
+    identity nxm-nx-nsi {
+        base ofoxm:match-field;
+    }
+
     grouping ofj-nxm-nx-match-nsp-grouping {
         container nsp-values {
             leaf nsp {
@@ -28,8 +32,17 @@ module ovs-nx-match {
         }
     }
 
+    grouping ofj-nxm-nx-match-nsi-grouping {
+        container nsi-values {
+            leaf nsi {
+                type uint8;
+            }
+        }
+    }
+
     augment "/ofoxm:oxm-container/ofoxm:match-entries" {
         ext:augment-identifier "ofj-aug_nx_match";
         uses ofj-nxm-nx-match-nsp-grouping;
+        uses ofj-nxm-nx-match-nsi-grouping;
     }
 }
\ No newline at end of file
index 60902ad18980b8970cdb0273896ce6f3a7d957b6..bf389006b5955decb2b30b8ac81f0202c548b493 100644 (file)
@@ -17,10 +17,12 @@ import org.opendaylight.ovs.nx.sal.convertor.action.ResubmitConvertor;
 import org.opendaylight.ovs.nx.sal.convertor.action.SetNsiConvertor;
 import org.opendaylight.ovs.nx.sal.convertor.action.SetNspConvertor;
 import org.opendaylight.ovs.nx.sal.convertor.match.NspConvertor;
+import org.opendaylight.ovs.nx.sal.convertor.match.NsiConvertor;
 import org.opendaylight.ovs.nx.ofjava.codec.action.ResubmitCodec;
 import org.opendaylight.ovs.nx.ofjava.codec.action.SetNsiCodec;
 import org.opendaylight.ovs.nx.ofjava.codec.action.SetNspCodec;
 import org.opendaylight.ovs.nx.ofjava.codec.match.NspCodec;
+import org.opendaylight.ovs.nx.ofjava.codec.match.NsiCodec;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
@@ -55,6 +57,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.update.group.input.original.group.buckets.bucket.action.action.NxActionSetNsiRpcUpdateGroupOriginalCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.update.group.input.updated.group.buckets.bucket.action.action.NxActionSetNsiRpcUpdateGroupUpdatedCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNspKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNsiKey;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,6 +76,7 @@ public class NiciraExtensionProvider implements AutoCloseable {
     private final static SetNspConvertor SET_NSP_CONVERTOR = new SetNspConvertor();
     private final static SetNsiConvertor SET_NSI_CONVERTOR = new SetNsiConvertor();
     private final static NspConvertor NSP_CONVERTOR = new NspConvertor();
+    private final static NsiConvertor NSI_CONVERTOR = new NsiConvertor();
 
     @Override
     public void close() {
@@ -137,6 +141,9 @@ public class NiciraExtensionProvider implements AutoCloseable {
 
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxNspKey.class, EncodeConstants.OF13_VERSION_ID), NSP_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(NspCodec.SERIALIZER_KEY, NSP_CONVERTOR));
+        registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxNsiKey.class, EncodeConstants.OF13_VERSION_ID), NSI_CONVERTOR));
+        registrations.add(extensionConverterRegistrator.registerMatchConvertor(NsiCodec.SERIALIZER_KEY, NSI_CONVERTOR));
+
     }
 
     private void registerAction13(
index c1d6e6b64d37af3f2ba226778586e2faa455afdf..0a4914d78af78edd057b032e6a3463f907982cb4 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchRpcUpdateFlowOriginal;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchRpcUpdateFlowUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNspGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNsiGrouping;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 
 public class MatchUtil {
@@ -39,6 +40,8 @@ public class MatchUtil {
     private final static Set<Class<? extends Augmentation<Extension>>> augmentationsOfExtension = new HashSet<>();
     public final static GroupingResolver<NxmNxNspGrouping, Extension> nspResolver = new GroupingResolver<>(
             NxmNxNspGrouping.class);
+    public final static GroupingResolver<NxmNxNsiGrouping, Extension> nsiResolver = new GroupingResolver<>(
+            NxmNxNsiGrouping.class);
     public final static ExperimenterIdMatchEntry EXPERIMENTER_ID_MATCH_ENTRY;
 
     static {
@@ -51,6 +54,7 @@ public class MatchUtil {
         augmentationsOfExtension.add(NxAugMatchNotifPacketIn.class);
         augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class);
         nspResolver.setAugmentations(augmentationsOfExtension);
+        nsiResolver.setAugmentations(augmentationsOfExtension);
         ExperimenterIdMatchEntryBuilder experimenterIdMatchEntryBuilder = new ExperimenterIdMatchEntryBuilder();
         experimenterIdMatchEntryBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID));
         EXPERIMENTER_ID_MATCH_ENTRY = experimenterIdMatchEntryBuilder.build();
diff --git a/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NsiConvertor.java b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NsiConvertor.java
new file mode 100644 (file)
index 0000000..c272008
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovs.nx.sal.convertor.match;
+
+import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava;
+import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
+import org.opendaylight.openflowplugin.extension.api.ExtensionAugment;
+import org.opendaylight.openflowplugin.extension.api.path.MatchPath;
+import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.OfjAugNxMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.OfjAugNxMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.ofj.nxm.nx.match.nsi.grouping.NsiValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.ofj.nxm.nx.match.nsi.grouping.NsiValuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifPacketIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifPacketInBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifSwitchFlowRemoved;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifUpdateFlowStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNsiGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNsiKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.nxm.nx.nsi.grouping.NxmNxNsi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.nxm.nx.nsi.grouping.NxmNxNsiBuilder;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
+
+import com.google.common.base.Optional;
+public class NsiConvertor implements ConvertorToOFJava<MatchEntries>, ConvertorFromOFJava<MatchEntries, MatchPath> {
+    @Override
+    public ExtensionAugment<? extends Augmentation<Extension>> convert(MatchEntries input, MatchPath path) {
+        NsiValues values = input.getAugmentation(OfjAugNxMatch.class).getNsiValues();
+        return resolveAugmentation(new NxmNxNsiBuilder().setNsi(values.getNsi()).build(), path,
+                NxmNxNsiKey.class);
+    }
+
+    private static ExtensionAugment<? extends Augmentation<Extension>> resolveAugmentation(NxmNxNsi value,
+            MatchPath path, Class<? extends ExtensionKey> key) {
+        switch (path) {
+        case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH:
+            return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class,
+                    new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxNsi(value).build(), key);
+        case PACKETRECEIVED_MATCH:
+            return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder()
+                    .setNxmNxNsi(value).build(), key);
+        case SWITCHFLOWREMOVED_MATCH:
+            return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class,
+                    new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxNsi(value).build(), key);
+        default:
+            throw new CodecPreconditionException(path);
+        }
+    }
+
+    @Override
+    public MatchEntries convert(Extension extension) {
+        Optional<NxmNxNsiGrouping> matchGrouping = MatchUtil.nsiResolver.getExtension(extension);
+        if (!matchGrouping.isPresent()) {
+            throw new CodecPreconditionException(extension);
+        }
+        Short value = matchGrouping.get().getNxmNxNsi().getNsi();
+        OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setNsiValues(new NsiValuesBuilder()
+                .setNsi(value).build());
+        return MatchUtil
+                .createNiciraMatchEntries(
+                        Nxm1Class.class,
+                        org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.NxmNxNsi.class,
+                        false, augNxMatchBuilder.build());
+    }
+
+}
index 7ed8d5dae0b63532a2e69c9983f78bb2b69b65cd..c24d273fba6d4594c5876fc1c0f98a16a6de7e5c 100644 (file)
@@ -26,6 +26,10 @@ module ovs-nx-sal-match {
         base ext-gen:extension-key;
     }
 
+    identity nxm-nx-nsi-key {
+        base ext-gen:extension-key;
+    }
+
     grouping nxm-nx-nsp-grouping {
         container nxm-nx-nsp {
             leaf value {
@@ -34,8 +38,17 @@ module ovs-nx-sal-match {
         }
     }
 
+    grouping nxm-nx-nsi-grouping {
+        container nxm-nx-nsi {
+            leaf nsi {
+                type uint8;
+            }
+        }
+    }
+
     grouping all-matches-grouping {
         uses nxm-nx-nsp-grouping;
+        uses nxm-nx-nsi-grouping;
     }
 
     // MATCH augmentations