From b91e07f1e3974346a59bd11b7270d83f502bdfda Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Wed, 13 Aug 2014 04:38:53 -0700 Subject: [PATCH] NXM_NX_NSP openflow extended match support. Sample output : [root@localhost ~]# ovs-ofctl dump-flows br-int -O OpenFlow13 OFPST_FLOW reply (OF1.3) (xid=0x2): cookie=0x0, duration=12.100s, table=1, n_packets=0, n_bytes=0, send_flow_rem ip,nsp=1000,nw_dst=1.1.1.1 actions=set_nsp:0x3e8,set_nsi:45 Change-Id: I5c88114448972f9b5f561d438119b17b2e013a28 Signed-off-by: Madhu Venugopal --- .../ofjava/NiciraExtensionsRegistrator.java | 8 ++ .../{ => codec/match}/NiciraMatchCodecs.java | 3 +- .../ovs/nx/ofjava/codec/match/NspCodec.java | 78 ++++++++++++++++++ .../nx-ofjava/src/main/yang/ovs-nx-match.yang | 23 +++++- .../ovs/nx/sal/NiciraExtensionProvider.java | 9 ++- .../ovs/nx/sal/convertor/match/MatchUtil.java | 68 ++++++++++++++++ .../nx/sal/convertor/match/NspConvertor.java | 79 +++++++++++++++++++ .../src/main/yang/ovs-nx-sal-match.yang | 70 +++++++++++++++- 8 files changed, 331 insertions(+), 7 deletions(-) rename of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/{ => codec/match}/NiciraMatchCodecs.java (74%) create mode 100644 of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NspCodec.java create mode 100644 of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/MatchUtil.java create mode 100644 of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NspConvertor.java diff --git a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraExtensionsRegistrator.java b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraExtensionsRegistrator.java index e81d5a5ba..a7ce3f274 100644 --- a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraExtensionsRegistrator.java +++ b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraExtensionsRegistrator.java @@ -13,6 +13,8 @@ import org.opendaylight.ovs.nx.ofjava.codec.action.NiciraActionCodecs; 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.NiciraMatchCodecs; +import org.opendaylight.ovs.nx.ofjava.codec.match.NspCodec; import com.google.common.base.Preconditions; @@ -34,6 +36,9 @@ public class NiciraExtensionsRegistrator implements AutoCloseable { registrator.registerActionDeserializer(SetNsiCodec.DESERIALIZER_KEY, NiciraActionCodecs.SET_NSI_CODEC); registrator.registerActionSerializer(SetNsiCodec.SERIALIZER_KEY, NiciraActionCodecs.SET_NSI_CODEC); + + registrator.registerMatchEntrySerializer(NspCodec.SERIALIZER_KEY, NiciraMatchCodecs.NSP_CODEC); + registrator.registerMatchEntryDeserializer(NspCodec.DESERIALIZER_KEY, NiciraMatchCodecs.NSP_CODEC); } public void unregisterExtensions() { @@ -44,6 +49,9 @@ public class NiciraExtensionsRegistrator implements AutoCloseable { registrator.unregisterActionSerializer(SetNsiCodec.SERIALIZER_KEY); registrator.unregisterActionDeserializer(SetNspCodec.DESERIALIZER_KEY); registrator.unregisterActionSerializer(SetNspCodec.SERIALIZER_KEY); + + registrator.unregisterMatchEntrySerializer(NspCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(NspCodec.DESERIALIZER_KEY); } @Override diff --git a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraMatchCodecs.java b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NiciraMatchCodecs.java similarity index 74% rename from of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraMatchCodecs.java rename to of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NiciraMatchCodecs.java index 79ccf6410..26c22467a 100644 --- a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/NiciraMatchCodecs.java +++ b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NiciraMatchCodecs.java @@ -7,6 +7,7 @@ * * Authors : Madhu Venugopal */ -package org.opendaylight.ovs.nx.ofjava; +package org.opendaylight.ovs.nx.ofjava.codec.match; public class NiciraMatchCodecs { + public static final NspCodec NSP_CODEC = new NspCodec(); } diff --git a/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NspCodec.java b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NspCodec.java new file mode 100644 index 000000000..ad770cb1f --- /dev/null +++ b/of-extension/nx-ofjava/src/main/java/org/opendaylight/ovs/nx/ofjava/codec/match/NspCodec.java @@ -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.NxmNxNsp; +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.nsp.grouping.NspValuesBuilder; + +public class NspCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + private static final int NXM_FIELD_CODE = 37; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxNsp.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); + Long nsp = input.getAugmentation(OfjAugNxMatch.class).getNspValues().getNsp(); + outBuffer.writeInt(nsp.intValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setNspValues(new NspValuesBuilder().setNsp(message.readUnsignedInt()).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 getNxmField() { + return NxmNxNsp.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } +} diff --git a/of-extension/nx-ofjava/src/main/yang/ovs-nx-match.yang b/of-extension/nx-ofjava/src/main/yang/ovs-nx-match.yang index 3b75e9f9a..2c2db1f05 100644 --- a/of-extension/nx-ofjava/src/main/yang/ovs-nx-match.yang +++ b/of-extension/nx-ofjava/src/main/yang/ovs-nx-match.yang @@ -2,7 +2,7 @@ module ovs-nx-match { yang-version 1; namespace "urn:opendaylight:ovs:nx:match"; - prefix "nx-match"; + prefix "ovs-nx-match"; import openflow-extensible-match {prefix ofoxm;} import openflow-types {prefix oft;} @@ -10,9 +10,26 @@ module ovs-nx-match { import yang-ext {prefix ext; revision-date "2013-07-09";} description - "Nicira openflow match extensions"; + "OVS Openflow NX match extensions"; revision "2014-04-21" { description "Initial revision"; } -} + + identity nxm-nx-nsp { + base ofoxm:match-field; + } + + grouping ofj-nxm-nx-match-nsp-grouping { + container nsp-values { + leaf nsp { + type uint32; + } + } + } + + augment "/ofoxm:oxm-container/ofoxm:match-entries" { + ext:augment-identifier "ofj-aug_nx_match"; + uses ofj-nxm-nx-match-nsp-grouping; + } +} \ No newline at end of file diff --git a/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/NiciraExtensionProvider.java b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/NiciraExtensionProvider.java index ec0218906..60902ad18 100644 --- a/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/NiciraExtensionProvider.java +++ b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/NiciraExtensionProvider.java @@ -16,10 +16,13 @@ import org.opendaylight.openflowjava.nx.api.NiciraUtil; 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.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.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; @@ -51,7 +54,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.remove.group.input.buckets.bucket.action.action.NxActionSetNsiRpcRemoveGroupCase; 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.yangtools.concepts.ObjectRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,6 +72,7 @@ public class NiciraExtensionProvider implements AutoCloseable { private final static ResubmitConvertor RESUBMIT_CONVERTOR = new ResubmitConvertor(); 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(); @Override public void close() { @@ -130,6 +134,9 @@ public class NiciraExtensionProvider implements AutoCloseable { registrations.add(extensionConverterRegistrator.registerActionConvertor(NiciraUtil.createOfJavaKeyFrom(ResubmitCodec.SERIALIZER_KEY), RESUBMIT_CONVERTOR)); registrations.add(extensionConverterRegistrator.registerActionConvertor(NiciraUtil.createOfJavaKeyFrom(SetNspCodec.SERIALIZER_KEY), SET_NSP_CONVERTOR)); registrations.add(extensionConverterRegistrator.registerActionConvertor(NiciraUtil.createOfJavaKeyFrom(SetNsiCodec.SERIALIZER_KEY), SET_NSI_CONVERTOR)); + + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxNspKey.class, EncodeConstants.OF13_VERSION_ID), NSP_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(NspCodec.SERIALIZER_KEY, NSP_CONVERTOR)); } private void registerAction13( diff --git a/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/MatchUtil.java b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/MatchUtil.java new file mode 100644 index 000000000..c1d6e6b64 --- /dev/null +++ b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/MatchUtil.java @@ -0,0 +1,68 @@ +/* + * 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 java.util.HashSet; +import java.util.Set; + +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.openflowplugin.extension.api.GroupingResolver; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +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.OfjAugNxMatch; +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.NxAugMatchNodesNodeTableFlow; +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.NxAugMatchNotifSwitchFlowRemoved; +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.NxAugMatchRpcAddFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchRpcRemoveFlow; +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.yangtools.yang.binding.Augmentation; + +public class MatchUtil { + + private final static Set>> augmentationsOfExtension = new HashSet<>(); + public final static GroupingResolver nspResolver = new GroupingResolver<>( + NxmNxNspGrouping.class); + public final static ExperimenterIdMatchEntry EXPERIMENTER_ID_MATCH_ENTRY; + + static { + augmentationsOfExtension.add(NxAugMatchRpcAddFlow.class); + augmentationsOfExtension.add(NxAugMatchRpcRemoveFlow.class); + augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowOriginal.class); + augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowUpdated.class); + augmentationsOfExtension.add(NxAugMatchNodesNodeTableFlow.class); + augmentationsOfExtension.add(NxAugMatchNotifSwitchFlowRemoved.class); + augmentationsOfExtension.add(NxAugMatchNotifPacketIn.class); + augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class); + nspResolver.setAugmentations(augmentationsOfExtension); + ExperimenterIdMatchEntryBuilder experimenterIdMatchEntryBuilder = new ExperimenterIdMatchEntryBuilder(); + experimenterIdMatchEntryBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID)); + EXPERIMENTER_ID_MATCH_ENTRY = experimenterIdMatchEntryBuilder.build(); + } + + public static MatchEntries createNiciraMatchEntries(Class oxmClass, + Class oxmMatchField, boolean hasMask, OfjAugNxMatch augNxMatch) { + MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); + matchEntriesBuilder.setOxmClass(oxmClass).setOxmMatchField(oxmMatchField).setHasMask(hasMask); + matchEntriesBuilder.addAugmentation(ExperimenterIdMatchEntry.class, EXPERIMENTER_ID_MATCH_ENTRY); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatch); + return matchEntriesBuilder.build(); + } + +} diff --git a/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NspConvertor.java b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NspConvertor.java new file mode 100644 index 000000000..2de942831 --- /dev/null +++ b/of-extension/nx-sal/src/main/java/org/opendaylight/ovs/nx/sal/convertor/match/NspConvertor.java @@ -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.nsp.grouping.NspValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.ofj.nxm.nx.match.nsp.grouping.NspValuesBuilder; +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.NxmNxNspGrouping; +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.nxm.nx.nsp.grouping.NxmNxNsp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.nxm.nx.nsp.grouping.NxmNxNspBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; +public class NspConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + NspValues values = input.getAugmentation(OfjAugNxMatch.class).getNspValues(); + return resolveAugmentation(new NxmNxNspBuilder().setValue(values.getNsp()).build(), path, + NxmNxNspKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxNsp value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxNsp(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxNsp(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxNsp(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.nspResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + Long value = matchGrouping.get().getNxmNxNsp().getValue(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setNspValues(new NspValuesBuilder() + .setNsp(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.match.rev140421.NxmNxNsp.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/of-extension/nx-sal/src/main/yang/ovs-nx-sal-match.yang b/of-extension/nx-sal/src/main/yang/ovs-nx-sal-match.yang index 3267cf5af..7ed8d5dae 100644 --- a/of-extension/nx-sal/src/main/yang/ovs-nx-sal-match.yang +++ b/of-extension/nx-sal/src/main/yang/ovs-nx-sal-match.yang @@ -4,10 +4,76 @@ module ovs-nx-sal-match { namespace "urn:opendaylight:ovs:nx:sal:match"; prefix "ovs-nx-sal-match"; + import yang-ext {prefix ext; revision-date "2013-07-09";} + import flow-node-inventory {prefix fni; revision-date 2013-08-19; } + import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} + import sal-flow {prefix sal-flow;revision-date "2013-08-19";} + import packet-processing {prefix sal-packet;revision-date "2013-07-09";} + import openflowplugin-extension-general {prefix ext-gen;revision-date "2014-07-14";} + import opendaylight-flow-statistics {prefix odl-flow-stats;revision-date "2013-08-19";} + import nicira-match {prefix nicira-match;revision-date "2014-04-21";} + import ietf-inet-types {prefix inet; revision-date "2010-09-24";} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} + description - "Nicira openflow match extensions."; + "OVS Openflow NX match extensions."; revision "2014-07-14" { description "Initial revision"; } -} + + identity nxm-nx-nsp-key { + base ext-gen:extension-key; + } + + grouping nxm-nx-nsp-grouping { + container nxm-nx-nsp { + leaf value { + type uint32; + } + } + } + + grouping all-matches-grouping { + uses nxm-nx-nsp-grouping; + } + + // MATCH augmentations + // RPCS + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-add-flow"; + uses all-matches-grouping; + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-remove-flow"; + uses all-matches-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-update-flow-original"; + uses all-matches-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-update-flow-updated"; + uses all-matches-grouping; + } + + // DATA + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-nodes-node-table-flow"; + uses all-matches-grouping; + } + + // NOTIFICATIONS + augment "/sal-flow:switch-flow-removed/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-switch-flow-removed"; + uses all-matches-grouping; + } + augment "/sal-packet:packet-received/sal-packet:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-packet-in"; + uses all-matches-grouping; + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-update-flow-stats"; + uses all-matches-grouping; + } +} \ No newline at end of file -- 2.36.6