Bug 6633 : NXM_OF_IN_PORT support in openflowplugin 92/45192/5
authorChetan A G <chetan.arakere.gowdru@ericsson.com>
Tue, 6 Sep 2016 04:21:48 +0000 (09:51 +0530)
committerxcheara <chetan.arakere@altencalsoftlabs.com>
Wed, 7 Sep 2016 11:29:12 +0000 (16:59 +0530)
Description : OVS split-horizon logic will drop pkts by default if value
of in_port and out_port is same. But, if we have two vlan-trunk member
VM for which trunk interface is same, the connectivity between these two
VM cannot be established as OVS drops such packets. So, it is required to
override the value of in_port so that split_horizon check is bypassed.
Nicra NXM_OF_IN_PORT support is required in order to achieve this. The
in_port value will be overrriden using load(ex:
load:0x1->NXM_OF_IN_PORT[]).

Change-Id: Ica0a1b2da27fc189b8906462a4420473215a22af
Signed-off-by: xcheara <chetan.arakere@altencalsoftlabs.com>
extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java
extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java
extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/InPortCodec.java [new file with mode: 0644]
extension/openflowjava-extension-nicira/src/main/yang/nicira-match.yang
extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/NiciraExtensionProvider.java
extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegMoveConvertor.java
extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/MatchUtil.java
extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/NxmInPortConvertor.java [new file with mode: 0644]
extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-action.yang
extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-match.yang

index 36ed7c23e4140acf04c278d323a932ad2d157a64..0d2de7a41e6b26b39382f64cfd7321a3839a05a1 100644 (file)
@@ -56,6 +56,7 @@ import org.opendaylight.openflowjava.nx.codec.match.TunIpv4DstCodec;
 import org.opendaylight.openflowjava.nx.codec.match.TunIpv4SrcCodec;
 import org.opendaylight.openflowjava.nx.codec.match.UdpDstCodec;
 import org.opendaylight.openflowjava.nx.codec.match.UdpSrcCodec;
+import org.opendaylight.openflowjava.nx.codec.match.InPortCodec;
 
 import com.google.common.base.Preconditions;
 
@@ -122,6 +123,8 @@ public class NiciraExtensionsRegistrator implements AutoCloseable {
         registrator.registerMatchEntryDeserializer(ArpThaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_THA_CODEC);
         registrator.registerMatchEntrySerializer(ArpTpaCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_TPA_CODEC);
         registrator.registerMatchEntryDeserializer(ArpTpaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_TPA_CODEC);
+        registrator.registerMatchEntrySerializer(InPortCodec.SERIALIZER_KEY, NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC);
+        registrator.registerMatchEntryDeserializer(InPortCodec.DESERIALIZER_KEY, NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC);
         registrator.registerMatchEntrySerializer(EthDstCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_DST_CODEC);
         registrator.registerMatchEntryDeserializer(EthDstCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ETH_DST_CODEC);
         registrator.registerMatchEntrySerializer(EthSrcCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_SRC_CODEC);
@@ -219,6 +222,8 @@ public class NiciraExtensionsRegistrator implements AutoCloseable {
         registrator.unregisterMatchEntryDeserializer(ArpThaCodec.DESERIALIZER_KEY);
         registrator.unregisterMatchEntrySerializer(ArpTpaCodec.SERIALIZER_KEY);
         registrator.unregisterMatchEntryDeserializer(ArpTpaCodec.DESERIALIZER_KEY);
+        registrator.unregisterMatchEntrySerializer(InPortCodec.SERIALIZER_KEY);
+        registrator.unregisterMatchEntryDeserializer(InPortCodec.DESERIALIZER_KEY);
         registrator.unregisterMatchEntrySerializer(EthDstCodec.SERIALIZER_KEY);
         registrator.unregisterMatchEntryDeserializer(EthDstCodec.DESERIALIZER_KEY);
         registrator.unregisterMatchEntrySerializer(EthSrcCodec.SERIALIZER_KEY);
index 4f513a232fcdc20077f1cec0972a1149a34bfb24..198ecd7d278825c5dbc510243715ef5b612b258b 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec;
 import org.opendaylight.openflowjava.nx.codec.match.IcmpTypeCodec;
 import org.opendaylight.openflowjava.nx.codec.match.IpSrcCodec;
 import org.opendaylight.openflowjava.nx.codec.match.IpDstCodec;
+import org.opendaylight.openflowjava.nx.codec.match.InPortCodec;
 import org.opendaylight.openflowjava.nx.codec.match.Nshc1Codec;
 import org.opendaylight.openflowjava.nx.codec.match.Nshc2Codec;
 import org.opendaylight.openflowjava.nx.codec.match.Nshc3Codec;
@@ -69,6 +70,7 @@ public class NiciraMatchCodecs {
     public static final ArpSpaCodec ARP_SPA_CODEC = new ArpSpaCodec();
     public static final ArpThaCodec ARP_THA_CODEC = new ArpThaCodec();
     public static final ArpTpaCodec ARP_TPA_CODEC = new ArpTpaCodec();
+    public static final InPortCodec NXM_OF_IN_PORT_CODEC = new InPortCodec();
     public static final EthDstCodec ETH_DST_CODEC = new EthDstCodec();
     public static final EthSrcCodec ETH_SRC_CODEC = new EthSrcCodec();
     public static final TunIpv4DstCodec TUN_IPV4_DST_CODEC = new TunIpv4DstCodec();
diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/InPortCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/InPortCodec.java
new file mode 100644 (file)
index 0000000..6241575
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * 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
+ */
+package org.opendaylight.openflowjava.nx.codec.match;
+
+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.rev150225.MatchField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Nxm0Class;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfInPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.in.port.type.grouping.NxmOfInPortValuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.oxm.container.match.entry.value.OfInPortCaseValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.oxm.container.match.entry.value.OfInPortCaseValueBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.buffer.ByteBuf;
+
+public class InPortCodec extends AbstractMatchCodec {
+
+    private static final int VALUE_LENGTH = 2;
+    private static final int NXM_FIELD_CODE = 0;
+
+    public static final MatchEntrySerializerKey<Nxm0Class, NxmOfInPort> SERIALIZER_KEY = new MatchEntrySerializerKey<>(
+            EncodeConstants.OF13_VERSION_ID, Nxm0Class.class,
+            NxmOfInPort.class);
+
+    public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey(
+            EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS,
+            NXM_FIELD_CODE);
+
+    @Override
+    public void serialize(MatchEntry input, ByteBuf outBuffer) {
+        serializeHeader(input, outBuffer);
+        OfInPortCaseValue value = (OfInPortCaseValue) input.getMatchEntryValue();
+        outBuffer.writeInt(value.getNxmOfInPortValues().getValue());
+    }
+
+    @Override
+    public MatchEntry deserialize(ByteBuf message) {
+        MatchEntryBuilder matchEntryBuilder = deserializeHeader(message);
+        OfInPortCaseValueBuilder caseBuilder = new OfInPortCaseValueBuilder();
+        NxmOfInPortValuesBuilder valuesBuilder = new NxmOfInPortValuesBuilder();
+        valuesBuilder.setValue(message.readInt()).build();
+        caseBuilder.setNxmOfInPortValues(valuesBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    @Override
+    public int getNxmFieldCode() {
+        return NXM_FIELD_CODE;
+    }
+
+    @Override
+    public int getOxmClassCode() {
+        return OxmMatchConstants.NXM_0_CLASS;
+    }
+
+    @Override
+    public int getValueLength() {
+        return VALUE_LENGTH;
+    }
+
+    @Override
+    public Class<? extends MatchField> getNxmField() {
+        return NxmOfInPort.class;
+    }
+
+    @Override
+    public Class<? extends OxmClassBase> getOxmClass() {
+        return Nxm0Class.class;
+    }
+
+}
index 98bea96d979471aa4f03f75a03167d83d33a86a1..4ea7dd700709ec7a44cda15b0a0706d5f6d244ef 100644 (file)
@@ -63,6 +63,9 @@ module nicira-match {
     identity nxm-of-arp-tpa {
         base ofoxm:match-field;
     }
+    identity nxm-of-in-port {
+        base ofoxm:match-field;
+    }
     identity nxm-nx-tun-ipv4-dst {
         base ofoxm:match-field;
     }
@@ -192,6 +195,13 @@ module nicira-match {
             }
         }
     }
+    grouping ofj-nxm-of-in-port-type-grouping {
+        container nxm-of-in-port-values {
+            leaf value {
+                type uint16;
+            }
+        }
+    }
     grouping ofj-nxm-nx-match-tun-ipv4-dst-grouping {
         container tun-ipv4-dst-values {
             leaf value {
@@ -414,6 +424,9 @@ module nicira-match {
         case arp-tpa-case-value {
             uses ofj-nxm-of-match-arp-tpa-grouping;
         }
+        case of-in-port-case-value {
+            uses ofj-nxm-of-in-port-type-grouping;
+        }
         case tun-ipv4-dst-case-value {
             uses ofj-nxm-nx-match-tun-ipv4-dst-grouping;
         }
index b1fb354e050e248cea5b1d77a84a1c076b543e25..75d3b142f864514d5a1f83a464e1ea7eea42cb84 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.openflowjava.nx.codec.match.ArpShaCodec;
 import org.opendaylight.openflowjava.nx.codec.match.ArpSpaCodec;
 import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec;
 import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec;
+import org.opendaylight.openflowjava.nx.codec.match.InPortCodec;
 import org.opendaylight.openflowjava.nx.codec.match.CtStateCodec;
 import org.opendaylight.openflowjava.nx.codec.match.CtZoneCodec;
 import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec;
@@ -108,6 +109,7 @@ import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.N
 import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.TunGpeNpConvertor;
 import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.UdpDstConvertor;
 import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.UdpSrcConvertor;
+import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.NxmInPortConvertor;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.ActionChoice;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
@@ -236,6 +238,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ni
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortKey;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -258,6 +261,7 @@ public class NiciraExtensionProvider implements AutoCloseable {
     private final static ArpSpaConvertor ARP_SPA_CONVERTOR = new ArpSpaConvertor();
     private final static ArpTpaConvertor ARP_TPA_CONVERTOR = new ArpTpaConvertor();
     private final static ArpThaConvertor ARP_THA_CONVERTOR = new ArpThaConvertor();
+    private final static NxmInPortConvertor NXM_IN_PORT_CONVERTOR = new NxmInPortConvertor();
     private final static EthDstConvertor ETH_DST_CONVERTOR = new EthDstConvertor();
     private final static EthSrcConvertor ETH_SRC_CONVERTOR = new EthSrcConvertor();
     private final static RegLoadConvertor REG_LOAD_CONVERTOR = new RegLoadConvertor();
@@ -456,6 +460,8 @@ public class NiciraExtensionProvider implements AutoCloseable {
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpSpaCodec.SERIALIZER_KEY, ARP_SPA_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfArpTpaKey.class, EncodeConstants.OF13_VERSION_ID), ARP_TPA_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpTpaCodec.SERIALIZER_KEY, ARP_TPA_CONVERTOR));
+        registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfInPortKey.class, EncodeConstants.OF13_VERSION_ID), NXM_IN_PORT_CONVERTOR));
+        registrations.add(extensionConverterRegistrator.registerMatchConvertor(InPortCodec.SERIALIZER_KEY, NXM_IN_PORT_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfEthSrcKey.class, EncodeConstants.OF13_VERSION_ID), ETH_SRC_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(EthSrcCodec.SERIALIZER_KEY, ETH_SRC_CONVERTOR));
         registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfEthDstKey.class, EncodeConstants.OF13_VERSION_ID), ETH_DST_CONVERTOR));
index e323af57f14fd540a2f78718294ffdd88cb9806a..ddbeb3f076ae2434038d472023170ddafd4914e8 100644 (file)
@@ -33,6 +33,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ni
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxOfInPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxOfInPortCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxNshc1Case;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxNshc1CaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxNshc2Case;
@@ -140,7 +142,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ni
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfIpDstCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfIpSrcCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfIpSrcCaseBuilder;
-
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxOfInPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxOfInPortCaseBuilder;
 
 import com.google.common.base.Preconditions;
 
@@ -192,6 +195,9 @@ public class RegMoveConvertor implements
         if (dstValue == NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong()) {
             return new DstOfArpTpaCaseBuilder().setOfArpTpa(true).build();
         }
+        if (dstValue == NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC.getHeaderWithoutHasMask().toLong()) {
+            return new DstNxOfInPortCaseBuilder().setOfInPort(true).build();
+        }
         if (dstValue == NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong()) {
             return new DstOfEthDstCaseBuilder().setOfEthDst(true).build();
         }
@@ -273,6 +279,9 @@ public class RegMoveConvertor implements
         if (srcValue == NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong()) {
             return new SrcOfArpTpaCaseBuilder().setOfArpTpa(true).build();
         }
+        if (srcValue == NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC.getHeaderWithoutHasMask().toLong()) {
+            return new SrcNxOfInPortCaseBuilder().setOfInPort(true).build();
+        }
         if (srcValue == NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong()) {
             return new SrcOfEthDstCaseBuilder().setOfEthDst(true).build();
         }
@@ -416,6 +425,9 @@ public class RegMoveConvertor implements
         if (dstChoice instanceof DstOfArpTpaCase) {
             return NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong();
         }
+        if (dstChoice instanceof DstNxOfInPortCase) {
+            return NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC.getHeaderWithoutHasMask().toLong();
+        }
         if (dstChoice instanceof DstNxTunIpv4DstCase) {
             return NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong();
         }
@@ -503,6 +515,9 @@ public class RegMoveConvertor implements
         if (srcChoice instanceof SrcOfArpTpaCase) {
             return NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong();
         }
+        if (srcChoice instanceof SrcNxOfInPortCase) {
+            return NiciraMatchCodecs.NXM_OF_IN_PORT_CODEC.getHeaderWithoutHasMask().toLong();
+        }
         if (srcChoice instanceof SrcNxTunIpv4DstCase) {
             return NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong();
         }
index 01eb79b1ee6e59d0d316580969f991457dc01b5d..6889866f4d70d396505f68bca1fa5c275b54c10b 100644 (file)
@@ -60,6 +60,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ni
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcGrouping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstGrouping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortGrouping;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 
 /**
@@ -131,7 +132,8 @@ public class MatchUtil {
             NxmNxCtStateGrouping.class);
     public final static GroupingResolver<NxmNxCtZoneGrouping, Extension> ctZoneResolver = new GroupingResolver<>(
             NxmNxCtZoneGrouping.class);
-
+    public final static GroupingResolver<NxmOfInPortGrouping, Extension> nxmOfInportResolver = new GroupingResolver<>(
+            NxmOfInPortGrouping.class);
 
     static {
         augmentationsOfExtension.add(NxAugMatchRpcAddFlow.class);
@@ -172,6 +174,7 @@ public class MatchUtil {
         udpDstResolver.setAugmentations(augmentationsOfExtension);
         ctStateResolver.setAugmentations(augmentationsOfExtension);
         ctZoneResolver.setAugmentations(augmentationsOfExtension);
+        nxmOfInportResolver.setAugmentations(augmentationsOfExtension);
 
     }
 
diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/NxmInPortConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/NxmInPortConvertor.java
new file mode 100644 (file)
index 0000000..dad216c
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * 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
+ */
+package org.opendaylight.openflowplugin.extension.vendor.nicira.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.rev150225.Nxm0Class;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.in.port.type.grouping.NxmOfInPortValuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.oxm.container.match.entry.value.OfInPortCaseValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.oxm.container.match.entry.value.OfInPortCaseValueBuilder;
+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.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.in.port.grouping.OfInPortBuilder;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
+
+import com.google.common.base.Optional;
+
+public class NxmInPortConvertor implements ConvertorToOFJava<MatchEntry>,
+        ConvertorFromOFJava<MatchEntry, MatchPath> {
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert
+     * (org.opendaylight.yangtools.yang.binding.DataContainer,
+     * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath)
+     */
+    @Override
+    public ExtensionAugment<? extends Augmentation<Extension>> convert(
+            MatchEntry input, MatchPath path) {
+        OfInPortCaseValue inPortCaseValue = ((OfInPortCaseValue) input
+                .getMatchEntryValue());
+        return NxmInPortConvertor.resolveAugmentation(new OfInPortBuilder()
+                .setValue(inPortCaseValue.getNxmOfInPortValues().getValue())
+                .build(), path, NxmOfInPortKey.class);
+    }
+
+    private static ExtensionAugment<? extends Augmentation<Extension>> resolveAugmentation(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.in.port.grouping.OfInPort value,
+            MatchPath path, Class<? extends ExtensionKey> key) {
+        switch (path) {
+        case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH:
+            return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class,
+                    new NxAugMatchNotifUpdateFlowStatsBuilder()
+                            .setOfInPort(value).build(),
+                    key);
+        case PACKETRECEIVED_MATCH:
+            return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class,
+                    new NxAugMatchNotifPacketInBuilder().setOfInPort(value)
+                            .build(),
+                    key);
+        case SWITCHFLOWREMOVED_MATCH:
+            return new ExtensionAugment<>(
+                    NxAugMatchNotifSwitchFlowRemoved.class,
+                    new NxAugMatchNotifSwitchFlowRemovedBuilder()
+                            .setOfInPort(value).build(),
+                    key);
+        default:
+            throw new CodecPreconditionException(path);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert
+     * (org .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.
+     * general .rev140714.general.extension.grouping.Extension)
+     */
+    @Override
+    public MatchEntry convert(Extension extension) {
+        Optional<NxmOfInPortGrouping> matchGrouping = MatchUtil.nxmOfInportResolver
+                .getExtension(extension);
+        if (!matchGrouping.isPresent()) {
+            throw new CodecPreconditionException(extension);
+        }
+        Integer value = matchGrouping.get().getOfInPort().getValue();
+        OfInPortCaseValueBuilder inPortCaseValueBuilder = new OfInPortCaseValueBuilder();
+        inPortCaseValueBuilder.setNxmOfInPortValues(
+                new NxmOfInPortValuesBuilder().setValue(value).build());
+        return MatchUtil
+                .createDefaultMatchEntryBuilder(
+                        org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfInPort.class,
+                        Nxm0Class.class, inPortCaseValueBuilder.build())
+                .build();
+
+    }
+}
\ No newline at end of file
index c983e595288a6e9ae814aa9e3aa744baac5aeeee..3bb70190461f5cd6c6b10554ee87ef92071afafc 100644 (file)
@@ -68,6 +68,11 @@ module openflowplugin-extension-nicira-action {
             type empty;
         }
     }
+    grouping nxm-of-in-port-grouping {
+        leaf of-in-port {
+            type empty;
+        }
+    }
     grouping nxm-nx-tun-ipv4-dst-grouping {
         leaf nx-tun-ipv4-dst {
             type empty;
@@ -187,6 +192,9 @@ module openflowplugin-extension-nicira-action {
             case dst-of-arp-tpa-case {
                 uses nxm-of-arp-tpa-grouping;
             }
+            case dst-nx-of-in-port-case {
+                uses nxm-of-in-port-grouping;
+            }
             case dst-nx-tun-ipv4-dst-case {
                 uses nxm-nx-tun-ipv4-dst-grouping;
             }
@@ -267,6 +275,9 @@ module openflowplugin-extension-nicira-action {
             case src-of-arp-tpa-case {
                 uses nxm-of-arp-tpa-grouping;
             }
+            case src-nx-of-in-port-case {
+                uses nxm-of-in-port-grouping;
+            }
             case src-nx-tun-ipv4-dst-case {
                 uses nxm-nx-tun-ipv4-dst-grouping;
             }
index 8acbf61d0f994a44af7e065fbaf31c141b719642..d62aa28ab185d243829b8e560990d16bc3c5da76 100644 (file)
@@ -64,6 +64,9 @@ module openflowplugin-extension-nicira-match {
     identity nxm-of-arp-tpa-key {
         base ext-gen:extension-key;
     }
+    identity nxm-of-in-port-key {
+        base ext-gen:extension-key;
+    }
     identity nxm-nx-tun-ipv4-dst-key {
         base ext-gen:extension-key;
     }
@@ -196,6 +199,13 @@ module openflowplugin-extension-nicira-match {
             uses ipv4-address-grouping;
         }
     }
+    grouping nxm-of-in-port-grouping {
+        container of-in-port {
+            leaf value {
+                type uint16;
+            }
+        }
+    }
     grouping nxm-of-tcp-src-grouping {
         container nxm-of-tcp-src {
             leaf port {
@@ -393,6 +403,7 @@ module openflowplugin-extension-nicira-match {
         uses nxm-of-arp-op-grouping;
         uses nxm-of-arp-spa-grouping;
         uses nxm-of-arp-tpa-grouping;
+        uses nxm-of-in-port-grouping;
         uses nxm-nx-tun-ipv4-dst-grouping;
         uses nxm-nx-tun-ipv4-src-grouping;
         uses nxm-of-eth-src-grouping;