From 6af72a12d0f97b2a35fcdac5bf6c6dede8388317 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Mon, 27 Jun 2016 16:10:40 +0200 Subject: [PATCH] Bug 5540 - PortConvertor, MatchConvertor - Reworked MatchConvertorImpl and MatchConvertorV10Impl (extracted some logic from it) - Added MatchResponseConvertor and MatchV10ResponseConvertor - Updated and added new tests, and updated usage of match convertors - Reworked PortConvertor to use new ConvertorManager design - Updated tests and usage of PortConvertor accordingly Change-Id: If53d7c521bf4a718a466ec7cd11d28e57d8cf4bd Signed-off-by: Tomas Slusny --- .../impl/services/SalPortServiceImpl.java | 13 +- .../translator/FlowRemovedTranslator.java | 15 +- .../translator/FlowRemovedV10Translator.java | 17 +- .../translator/PacketReceivedTranslator.java | 24 +- .../md/core/sal/OFRpcTaskFactory.java | 14 +- .../core/sal/convertor/ActionConvertor.java | 25 +- .../core/sal/convertor/ConvertorManager.java | 6 + .../convertor/FlowStatsResponseConvertor.java | 38 +- .../md/core/sal/convertor/PortConvertor.java | 112 +- .../data/VersionDatapathIdConvertorData.java | 46 + .../sal/convertor/match/MatchConvertor.java | 7 +- .../convertor/match/MatchConvertorImpl.java | 2144 +++-------------- .../convertor/match/MatchConvertorUtil.java | 95 +- .../match/MatchConvertorV10Impl.java | 316 +-- .../sal/convertor/match/MatchReactor.java | 9 +- .../match/MatchReactorMappingFactory.java | 8 +- .../match/MatchResponseConvertor.java | 192 ++ .../match/MatchV10ResponseConvertor.java | 212 ++ .../match/cases/OfToSalArpOpCase.java | 40 + .../match/cases/OfToSalArpShaCase.java | 53 + .../match/cases/OfToSalArpSpaCase.java | 49 + .../match/cases/OfToSalArpThaCase.java | 53 + .../match/cases/OfToSalArpTpaCase.java | 49 + .../match/cases/OfToSalEthDstCase.java | 52 + .../match/cases/OfToSalEthSrcCase.java | 52 + .../match/cases/OfToSalEthTypeCase.java | 44 + .../cases/OfToSalExperimenterIdCase.java | 53 + .../match/cases/OfToSalIcmpv4CodeCase.java | 41 + .../match/cases/OfToSalIcmpv4TypeCase.java | 41 + .../match/cases/OfToSalIcmpv6CodeCase.java | 41 + .../match/cases/OfToSalIcmpv6TypeCase.java | 41 + .../match/cases/OfToSalInPhyPortCase.java | 42 + .../match/cases/OfToSalInPortCase.java | 42 + .../match/cases/OfToSalIpDscpCase.java | 41 + .../match/cases/OfToSalIpEcnCase.java | 40 + .../match/cases/OfToSalIpProtoCase.java | 41 + .../match/cases/OfToSalIpv4DstCase.java | 122 + .../match/cases/OfToSalIpv4SrcCase.java | 126 + .../match/cases/OfToSalIpv6DstCase.java | 124 + .../match/cases/OfToSalIpv6ExthdrCase.java | 54 + .../match/cases/OfToSalIpv6FlabelCase.java | 51 + .../match/cases/OfToSalIpv6NdSllCase.java | 40 + .../match/cases/OfToSalIpv6NdTargetCase.java | 40 + .../match/cases/OfToSalIpv6NdTllCase.java | 40 + .../match/cases/OfToSalIpv6SrcCase.java | 124 + .../match/cases/OfToSalMetadataCase.java | 46 + .../match/cases/OfToSalMplsBosCase.java | 40 + .../match/cases/OfToSalMplsLabelCase.java | 40 + .../match/cases/OfToSalMplsTcCase.java | 40 + .../match/cases/OfToSalPbbIsidCase.java | 50 + .../match/cases/OfToSalSctpDstCase.java | 42 + .../match/cases/OfToSalSctpSrcCase.java | 42 + .../match/cases/OfToSalTcpDstCase.java | 42 + .../match/cases/OfToSalTcpSrcCase.java | 40 + .../match/cases/OfToSalTunnelIdCase.java | 47 + .../match/cases/OfToSalTunnelIpv4DstCase.java | 60 + .../match/cases/OfToSalTunnelIpv4SrcCase.java | 61 + .../match/cases/OfToSalUdpDstCase.java | 40 + .../match/cases/OfToSalUdpSrcCase.java | 40 + .../match/cases/OfToSalVlanPcpCase.java | 42 + .../match/cases/OfToSalVlanVidCase.java | 45 + .../match/cases/SalToOfArpMatchCase.java | 157 ++ .../SalToOfIpv4MatchArbitraryBitMaskCase.java | 91 + .../match/cases/SalToOfIpv4MatchCase.java | 96 + .../SalToOfIpv6MatchArbitraryBitMaskCase.java | 89 + .../match/cases/SalToOfIpv6MatchCase.java | 198 ++ .../match/cases/SalToOfSctpMatchCase.java | 67 + .../match/cases/SalToOfTcpMatchCase.java | 68 + .../cases/SalToOfTunnelIpv4MatchCase.java | 96 + .../match/cases/SalToOfUdpMatchCase.java | 67 + .../data/MatchResponseConvertorData.java | 388 +++ .../translator/FlowRemovedTranslator.java | 11 +- .../core/translator/PacketInTranslator.java | 14 +- .../core/sal/convertor/PortConvertorTest.java | 9 +- .../match/MatchConvertorImpl2Test.java | 64 +- ....java => MatchResponseConvertor2Test.java} | 208 +- ...t.java => MatchResponseConvertorTest.java} | 68 +- ...ava => MatchV10ResponseConvertorTest.java} | 135 +- 78 files changed, 5003 insertions(+), 2369 deletions(-) create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionDatapathIdConvertorData.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertor.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpOpCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpShaCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpSpaCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpThaCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpTpaCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthDstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthSrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthTypeCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalExperimenterIdCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4CodeCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4TypeCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6CodeCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6TypeCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPhyPortCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPortCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpDscpCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpEcnCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpProtoCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4DstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4SrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6DstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6ExthdrCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6FlabelCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdSllCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTargetCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTllCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6SrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMetadataCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsBosCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsLabelCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsTcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalPbbIsidCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpDstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpSrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpDstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpSrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIdCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4DstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4SrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpDstCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpSrcCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanPcpCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanVidCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfArpMatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchArbitraryBitMaskCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchArbitraryBitMaskCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfSctpMatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTcpMatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTunnelIpv4MatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfUdpMatchCase.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/data/MatchResponseConvertorData.java rename openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/{MatchConvertorImplV13Test.java => MatchResponseConvertor2Test.java} (86%) rename openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/{MatchConvertorImplTest.java => MatchResponseConvertorTest.java} (84%) rename openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/{MatchConvertorImplV10Test.java => MatchV10ResponseConvertorTest.java} (84%) diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java index 3bd932bd0f..674d6b2374 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java @@ -7,11 +7,14 @@ */ package org.opendaylight.openflowplugin.impl.services; +import java.util.Optional; import java.util.concurrent.Future; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput; @@ -34,9 +37,13 @@ public final class SalPortServiceImpl extends AbstractSimpleService ofPortModInput = ConvertorManager + .getInstance() + .convert(inputPort, new VersionConvertorData(getVersion())); + + final PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput + .orElse(PortConvertor.defaultResult(getVersion()))) + .setXid(xid.getValue()); return mdInput.build(); } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedTranslator.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedTranslator.java index c5683d2ebc..c72a6b79e2 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedTranslator.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedTranslator.java @@ -7,10 +7,11 @@ */ package org.opendaylight.openflowplugin.impl.translator; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemovedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; @@ -35,8 +36,14 @@ public class FlowRemovedTranslator implements MessageTranslator matchBuilderOptional = ConvertorManager.getInstance().convert( + flowRemoved.getMatch(), + datapathIdConvertorData); + + return matchBuilderOptional.orElse(new MatchBuilder()); } /** diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedV10Translator.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedV10Translator.java index e5904310c5..d4685e0738 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedV10Translator.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/FlowRemovedV10Translator.java @@ -8,9 +8,10 @@ package org.opendaylight.openflowplugin.impl.translator; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemoved; @@ -21,8 +22,14 @@ public class FlowRemovedV10Translator extends FlowRemovedTranslator { @Override protected MatchBuilder translateMatch(FlowRemoved flowRemoved, DeviceInfo deviceInfo) { - return MatchConvertorImpl.fromOFMatchV10ToSALMatch(flowRemoved.getMatchV10(), - deviceInfo.getDatapathId(), OpenflowVersion.OF10); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(deviceInfo.getVersion()); + datapathIdConvertorData.setDatapathId(deviceInfo.getDatapathId()); + + final Optional matchBuilderOptional = ConvertorManager.getInstance().convert( + flowRemoved.getMatchV10(), + datapathIdConvertorData); + + return matchBuilderOptional.orElse(new MatchBuilder()); } /** @@ -33,6 +40,6 @@ public class FlowRemovedV10Translator extends FlowRemovedTranslator { */ @Override protected Short translateTableId(FlowRemoved flowRemoved) { - return Short.valueOf((short)0); + return (short) 0; } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslator.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslator.java index 9b5f76069f..b7e1a8bed0 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslator.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslator.java @@ -10,6 +10,7 @@ package org.opendaylight.openflowplugin.impl.translator; import com.google.common.annotations.VisibleForTesting; import java.math.BigInteger; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; @@ -17,11 +18,11 @@ import org.opendaylight.openflowplugin.extension.api.AugmentTuple; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.impl.util.NodeConnectorRefToPortTranslator; import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.PacketInUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceivedBuilder; @@ -73,17 +74,24 @@ public class PacketReceivedTranslator implements MessageTranslator matchExtensionWrap = + final Optional matchOptional = ConvertorManager.getInstance().convert(input.getMatch(), datapathIdConvertorData); + final MatchBuilder matchBuilder = matchOptional.isPresent() ? + new MatchBuilder(matchOptional.get().build()) : + new MatchBuilder(); + + final AugmentTuple matchExtensionWrap = MatchExtensionHelper.processAllExtensions( - input.getMatch().getMatchEntry(), OpenflowVersion.get(input.getVersion().shortValue()), MatchPath.PACKETRECEIVED_MATCH); + input.getMatch().getMatchEntry(), + OpenflowVersion.get(input.getVersion()), + MatchPath.PACKETRECEIVED_MATCH); + if (matchExtensionWrap != null) { matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); } + return matchBuilder.build(); } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java index 442b51c3f4..ef7741a89c 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java @@ -2088,14 +2088,16 @@ public abstract class OFRpcTaskFactory { @Override public ListenableFuture> call() { ListenableFuture> result = SettableFuture.create(); - final Long xid = taskContext.getSession().getNextXid(); - Port inputPort = input.getUpdatedPort().getPort().getPort().get(0); + final short version = taskContext.getSession().getPrimaryConductor().getVersion(); + final Port inputPort = input.getUpdatedPort().getPort().getPort().get(0); - PortModInput ofPortModInput = PortConvertor.toPortModInput(inputPort, - taskContext.getSession().getPrimaryConductor().getVersion()); + final java.util.Optional ofPortModInput = ConvertorManager + .getInstance() + .convert(inputPort, new VersionConvertorData(version)); - PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput); - mdInput.setXid(xid); + PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput + .orElse(PortConvertor.defaultResult(version))) + .setXid(taskContext.getSession().getNextXid()); Future> resultFromOFLib = getMessageService() .portMod(mdInput.build(), cookie); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java index 366b61a37c..84341cd3fc 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java @@ -11,6 +11,7 @@ import com.google.common.collect.Ordering; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; @@ -23,7 +24,8 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.Act import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwSrcReactor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IPProtocols; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.OrderComparator; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor; import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil; @@ -80,6 +82,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueAction; @@ -89,6 +92,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCaseBuilder; @@ -126,6 +130,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.vlan._case.PushVlanActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.dl.dst._case.SetDlDstActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.dl.src._case.SetDlSrcActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.mpls.ttl._case.SetMplsTtlActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.tos._case.SetNwTosActionBuilder; @@ -517,7 +522,8 @@ public final class ActionConvertor { SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder(); List matchEntriesList = new ArrayList<>(); - matchEntriesList.add(MatchConvertorImpl.toOfVlanPcp(setvlanpcpaction.getVlanPcp())); + + matchEntriesList.add(MatchConvertorUtil.toOfVlanPcp(setvlanpcpaction.getVlanPcp())); setFieldBuilder.setMatchEntry(matchEntriesList); setFieldCaseBuilder.setSetFieldAction(setFieldBuilder.build()); actionBuilder.setActionChoice(setFieldCaseBuilder.build()); @@ -686,7 +692,7 @@ public final class ActionConvertor { SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder(); List entries = new ArrayList<>(); - entries.add(MatchConvertorImpl.toOfIpDscp(new Dscp( + entries.add(MatchConvertorUtil.toOfIpDscp(new Dscp( ActionUtil.tosToDscp(setnwtosaction.getTos().shortValue()) ))); setFieldBuilder.setMatchEntry(entries); @@ -975,8 +981,17 @@ public final class ActionConvertor { bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder() .setDecNwTtl(decNwTtl.build()).build()); } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase) { - bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder() - .setSetField(MatchConvertorImpl.fromOFSetFieldToSALSetFieldAction(action, ofVersion)).build()); + org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase setFieldCase = (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase) action.getActionChoice(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(ofVersion.getVersion()); + final SetFieldAction setFieldAction = setFieldCase.getSetFieldAction(); + final SetFieldBuilder setField = new SetFieldBuilder(); + final Optional matchOptional = ConvertorManager.getInstance().convert(setFieldAction, datapathIdConvertorData); + + if (matchOptional.isPresent()) { + setField.fieldsFrom(matchOptional.get().build()); + } + + bucketActions.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder().setSetField(setField.build()).build()); } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase) { bucketActions.add(ofToSALPushPbbAction(action)); } else if (action.getActionChoice() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCase) { diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java index cb4465f181..2cb539515c 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java @@ -19,6 +19,8 @@ import java.util.Optional; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +39,10 @@ public class ConvertorManager { INSTANCE.registerConvertor(new MeterConvertor()); INSTANCE.registerConvertor(new MeterStatsResponseConvertor()); INSTANCE.registerConvertor(new MeterConfigStatsResponseConvertor()); + INSTANCE.registerConvertor(new PortConvertor()); + // TODO: Add MatchConvertor + INSTANCE.registerConvertor(new MatchResponseConvertor()); + INSTANCE.registerConvertor(new MatchV10ResponseConvertor()); } // Actual convertor keys diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java index 989444f53e..83901dc907 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java @@ -11,13 +11,15 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.extension.api.AugmentTuple; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; @@ -79,23 +81,39 @@ public class FlowStatsResponseConvertor { salFlowStatsBuilder.setPriority(flowStats.getPriority()); salFlowStatsBuilder.setTableId(flowStats.getTableId()); if(flowStats.getMatchV10() != null){ - salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchV10ToSALMatch(flowStats.getMatchV10(), datapathid, OpenflowVersion.OF10).build()); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + data.setDatapathId(datapathid); + + Optional matchBuilder = ConvertorManager.getInstance().convert(flowStats.getMatchV10(), data); + + if (matchBuilder.isPresent()) { + salFlowStatsBuilder.setMatch(matchBuilder.get().build()); + } + if(flowStats.getAction() != null && flowStats.getAction().size()!=0){ salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.wrapOF10ActionsToInstruction(flowStats.getAction(), ofVersion)); } } if(flowStats.getMatch() != null){ - MatchBuilder matchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(flowStats.getMatch(),datapathid, ofVersion); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(ofVersion.getVersion()); + data.setDatapathId(datapathid); - AugmentTuple matchExtensionWrap = - MatchExtensionHelper.processAllExtensions( - flowStats.getMatch().getMatchEntry(), ofVersion, MatchPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH); - if (matchExtensionWrap != null) { - matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); - } + Optional matchBuilderOptional = ConvertorManager.getInstance().convert(flowStats.getMatch(), data); + if (matchBuilderOptional.isPresent()) { + MatchBuilder matchBuilder = matchBuilderOptional.get(); + + AugmentTuple matchExtensionWrap = + MatchExtensionHelper.processAllExtensions( + flowStats.getMatch().getMatchEntry(), ofVersion, MatchPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH); + + if (matchExtensionWrap != null) { + matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); + } + + salFlowStatsBuilder.setMatch(matchBuilder.build()); + } - salFlowStatsBuilder.setMatch(matchBuilder.build()); salFlowStatsBuilder.setFlags( new FlowModFlags(flowStats.getFlags().isOFPFFCHECKOVERLAP(), flowStats.getFlags().isOFPFFRESETCOUNTS(), diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java index 2f4e2043fc..e644a090fb 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java @@ -1,15 +1,20 @@ -/** +/* * Copyright (c) 2014 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.openflow.md.core.sal.convertor; -import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; +import com.google.common.annotations.VisibleForTesting; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfigV10; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures; @@ -20,54 +25,31 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.Ports; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** - * @author esssuuu This convertor class is used for Port Mod,port status and - * port description messages,decodes SAL and encodes to OF Data + * Converts port mod, port status and port description MD-SAL messages to OF library data * + * Example usage: + *
+ * {@code
+ * VersionConvertorData data = new VersionConvertorData(version);
+ * Optional ofPort = ConvertorManager.getInstance().convert(salPort, data);
+ * }
+ * 
*/ -public final class PortConvertor { - private static final Logger LOG = LoggerFactory.getLogger(PortConvertor.class); - - private PortConvertor() { - - } +public class PortConvertor implements ParametrizedConvertor { /** - * This method is used by PORT_MOD_MESSAGE + * Create default empty port mod input + * Use this method, if result from convertor is empty. * - * @param source source port - * @param version openflow version - * @return port mod input + * @param version Openflow version + * @return default empty port mod input */ - - public static PortModInput toPortModInput( - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port source, - short version) { - - - PortConfig config = maskPortConfigFields(source.getConfiguration()); - PortConfigV10 configV10 = maskPortConfigV10Fields(source.getConfiguration()); - - PortModInputBuilder portModInputBuilder = new PortModInputBuilder(); - portModInputBuilder.setAdvertise(getPortFeatures(source.getAdvertisedFeatures())); - portModInputBuilder.setPortNo(new PortNumber( - OpenflowPortsUtil.getProtocolPortNumber(OpenflowVersion.get(version), source.getPortNumber()))); - - portModInputBuilder.setConfig(config); - portModInputBuilder.setMask(config); - - portModInputBuilder.setHwAddress(new MacAddress(source.getHardwareAddress())); - - portModInputBuilder.setVersion(version); - - portModInputBuilder.setConfigV10(configV10); - portModInputBuilder.setMaskV10(configV10); - portModInputBuilder.setAdvertiseV10(getPortFeaturesV10(source.getAdvertisedFeatures())); - return portModInputBuilder.build(); - + public static PortModInput defaultResult(short version) { + return new PortModInputBuilder() + .setVersion(version) + .build(); } private static PortConfig maskPortConfigFields( @@ -91,6 +73,7 @@ public final class PortConvertor { return new PortConfigV10(false, noFwd, noPacketIn, noRecv, true, true, portDown); } + private static PortFeatures getPortFeatures( org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures salPortFeatures) { @@ -110,23 +93,19 @@ public final class PortConvertor { salPortFeatures.isPause(), salPortFeatures.isPauseAsym()); } - - /* + /** * This method is called as a reply to OFPMP_PORT_DESCRIPTION * message(OF1.3.1) - */ - /** - * @param source FlowCapablePort + * + * @param source FlowCapablePort * @param version openflow version * @return OF:Ports */ - public static Ports toPortDesc( + @VisibleForTesting + static Ports toPortDesc( org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowCapablePort source, short version) { - PortConfig config = null; - PortState portState = null; - PortsBuilder oFPortDescDataBuilder = new PortsBuilder(); oFPortDescDataBuilder.setPortNo( @@ -135,11 +114,11 @@ public final class PortConvertor { oFPortDescDataBuilder.setHwAddr(source.getHardwareAddress()); oFPortDescDataBuilder.setName(source.getName()); - config = maskPortConfigFields(source.getConfiguration()); + PortConfig config = maskPortConfigFields(source.getConfiguration()); oFPortDescDataBuilder.setConfig(config); - portState = getPortState(source.getState()); + PortState portState = getPortState(source.getState()); oFPortDescDataBuilder.setState(portState); oFPortDescDataBuilder.setCurrentFeatures(getPortFeatures(source.getCurrentFeature())); @@ -164,6 +143,31 @@ public final class PortConvertor { } + @Override + public Class getType() { + return Port.class; + } + + @Override + public PortModInput convert(Port source, VersionConvertorData data) { + PortConfig config = maskPortConfigFields(source.getConfiguration()); + PortConfigV10 configV10 = maskPortConfigV10Fields(source.getConfiguration()); + + PortModInputBuilder portModInputBuilder = new PortModInputBuilder(); + portModInputBuilder.setAdvertise(getPortFeatures(source.getAdvertisedFeatures())); + portModInputBuilder.setPortNo(new PortNumber( + OpenflowPortsUtil.getProtocolPortNumber(OpenflowVersion.get(data.getVersion()), source.getPortNumber()))); + + portModInputBuilder.setConfig(config); + portModInputBuilder.setMask(config); + + portModInputBuilder.setHwAddress(new MacAddress(source.getHardwareAddress())); + portModInputBuilder.setVersion(data.getVersion()); -} + portModInputBuilder.setConfigV10(configV10); + portModInputBuilder.setMaskV10(configV10); + portModInputBuilder.setAdvertiseV10(getPortFeaturesV10(source.getAdvertisedFeatures())); + return portModInputBuilder.build(); + } +} \ No newline at end of file diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionDatapathIdConvertorData.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionDatapathIdConvertorData.java new file mode 100644 index 0000000000..f3059e6039 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/data/VersionDatapathIdConvertorData.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.data; + +import java.math.BigInteger; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData; + +/** + * Convertor data implementation containing Openflow version and datapath ID + */ +public class VersionDatapathIdConvertorData extends ConvertorData { + private BigInteger datapathId; + + /** + * Instantiates a new version datapath id convertor data. + * + * @param version the version + */ + public VersionDatapathIdConvertorData(short version) { + super(version); + } + + /** + * Gets datapath id. + * + * @return the datapath id + */ + public BigInteger getDatapathId() { + return datapathId; + } + + /** + * Sets datapath id. + * + * @param datapathId the datapath id + */ + public void setDatapathId(BigInteger datapathId) { + this.datapathId = datapathId; + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertor.java index 0192fffedd..2524e64e12 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertor.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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, @@ -13,7 +13,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 /** * converting from MD-SAL match model into appropriate OF-API match model - * @param type of converted match + * + * @param type of converted match */ public interface MatchConvertor extends Convertor { diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java index 7c32695445..3497f49dac 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2013, 2015 Ericsson. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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, @@ -8,15 +8,10 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; -import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString; import com.google.common.base.Optional; -import java.math.BigInteger; -import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import javax.annotation.Nonnull; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; @@ -24,97 +19,45 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfArpMatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchArbitraryBitMaskCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchArbitraryBitMaskCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfSctpMatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTcpMatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTunnelIpv4MatchCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfUdpMatchCase; import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; -import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil; import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeader; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6Label; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch; -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.Layer3Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match; -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.TcpFlagsMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder; -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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMask; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType; @@ -125,121 +68,36 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmp import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid; 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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOpBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpShaBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpaBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpThaBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpaBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder; @@ -249,1646 +107,340 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscpBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6ExthdrBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6FlabelBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSllBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTargetBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTllBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6SrcBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDstBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrcBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDstBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDstBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrcBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcpBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10; 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.GeneralExtensionListGrouping; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst; -import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Utility class for converting a MD-SAL Flow into the OF flow mod */ public class MatchConvertorImpl implements MatchConvertor> { - private static final Logger logger = LoggerFactory.getLogger(MatchConvertorImpl.class); + private static final ConvertorProcessor, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor, VersionConvertorData>() + .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase()) + .addCase(new SalToOfIpv4MatchCase()) + .addCase(new SalToOfTunnelIpv4MatchCase()) + .addCase(new SalToOfArpMatchCase()) + .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase()) + .addCase(new SalToOfIpv6MatchCase()); + + private static final ConvertorProcessor, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor, VersionConvertorData>() + .addCase(new SalToOfTcpMatchCase()) + .addCase(new SalToOfUdpMatchCase()) + .addCase(new SalToOfSctpMatchCase()); + private static final byte[] VLAN_VID_MASK = new byte[]{16, 0}; - private static final short PROTO_TCP = 6; - private static final short PROTO_UDP = 17; - private static final short PROTO_ICMPV4 = 1; - private static final String NO_IP = "0.0.0.0/0"; - - // Pre-calculated masks for the 33 possible values. Do not give them out, but clone() them as they may - // end up being leaked and vulnerable. - private static final byte[][] IPV4_MASKS; - static { - final byte[][] tmp = new byte[33][]; - for (int i = 0; i <= 32; ++i) { - final int mask = 0xffffffff << (32 - i); - tmp[i] = new byte[]{(byte) (mask >>> 24), (byte) (mask >>> 16), (byte) (mask >>> 8), (byte) mask}; - } - IPV4_MASKS = tmp; - } + private static void layer3Match(final List matchEntryList, final Layer3Match layer3Match) { + java.util.Optional> result = LAYER3_PROCESSOR.process(layer3Match); - @Override - public List convert( - final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match) { - List matchEntryList = new ArrayList<>(); - if (match == null) { - return matchEntryList; - } - if (match.getInPort() != null) { - //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+ - matchEntryList.add(toOfPort(InPort.class, - InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPort()))); + if (result.isPresent()) { + matchEntryList.addAll(result.get()); } + } - if (match.getInPhyPort() != null) { - //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+ - matchEntryList.add(toOfPhyPort(InPhyPort.class, - InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPhyPort()))); - } + private static void layer4Match(final List matchEntryList, final Layer4Match layer4Match) { + java.util.Optional> result = LAYER4_PROCESSOR.process(layer4Match); - org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata = match - .getMetadata(); - if (metadata != null) { - matchEntryList.add(toOfMetadata(Metadata.class, metadata.getMetadata(), metadata.getMetadataMask())); + if (result.isPresent()) { + matchEntryList.addAll(result.get()); } + } - ethernetMatch(matchEntryList, match.getEthernetMatch()); - vlanMatch(matchEntryList, match.getVlanMatch()); - ipMatch(matchEntryList, match.getIpMatch()); - layer4Match(matchEntryList, match.getLayer4Match()); - icmpv4Match(matchEntryList, match.getIcmpv4Match()); - icmpv6Match(matchEntryList, match.getIcmpv6Match()); - layer3Match(matchEntryList, match.getLayer3Match()); - protocolMatchFields(matchEntryList, match.getProtocolMatchFields()); - tcpFlagsMatch(matchEntryList, match.getTcpFlagsMatch()); - - org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel = match - .getTunnel(); - if (tunnel != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder(); - TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder(); - boolean hasMask = false; - if (null != tunnel.getTunnelMask()) { - hasMask = true; - tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES)); - } - tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES)); - tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build()); - matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryBuilder.setOxmMatchField(TunnelId.class); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryList.add(matchEntryBuilder.build()); + private static void inPortMatch(final List matchEntryList, NodeConnectorId inPort) { + if (inPort == null) { + return; } + //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+ + final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(InPort.class); + InPortCaseBuilder caseBuilder = new InPortCaseBuilder(); + InPortBuilder portBuilder = new InPortBuilder(); + portBuilder.setPortNumber(new PortNumber(portNumber)); + caseBuilder.setInPort(portBuilder.build()); + matchEntryBuilder.setMatchEntryValue(caseBuilder.build()); + matchEntryList.add(matchEntryBuilder.build()); + } - /** - * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava) - * - we might need version for conversion and for key - * - sanitize NPE - */ - Optional extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match); - if (extensionListOpt.isPresent()) { - for (ExtensionList extensionItem : extensionListOpt.get().getExtensionList()) { - // TODO: get real version - ConverterExtensionKey key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3); - ConvertorToOFJava convertor = - OFSessionUtil.getExtensionConvertorProvider().getConverter(key); - MatchEntry ofMatch = convertor.convert(extensionItem.getExtension()); - matchEntryList.add(ofMatch); - } + private static void inPhyPortMatch(final List matchEntryList, NodeConnectorId inPhyPort) { + if (inPhyPort == null) { + return; } - return matchEntryList; + //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+ + final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(InPhyPort.class); + InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder(); + InPhyPortBuilder portBuilder = new InPhyPortBuilder(); + portBuilder.setPortNumber(new PortNumber(portNumber)); + caseBuilder.setInPhyPort(portBuilder.build()); + matchEntryBuilder.setMatchEntryValue(caseBuilder.build()); + matchEntryList.add(matchEntryBuilder.build()); } - private static void tcpFlagsMatch(List matchEntryList, TcpFlagsMatch tcpFlagsMatch) { - ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder(); - if (tcpFlagsMatch != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(ExperimenterClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(TcpFlags.class); - - TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder(); - TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder(); - tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags()); - if(tcpFlagsMatch.getTcpFlagsMask() != null) { - matchEntryBuilder.setHasMask(true); - tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask())); - } - tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build()); - - //Set experimenter ID. - ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder(); - experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID)); - expIdCaseBuilder.setExperimenter(experimenterBuilder.build()); - - expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build()); - matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); + private static void metadataMatch(final List matchEntryList, + final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) { + if (metadata == null) { + return; } - } - - private static void protocolMatchFields(final List matchEntryList, - final ProtocolMatchFields protocolMatchFields) { - if (protocolMatchFields != null) { - if (protocolMatchFields.getMplsLabel() != null) { - matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel())); - } - - if (protocolMatchFields.getMplsBos() != null) { - matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos())); - } - if (protocolMatchFields.getMplsTc() != null) { - matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc())); - } + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + boolean hasmask = metadata.getMetadataMask() != null; + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Metadata.class); + MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder(); + org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder(); + metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES)); - if (protocolMatchFields.getPbb() != null) { - matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb())); - } + if (hasmask) { + metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES)); } - } - - - private static void layer3Match(final List matchEntryList, final Layer3Match layer3Match) { - if (layer3Match != null) { - if(layer3Match instanceof Ipv6MatchArbitraryBitMask){ - Ipv6MatchArbitraryBitMask Ipv6ArbitraryMaskMatchFields = (Ipv6MatchArbitraryBitMask) layer3Match; - if (Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Src.class); - - Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder(); - Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder(); - ipv6SrcBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask()); - Ipv6ArbitraryMask sourceArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6SourceArbitraryBitmask(); - boolean hasMask = false; - if (sourceArbitrarySubNetMask != null) { - byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(sourceArbitrarySubNetMask); - if (maskByteArray != null) { - ipv6SrcBuilder.setMask(maskByteArray); - hasMask = true; - } - } - matchEntryBuilder.setHasMask(hasMask); - ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - if (Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Dst.class); - - Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder(); - Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder(); - - ipv6DstBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask()); - Ipv6ArbitraryMask destinationArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6DestinationArbitraryBitmask(); - - boolean hasMask = false; - if (destinationArbitrarySubNetMask != null) { - byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(destinationArbitrarySubNetMask); - if (maskByteArray != null) { - ipv6DstBuilder.setMask(maskByteArray); - hasMask = true; - } - } - matchEntryBuilder.setHasMask(hasMask); - ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - } - if(layer3Match instanceof Ipv4MatchArbitraryBitMask) { - Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMaskFields = (Ipv4MatchArbitraryBitMask) layer3Match; - if (ipv4MatchArbitraryBitMaskFields.getIpv4SourceAddressNoMask() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Src.class); - - Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); - Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); - - ipv4SrcBuilder.setIpv4Address(ipv4MatchArbitraryBitMaskFields.getIpv4SourceAddressNoMask()); - DottedQuad sourceArbitrarySubNetMask = ipv4MatchArbitraryBitMaskFields.getIpv4SourceArbitraryBitmask(); - - boolean hasMask = false; - if (sourceArbitrarySubNetMask != null) { - byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(sourceArbitrarySubNetMask); - if (maskByteArray != null) { - ipv4SrcBuilder.setMask(maskByteArray); - hasMask = true; - } - } - matchEntryBuilder.setHasMask(hasMask); - ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - if (ipv4MatchArbitraryBitMaskFields.getIpv4DestinationAddressNoMask() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); - - Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); - Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); - - ipv4DstBuilder.setIpv4Address(ipv4MatchArbitraryBitMaskFields.getIpv4DestinationAddressNoMask()); - DottedQuad destArbitrarySubNetMask = ipv4MatchArbitraryBitMaskFields.getIpv4DestinationArbitraryBitmask(); - - boolean hasMask = false; - if (destArbitrarySubNetMask != null) { - byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(destArbitrarySubNetMask); - if (maskByteArray != null) { - ipv4DstBuilder.setMask(maskByteArray); - hasMask = true; - } - } - matchEntryBuilder.setHasMask(hasMask); - ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - } - if(layer3Match instanceof Ipv4Match){ - Ipv4Match ipv4Match = (Ipv4Match) layer3Match; - if (ipv4Match.getIpv4Source() != null) { - Ipv4Prefix ipv4Prefix = ipv4Match.getIpv4Source(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Src.class); - - Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); - Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - ipv4SrcBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - ipv4SrcBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - if (ipv4Match.getIpv4Destination() != null) { - Ipv4Prefix ipv4Prefix = ipv4Match.getIpv4Destination(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); - - Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); - Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - ipv4DstBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - ipv4DstBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - } - if (layer3Match instanceof TunnelIpv4Match) { - TunnelIpv4Match tunnelIpv4Src = (TunnelIpv4Match) layer3Match; - if (tunnelIpv4Src.getTunnelIpv4Source() != null) { - Ipv4Prefix ipv4Prefix = tunnelIpv4Src.getTunnelIpv4Source(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Src.class); - - Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); - Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - ipv4SrcBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - ipv4SrcBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - if (tunnelIpv4Src.getTunnelIpv4Destination() != null) { - Ipv4Prefix ipv4Prefix = tunnelIpv4Src.getTunnelIpv4Destination(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); - - Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); - Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - ipv4DstBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - ipv4DstBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - } else if (layer3Match instanceof ArpMatch) { - ArpMatch arpMatch = (ArpMatch) layer3Match; - if (arpMatch.getArpOp() != null) { - matchEntryList.add(toOfArpOpCode(arpMatch.getArpOp())); - } - - if (arpMatch.getArpSourceTransportAddress() != null) { - Ipv4Prefix ipv4Prefix = arpMatch.getArpSourceTransportAddress(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(ArpSpa.class); - - ArpSpaCaseBuilder arpSpaCaseBuilder = new ArpSpaCaseBuilder(); - ArpSpaBuilder arpSpaBuilder = new ArpSpaBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - arpSpaBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - arpSpaBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - arpSpaCaseBuilder.setArpSpa(arpSpaBuilder.build()); - matchEntryBuilder.setMatchEntryValue(arpSpaCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - if (arpMatch.getArpTargetTransportAddress() != null) { - Ipv4Prefix ipv4Prefix = arpMatch.getArpTargetTransportAddress(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(ArpTpa.class); - - ArpTpaCaseBuilder arpTpaCaseBuilder = new ArpTpaCaseBuilder(); - ArpTpaBuilder arpTpaBuilder = new ArpTpaBuilder(); - - Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); - Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); - arpTpaBuilder.setIpv4Address(ipv4Address); - boolean hasMask = false; - byte[] mask = extractIpv4Mask(addressParts); - if (null != mask) { - arpTpaBuilder.setMask(mask); - hasMask = true; - } - matchEntryBuilder.setHasMask(hasMask); - arpTpaCaseBuilder.setArpTpa(arpTpaBuilder.build()); - matchEntryBuilder.setMatchEntryValue(arpTpaCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } - - ArpSourceHardwareAddress arpSourceHardwareAddress = arpMatch.getArpSourceHardwareAddress(); - if (arpSourceHardwareAddress != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(ArpSha.class); - - ArpShaCaseBuilder arpShaCaseBuilder = new ArpShaCaseBuilder(); - ArpShaBuilder arpShaBuilder = new ArpShaBuilder(); - arpShaBuilder.setMacAddress(arpSourceHardwareAddress.getAddress()); - boolean hasMask = false; - if (null != arpSourceHardwareAddress.getMask()) { - arpShaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpSourceHardwareAddress.getMask().getValue())); - hasMask = true; - } - arpShaCaseBuilder.setArpSha(arpShaBuilder.build()); - matchEntryBuilder.setMatchEntryValue(arpShaCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryList.add(matchEntryBuilder.build()); - } + metadataCaseBuilder.setMetadata(metadataBuilder.build()); + matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasmask); + matchEntryList.add(matchEntryBuilder.build()); + } - ArpTargetHardwareAddress arpTargetHardwareAddress = arpMatch.getArpTargetHardwareAddress(); - if (arpTargetHardwareAddress != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(ArpTha.class); - - ArpThaCaseBuilder arpThaCaseBuilder = new ArpThaCaseBuilder(); - ArpThaBuilder arpThaBuilder = new ArpThaBuilder(); - arpThaBuilder.setMacAddress(arpTargetHardwareAddress.getAddress()); - boolean hasMask = false; - if (null != arpTargetHardwareAddress.getMask()) { - arpThaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpTargetHardwareAddress.getMask().getValue())); - hasMask = true; - } - arpThaCaseBuilder.setArpTha(arpThaBuilder.build()); - matchEntryBuilder.setMatchEntryValue(arpThaCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryList.add(matchEntryBuilder.build()); - } - } else if (layer3Match instanceof Ipv6Match) { - Ipv6Match ipv6Match = (Ipv6Match) layer3Match; - if (ipv6Match.getIpv6Source() != null) { - Ipv6Prefix ipv6Prefix = ipv6Match.getIpv6Source(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Src.class); - - Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder(); - Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder(); - final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix); - boolean hasMask = false; - if (null != prefix) { - ipv6SrcBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix)); - hasMask = true; - } - ipv6SrcBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix)); - ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } + private static void tunnelMatch(final List matchEntryList, + final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) { + if (tunnel == null) { + return; + } - if (ipv6Match.getIpv6Destination() != null) { - Ipv6Prefix ipv6Prefix = ipv6Match.getIpv6Destination(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Dst.class); - - Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder(); - Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder(); - final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix); - boolean hasMask = false; - if (null != prefix) { - ipv6DstBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix)); - hasMask = true; - } - ipv6DstBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix)); - ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build()); - matchEntryList.add(matchEntryBuilder.build()); - } + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder(); + TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder(); + boolean hasMask = tunnel.getTunnelMask() != null; - if (ipv6Match.getIpv6Label() != null) { - matchEntryList.add(toOfIpv6FlowLabel(ipv6Match.getIpv6Label())); - } + if (hasMask) { + tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES)); + } - if (ipv6Match.getIpv6NdTarget() != null) { - matchEntryList.add(toOfIpv6NdTargetAddress(ipv6Match.getIpv6NdTarget())); - } + tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES)); + tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build()); + matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryBuilder.setOxmMatchField(TunnelId.class); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryList.add(matchEntryBuilder.build()); + } - if (ipv6Match.getIpv6NdSll() != null) { - MacAddress ipv6NdSll = ipv6Match.getIpv6NdSll(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6NdSll.class); - - Ipv6NdSllCaseBuilder ipv6NdSllCaseBuilder = new Ipv6NdSllCaseBuilder(); - Ipv6NdSllBuilder ipv6NdSllBuilder = new Ipv6NdSllBuilder(); - ipv6NdSllBuilder.setMacAddress(ipv6NdSll); - ipv6NdSllCaseBuilder.setIpv6NdSll(ipv6NdSllBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6NdSllCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } + private static void protocolMatchFields(final List matchEntryList, + final ProtocolMatchFields protocolMatchFields) { + if (protocolMatchFields == null) { + return; + } - if (ipv6Match.getIpv6NdTll() != null) { - MacAddress ipv6NdSll = ipv6Match.getIpv6NdTll(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6NdTll.class); + if (protocolMatchFields.getMplsLabel() != null) { + matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel())); + } - Ipv6NdTllCaseBuilder ipv6NdTllCaseBuilder = new Ipv6NdTllCaseBuilder(); - Ipv6NdTllBuilder ipv6NdTllBuilder = new Ipv6NdTllBuilder(); - ipv6NdTllBuilder.setMacAddress(ipv6NdSll); - ipv6NdTllCaseBuilder.setIpv6NdTll(ipv6NdTllBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6NdTllCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); + if (protocolMatchFields.getMplsBos() != null) { + matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos())); + } - } + if (protocolMatchFields.getMplsTc() != null) { + matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc())); + } - if (ipv6Match.getIpv6ExtHeader() != null) { - matchEntryList.add(toOfIpv6ExtHeader(ipv6Match.getIpv6ExtHeader())); - } - } + if (protocolMatchFields.getPbb() != null) { + matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb())); } } - private static void icmpv6Match(final List matchEntryList, final Icmpv6Match icmpv6Match) { - if (icmpv6Match != null) { - if (icmpv6Match.getIcmpv6Type() != null) { - matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type())); - } - - if (icmpv6Match.getIcmpv6Code() != null) { - matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code())); - } + if (icmpv6Match == null) { + return; } - } - - private static void icmpv4Match(final List matchEntryList, final Icmpv4Match icmpv4Match) { - if (icmpv4Match != null) { - if (icmpv4Match.getIcmpv4Type() != null) { - matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type())); - } + if (icmpv6Match.getIcmpv6Type() != null) { + matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type())); + } - if (icmpv4Match.getIcmpv4Code() != null) { - matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code())); - } + if (icmpv6Match.getIcmpv6Code() != null) { + matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code())); } } + private static void icmpv4Match(final List matchEntryList, final Icmpv4Match icmpv4Match) { + if (icmpv4Match == null) { + return; + } - private static void layer4Match(final List matchEntryList, final Layer4Match layer4Match) { - if (layer4Match != null) { - if (layer4Match instanceof TcpMatch) { - TcpMatch tcpMatch = (TcpMatch) layer4Match; - - if (tcpMatch.getTcpSourcePort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(TcpSrc.class); - - TcpSrcCaseBuilder tcpSrcCaseBuilder = new TcpSrcCaseBuilder(); - TcpSrcBuilder tcpSrcBuilder = new TcpSrcBuilder(); - tcpSrcBuilder.setPort(tcpMatch.getTcpSourcePort()); - tcpSrcCaseBuilder.setTcpSrc(tcpSrcBuilder.build()); - - matchEntryBuilder.setMatchEntryValue(tcpSrcCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } - if (tcpMatch.getTcpDestinationPort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(TcpDst.class); - - TcpDstCaseBuilder tcpDstCaseBuilder = new TcpDstCaseBuilder(); - TcpDstBuilder tcpDstBuilder = new TcpDstBuilder(); - tcpDstBuilder.setPort(tcpMatch.getTcpDestinationPort()); - tcpDstCaseBuilder.setTcpDst(tcpDstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(tcpDstCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } - } else if (layer4Match instanceof UdpMatch) { - UdpMatch udpMatch = (UdpMatch) layer4Match; - if (udpMatch.getUdpSourcePort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(UdpSrc.class); - - UdpSrcCaseBuilder udpSrcCaseBuilder = new UdpSrcCaseBuilder(); - UdpSrcBuilder udpSrcBuilder = new UdpSrcBuilder(); - boolean hasMask = false; - udpSrcBuilder.setPort(udpMatch.getUdpSourcePort()); - udpSrcCaseBuilder.setUdpSrc(udpSrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(udpSrcCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryList.add(matchEntryBuilder.build()); - } - - if (udpMatch.getUdpDestinationPort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(UdpDst.class); - - UdpDstCaseBuilder udpDstCaseBuilder = new UdpDstCaseBuilder(); - UdpDstBuilder udpDstBuilder = new UdpDstBuilder(); - udpDstBuilder.setPort(udpMatch.getUdpDestinationPort()); - udpDstCaseBuilder.setUdpDst(udpDstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(udpDstCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } - } else if (layer4Match instanceof SctpMatch) { - SctpMatch sctpMatch = (SctpMatch) layer4Match; - if (sctpMatch.getSctpSourcePort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(SctpSrc.class); - - SctpSrcCaseBuilder sctpSrcCaseBuilder = new SctpSrcCaseBuilder(); - SctpSrcBuilder sctpSrcBuilder = new SctpSrcBuilder(); - sctpSrcBuilder.setPort(sctpMatch.getSctpSourcePort()); - sctpSrcCaseBuilder.setSctpSrc(sctpSrcBuilder.build()); - matchEntryBuilder.setMatchEntryValue(sctpSrcCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } + if (icmpv4Match.getIcmpv4Type() != null) { + matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type())); + } - if (sctpMatch.getSctpDestinationPort() != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(SctpDst.class); - - SctpDstCaseBuilder sctpDstCaseBuilder = new SctpDstCaseBuilder(); - SctpDstBuilder sctpDstBuilder = new SctpDstBuilder(); - sctpDstBuilder.setPort(sctpMatch.getSctpDestinationPort()); - sctpDstCaseBuilder.setSctpDst(sctpDstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(sctpDstCaseBuilder.build()); - matchEntryBuilder.setHasMask(false); - matchEntryList.add(matchEntryBuilder.build()); - } - } + if (icmpv4Match.getIcmpv4Code() != null) { + matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code())); } } - private static void ipMatch(final List matchEntryList, final IpMatch ipMatch) { - if (ipMatch != null) { - if (ipMatch.getIpDscp() != null) { - matchEntryList.add(toOfIpDscp(ipMatch.getIpDscp())); - } + if (ipMatch == null) { + return; + } - if (ipMatch.getIpEcn() != null) { - matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn())); - } + if (ipMatch.getIpDscp() != null) { + matchEntryList.add(MatchConvertorUtil.toOfIpDscp(ipMatch.getIpDscp())); + } - if (ipMatch.getIpProtocol() != null) { - matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol())); - } + if (ipMatch.getIpEcn() != null) { + matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn())); } - } + if (ipMatch.getIpProtocol() != null) { + matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol())); + } + } private static void vlanMatch(final List matchEntryList, final VlanMatch vlanMatch) { - if (vlanMatch != null) { - if (vlanMatch.getVlanId() != null) { - VlanId vlanId = vlanMatch.getVlanId(); - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(VlanVid.class); - - VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder(); - VlanVidBuilder vlanVidBuilder = new VlanVidBuilder(); - boolean setCfiBit = false; - Integer vidEntryValue = 0; - boolean hasmask = false; - if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) { - setCfiBit = true; - if (vlanId.getVlanId() != null) { - vidEntryValue = vlanId.getVlanId().getValue(); - } - hasmask = (vidEntryValue == 0); - if (hasmask) { - vlanVidBuilder.setMask(VLAN_VID_MASK); - } - } - - vlanVidBuilder.setCfiBit(setCfiBit); - vlanVidBuilder.setVlanVid(vidEntryValue); - vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build()); - matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasmask); - matchEntryList.add(matchEntryBuilder.build()); - } - - if (vlanMatch.getVlanPcp() != null) { - matchEntryList.add(toOfVlanPcp(vlanMatch.getVlanPcp())); - } + if (vlanMatch == null) { + return; } - } + if (vlanMatch.getVlanId() != null) { + VlanId vlanId = vlanMatch.getVlanId(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(VlanVid.class); + VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder(); + VlanVidBuilder vlanVidBuilder = new VlanVidBuilder(); + boolean setCfiBit = false; + Integer vidEntryValue = 0; + boolean hasmask = false; - private static void ethernetMatch(final List matchEntryList, final EthernetMatch ethernetMatch) { - if (ethernetMatch != null) { - EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination(); - if (ethernetDestination != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(EthDst.class); - EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder(); - EthDstBuilder ethDstBuilder = new EthDstBuilder(); - ethDstBuilder.setMacAddress(ethernetDestination.getAddress()); - boolean hasMask = false; - if (null != ethernetDestination.getMask()) { - ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue())); - hasMask = true; + if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) { + setCfiBit = true; + if (vlanId.getVlanId() != null) { + vidEntryValue = vlanId.getVlanId().getValue(); } - ethDstCaseBuilder.setEthDst(ethDstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryList.add(matchEntryBuilder.build()); - } - EthernetSource ethernetSource = ethernetMatch.getEthernetSource(); - if (ethernetSource != null) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(EthSrc.class); - - EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder(); - EthSrcBuilder ethDstBuilder = new EthSrcBuilder(); - ethDstBuilder.setMacAddress(ethernetSource.getAddress()); - boolean hasMask = false; - if (null != ethernetSource.getMask()) { - ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue())); - hasMask = true; + hasmask = (vidEntryValue == 0); + if (hasmask) { + vlanVidBuilder.setMask(VLAN_VID_MASK); } - ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasMask); - matchEntryList.add(matchEntryBuilder.build()); - } - - if (ethernetMatch.getEthernetType() != null) { - matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType())); } - } - } - - private static byte[] extractIpv4Mask(final Iterator addressParts) { - final int prefix; - if (addressParts.hasNext()) { - int potentionalPrefix = Integer.parseInt(addressParts.next()); - prefix = potentionalPrefix < 32 ? potentionalPrefix : 0; - } else { - prefix = 0; + vlanVidBuilder.setCfiBit(setCfiBit); + vlanVidBuilder.setVlanVid(vidEntryValue); + vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build()); + matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasmask); + matchEntryList.add(matchEntryBuilder.build()); } - if (prefix != 0) { - // clone() is necessary to protect our constants - return IPV4_MASKS[prefix].clone(); + if (vlanMatch.getVlanPcp() != null) { + matchEntryList.add(MatchConvertorUtil.toOfVlanPcp(vlanMatch.getVlanPcp())); } - return null; } - /** - * Method convert Openflow 1.0 specific flow match to MD-SAL format flow - * match - * @param swMatch source match - * @param datapathid datapath id - * @param ofVersion openflow version - * @return match builder - */ - public static MatchBuilder fromOFMatchV10ToSALMatch(@Nonnull final MatchV10 swMatch, @Nonnull final BigInteger datapathid, @Nonnull final OpenflowVersion ofVersion) { - MatchBuilder matchBuilder = new MatchBuilder(); - EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder(); - VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder(); - Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder(); - IpMatchBuilder ipMatchBuilder = new IpMatchBuilder(); - if (!swMatch.getWildcards().isINPORT().booleanValue() && swMatch.getInPort() != null) { - matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid, - (long) swMatch.getInPort(), ofVersion)); + private static void ethernetMatch(final List matchEntryList, final EthernetMatch ethernetMatch) { + if (ethernetMatch == null) { + return; } - if (!swMatch.getWildcards().isDLSRC().booleanValue() && swMatch.getDlSrc() != null) { - EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder(); - ethSrcBuilder.setAddress(swMatch.getDlSrc()); - ethMatchBuilder.setEthernetSource(ethSrcBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - if (!swMatch.getWildcards().isDLDST().booleanValue() && swMatch.getDlDst() != null) { - EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder(); - ethDstBuilder.setAddress(swMatch.getDlDst()); - ethMatchBuilder.setEthernetDestination(ethDstBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getDlType() != null) { - EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); - ethTypeBuilder.setType(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType( - (long) swMatch.getDlType())); - ethMatchBuilder.setEthernetType(ethTypeBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - if (!swMatch.getWildcards().isDLVLAN().booleanValue() && swMatch.getDlVlan() != null) { - VlanIdBuilder vlanIdBuilder = new VlanIdBuilder(); - int vlanId = (swMatch.getDlVlan() == (0xffff)) ? 0 : swMatch.getDlVlan(); - vlanIdBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanId)); - vlanIdBuilder.setVlanIdPresent(vlanId == 0 ? false : true); - vlanMatchBuilder.setVlanId(vlanIdBuilder.build()); - matchBuilder.setVlanMatch(vlanMatchBuilder.build()); - } - if (!swMatch.getWildcards().isDLVLANPCP().booleanValue() && swMatch.getDlVlanPcp() != null) { - vlanMatchBuilder.setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp( - swMatch.getDlVlanPcp())); - matchBuilder.setVlanMatch(vlanMatchBuilder.build()); - } - if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getNwSrc() != null) { - final Ipv4Prefix prefix; - if (swMatch.getNwSrcMask() != null) { - prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwSrc(), swMatch.getNwSrcMask()); - } else { - //Openflow Spec : 1.3.2 - //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. - // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow - // statistics response. - prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwSrc()); - } - if (!NO_IP.equals(prefix.getValue())) { - ipv4MatchBuilder.setIpv4Source(prefix); - matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); - } - } - if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getNwDst() != null) { - final Ipv4Prefix prefix; - if (swMatch.getNwDstMask() != null) { - prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwDst(), swMatch.getNwDstMask()); - } else { - //Openflow Spec : 1.3.2 - //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. - // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow - // statistics response. - prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwDst()); - } - if (!NO_IP.equals(prefix.getValue())) { - ipv4MatchBuilder.setIpv4Destination(prefix); - matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); + EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination(); + if (ethernetDestination != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(EthDst.class); + EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder(); + EthDstBuilder ethDstBuilder = new EthDstBuilder(); + ethDstBuilder.setMacAddress(ethernetDestination.getAddress()); + boolean hasMask = ethernetDestination.getMask() != null; + + if (hasMask) { + ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue())); } - } - if (!swMatch.getWildcards().isNWPROTO().booleanValue() && swMatch.getNwProto() != null) { - Short nwProto = swMatch.getNwProto(); - ipMatchBuilder.setIpProtocol(nwProto); - matchBuilder.setIpMatch(ipMatchBuilder.build()); - - int proto = nwProto.intValue(); - if (proto == PROTO_TCP) { - TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder(); - boolean hasTcp = false; - if (!swMatch.getWildcards().isTPSRC().booleanValue() && swMatch.getTpSrc() != null) { - tcpMatchBuilder - .setTcpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( - swMatch.getTpSrc())); - hasTcp = true; - } - if (!swMatch.getWildcards().isTPDST().booleanValue() && swMatch.getTpDst() != null) { - tcpMatchBuilder - .setTcpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( - swMatch.getTpDst())); - hasTcp = true; - } - - if (hasTcp) { - matchBuilder.setLayer4Match(tcpMatchBuilder.build()); - } - } else if (proto == PROTO_UDP) { - UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder(); - boolean hasUdp = false; - if (!swMatch.getWildcards().isTPSRC().booleanValue() && swMatch.getTpSrc() != null) { - udpMatchBuilder - .setUdpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( - swMatch.getTpSrc())); - hasUdp = true; - } - if (!swMatch.getWildcards().isTPDST().booleanValue() && swMatch.getTpDst() != null) { - udpMatchBuilder - .setUdpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( - swMatch.getTpDst())); - hasUdp = true; - } - - if (hasUdp) { - matchBuilder.setLayer4Match(udpMatchBuilder.build()); - } - } else if (proto == PROTO_ICMPV4) { - Icmpv4MatchBuilder icmpv4MatchBuilder = new Icmpv4MatchBuilder(); - boolean hasIcmpv4 = false; - if (!swMatch.getWildcards().isTPSRC().booleanValue()) { - Integer type = swMatch.getTpSrc(); - if (type != null) { - icmpv4MatchBuilder.setIcmpv4Type(type.shortValue()); - hasIcmpv4 = true; - } - } - if (!swMatch.getWildcards().isTPDST().booleanValue()) { - Integer code = swMatch.getTpDst(); - if (code != null) { - icmpv4MatchBuilder.setIcmpv4Code(code.shortValue()); - hasIcmpv4 = true; - } - } - if (hasIcmpv4) { - matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); - } - } - } - if (!swMatch.getWildcards().isNWTOS().booleanValue() && swMatch.getNwTos() != null) { - Short dscp = ActionUtil.tosToDscp(swMatch.getNwTos().shortValue()); - ipMatchBuilder.setIpDscp(new Dscp(dscp)); - matchBuilder.setIpMatch(ipMatchBuilder.build()); + ethDstCaseBuilder.setEthDst(ethDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryList.add(matchEntryBuilder.build()); } - return matchBuilder; - } - - /** - * Method converts Openflow 1.3+ specific flow match to MD-SAL format flow - * match - * - * @param swMatch source match - * @param datapathid datapath id - * @param ofVersion openflow version - * @return md-sal match instance - * @author avishnoi@in.ibm.com - */ - public static MatchBuilder fromOFMatchToSALMatch( - @Nonnull final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match swMatch, - @Nonnull final BigInteger datapathid, @Nonnull final OpenflowVersion ofVersion) { - return OfMatchToSALMatchConvertor(swMatch.getMatchEntry(), datapathid, ofVersion); - } - - private static MatchBuilder OfMatchToSALMatchConvertor(final List swMatchList, final BigInteger datapathid, - final OpenflowVersion ofVersion) { - - MatchBuilder matchBuilder = new MatchBuilder(); - EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder(); - VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder(); - IpMatchBuilder ipMatchBuilder = new IpMatchBuilder(); - TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder(); - UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder(); - SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder(); - Icmpv4MatchBuilder icmpv4MatchBuilder = new Icmpv4MatchBuilder(); - Icmpv6MatchBuilder icmpv6MatchBuilder = new Icmpv6MatchBuilder(); - Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder(); - Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = new Ipv4MatchArbitraryBitMaskBuilder(); - ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder(); - Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder(); - Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = new Ipv6MatchArbitraryBitMaskBuilder(); - ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder(); - TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder(); - TcpFlagsMatchBuilder tcpFlagsMatchBuilder = new TcpFlagsMatchBuilder(); - - for (MatchEntry ofMatch : swMatchList) { - - if (ofMatch.getOxmMatchField().equals(InPort.class)) { - PortNumber portNumber = ((InPortCase) ofMatch.getMatchEntryValue()).getInPort().getPortNumber(); - if (portNumber != null) { - matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid, portNumber.getValue(), ofVersion)); - } - } else if (ofMatch.getOxmMatchField().equals(InPhyPort.class)) { - PortNumber portNumber = ((InPhyPortCase) ofMatch.getMatchEntryValue()).getInPhyPort().getPortNumber(); - matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid, - portNumber.getValue(), ofVersion)); - } else if (ofMatch.getOxmMatchField().equals(Metadata.class)) { - MetadataBuilder metadataBuilder = new MetadataBuilder(); - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.Metadata metadata = ((MetadataCase) ofMatch.getMatchEntryValue()).getMetadata(); - if (metadata != null) { - metadataBuilder.setMetadata(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadata.getMetadata())); - byte[] metadataMask = metadata.getMask(); - if (metadataMask != null) { - metadataBuilder.setMetadataMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadataMask)); - } - matchBuilder.setMetadata(metadataBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(EthSrc.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrc ethSrcCase = ((EthSrcCase) ofMatch.getMatchEntryValue()).getEthSrc(); - if (ethSrcCase != null) { - EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder(); - ethSourceBuilder.setAddress(ethSrcCase.getMacAddress()); - byte[] mask = ethSrcCase.getMask(); - if (mask != null) { - ethSourceBuilder.setMask(new MacAddress(macAddressToString(mask))); - } - ethMatchBuilder.setEthernetSource(ethSourceBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(EthDst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDst ethDstCase = ((EthDstCase) ofMatch.getMatchEntryValue()).getEthDst(); - if (ethDstCase != null) { - EthernetDestinationBuilder ethDestinationBuilder = new EthernetDestinationBuilder(); - ethDestinationBuilder.setAddress(ethDstCase.getMacAddress()); - byte[] destinationMask = ethDstCase.getMask(); - if (destinationMask != null) { - ethDestinationBuilder.setMask(new MacAddress(macAddressToString(destinationMask))); - } - ethMatchBuilder.setEthernetDestination(ethDestinationBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(EthType.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthType ethTypeCase = ((EthTypeCase) ofMatch.getMatchEntryValue()).getEthType(); - if (ethTypeCase != null) { - EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); - ethTypeBuilder - .setType(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType( - (long) ethTypeCase.getEthType().getValue())); - ethMatchBuilder.setEthernetType(ethTypeBuilder.build()); - matchBuilder.setEthernetMatch(ethMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(VlanVid.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVid vlanVid = ((VlanVidCase) ofMatch.getMatchEntryValue()).getVlanVid(); - if (vlanVid != null) { - VlanIdBuilder vlanBuilder = new VlanIdBuilder(); - vlanBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId( - vlanVid.getVlanVid())) - .setVlanIdPresent(vlanVid.isCfiBit()); - vlanBuilder.setVlanIdPresent(vlanVid.isCfiBit()); - vlanMatchBuilder.setVlanId(vlanBuilder.build()); - - matchBuilder.setVlanMatch(vlanMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(VlanPcp.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcp vlanPcp = ((VlanPcpCase) ofMatch.getMatchEntryValue()).getVlanPcp(); - if (vlanPcp != null) { - vlanMatchBuilder - .setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp( - vlanPcp.getVlanPcp())); - matchBuilder.setVlanMatch(vlanMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(IpDscp.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscp ipDscp = ((IpDscpCase) ofMatch.getMatchEntryValue()).getIpDscp(); - if (ipDscp != null) { - ipMatchBuilder.setIpDscp(new Dscp(ipDscp.getDscp().getValue())); - matchBuilder.setIpMatch(ipMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(IpEcn.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcn ipEcn = ((IpEcnCase) ofMatch.getMatchEntryValue()).getIpEcn(); - if (ipEcn != null) { - ipMatchBuilder.setIpEcn(ipEcn.getEcn()); - matchBuilder.setIpMatch(ipMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(IpProto.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProto ipProto = ((IpProtoCase) ofMatch.getMatchEntryValue()).getIpProto(); - Short protocolNumber = ipProto.getProtocolNumber(); - if (protocolNumber != null) { - ipMatchBuilder.setIpProtocol(protocolNumber); - matchBuilder.setIpMatch(ipMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(TcpSrc.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrc tcpSrc = ((TcpSrcCase) ofMatch.getMatchEntryValue()).getTcpSrc(); - if (tcpSrc != null) { - tcpMatchBuilder.setTcpSourcePort(tcpSrc.getPort()); - matchBuilder.setLayer4Match(tcpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(TcpDst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDst tcpDst = ((TcpDstCase) ofMatch.getMatchEntryValue()).getTcpDst(); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = tcpDst.getPort(); - if (portNumber != null) { - tcpMatchBuilder.setTcpDestinationPort(portNumber); - matchBuilder.setLayer4Match(tcpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(UdpSrc.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrc udpSrc = ((UdpSrcCase) ofMatch.getMatchEntryValue()).getUdpSrc(); - if (udpSrc != null) { - udpMatchBuilder.setUdpSourcePort(udpSrc.getPort()); - matchBuilder.setLayer4Match(udpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(UdpDst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDst udpDst = ((UdpDstCase) ofMatch.getMatchEntryValue()).getUdpDst(); - if (udpDst != null) { - udpMatchBuilder.setUdpDestinationPort(udpDst.getPort()); - matchBuilder.setLayer4Match(udpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(SctpSrc.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrc sctpSrc = ((SctpSrcCase) ofMatch.getMatchEntryValue()).getSctpSrc(); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = sctpSrc.getPort(); - if (portNumber != null) { - sctpMatchBuilder.setSctpSourcePort(portNumber); - matchBuilder.setLayer4Match(sctpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(SctpDst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDst sctpDst = ((SctpDstCase) ofMatch.getMatchEntryValue()).getSctpDst(); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = sctpDst.getPort(); - if (portNumber != null) { - sctpMatchBuilder.setSctpDestinationPort(portNumber); - matchBuilder.setLayer4Match(sctpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Icmpv4Type.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4Type icmpv4Type = ((Icmpv4TypeCase) ofMatch.getMatchEntryValue()).getIcmpv4Type(); - Short type = icmpv4Type.getIcmpv4Type(); - if (type != null) { - icmpv4MatchBuilder.setIcmpv4Type(type); - matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Icmpv4Code.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4Code icmpv4Code = ((Icmpv4CodeCase) ofMatch.getMatchEntryValue()).getIcmpv4Code(); - Short v4code = icmpv4Code.getIcmpv4Code(); - if (v4code != null) { - icmpv4MatchBuilder.setIcmpv4Code(v4code); - matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Icmpv6Type.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6Type icmpv6Type = ((Icmpv6TypeCase) ofMatch.getMatchEntryValue()).getIcmpv6Type(); - Short v6type = icmpv6Type.getIcmpv6Type(); - if (v6type != null) { - icmpv6MatchBuilder.setIcmpv6Type(v6type); - matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Icmpv6Code.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6Code icmpv6Code = ((Icmpv6CodeCase) ofMatch.getMatchEntryValue()).getIcmpv6Code(); - Short v6code = icmpv6Code.getIcmpv6Code(); - if (v6code != null) { - icmpv6MatchBuilder.setIcmpv6Code(v6code); - matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src ipv4Address = ((Ipv4SrcCase) ofMatch.getMatchEntryValue()).getIpv4Src(); - if (ipv4Address != null) { - byte[] mask = ipv4Address.getMask(); - if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { - // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary. - // Needs to convert ipv4dst to ipv4MatchArbitrary. - if (ipv4MatchBuilder.getIpv4Destination() != null) { - Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination(); - Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress); - DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress); - setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, - dstDottedQuadMask, ipv4DstAddress.getValue()); - } - DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); - setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, - srcDottedQuadMask, stringIpv4SrcAddress); - matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); - } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) { - /* - Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, - source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. - We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 - expected output example:- - 36.36.36.0/24 - 36.36.36.0 - 255.0.255.0 - after conversion output example:- - 36.36.36.0 - 255.255.255.0 - 36.36.36.0 - 255.0.255.0 - */ - DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); - setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, - srcDottedQuadMask, stringIpv4SrcAddress); - matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); - } else { - String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, stringIpv4SrcAddress); - matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst ipv4Address = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst(); - if (ipv4Address != null) { - byte[] mask = ipv4Address.getMask(); - if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { - // case where ipv4src is of type ipv4MatchBuilder and ipv4dst is of type ipv4MatchArbitrary. - // Needs to convert ipv4src to ipv4MatchArbitrary. - if (ipv4MatchBuilder.getIpv4Source() != null) { - Ipv4Prefix ipv4PrefixSourceAddress = ipv4MatchBuilder.getIpv4Source(); - Ipv4Address ipv4SourceAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixSourceAddress); - DottedQuad srcDottedQuad = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixSourceAddress); - setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder,ofMatch, - srcDottedQuad, ipv4SourceAddress.getValue()); - } - DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); - setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, - dstDottedQuadMask, stringIpv4DstAddress); - matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); - } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4SourceAddressNoMask() != null) { - /* - Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, - destination which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. - We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 - expected output example:- - 36.36.36.0/24 - 36.36.36.0 - 255.0.255.0 - after conversion output example:- - 36.36.36.0 - 255.255.255.0 - 36.36.36.0 - 255.0.255.0 - */ - DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); - setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, - dstDottedQuadMask, stringIpv4DstAddress); - matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); - } - else { - String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr); - matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(TunnelIpv4Dst.class) - || ofMatch.getOxmMatchField().equals(TunnelIpv4Src.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst tunnelIpv4Dst = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst(); - if (tunnelIpv4Dst != null) { - String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue(); - byte[] mask = tunnelIpv4Dst.getMask(); - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr); - matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(TunnelIpv4Src.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src tunnelIpv4Dst = ((Ipv4SrcCase) ofMatch.getMatchEntryValue()).getIpv4Src(); - if (tunnelIpv4Dst != null) { - String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue(); - byte[] mask = tunnelIpv4Dst.getMask(); - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr); - matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(ArpOp.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOp arpOp = ((ArpOpCase) ofMatch.getMatchEntryValue()).getArpOp(); - if (arpOp != null) { - arpMatchBuilder.setArpOp(arpOp.getOpCode()); - - matchBuilder.setLayer3Match(arpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(ArpSpa.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpa arpSpa = ((ArpSpaCase) ofMatch.getMatchEntryValue()).getArpSpa(); - if (arpSpa != null) { - int mask = 32; - if (null != arpSpa.getMask()){ - mask = IpConversionUtil.countBits(arpSpa.getMask()); - } - Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpSpa.getIpv4Address(), mask); - arpMatchBuilder.setArpSourceTransportAddress(ipv4Prefix); - matchBuilder.setLayer3Match(arpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(ArpTpa.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpa arpTpa = ((ArpTpaCase) ofMatch.getMatchEntryValue()).getArpTpa(); - if (arpTpa != null) { - int mask = 32; - if (null != arpTpa.getMask()){ - mask = IpConversionUtil.countBits(arpTpa.getMask()); - } - Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpTpa.getIpv4Address(), mask); - - arpMatchBuilder.setArpTargetTransportAddress(ipv4Prefix); - matchBuilder.setLayer3Match(arpMatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(ArpSha.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpSha arpSha = ((ArpShaCase) ofMatch.getMatchEntryValue()).getArpSha(); - MacAddress macAddress = arpSha.getMacAddress(); - if (macAddress != null) { - if (ofMatch.getOxmMatchField().equals(ArpSha.class)) { - ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder(); - arpSourceHardwareAddressBuilder.setAddress(macAddress); - byte[] mask = arpSha.getMask(); - if (mask != null) { - arpSourceHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils - .macAddressToString(mask))); - } - arpMatchBuilder.setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder.build()); - matchBuilder.setLayer3Match(arpMatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(ArpTha.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpTha arpTha = ((ArpThaCase) ofMatch.getMatchEntryValue()).getArpTha(); - MacAddress macAddress = arpTha.getMacAddress(); - if (macAddress != null) { - if (ofMatch.getOxmMatchField().equals(ArpTha.class)) { - ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder(); - arpTargetHardwareAddressBuilder.setAddress(macAddress); - byte[] mask = arpTha.getMask(); - if (mask != null) { - arpTargetHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils - .macAddressToString(mask))); - } - arpMatchBuilder.setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder.build()); - matchBuilder.setLayer3Match(arpMatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src ipv6Address = ((Ipv6SrcCase) ofMatch.getMatchEntryValue()).getIpv6Src(); - if (ipv6Address != null) { - byte[] mask = ipv6Address.getMask(); - if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) { - // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary. - // Need to convert ipv6dst to ipv6MatchArbitrary. - - if (ipv6MatchBuilder.getIpv6Destination() != null) { - Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination(); - Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress); - Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress)); - setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue())); - } - Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.createIpv6ArbitraryBitMask(mask)); - String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - srcIpv6ArbitraryMask, stringIpv6SrcAddress); - matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); - } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) { - /* - TODO Change comments - Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match, - source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask. - We convert 1::/32 to 1::/FFFF:FFFF:: - example:- - 1::/32 - 1::1 - FFFF::0001 - after conversion output example:- - 1:: - FFFF:FFFF:: - 1::1 - FFFF::0001 - */ - Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.createIpv6ArbitraryBitMask(mask)); - String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - srcIpv6ArbitraryMask, stringIpv6SrcAddress); - matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); - } else { - String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6SrcAddress); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst ipv6Address = ((Ipv6DstCase) ofMatch.getMatchEntryValue()).getIpv6Dst(); - if (ipv6Address != null) { - byte[] mask = ipv6Address.getMask(); - if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) { - // case where ipv6src is of type ipv6MatchBuilder and ipv6dst is of type ipv6MatchArbitrary. - // Need to convert ipv6src to ipv6MatchArbitrary. - - if (ipv6MatchBuilder.getIpv6Source() != null) { - Ipv6Prefix ipv6PrefixSourceAddress = ipv6MatchBuilder.getIpv6Source(); - Ipv6Address ipv6SrcAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixSourceAddress); - Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress)); - setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - srcIpv6Arbitrary, IpConversionUtil.compressedIpv6Format(ipv6SrcAddress.getValue())); - } - Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.createIpv6ArbitraryBitMask(mask)); - String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - dstIpv6ArbitraryMask, stringIpv6DstAddress); - matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); - } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6SourceAddressNoMask() != null) { - /* - TODO Change comments - Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, - source which of type ipv6Match needs to be converted to ipv6MatchArbitraryBitMask. - We convert 1::/32 to 1::/FFFF:FFFF:: - example:- - 1::/32 - 1::1 - FFFF::0001 - after conversion output example:- - 1:: - FFFF:FFFF:: - 1::1 - FFFF::0001 - */ - Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( - IpConversionUtil.createIpv6ArbitraryBitMask(mask)); - String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch, - dstIpv6ArbitraryMask, stringIpv6DstAddress); - matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); - } else { - String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue()); - setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6DstAddress); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6Flabel.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6Flabel ipv6Flabel = ((Ipv6FlabelCase) ofMatch.getMatchEntryValue()).getIpv6Flabel(); - if (ipv6Flabel != null) { - Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder(); - ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(ipv6Flabel.getIpv6Flabel())); - byte[] mask = ipv6Flabel.getMask(); - if (mask != null) { - ipv6LabelBuilder.setFlabelMask(new Ipv6FlowLabel(Long.valueOf(ByteUtil - .bytesToUnsignedInt(mask)))); - } - ipv6MatchBuilder.setIpv6Label(ipv6LabelBuilder.build()); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6NdTarget.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTarget ipv6NdTarget = ((Ipv6NdTargetCase) ofMatch.getMatchEntryValue()).getIpv6NdTarget(); - if (ipv6NdTarget != null) { - ipv6MatchBuilder.setIpv6NdTarget(ipv6NdTarget.getIpv6Address()); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6NdSll.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSll ipv6NdSll = ((Ipv6NdSllCase) ofMatch.getMatchEntryValue()).getIpv6NdSll(); - if (ipv6NdSll != null) { - ipv6MatchBuilder.setIpv6NdSll(ipv6NdSll.getMacAddress()); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6NdTll.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTll ipv6NdTll = ((Ipv6NdTllCase) ofMatch.getMatchEntryValue()).getIpv6NdTll(); - if (ipv6NdTll != null) { - ipv6MatchBuilder.setIpv6NdTll(ipv6NdTll.getMacAddress()); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(Ipv6Exthdr.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6Exthdr ipv6Exthdr = ((Ipv6ExthdrCase) ofMatch.getMatchEntryValue()).getIpv6Exthdr(); - if (ipv6Exthdr != null) { - Ipv6ExtHeaderBuilder ipv6ExtHeaderBuilder = new Ipv6ExtHeaderBuilder(); - - Ipv6ExthdrFlags pField = ipv6Exthdr.getPseudoField(); - Integer bitmap = MatchConvertorUtil.ipv6ExthdrFlagsToInt(pField); - - ipv6ExtHeaderBuilder.setIpv6Exthdr(bitmap); - byte[] mask = ipv6Exthdr.getMask(); - if (mask != null) { - ipv6ExtHeaderBuilder.setIpv6ExthdrMask(ByteUtil.bytesToUnsignedShort(mask)); - } - ipv6MatchBuilder.setIpv6ExtHeader(ipv6ExtHeaderBuilder.build()); - matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(MplsLabel.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabel mplsLabel = ((MplsLabelCase) ofMatch.getMatchEntryValue()).getMplsLabel(); - if (mplsLabel != null) { - protocolMatchFieldsBuilder.setMplsLabel(mplsLabel.getMplsLabel()); - matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(MplsBos.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBos mplsBos = ((MplsBosCase) ofMatch.getMatchEntryValue()).getMplsBos(); - if (mplsBos != null) { - protocolMatchFieldsBuilder.setMplsBos(mplsBos.isBos() ? (short) 1 : (short) 0); - matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(MplsTc.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTc mplsTc = ((MplsTcCase) ofMatch.getMatchEntryValue()).getMplsTc(); - if (mplsTc != null) { - protocolMatchFieldsBuilder.setMplsTc(mplsTc.getTc()); - matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(PbbIsid.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsid pbbIsid = ((PbbIsidCase) ofMatch.getMatchEntryValue()).getPbbIsid(); - if (pbbIsid != null) { - PbbBuilder pbbBuilder = new PbbBuilder(); - pbbBuilder.setPbbIsid(pbbIsid.getIsid()); - byte[] mask = pbbIsid.getMask(); - if (mask != null) { - pbbBuilder.setPbbMask(ByteUtil.bytesToUnsignedMedium(mask)); - } - protocolMatchFieldsBuilder.setPbb(pbbBuilder.build()); - matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(TunnelId.class)) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelId tunnelId = ((TunnelIdCase) ofMatch.getMatchEntryValue()).getTunnelId(); - TunnelBuilder tunnelBuilder = new TunnelBuilder(); - if (tunnelId.getTunnelId()!= null) { - tunnelBuilder.setTunnelId(new BigInteger(OFConstants.SIGNUM_UNSIGNED, tunnelId.getTunnelId())); - byte[] mask = tunnelId.getMask(); - if (null != mask) { - tunnelBuilder.setTunnelMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, mask)); - } - matchBuilder.setTunnel(tunnelBuilder.build()); - } - } else if (ofMatch.getOxmMatchField().equals(TcpFlags.class)) { - ExperimenterIdCase experimenterIdCase = ((ExperimenterIdCase) ofMatch.getMatchEntryValue()); - TcpFlagsContainer tcpFlagsContainer = experimenterIdCase.getAugmentation(TcpFlagsContainer.class); - - if (tcpFlagsContainer != null) { - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow. - approved.extensions.rev160802.oxm.container.match.entry. - value.experimenter.id._case.TcpFlags tcpFlags = tcpFlagsContainer.getTcpFlags(); - - tcpFlagsMatchBuilder.setTcpFlags(tcpFlags.getFlags()); - byte[] mask = tcpFlags.getMask(); - if (mask != null) { - tcpFlagsMatchBuilder.setTcpFlagsMask(ByteUtil.bytesToUnsignedShort(mask)); - } - matchBuilder.setTcpFlagsMatch(tcpFlagsMatchBuilder.build()); - } + EthernetSource ethernetSource = ethernetMatch.getEthernetSource(); + if (ethernetSource != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(EthSrc.class); + EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder(); + EthSrcBuilder ethDstBuilder = new EthSrcBuilder(); + ethDstBuilder.setMacAddress(ethernetSource.getAddress()); + boolean hasMask = ethernetSource.getMask() != null; + + if (hasMask) { + ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue())); } - } - return matchBuilder; - } - - private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv6PrefixStr) { - Ipv6Prefix ipv6Prefix; - - if (mask != null) { - ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask); - } else { - ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr)); - } - if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) { - ipv6MatchBuilder.setIpv6Source(ipv6Prefix); - } - if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) { - ipv6MatchBuilder.setIpv6Destination(ipv6Prefix); + ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryList.add(matchEntryBuilder.build()); } - } - private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv4PrefixStr) { - final Ipv4Prefix ipv4Prefix; - if (mask != null) { - ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask); - } else { - //Openflow Spec : 1.3.2 - //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. - // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow - // statistics response. - ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr)); - } - if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) { - ipv4MatchBuilder.setIpv4Source(ipv4Prefix); - } - if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) { - ipv4MatchBuilder.setIpv4Destination(ipv4Prefix); + if (ethernetMatch.getEthernetType() != null) { + matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType())); } } - private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields( - final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, - final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) { - Ipv4Address ipv4Address; - if (mask != null) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask); - } - ipv4Address = new Ipv4Address(ipv4AddressStr); - ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address); - } + private static void tcpFlagsMatch(List matchEntryList, TcpFlagsMatch tcpFlagsMatch) { + ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder(); + if (tcpFlagsMatch != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(ExperimenterClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(TcpFlags.class); - private static void setDstIpv4MatchArbitraryBitMaskBuilderFields( - final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, - final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) { - Ipv4Address ipv4Address; - if (mask != null) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask); - } - ipv4Address = new Ipv4Address(ipv4AddressStr); - ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address); - } + TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder(); + TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder(); + tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags()); + if(tcpFlagsMatch.getTcpFlagsMask() != null) { + matchEntryBuilder.setHasMask(true); + tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask())); + } + tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build()); - private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields( - final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, - final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { - Ipv6Address ipv6Address; - if (mask != null) { - ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask); - } - ipv6Address = new Ipv6Address(ipv6AddressStr); - ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address); - } + //Set experimenter ID. + ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder(); + experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID)); + expIdCaseBuilder.setExperimenter(experimenterBuilder.build()); - private static void setDstIpv6MatchArbitraryBitMaskBuilderFields( - final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, - final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { - Ipv6Address ipv6Address; - if (mask != null) { - ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask); + expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build()); + matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build()); + matchEntryList.add(matchEntryBuilder.build()); } - ipv6Address = new Ipv6Address(ipv6AddressStr); - ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address); } private static MatchEntry toOfMplsPbb(final Pbb pbb) { MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - boolean hasmask = false; + boolean hasmask = pbb.getPbbMask() != null; matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); matchEntryBuilder.setOxmMatchField(PbbIsid.class); PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder(); PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder(); pbbIsidBuilder.setIsid(pbb.getPbbIsid()); - if (pbb.getPbbMask() != null) { - hasmask = true; + + if (hasmask) { pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask())); } + pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build()); matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build()); matchEntryBuilder.setHasMask(hasmask); @@ -1915,13 +467,8 @@ public class MatchConvertorImpl implements MatchConvertor> { matchEntryBuilder.setOxmMatchField(MplsBos.class); MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder(); MplsBosBuilder mplsBosBuilder = new MplsBosBuilder(); - boolean isBos = false; - if (mplsBos.shortValue() != 0) { - isBos = true; - } - mplsBosBuilder.setBos(isBos); + mplsBosBuilder.setBos(mplsBos != 0); mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build()); - matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build()); return matchEntryBuilder.build(); } @@ -1931,7 +478,6 @@ public class MatchConvertorImpl implements MatchConvertor> { matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); matchEntryBuilder.setHasMask(false); matchEntryBuilder.setOxmMatchField(MplsLabel.class); - MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder(); MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder(); mplsLabelBuilder.setMplsLabel(mplsLabel); @@ -1940,102 +486,6 @@ public class MatchConvertorImpl implements MatchConvertor> { return matchEntryBuilder.build(); } - private static MatchEntry toOfIpv6ExtHeader(final Ipv6ExtHeader ipv6ExtHeader) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - boolean hasmask = false; - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Exthdr.class); - Ipv6ExthdrCaseBuilder ipv6ExthdrCaseBuilder = new Ipv6ExthdrCaseBuilder(); - Ipv6ExthdrBuilder ipv6ExthdrBuilder = new Ipv6ExthdrBuilder(); - - Integer bitmap = ipv6ExtHeader.getIpv6Exthdr(); - final Boolean NONEXT = ((bitmap) & (1 << 0)) != 0; - final Boolean ESP = ((bitmap) & (1 << 1)) != 0; - final Boolean AUTH = ((bitmap) & (1 << 2)) != 0; - final Boolean DEST = ((bitmap) & (1 << 3)) != 0; - final Boolean FRAG = ((bitmap) & (1 << 4)) != 0; - final Boolean ROUTER = ((bitmap) & (1 << 5)) != 0; - final Boolean HOP = ((bitmap) & (1 << 6)) != 0; - final Boolean UNREP = ((bitmap) & (1 << 7)) != 0; - final Boolean UNSEQ = ((bitmap) & (1 << 8)) != 0; - - ipv6ExthdrBuilder.setPseudoField(new Ipv6ExthdrFlags(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ)); - //TODO ipv6ExthdrBuilder.setMask() - if (ipv6ExtHeader.getIpv6ExthdrMask() != null) { - hasmask = true; - ipv6ExthdrBuilder.setMask(ByteUtil.unsignedShortToBytes(ipv6ExtHeader.getIpv6ExthdrMask())); - } - ipv6ExthdrCaseBuilder.setIpv6Exthdr(ipv6ExthdrBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6ExthdrCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasmask); - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfIpv6FlowLabel(final Ipv6Label ipv6Label) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - boolean hasmask = false; - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(Ipv6Flabel.class); - Ipv6FlabelCaseBuilder ipv6FlabelCaseBuilder = new Ipv6FlabelCaseBuilder(); - Ipv6FlabelBuilder ipv6FlabelBuilder = new Ipv6FlabelBuilder(); - ipv6FlabelBuilder.setIpv6Flabel(ipv6Label.getIpv6Flabel()); - if (ipv6Label.getFlabelMask() != null) { - hasmask = true; - ipv6FlabelBuilder.setMask(ByteUtil.unsignedIntToBytes(ipv6Label.getFlabelMask().getValue())); - } - ipv6FlabelCaseBuilder.setIpv6Flabel(ipv6FlabelBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6FlabelCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasmask); - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfPort(final Class field, final Long portNumber) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(field); - InPortCaseBuilder caseBuilder = new InPortCaseBuilder(); - InPortBuilder portBuilder = new InPortBuilder(); - portBuilder.setPortNumber(new PortNumber(portNumber)); - caseBuilder.setInPort(portBuilder.build()); - matchEntryBuilder.setMatchEntryValue(caseBuilder.build()); - - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfPhyPort(final Class field, final Long portNumber) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(field); - InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder(); - InPhyPortBuilder portBuilder = new InPhyPortBuilder(); - portBuilder.setPortNumber(new PortNumber(portNumber)); - caseBuilder.setInPhyPort(portBuilder.build()); - matchEntryBuilder.setMatchEntryValue(caseBuilder.build()); - - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfMetadata(final Class field, final BigInteger metadata, - final BigInteger metadataMask) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - boolean hasmask = false; - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setOxmMatchField(field); - MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder(); - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder(); - metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata, OFConstants.SIZE_OF_LONG_IN_BYTES)); - if (metadataMask != null) { - hasmask = true; - metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadataMask, OFConstants.SIZE_OF_LONG_IN_BYTES)); - } - metadataCaseBuilder.setMetadata(metadataBuilder.build()); - matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build()); - matchEntryBuilder.setHasMask(hasmask); - return matchEntryBuilder.build(); - } - private static MatchEntry toOfEthernetType(final EthernetType ethernetType) { MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); @@ -2102,35 +552,6 @@ public class MatchConvertorImpl implements MatchConvertor> { return matchEntryBuilder.build(); } - public static MatchEntry toOfIpDscp(final Dscp ipDscp) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(IpDscp.class); - - IpDscpCaseBuilder ipDscpCaseBuilder = new IpDscpCaseBuilder(); - IpDscpBuilder ipDscpBuilder = new IpDscpBuilder(); - ipDscpBuilder.setDscp(ipDscp); - ipDscpCaseBuilder.setIpDscp(ipDscpBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipDscpCaseBuilder.build()); - return matchEntryBuilder.build(); - } - - public static MatchEntry toOfVlanPcp( - final org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp vlanPcp) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(VlanPcp.class); - VlanPcpCaseBuilder vlanPcpCaseBuilder = new VlanPcpCaseBuilder(); - VlanPcpBuilder vlanPcpBuilder = new VlanPcpBuilder(); - vlanPcpBuilder.setVlanPcp(vlanPcp.getValue()); - vlanPcpCaseBuilder.setVlanPcp(vlanPcpBuilder.build()); - matchEntryBuilder.setMatchEntryValue(vlanPcpCaseBuilder.build()); - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfIpProto(final Short ipProtocol) { MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); @@ -2157,53 +578,44 @@ public class MatchConvertorImpl implements MatchConvertor> { return matchEntryBuilder.build(); } - private static MatchEntry toOfArpOpCode(final Integer arpOp) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(ArpOp.class); - ArpOpCaseBuilder arpOpCaseBuilder = new ArpOpCaseBuilder(); - ArpOpBuilder arpOpBuilder = new ArpOpBuilder(); - arpOpBuilder.setOpCode(arpOp); - arpOpCaseBuilder.setArpOp(arpOpBuilder.build()); - matchEntryBuilder.setMatchEntryValue(arpOpCaseBuilder.build()); - return matchEntryBuilder.build(); - } - - private static MatchEntry toOfIpv6NdTargetAddress(final Ipv6Address address) { - MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); - matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); - matchEntryBuilder.setHasMask(false); - matchEntryBuilder.setOxmMatchField(Ipv6NdTarget.class); - - Ipv6NdTargetCaseBuilder ipv6NdTargetCaseBuilder = new Ipv6NdTargetCaseBuilder(); - Ipv6NdTargetBuilder ipv6NdTargetBuilder = new Ipv6NdTargetBuilder(); - ipv6NdTargetBuilder.setIpv6Address(address); - ipv6NdTargetCaseBuilder.setIpv6NdTarget(ipv6NdTargetBuilder.build()); - matchEntryBuilder.setMatchEntryValue(ipv6NdTargetCaseBuilder.build()); - return matchEntryBuilder.build(); - } - - + @Override + public List convert(final Match match) { + List result = new ArrayList<>(); + if (match == null) { + return result; + } + + inPortMatch(result, match.getInPort()); + inPhyPortMatch(result, match.getInPhyPort()); + metadataMatch(result, match.getMetadata()); + ethernetMatch(result, match.getEthernetMatch()); + vlanMatch(result, match.getVlanMatch()); + ipMatch(result, match.getIpMatch()); + layer4Match(result, match.getLayer4Match()); + icmpv4Match(result, match.getIcmpv4Match()); + icmpv6Match(result, match.getIcmpv6Match()); + layer3Match(result, match.getLayer3Match()); + protocolMatchFields(result, match.getProtocolMatchFields()); + tunnelMatch(result, match.getTunnel()); + tcpFlagsMatch(result, match.getTcpFlagsMatch()); - /** - * Method converts OF SetField action to SAL SetFiled action. - * - * @param action input action - * @param ofVersion current ofp version - * @return set field builder - */ - public static SetField fromOFSetFieldToSALSetFieldAction( - final Action action, final OpenflowVersion ofVersion) { - logger.debug("Converting OF SetField action to SAL SetField action"); - SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice(); - SetFieldAction setFieldAction = setFieldCase.getSetFieldAction(); + /** + * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava) + * - we might need version for conversion and for key + * - sanitize NPE + */ + Optional extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match); + if (extensionListOpt.isPresent()) { + for (ExtensionList extensionItem : extensionListOpt.get().getExtensionList()) { + // TODO: get real version + ConverterExtensionKey key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3); + ConvertorToOFJava convertor = OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + MatchEntry ofMatch = convertor.convert(extensionItem.getExtension()); + result.add(ofMatch); + } + } - SetFieldBuilder setField = new SetFieldBuilder(); - MatchBuilder match = OfMatchToSALMatchConvertor(setFieldAction.getMatchEntry(), null, ofVersion); - setField.fieldsFrom(match.build()); - return setField.build(); + return result; } - } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorUtil.java index cc95a7bc25..df2ff96270 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorUtil.java @@ -1,28 +1,53 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match; +import java.util.Iterator; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscpBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcpBuilder; /** * match related tools */ public abstract class MatchConvertorUtil { + // Pre-calculated masks for the 33 possible values. Do not give them out, but clone() them as they may + // end up being leaked and vulnerable. + private static final byte[][] IPV4_MASKS; - private static final String PREFIX_SEPARATOR = "/"; + static { + final byte[][] tmp = new byte[33][]; + for (int i = 0; i <= 32; ++i) { + final int mask = 0xffffffff << (32 - i); + tmp[i] = new byte[]{(byte) (mask >>> 24), (byte) (mask >>> 16), (byte) (mask >>> 8), (byte) mask}; + } + + IPV4_MASKS = tmp; + } /** + * Ipv 6 exthdr flags to int integer. + * * @param pField ipv6 external header flag * @return integer containing lower 9 bits filled with corresponding flags */ public static Integer ipv6ExthdrFlagsToInt(final Ipv6ExthdrFlags pField) { Integer bitmap = 0; - bitmap |= pField.isNonext() ? (1 << 0) : 0; + bitmap |= pField.isNonext() ? 1 : 0; bitmap |= pField.isEsp() ? (1 << 1) : 0; bitmap |= pField.isAuth() ? (1 << 2) : 0; bitmap |= pField.isDest() ? (1 << 3) : 0; @@ -34,4 +59,66 @@ public abstract class MatchConvertorUtil { return bitmap; } + /** + * Extract ipv 4 mask byte [ ]. + * + * @param addressParts the address parts + * @return the byte [ ] + */ + public static byte[] extractIpv4Mask(final Iterator addressParts) { + final int prefix; + if (addressParts.hasNext()) { + int potentionalPrefix = Integer.parseInt(addressParts.next()); + prefix = potentionalPrefix < 32 ? potentionalPrefix : 0; + } else { + prefix = 0; + } + + if (prefix != 0) { + // clone() is necessary to protect our constants + return IPV4_MASKS[prefix].clone(); + } + + return null; + } + + /** + * To of ip dscp match entry. + * + * @param ipDscp the ip dscp + * @return the match entry + */ + public static MatchEntry toOfIpDscp(final Dscp ipDscp) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(IpDscp.class); + + IpDscpCaseBuilder ipDscpCaseBuilder = new IpDscpCaseBuilder(); + IpDscpBuilder ipDscpBuilder = new IpDscpBuilder(); + ipDscpBuilder.setDscp(ipDscp); + ipDscpCaseBuilder.setIpDscp(ipDscpBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipDscpCaseBuilder.build()); + return matchEntryBuilder.build(); + } + + /** + * To of vlan pcp match entry. + * + * @param vlanPcp the vlan pcp + * @return the match entry + */ + public static MatchEntry toOfVlanPcp( + final org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp vlanPcp) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(VlanPcp.class); + VlanPcpCaseBuilder vlanPcpCaseBuilder = new VlanPcpCaseBuilder(); + VlanPcpBuilder vlanPcpBuilder = new VlanPcpBuilder(); + vlanPcpBuilder.setVlanPcp(vlanPcp.getValue()); + vlanPcpCaseBuilder.setVlanPcp(vlanPcpBuilder.build()); + matchEntryBuilder.setMatchEntryValue(vlanPcpCaseBuilder.build()); + return matchEntryBuilder.build(); + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java index 70fcc02812..90236ab912 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2013, 2015 Cisco Systems, Inc. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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, @@ -31,14 +31,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder; /** - * + * The type Match convertor v 10. */ public class MatchConvertorV10Impl implements MatchConvertor { - /** default MAC */ - public static final MacAddress zeroMac = new MacAddress("00:00:00:00:00:00"); - /** default IPv4 */ - public static final Ipv4Address zeroIPv4 = new Ipv4Address("0.0.0.0"); + /** + * default MAC + */ + private static final MacAddress zeroMac = new MacAddress("00:00:00:00:00:00"); + /** + * default IPv4 + */ + private static final Ipv4Address zeroIPv4 = new Ipv4Address("0.0.0.0"); /* * The value 0xffff (OFP_VLAN_NONE) is used to indicate @@ -46,113 +50,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { */ private static final Integer OFP_VLAN_NONE = 0xffff; - /** - * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match. - * @param match MD-SAL match - * @return OF-API match - * @author avishnoi@in.ibm.com - */ - @Override - public MatchV10 convert(final Match match) { - MatchV10Builder matchBuilder = new MatchV10Builder(); - boolean _dLDST = true; - boolean _dLSRC = true; - boolean _dLTYPE = true; - boolean _dLVLAN = true; - boolean _dLVLANPCP = true; - boolean _iNPORT = true; - boolean _nWPROTO = true; - boolean _nWTOS = true; - boolean _tPDST = true; - boolean _tPSRC = true; - - matchBuilder.setInPort(0); - matchBuilder.setDlDst(zeroMac); - matchBuilder.setDlSrc(zeroMac); - matchBuilder.setDlType(0); - matchBuilder.setDlVlan(OFP_VLAN_NONE); - matchBuilder.setDlVlanPcp((short) 0); - matchBuilder.setNwDst(zeroIPv4); - matchBuilder.setNwDstMask((short) 0); - matchBuilder.setNwSrc(zeroIPv4); - matchBuilder.setNwSrcMask((short) 0); - matchBuilder.setNwProto((short) 0); - matchBuilder.setNwTos((short) 0); - matchBuilder.setTpSrc(0); - matchBuilder.setTpDst(0); - - if (match != null) { - EthernetMatch ethernetMatch = match.getEthernetMatch(); - if(ethernetMatch!= null){ - _dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch); - _dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch); - _dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch); - } - VlanMatch vlanMatch = match.getVlanMatch(); - if(vlanMatch!= null){ - _dLVLAN = convertDlVlan(matchBuilder, vlanMatch); - _dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch); - } - NodeConnectorId inPort = match.getInPort(); - if(inPort!=null){ - _iNPORT = convertInPortMatch(matchBuilder, inPort); - } - Layer3Match l3Match = match.getLayer3Match(); - if(l3Match != null){ - if(l3Match instanceof Ipv4Match){ - Ipv4Match ipv4 = (Ipv4Match)l3Match; - convertL3Ipv4SrcMatch(matchBuilder, ipv4); - convertL3Ipv4DstMatch(matchBuilder, ipv4); - } - } - IpMatch ipMatch = match.getIpMatch(); - if(ipMatch!=null){ - _nWPROTO = convertNwProto(matchBuilder, ipMatch); - _nWTOS = convertNwTos(matchBuilder, ipMatch); - } - Layer4Match layer4Match = match.getLayer4Match(); - if (layer4Match != null) { - if (layer4Match instanceof TcpMatch) { - TcpMatch tcpMatch = (TcpMatch) layer4Match; - _tPSRC = convertL4TpSrcMatch(matchBuilder, tcpMatch); - _tPDST = convertL4TpDstMatch(matchBuilder, tcpMatch); - } else if (layer4Match instanceof UdpMatch) { - UdpMatch udpMatch = (UdpMatch) layer4Match; - _tPSRC = convertL4UdpSrcMatch(matchBuilder, udpMatch); - _tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch); - } - } else { - Icmpv4Match icmpv4Match = match.getIcmpv4Match(); - if (icmpv4Match != null) { - Short type = icmpv4Match.getIcmpv4Type(); - if (type != null) { - matchBuilder.setTpSrc(type.intValue()); - _tPSRC = false; - } - Short code = icmpv4Match.getIcmpv4Code(); - if (code != null) { - matchBuilder.setTpDst(code.intValue()); - _tPDST = false; - } - } - } - } - - FlowWildcardsV10 wildCards = new FlowWildcardsV10( - _dLDST, _dLSRC, _dLTYPE, _dLVLAN, - _dLVLANPCP, _iNPORT, _nWPROTO, _nWTOS, _tPDST, _tPSRC); - matchBuilder.setWildcards(wildCards); - - return matchBuilder.build(); - } - - /** - * @param matchBuilder - * @param udpMatch - * @return is wildCard - */ private static boolean convertL4UdpDstMatch(final MatchV10Builder matchBuilder, - final UdpMatch udpMatch) { + final UdpMatch udpMatch) { if (udpMatch.getUdpDestinationPort() != null) { matchBuilder.setTpDst(udpMatch.getUdpDestinationPort().getValue()); return false; @@ -160,13 +59,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param udpMatch - * @return is wildCard - */ private static boolean convertL4UdpSrcMatch(final MatchV10Builder matchBuilder, - final UdpMatch udpMatch) { + final UdpMatch udpMatch) { if (udpMatch.getUdpSourcePort() != null) { matchBuilder.setTpSrc(udpMatch.getUdpSourcePort().getValue()); return false; @@ -174,13 +68,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param tcpMatch - * @return is wildCard - */ private static boolean convertL4TpDstMatch(final MatchV10Builder matchBuilder, - final TcpMatch tcpMatch) { + final TcpMatch tcpMatch) { if (tcpMatch.getTcpDestinationPort() != null) { matchBuilder.setTpDst(tcpMatch.getTcpDestinationPort().getValue()); return false; @@ -188,13 +77,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param tcpMatch - * @return is wildCard - */ private static boolean convertL4TpSrcMatch(final MatchV10Builder matchBuilder, - final TcpMatch tcpMatch) { + final TcpMatch tcpMatch) { if (tcpMatch.getTcpSourcePort() != null) { matchBuilder.setTpSrc(tcpMatch.getTcpSourcePort().getValue()); return false; @@ -202,13 +86,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param ipMatch - * @return is wildCard - */ private static boolean convertNwTos(final MatchV10Builder matchBuilder, - final IpMatch ipMatch) { + final IpMatch ipMatch) { if (ipMatch.getIpDscp() != null) { matchBuilder.setNwTos(ActionUtil.dscpToTos(ipMatch.getIpDscp().getValue())); return false; @@ -216,11 +95,6 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param ipMatch - * @return is wildCard - */ private static boolean convertNwProto(final MatchV10Builder matchBuilder, final IpMatch ipMatch) { if (ipMatch.getIpProtocol() != null) { matchBuilder.setNwProto(ipMatch.getIpProtocol()); @@ -232,12 +106,13 @@ public class MatchConvertorV10Impl implements MatchConvertor { /** * Method splits the IP address and its mask and set their respective values in MatchV10Builder instance. * Wildcard value of the IP mask will be determined by Openflow java encoding library. - * @param matchBuilder - * @param ipv4 + * + * @param matchBuilder match builder + * @param ipv4 ip v4 match */ private static void convertL3Ipv4DstMatch(final MatchV10Builder matchBuilder, - final Ipv4Match ipv4) { - if(ipv4.getIpv4Destination()!=null){ + final Ipv4Match ipv4) { + if (ipv4.getIpv4Destination() != null) { Iterator addressParts = IpConversionUtil.PREFIX_SPLITTER.split(ipv4.getIpv4Destination().getValue()).iterator(); Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); Integer prefix = buildPrefix(addressParts); @@ -249,12 +124,13 @@ public class MatchConvertorV10Impl implements MatchConvertor { /** * Method splits the IP address and its mask and set their respective values in MatchV10Builder instance. * Wildcard value of the IP mask will be determined by Openflow java encoding library. - * @param matchBuilder - * @param ipv4 + * + * @param matchBuilder match builder + * @param ipv4 ip v4 match */ private static void convertL3Ipv4SrcMatch(final MatchV10Builder matchBuilder, - final Ipv4Match ipv4) { - if(ipv4.getIpv4Source()!=null){ + final Ipv4Match ipv4) { + if (ipv4.getIpv4Source() != null) { Iterator addressParts = IpConversionUtil.PREFIX_SPLITTER.split(ipv4.getIpv4Source().getValue()).iterator(); Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); int prefix = buildPrefix(addressParts); @@ -264,10 +140,6 @@ public class MatchConvertorV10Impl implements MatchConvertor { } } - /** - * @param addressParts - * @return - */ private static int buildPrefix(final Iterator addressParts) { int prefix = 32; if (addressParts.hasNext()) { @@ -276,13 +148,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return prefix; } - /** - * @param matchBuilder - * @param vlanMatch - * @return - */ private static boolean convertDlVlanPcp(final MatchV10Builder matchBuilder, - final VlanMatch vlanMatch) { + final VlanMatch vlanMatch) { if (vlanMatch.getVlanPcp() != null) { matchBuilder.setDlVlanPcp(vlanMatch.getVlanPcp().getValue()); return false; @@ -290,11 +157,6 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param vlanMatch - * @return - */ private static boolean convertDlVlan(final MatchV10Builder matchBuilder, final VlanMatch vlanMatch) { if (vlanMatch.getVlanId() != null) { int vlanId = vlanMatch.getVlanId().getVlanId().getValue(); @@ -304,13 +166,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param ethernetMatch - * @return is wildCard - */ private static boolean convertEthernetDlType(final MatchV10Builder matchBuilder, - final EthernetMatch ethernetMatch) { + final EthernetMatch ethernetMatch) { if (ethernetMatch.getEthernetType() != null) { matchBuilder.setDlType(ethernetMatch.getEthernetType().getType().getValue().intValue()); return false; @@ -318,13 +175,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param ethernetMatch - * @return is wildCard - */ private static boolean convertEthernetDlSrc(final MatchV10Builder matchBuilder, - final EthernetMatch ethernetMatch) { + final EthernetMatch ethernetMatch) { if (ethernetMatch.getEthernetSource() != null) { matchBuilder.setDlSrc(ethernetMatch.getEthernetSource().getAddress()); return false; @@ -332,13 +184,8 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param ethernetMatch - * @return is wildCard - */ private static boolean convertEthernetDlDst(final MatchV10Builder matchBuilder, - final EthernetMatch ethernetMatch) { + final EthernetMatch ethernetMatch) { if (ethernetMatch.getEthernetDestination() != null) { matchBuilder.setDlDst(ethernetMatch.getEthernetDestination().getAddress()); return false; @@ -346,10 +193,6 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } - /** - * @param matchBuilder - * @param inPort - */ private static boolean convertInPortMatch(final MatchV10Builder matchBuilder, final NodeConnectorId inPort) { if (inPort != null) { matchBuilder.setInPort(InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF10, inPort).intValue()); @@ -358,4 +201,103 @@ public class MatchConvertorV10Impl implements MatchConvertor { return true; } + /** + * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match. + * + * @param match MD-SAL match + * @return OF-API match + */ + @Override + public MatchV10 convert(final Match match) { + MatchV10Builder matchBuilder = new MatchV10Builder(); + boolean _dLDST = true; + boolean _dLSRC = true; + boolean _dLTYPE = true; + boolean _dLVLAN = true; + boolean _dLVLANPCP = true; + boolean _iNPORT = true; + boolean _nWPROTO = true; + boolean _nWTOS = true; + boolean _tPDST = true; + boolean _tPSRC = true; + + matchBuilder.setInPort(0); + matchBuilder.setDlDst(zeroMac); + matchBuilder.setDlSrc(zeroMac); + matchBuilder.setDlType(0); + matchBuilder.setDlVlan(OFP_VLAN_NONE); + matchBuilder.setDlVlanPcp((short) 0); + matchBuilder.setNwDst(zeroIPv4); + matchBuilder.setNwDstMask((short) 0); + matchBuilder.setNwSrc(zeroIPv4); + matchBuilder.setNwSrcMask((short) 0); + matchBuilder.setNwProto((short) 0); + matchBuilder.setNwTos((short) 0); + matchBuilder.setTpSrc(0); + matchBuilder.setTpDst(0); + + if (match != null) { + EthernetMatch ethernetMatch = match.getEthernetMatch(); + if (ethernetMatch != null) { + _dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch); + _dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch); + _dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch); + } + VlanMatch vlanMatch = match.getVlanMatch(); + if (vlanMatch != null) { + _dLVLAN = convertDlVlan(matchBuilder, vlanMatch); + _dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch); + } + NodeConnectorId inPort = match.getInPort(); + if (inPort != null) { + _iNPORT = convertInPortMatch(matchBuilder, inPort); + } + Layer3Match l3Match = match.getLayer3Match(); + if (l3Match != null) { + if (l3Match instanceof Ipv4Match) { + Ipv4Match ipv4 = (Ipv4Match) l3Match; + convertL3Ipv4SrcMatch(matchBuilder, ipv4); + convertL3Ipv4DstMatch(matchBuilder, ipv4); + } + } + IpMatch ipMatch = match.getIpMatch(); + if (ipMatch != null) { + _nWPROTO = convertNwProto(matchBuilder, ipMatch); + _nWTOS = convertNwTos(matchBuilder, ipMatch); + } + Layer4Match layer4Match = match.getLayer4Match(); + if (layer4Match != null) { + if (layer4Match instanceof TcpMatch) { + TcpMatch tcpMatch = (TcpMatch) layer4Match; + _tPSRC = convertL4TpSrcMatch(matchBuilder, tcpMatch); + _tPDST = convertL4TpDstMatch(matchBuilder, tcpMatch); + } else if (layer4Match instanceof UdpMatch) { + UdpMatch udpMatch = (UdpMatch) layer4Match; + _tPSRC = convertL4UdpSrcMatch(matchBuilder, udpMatch); + _tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch); + } + } else { + Icmpv4Match icmpv4Match = match.getIcmpv4Match(); + if (icmpv4Match != null) { + Short type = icmpv4Match.getIcmpv4Type(); + if (type != null) { + matchBuilder.setTpSrc(type.intValue()); + _tPSRC = false; + } + Short code = icmpv4Match.getIcmpv4Code(); + if (code != null) { + matchBuilder.setTpDst(code.intValue()); + _tPDST = false; + } + } + } + } + + FlowWildcardsV10 wildCards = new FlowWildcardsV10( + _dLDST, _dLSRC, _dLTYPE, _dLVLAN, + _dLVLANPCP, _iNPORT, _nWPROTO, _nWTOS, _tPDST, _tPSRC); + matchBuilder.setWildcards(wildCards); + + return matchBuilder.build(); + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java index 9775d01afa..3f285cd0df 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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, @@ -9,7 +9,6 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; import java.util.Map; - import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.InjectionKey; @@ -35,8 +34,8 @@ public class MatchReactor extends ConvertReactor { } @Override - protected void initMappings(final Map> conversions, - final Map> injections) { + protected void initMappings(final Map> conversions, + final Map> injections) { MatchReactorMappingFactory.addMatchConvertors(conversions); MatchReactorMappingFactory.addMatchIjectors(injections); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorMappingFactory.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorMappingFactory.java index bc4ca0c4e6..1226fdf569 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorMappingFactory.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorMappingFactory.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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, @@ -8,6 +8,8 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; +import java.util.List; +import java.util.Map; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; @@ -21,8 +23,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder; -import java.util.List; -import java.util.Map; /** * add prepared convertors and injectors into given mappings diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor.java new file mode 100644 index 0000000000..1ba9bdc771 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match; + +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpOpCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpShaCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpSpaCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpThaCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalArpTpaCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthDstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthSrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalEthTypeCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4CodeCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv4TypeCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6CodeCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIcmpv6TypeCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPhyPortCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalInPortCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpDscpCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpEcnCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpProtoCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4DstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv4SrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6DstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6ExthdrCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6FlabelCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdSllCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTargetCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6NdTllCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalIpv6SrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMetadataCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsBosCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsLabelCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalMplsTcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalPbbIsidCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpDstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalSctpSrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpDstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalExperimenterIdCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTcpSrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIdCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4DstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalTunnelIpv4SrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpDstCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalUdpSrcCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanPcpCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.OfToSalVlanVidCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; +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.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder; +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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping; +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.entry.value.grouping.MatchEntryValue; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src; + +/** + * Converts Openflow 1.3+ specific flow match to MD-SAL format flow + * match + * + * Example usage: + *
+ * {@code
+ * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
+ * data.setDatapathId(datapathId);
+ * Optional salMatch = ConvertorManager.getInstance().convert(ofMatch, data);
+ * }
+ * 
+ */ +public class MatchResponseConvertor implements ParametrizedConvertor { + private static final ConvertorProcessor OF_TO_SAL_PROCESSOR = new ConvertorProcessor() + .addCase(new OfToSalInPortCase()) + .addCase(new OfToSalInPhyPortCase()) + .addCase(new OfToSalMetadataCase()) + .addCase(new OfToSalEthSrcCase()) + .addCase(new OfToSalEthDstCase()) + .addCase(new OfToSalEthTypeCase()) + .addCase(new OfToSalVlanVidCase()) + .addCase(new OfToSalVlanPcpCase()) + .addCase(new OfToSalIpDscpCase()) + .addCase(new OfToSalIpEcnCase()) + .addCase(new OfToSalIpProtoCase()) + .addCase(new OfToSalTcpSrcCase()) + .addCase(new OfToSalTcpDstCase()) + .addCase(new OfToSalUdpSrcCase()) + .addCase(new OfToSalUdpDstCase()) + .addCase(new OfToSalSctpSrcCase()) + .addCase(new OfToSalSctpDstCase()) + .addCase(new OfToSalIcmpv4TypeCase()) + .addCase(new OfToSalIcmpv4CodeCase()) + .addCase(new OfToSalIcmpv6TypeCase()) + .addCase(new OfToSalIcmpv6CodeCase()) + .addCase(new OfToSalIpv4SrcCase()) + .addCase(new OfToSalIpv4DstCase()) + .addCase(new OfToSalArpOpCase()) + .addCase(new OfToSalArpSpaCase()) + .addCase(new OfToSalArpTpaCase()) + .addCase(new OfToSalArpShaCase()) + .addCase(new OfToSalArpThaCase()) + .addCase(new OfToSalIpv6SrcCase()) + .addCase(new OfToSalIpv6DstCase()) + .addCase(new OfToSalIpv6FlabelCase()) + .addCase(new OfToSalIpv6NdTargetCase()) + .addCase(new OfToSalIpv6NdSllCase()) + .addCase(new OfToSalIpv6NdTllCase()) + .addCase(new OfToSalIpv6ExthdrCase()) + .addCase(new OfToSalMplsLabelCase()) + .addCase(new OfToSalMplsBosCase()) + .addCase(new OfToSalMplsTcCase()) + .addCase(new OfToSalPbbIsidCase()) + .addCase(new OfToSalTunnelIdCase()) + .addCase(new OfToSalExperimenterIdCase()); + + private static final ConvertorProcessor OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor() + .addCase(new OfToSalTunnelIpv4SrcCase()) + .addCase(new OfToSalTunnelIpv4DstCase()); + + @Override + public Class getType() { + return MatchEntriesGrouping.class; + } + + @Override + public MatchBuilder convert(MatchEntriesGrouping source, VersionDatapathIdConvertorData datapathIdConvertorData) { + final MatchBuilder matchBuilder = new MatchBuilder(); + + final MatchResponseConvertorData data = new MatchResponseConvertorData(datapathIdConvertorData.getVersion()); + data.setDatapathId(datapathIdConvertorData.getDatapathId()); + data.setMatchBuilder(matchBuilder); + data.setEthernetMatchBuilder(new EthernetMatchBuilder()); + data.setVlanMatchBuilder(new VlanMatchBuilder()); + data.setIpMatchBuilder(new IpMatchBuilder()); + data.setTcpMatchBuilder(new TcpMatchBuilder()); + data.setUdpMatchBuilder(new UdpMatchBuilder()); + data.setSctpMatchBuilder(new SctpMatchBuilder()); + data.setIcmpv4MatchBuilder(new Icmpv4MatchBuilder()); + data.setIcmpv6MatchBuilder(new Icmpv6MatchBuilder()); + data.setIpv4MatchBuilder(new Ipv4MatchBuilder()); + data.setIpv4MatchArbitraryBitMaskBuilder(new Ipv4MatchArbitraryBitMaskBuilder()); + data.setIpv6MatchArbitraryBitMaskBuilder(new Ipv6MatchArbitraryBitMaskBuilder()); + data.setArpMatchBuilder(new ArpMatchBuilder()); + data.setIpv6MatchBuilder(new Ipv6MatchBuilder()); + data.setProtocolMatchFieldsBuilder(new ProtocolMatchFieldsBuilder()); + data.setTunnelIpv4MatchBuilder(new TunnelIpv4MatchBuilder()); + data.setTcpFlagsMatchBuilder(new TcpFlagsMatchBuilder()); + + for (MatchEntry ofMatch : source.getMatchEntry()) { + if (TunnelIpv4Dst.class.isAssignableFrom(ofMatch.getOxmMatchField()) || + TunnelIpv4Src.class.isAssignableFrom(ofMatch.getOxmMatchField())) { + /** + * TODO: Fix TunnelIpv4Src and Ipv4Dst, because current implementation do not work + * TunnelIpv4Src and TunnelIpv4Dst are not compatible with + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField + * and so you cannot even set them to OxmMatchField. + * Creation of TunnelIpv4SrcCase and TunnelIpv4DstCase in + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value + * and proper use of it can fix this bug. + */ + OF_TO_SAL_TUNNEL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data); + } else { + data.setOxmMatchField(ofMatch.getOxmMatchField()); + OF_TO_SAL_PROCESSOR.process(ofMatch.getMatchEntryValue(), data); + } + } + + return matchBuilder; + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertor.java new file mode 100644 index 0000000000..b47be384b9 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertor.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match; + +import java.math.BigInteger; +import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +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.VlanMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10; + +/** + * Converts Openflow 1.0 specific flow match to MD-SAL format flow + * match + * + * Example usage: + *
+ * {@code
+ * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
+ * data.setDatapathId(datapathId);
+ * Optional salMatch = ConvertorManager.getInstance().convert(ofMatchV10, data);
+ * }
+ * 
+ */ +public class MatchV10ResponseConvertor implements ParametrizedConvertor { + private static final short PROTO_TCP = 6; + private static final short PROTO_UDP = 17; + private static final short PROTO_ICMPV4 = 1; + private static final String NO_IP = "0.0.0.0/0"; + + @Override + public Class getType() { + return MatchV10.class; + } + + @Override + public MatchBuilder convert(MatchV10 source, VersionDatapathIdConvertorData datapathIdConvertorData) { + MatchBuilder matchBuilder = new MatchBuilder(); + EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder(); + VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder(); + Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder(); + IpMatchBuilder ipMatchBuilder = new IpMatchBuilder(); + OpenflowVersion ofVersion = OpenflowVersion.get(datapathIdConvertorData.getVersion()); + BigInteger datapathid = datapathIdConvertorData.getDatapathId(); + + if (!source.getWildcards().isINPORT() && source.getInPort() != null) { + matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid, + (long) source.getInPort(), ofVersion)); + } + + if (!source.getWildcards().isDLSRC() && source.getDlSrc() != null) { + EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder(); + ethSrcBuilder.setAddress(source.getDlSrc()); + ethMatchBuilder.setEthernetSource(ethSrcBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + if (!source.getWildcards().isDLDST() && source.getDlDst() != null) { + EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder(); + ethDstBuilder.setAddress(source.getDlDst()); + ethMatchBuilder.setEthernetDestination(ethDstBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + if (!source.getWildcards().isDLTYPE() && source.getDlType() != null) { + EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); + ethTypeBuilder.setType(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType( + (long) source.getDlType())); + ethMatchBuilder.setEthernetType(ethTypeBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + if (!source.getWildcards().isDLVLAN() && source.getDlVlan() != null) { + VlanIdBuilder vlanIdBuilder = new VlanIdBuilder(); + int vlanId = (source.getDlVlan() == (0xffff)) ? 0 : source.getDlVlan(); + vlanIdBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanId)); + vlanIdBuilder.setVlanIdPresent(vlanId != 0); + vlanMatchBuilder.setVlanId(vlanIdBuilder.build()); + matchBuilder.setVlanMatch(vlanMatchBuilder.build()); + } + if (!source.getWildcards().isDLVLANPCP() && source.getDlVlanPcp() != null) { + vlanMatchBuilder.setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp( + source.getDlVlanPcp())); + matchBuilder.setVlanMatch(vlanMatchBuilder.build()); + } + if (!source.getWildcards().isDLTYPE() && source.getNwSrc() != null) { + final Ipv4Prefix prefix; + if (source.getNwSrcMask() != null) { + prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(source.getNwSrc(), source.getNwSrcMask()); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(source.getNwSrc()); + } + if (!NO_IP.equals(prefix.getValue())) { + ipv4MatchBuilder.setIpv4Source(prefix); + matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); + } + } + if (!source.getWildcards().isDLTYPE() && source.getNwDst() != null) { + final Ipv4Prefix prefix; + if (source.getNwDstMask() != null) { + prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(source.getNwDst(), source.getNwDstMask()); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(source.getNwDst()); + } + if (!NO_IP.equals(prefix.getValue())) { + ipv4MatchBuilder.setIpv4Destination(prefix); + matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); + } + } + if (!source.getWildcards().isNWPROTO() && source.getNwProto() != null) { + Short nwProto = source.getNwProto(); + ipMatchBuilder.setIpProtocol(nwProto); + matchBuilder.setIpMatch(ipMatchBuilder.build()); + + int proto = nwProto.intValue(); + if (proto == PROTO_TCP) { + TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder(); + boolean hasTcp = false; + if (!source.getWildcards().isTPSRC() && source.getTpSrc() != null) { + tcpMatchBuilder + .setTcpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( + source.getTpSrc())); + hasTcp = true; + } + if (!source.getWildcards().isTPDST() && source.getTpDst() != null) { + tcpMatchBuilder + .setTcpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( + source.getTpDst())); + hasTcp = true; + } + + if (hasTcp) { + matchBuilder.setLayer4Match(tcpMatchBuilder.build()); + } + } else if (proto == PROTO_UDP) { + UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder(); + boolean hasUdp = false; + if (!source.getWildcards().isTPSRC() && source.getTpSrc() != null) { + udpMatchBuilder + .setUdpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( + source.getTpSrc())); + hasUdp = true; + } + if (!source.getWildcards().isTPDST() && source.getTpDst() != null) { + udpMatchBuilder + .setUdpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber( + source.getTpDst())); + hasUdp = true; + } + + if (hasUdp) { + matchBuilder.setLayer4Match(udpMatchBuilder.build()); + } + } else if (proto == PROTO_ICMPV4) { + Icmpv4MatchBuilder icmpv4MatchBuilder = new Icmpv4MatchBuilder(); + boolean hasIcmpv4 = false; + if (!source.getWildcards().isTPSRC()) { + Integer type = source.getTpSrc(); + if (type != null) { + icmpv4MatchBuilder.setIcmpv4Type(type.shortValue()); + hasIcmpv4 = true; + } + } + if (!source.getWildcards().isTPDST()) { + Integer code = source.getTpDst(); + if (code != null) { + icmpv4MatchBuilder.setIcmpv4Code(code.shortValue()); + hasIcmpv4 = true; + } + } + + if (hasIcmpv4) { + matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); + } + } + } + if (!source.getWildcards().isNWTOS() && source.getNwTos() != null) { + Short dscp = ActionUtil.tosToDscp(source.getNwTos()); + ipMatchBuilder.setIpDscp(new Dscp(dscp)); + matchBuilder.setIpMatch(ipMatchBuilder.build()); + } + + return matchBuilder; + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpOpCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpOpCase.java new file mode 100644 index 0000000000..4e4a15f59e --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpOpCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOp; + +public class OfToSalArpOpCase extends ConvertorCase { + public OfToSalArpOpCase() { + super(ArpOpCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ArpOpCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ArpMatchBuilder arpMatchBuilder = data.getArpMatchBuilder(); + + ArpOp arpOp = source.getArpOp(); + + if (arpOp != null) { + arpMatchBuilder.setArpOp(arpOp.getOpCode()); + matchBuilder.setLayer3Match(arpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpShaCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpShaCase.java new file mode 100644 index 0000000000..552fd2f16f --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpShaCase.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpSha; + +public class OfToSalArpShaCase extends ConvertorCase { + public OfToSalArpShaCase() { + super(ArpShaCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ArpShaCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ArpMatchBuilder arpMatchBuilder = data.getArpMatchBuilder(); + + ArpSha arpSha = source.getArpSha(); + MacAddress macAddress = arpSha.getMacAddress(); + + if (macAddress != null) { + ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder(); + arpSourceHardwareAddressBuilder.setAddress(macAddress); + byte[] mask = arpSha.getMask(); + + if (mask != null) { + arpSourceHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils + .macAddressToString(mask))); + } + + arpMatchBuilder.setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder.build()); + matchBuilder.setLayer3Match(arpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpSpaCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpSpaCase.java new file mode 100644 index 0000000000..05782f9eaa --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpSpaCase.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpa; + +public class OfToSalArpSpaCase extends ConvertorCase { + public OfToSalArpSpaCase() { + super(ArpSpaCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ArpSpaCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ArpMatchBuilder arpMatchBuilder = data.getArpMatchBuilder(); + + ArpSpa arpSpa = source.getArpSpa(); + + if (arpSpa != null) { + int mask = 32; + + if (null != arpSpa.getMask()) { + mask = IpConversionUtil.countBits(arpSpa.getMask()); + } + + Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpSpa.getIpv4Address(), mask); + arpMatchBuilder.setArpSourceTransportAddress(ipv4Prefix); + matchBuilder.setLayer3Match(arpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpThaCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpThaCase.java new file mode 100644 index 0000000000..030bc38046 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpThaCase.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpTha; + +public class OfToSalArpThaCase extends ConvertorCase { + public OfToSalArpThaCase() { + super(ArpThaCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ArpThaCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ArpMatchBuilder arpMatchBuilder = data.getArpMatchBuilder(); + + ArpTha arpTha = source.getArpTha(); + MacAddress macAddress = arpTha.getMacAddress(); + + if (macAddress != null) { + ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder(); + arpTargetHardwareAddressBuilder.setAddress(macAddress); + byte[] mask = arpTha.getMask(); + + if (mask != null) { + arpTargetHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils + .macAddressToString(mask))); + } + + arpMatchBuilder.setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder.build()); + matchBuilder.setLayer3Match(arpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpTpaCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpTpaCase.java new file mode 100644 index 0000000000..843f5dac90 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalArpTpaCase.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpa; + +public class OfToSalArpTpaCase extends ConvertorCase { + public OfToSalArpTpaCase() { + super(ArpTpaCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ArpTpaCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ArpMatchBuilder arpMatchBuilder = data.getArpMatchBuilder(); + + ArpTpa arpTpa = source.getArpTpa(); + + if (arpTpa != null) { + int mask = 32; + + if (null != arpTpa.getMask()) { + mask = IpConversionUtil.countBits(arpTpa.getMask()); + } + + Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpTpa.getIpv4Address(), mask); + arpMatchBuilder.setArpTargetTransportAddress(ipv4Prefix); + matchBuilder.setLayer3Match(arpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthDstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthDstCase.java new file mode 100644 index 0000000000..b2af478336 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthDstCase.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDst; + +public class OfToSalEthDstCase extends ConvertorCase { + public OfToSalEthDstCase() { + super(EthDstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull EthDstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final EthernetMatchBuilder ethMatchBuilder = data.getEthernetMatchBuilder(); + + final EthDst ethDstCase = source.getEthDst(); + + if (ethDstCase != null) { + EthernetDestinationBuilder ethDestinationBuilder = new EthernetDestinationBuilder(); + ethDestinationBuilder.setAddress(ethDstCase.getMacAddress()); + byte[] destinationMask = ethDstCase.getMask(); + + if (destinationMask != null) { + ethDestinationBuilder.setMask(new MacAddress(macAddressToString(destinationMask))); + } + + ethMatchBuilder.setEthernetDestination(ethDestinationBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthSrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthSrcCase.java new file mode 100644 index 0000000000..fec3bfdc4f --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthSrcCase.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrc; + +public class OfToSalEthSrcCase extends ConvertorCase { + public OfToSalEthSrcCase() { + super(EthSrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull EthSrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final EthernetMatchBuilder ethMatchBuilder = data.getEthernetMatchBuilder(); + + final EthSrc ethSrcCase = source.getEthSrc(); + + if (ethSrcCase != null) { + EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder(); + ethSourceBuilder.setAddress(ethSrcCase.getMacAddress()); + byte[] mask = ethSrcCase.getMask(); + + if (mask != null) { + ethSourceBuilder.setMask(new MacAddress(macAddressToString(mask))); + } + + ethMatchBuilder.setEthernetSource(ethSourceBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthTypeCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthTypeCase.java new file mode 100644 index 0000000000..c69bddb8c4 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalEthTypeCase.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthType; + +public class OfToSalEthTypeCase extends ConvertorCase { + public OfToSalEthTypeCase() { + super(EthTypeCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull EthTypeCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final EthernetMatchBuilder ethMatchBuilder = data.getEthernetMatchBuilder(); + + final EthType ethTypeCase = source.getEthType(); + + if (ethTypeCase != null) { + EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); + ethTypeBuilder.setType(new EtherType((long) ethTypeCase.getEthType().getValue())); + ethMatchBuilder.setEthernetType(ethTypeBuilder.build()); + matchBuilder.setEthernetMatch(ethMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalExperimenterIdCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalExperimenterIdCase.java new file mode 100644 index 0000000000..ff4ac07940 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalExperimenterIdCase.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags; + +public class OfToSalExperimenterIdCase extends ConvertorCase { + public OfToSalExperimenterIdCase() { + super(ExperimenterIdCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull ExperimenterIdCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + + if (data.getOxmMatchField().equals(TcpFlags.class)) { + final TcpFlagsMatchBuilder tcpFlagsMatchBuilder = data.getTcpFlagsMatchBuilder(); + final TcpFlagsContainer tcpFlagsContainer = source.getAugmentation(TcpFlagsContainer.class); + + if (tcpFlagsContainer != null) { + org.opendaylight.yang.gen.v1.urn.opendaylight.openflow. + approved.extensions.rev160802.oxm.container.match.entry. + value.experimenter.id._case.TcpFlags tcpFlags = tcpFlagsContainer.getTcpFlags(); + + tcpFlagsMatchBuilder.setTcpFlags(tcpFlags.getFlags()); + byte[] mask = tcpFlags.getMask(); + if (mask != null) { + tcpFlagsMatchBuilder.setTcpFlagsMask(ByteUtil.bytesToUnsignedShort(mask)); + } + + matchBuilder.setTcpFlagsMatch(tcpFlagsMatchBuilder.build()); + } + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4CodeCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4CodeCase.java new file mode 100644 index 0000000000..7241695625 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4CodeCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4Code; + +public class OfToSalIcmpv4CodeCase extends ConvertorCase { + public OfToSalIcmpv4CodeCase() { + super(Icmpv4CodeCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Icmpv4CodeCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Icmpv4MatchBuilder icmpv4MatchBuilder = data.getIcmpv4MatchBuilder(); + + Icmpv4Code icmpv4Code = source.getIcmpv4Code(); + Short v4code = icmpv4Code.getIcmpv4Code(); + + if (v4code != null) { + icmpv4MatchBuilder.setIcmpv4Code(v4code); + matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4TypeCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4TypeCase.java new file mode 100644 index 0000000000..93ccedae5b --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv4TypeCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4Type; + +public class OfToSalIcmpv4TypeCase extends ConvertorCase { + public OfToSalIcmpv4TypeCase() { + super(Icmpv4TypeCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Icmpv4TypeCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Icmpv4MatchBuilder icmpv4MatchBuilder = data.getIcmpv4MatchBuilder(); + + Icmpv4Type icmpv4Type = source.getIcmpv4Type(); + Short type = icmpv4Type.getIcmpv4Type(); + + if (type != null) { + icmpv4MatchBuilder.setIcmpv4Type(type); + matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6CodeCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6CodeCase.java new file mode 100644 index 0000000000..b824b2194a --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6CodeCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6Code; + +public class OfToSalIcmpv6CodeCase extends ConvertorCase { + public OfToSalIcmpv6CodeCase() { + super(Icmpv6CodeCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Icmpv6CodeCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Icmpv6MatchBuilder icmpv6MatchBuilder = data.getIcmpv6MatchBuilder(); + + Icmpv6Code icmpv6Code = source.getIcmpv6Code(); + Short v6code = icmpv6Code.getIcmpv6Code(); + + if (v6code != null) { + icmpv6MatchBuilder.setIcmpv6Code(v6code); + matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6TypeCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6TypeCase.java new file mode 100644 index 0000000000..e0f296c81e --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIcmpv6TypeCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6Type; + +public class OfToSalIcmpv6TypeCase extends ConvertorCase { + public OfToSalIcmpv6TypeCase() { + super(Icmpv6TypeCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Icmpv6TypeCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Icmpv6MatchBuilder icmpv6MatchBuilder = data.getIcmpv6MatchBuilder(); + + Icmpv6Type icmpv6Type = source.getIcmpv6Type(); + Short v6type = icmpv6Type.getIcmpv6Type(); + + if (v6type != null) { + icmpv6MatchBuilder.setIcmpv6Type(v6type); + matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPhyPortCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPhyPortCase.java new file mode 100644 index 0000000000..faeb92ac18 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPhyPortCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.math.BigInteger; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase; + +public class OfToSalInPhyPortCase extends ConvertorCase { + public OfToSalInPhyPortCase() { + super(InPhyPortCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull InPhyPortCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final OpenflowVersion ofVersion = OpenflowVersion.get(data.getVersion()); + final BigInteger datapathId = data.getDatapathId(); + + final PortNumber portNumber = source.getInPhyPort().getPortNumber(); + + if (portNumber != null) { + matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNumber.getValue(), ofVersion)); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPortCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPortCase.java new file mode 100644 index 0000000000..3283b8d652 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalInPortCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.math.BigInteger; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase; + +public class OfToSalInPortCase extends ConvertorCase { + public OfToSalInPortCase() { + super(InPortCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull InPortCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final OpenflowVersion ofVersion = OpenflowVersion.get(data.getVersion()); + final BigInteger datapathId = data.getDatapathId(); + + final PortNumber portNumber = source.getInPort().getPortNumber(); + + if (portNumber != null) { + matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNumber.getValue(), ofVersion)); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpDscpCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpDscpCase.java new file mode 100644 index 0000000000..2cd568bdd9 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpDscpCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscp; + +public class OfToSalIpDscpCase extends ConvertorCase { + public OfToSalIpDscpCase() { + super(IpDscpCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull IpDscpCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final IpMatchBuilder ipMatchBuilder = data.getIpMatchBuilder(); + + IpDscp ipDscp = source.getIpDscp(); + + if (ipDscp != null) { + ipMatchBuilder.setIpDscp(new Dscp(ipDscp.getDscp().getValue())); + matchBuilder.setIpMatch(ipMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpEcnCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpEcnCase.java new file mode 100644 index 0000000000..f999efc9b1 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpEcnCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcn; + +public class OfToSalIpEcnCase extends ConvertorCase { + public OfToSalIpEcnCase() { + super(IpEcnCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull IpEcnCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final IpMatchBuilder ipMatchBuilder = data.getIpMatchBuilder(); + + IpEcn ipEcn = source.getIpEcn(); + + if (ipEcn != null) { + ipMatchBuilder.setIpEcn(ipEcn.getEcn()); + matchBuilder.setIpMatch(ipMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpProtoCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpProtoCase.java new file mode 100644 index 0000000000..a262198c70 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpProtoCase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProto; + +public class OfToSalIpProtoCase extends ConvertorCase { + public OfToSalIpProtoCase() { + super(IpProtoCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull IpProtoCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final IpMatchBuilder ipMatchBuilder = data.getIpMatchBuilder(); + + IpProto ipProto = source.getIpProto(); + Short protocolNumber = ipProto.getProtocolNumber(); + + if (protocolNumber != null) { + ipMatchBuilder.setIpProtocol(protocolNumber); + matchBuilder.setIpMatch(ipMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4DstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4DstCase.java new file mode 100644 index 0000000000..dc417df24d --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4DstCase.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst; + +public class OfToSalIpv4DstCase extends ConvertorCase { + public OfToSalIpv4DstCase() { + super(Ipv4DstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final byte[] mask, final String ipv4PrefixStr) { + final Ipv4Prefix ipv4Prefix; + if (mask != null) { + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr)); + } + + ipv4MatchBuilder.setIpv4Destination(ipv4Prefix); + } + + private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final DottedQuad mask, final String ipv4AddressStr) { + if (mask != null) { + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask); + } + + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(new Ipv4Address(ipv4AddressStr)); + } + + private static void setDstIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final DottedQuad mask, final String ipv4AddressStr) { + if (mask != null) { + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask); + } + + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address(ipv4AddressStr)); + } + + @Override + public Optional process(@Nonnull Ipv4DstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv4MatchBuilder ipv4MatchBuilder = data.getIpv4MatchBuilder(); + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = data.getIpv4MatchArbitraryBitMaskBuilder(); + + Ipv4Dst ipv4Address = source.getIpv4Dst(); + + if (ipv4Address != null) { + byte[] mask = ipv4Address.getMask(); + + if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { + // case where ipv4src is of type ipv4MatchBuilder and ipv4dst is of type ipv4MatchArbitrary. + // Needs to convert ipv4src to ipv4MatchArbitrary. + if (ipv4MatchBuilder.getIpv4Source() != null) { + Ipv4Prefix ipv4PrefixSourceAddress = ipv4MatchBuilder.getIpv4Source(); + Ipv4Address ipv4SourceAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixSourceAddress); + DottedQuad srcDottedQuad = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixSourceAddress); + setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, + srcDottedQuad, ipv4SourceAddress.getValue()); + } + + DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); + setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, + dstDottedQuadMask, stringIpv4DstAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4SourceAddressNoMask() != null) { + /* + Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, + destination which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. + We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 + expected output example:- + 36.36.36.0/24 + 36.36.36.0 + 255.0.255.0 + after conversion output example:- + 36.36.36.0 + 255.255.255.0 + 36.36.36.0 + 255.0.255.0 + */ + DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); + setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, + dstDottedQuadMask, stringIpv4DstAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else { + String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue(); + setIpv4MatchBuilderFields(ipv4MatchBuilder, mask, ipv4PrefixStr); + matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); + } + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4SrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4SrcCase.java new file mode 100644 index 0000000000..9098a6a66a --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv4SrcCase.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src; + +public class OfToSalIpv4SrcCase extends ConvertorCase { + public OfToSalIpv4SrcCase() { + super(Ipv4SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final byte[] mask, final String ipv4PrefixStr) { + final Ipv4Prefix ipv4Prefix; + if (mask != null) { + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr)); + } + + ipv4MatchBuilder.setIpv4Source(ipv4Prefix); + } + + private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final DottedQuad mask, final String ipv4AddressStr) { + if (mask != null) { + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask); + } + + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(new Ipv4Address(ipv4AddressStr)); + } + + private static void setDstIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final DottedQuad mask, final String ipv4AddressStr) { + if (mask != null) { + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask); + } + + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address(ipv4AddressStr)); + } + + @Override + public Optional process(@Nonnull Ipv4SrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv4MatchBuilder ipv4MatchBuilder = data.getIpv4MatchBuilder(); + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = data.getIpv4MatchArbitraryBitMaskBuilder(); + + Ipv4Src ipv4Address = source.getIpv4Src(); + + if (ipv4Address != null) { + byte[] mask = ipv4Address.getMask(); + + if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { + // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary. + // Needs to convert ipv4dst to ipv4MatchArbitrary. + if (ipv4MatchBuilder.getIpv4Destination() != null) { + Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination(); + Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress); + DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress); + + setDstIpv4MatchArbitraryBitMaskBuilderFields( + ipv4MatchArbitraryBitMaskBuilder, + dstDottedQuadMask, ipv4DstAddress.getValue()); + } + + DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setSrcIpv4MatchArbitraryBitMaskBuilderFields( + ipv4MatchArbitraryBitMaskBuilder, + srcDottedQuadMask, stringIpv4SrcAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) { + /* + Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, + source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. + We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 + expected output example:- + 36.36.36.0/24 + 36.36.36.0 + 255.0.255.0 + after conversion output example:- + 36.36.36.0 + 255.255.255.0 + 36.36.36.0 + 255.0.255.0 + */ + DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setSrcIpv4MatchArbitraryBitMaskBuilderFields( + ipv4MatchArbitraryBitMaskBuilder, + srcDottedQuadMask, stringIpv4SrcAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else { + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setIpv4MatchBuilderFields(ipv4MatchBuilder, mask, stringIpv4SrcAddress); + matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); + } + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6DstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6DstCase.java new file mode 100644 index 0000000000..6fd2a136a4 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6DstCase.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst; + +public class OfToSalIpv6DstCase extends ConvertorCase { + public OfToSalIpv6DstCase() { + super(Ipv6DstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6DstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = data.getIpv6MatchArbitraryBitMaskBuilder(); + + Ipv6Dst ipv6Dst = source.getIpv6Dst(); + + if (ipv6Dst != null) { + byte[] mask = ipv6Dst.getMask(); + if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) { + // case where ipv6src is of type ipv6MatchBuilder and ipv6dst is of type ipv6MatchArbitrary. + // Need to convert ipv6src to ipv6MatchArbitrary. + + if (ipv6MatchBuilder.getIpv6Source() != null) { + Ipv6Prefix ipv6PrefixSourceAddress = ipv6MatchBuilder.getIpv6Source(); + Ipv6Address ipv6SrcAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixSourceAddress); + Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress)); + setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + srcIpv6Arbitrary, IpConversionUtil.compressedIpv6Format(ipv6SrcAddress.getValue())); + } + Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.createIpv6ArbitraryBitMask(mask)); + String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue()); + setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + dstIpv6ArbitraryMask, stringIpv6DstAddress); + matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); + } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6SourceAddressNoMask() != null) { + /* + TODO Change comments + Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, + source which of type ipv6Match needs to be converted to ipv6MatchArbitraryBitMask. + We convert 1::/32 to 1::/FFFF:FFFF:: + example:- + 1::/32 + 1::1 + FFFF::0001 + after conversion output example:- + 1:: + FFFF:FFFF:: + 1::1 + FFFF::0001 + */ + Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.createIpv6ArbitraryBitMask(mask)); + String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue()); + setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + dstIpv6ArbitraryMask, stringIpv6DstAddress); + matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); + } else { + String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue()); + setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6DstAddress); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + } + + return Optional.of(matchBuilder); + } + + private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final byte[] mask, final String ipv6PrefixStr) { + Ipv6Prefix ipv6Prefix; + + if (mask != null) { + ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask); + } else { + ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr)); + } + + ipv6MatchBuilder.setIpv6Destination(ipv6Prefix); + } + + private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields( + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, + final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { + Ipv6Address ipv6Address; + if (mask != null) { + ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask); + } + ipv6Address = new Ipv6Address(ipv6AddressStr); + ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address); + } + + private static void setDstIpv6MatchArbitraryBitMaskBuilderFields( + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, + final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { + Ipv6Address ipv6Address; + if (mask != null) { + ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask); + } + ipv6Address = new Ipv6Address(ipv6AddressStr); + ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6ExthdrCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6ExthdrCase.java new file mode 100644 index 0000000000..b3b5abaaf4 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6ExthdrCase.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6Exthdr; + +public class OfToSalIpv6ExthdrCase extends ConvertorCase { + public OfToSalIpv6ExthdrCase() { + super(Ipv6ExthdrCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6ExthdrCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + + Ipv6Exthdr ipv6Exthdr = source.getIpv6Exthdr(); + + if (ipv6Exthdr != null) { + Ipv6ExtHeaderBuilder ipv6ExtHeaderBuilder = new Ipv6ExtHeaderBuilder(); + Ipv6ExthdrFlags pField = ipv6Exthdr.getPseudoField(); + Integer bitmap = MatchConvertorUtil.ipv6ExthdrFlagsToInt(pField); + ipv6ExtHeaderBuilder.setIpv6Exthdr(bitmap); + byte[] mask = ipv6Exthdr.getMask(); + + if (mask != null) { + ipv6ExtHeaderBuilder.setIpv6ExthdrMask(ByteUtil.bytesToUnsignedShort(mask)); + } + + ipv6MatchBuilder.setIpv6ExtHeader(ipv6ExtHeaderBuilder.build()); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6FlabelCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6FlabelCase.java new file mode 100644 index 0000000000..d0434847d6 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6FlabelCase.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6Flabel; + +public class OfToSalIpv6FlabelCase extends ConvertorCase { + public OfToSalIpv6FlabelCase() { + super(Ipv6FlabelCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6FlabelCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + + Ipv6Flabel ipv6Flabel = source.getIpv6Flabel(); + + if (ipv6Flabel != null) { + Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder(); + ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(ipv6Flabel.getIpv6Flabel())); + byte[] mask = ipv6Flabel.getMask(); + + if (mask != null) { + ipv6LabelBuilder.setFlabelMask(new Ipv6FlowLabel(ByteUtil.bytesToUnsignedInt(mask))); + } + + ipv6MatchBuilder.setIpv6Label(ipv6LabelBuilder.build()); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdSllCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdSllCase.java new file mode 100644 index 0000000000..2cdb2ab2b2 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdSllCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSll; + +public class OfToSalIpv6NdSllCase extends ConvertorCase { + public OfToSalIpv6NdSllCase() { + super(Ipv6NdSllCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6NdSllCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + + Ipv6NdSll ipv6NdSll = source.getIpv6NdSll(); + + if (ipv6NdSll != null) { + ipv6MatchBuilder.setIpv6NdSll(ipv6NdSll.getMacAddress()); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTargetCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTargetCase.java new file mode 100644 index 0000000000..36a3339439 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTargetCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTarget; + +public class OfToSalIpv6NdTargetCase extends ConvertorCase { + public OfToSalIpv6NdTargetCase() { + super(Ipv6NdTargetCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6NdTargetCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + + Ipv6NdTarget ipv6NdTarget = source.getIpv6NdTarget(); + + if (ipv6NdTarget != null) { + ipv6MatchBuilder.setIpv6NdTarget(ipv6NdTarget.getIpv6Address()); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTllCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTllCase.java new file mode 100644 index 0000000000..25153d0e3b --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6NdTllCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTll; + +public class OfToSalIpv6NdTllCase extends ConvertorCase { + public OfToSalIpv6NdTllCase() { + super(Ipv6NdTllCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6NdTllCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + + Ipv6NdTll ipv6NdTll = source.getIpv6NdTll(); + + if (ipv6NdTll != null) { + ipv6MatchBuilder.setIpv6NdTll(ipv6NdTll.getMacAddress()); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6SrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6SrcCase.java new file mode 100644 index 0000000000..981bdf8166 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6SrcCase.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src; + +public class OfToSalIpv6SrcCase extends ConvertorCase { + public OfToSalIpv6SrcCase() { + super(Ipv6SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv6SrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder(); + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = data.getIpv6MatchArbitraryBitMaskBuilder(); + + Ipv6Src ipv6Src = source.getIpv6Src(); + + if (ipv6Src != null) { + byte[] mask = ipv6Src.getMask(); + if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) { + // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary. + // Need to convert ipv6dst to ipv6MatchArbitrary. + + if (ipv6MatchBuilder.getIpv6Destination() != null) { + Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination(); + Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress); + Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress)); + setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue())); + } + Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.createIpv6ArbitraryBitMask(mask)); + String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue()); + setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + srcIpv6ArbitraryMask, stringIpv6SrcAddress); + matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); + } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) { + /* + TODO Change comments + Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match, + source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask. + We convert 1::/32 to 1::/FFFF:FFFF:: + example:- + 1::/32 + 1::1 + FFFF::0001 + after conversion output example:- + 1:: + FFFF:FFFF:: + 1::1 + FFFF::0001 + */ + Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat( + IpConversionUtil.createIpv6ArbitraryBitMask(mask)); + String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue()); + setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, + srcIpv6ArbitraryMask, stringIpv6SrcAddress); + matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build()); + } else { + String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue()); + setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6SrcAddress); + matchBuilder.setLayer3Match(ipv6MatchBuilder.build()); + } + } + + return Optional.of(matchBuilder); + } + + private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final byte[] mask, final String ipv6PrefixStr) { + Ipv6Prefix ipv6Prefix; + + if (mask != null) { + ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask); + } else { + ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr)); + } + + ipv6MatchBuilder.setIpv6Source(ipv6Prefix); + } + + private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields( + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, + final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { + Ipv6Address ipv6Address; + if (mask != null) { + ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask); + } + ipv6Address = new Ipv6Address(ipv6AddressStr); + ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address); + } + + private static void setDstIpv6MatchArbitraryBitMaskBuilderFields( + final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder, + final Ipv6ArbitraryMask mask, final String ipv6AddressStr) { + Ipv6Address ipv6Address; + if (mask != null) { + ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask); + } + ipv6Address = new Ipv6Address(ipv6AddressStr); + ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMetadataCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMetadataCase.java new file mode 100644 index 0000000000..179c6dac39 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMetadataCase.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.math.BigInteger; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.Metadata; + +public class OfToSalMetadataCase extends ConvertorCase { + public OfToSalMetadataCase() { + super(MetadataCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull MetadataCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final MetadataBuilder metadataBuilder = new MetadataBuilder(); + final Metadata metadata = source.getMetadata(); + + if (metadata != null) { + metadataBuilder.setMetadata(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadata.getMetadata())); + byte[] metadataMask = metadata.getMask(); + + if (metadataMask != null) { + metadataBuilder.setMetadataMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadataMask)); + } + + matchBuilder.setMetadata(metadataBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsBosCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsBosCase.java new file mode 100644 index 0000000000..8e70ca581a --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsBosCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBos; + +public class OfToSalMplsBosCase extends ConvertorCase { + public OfToSalMplsBosCase() { + super(MplsBosCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull MplsBosCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = data.getProtocolMatchFieldsBuilder(); + + MplsBos mplsBos = source.getMplsBos(); + + if (mplsBos != null) { + protocolMatchFieldsBuilder.setMplsBos(mplsBos.isBos() ? (short) 1 : (short) 0); + matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsLabelCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsLabelCase.java new file mode 100644 index 0000000000..dd26627586 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsLabelCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabel; + +public class OfToSalMplsLabelCase extends ConvertorCase { + public OfToSalMplsLabelCase() { + super(MplsLabelCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull MplsLabelCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = data.getProtocolMatchFieldsBuilder(); + + MplsLabel mplsLabel = source.getMplsLabel(); + + if (mplsLabel != null) { + protocolMatchFieldsBuilder.setMplsLabel(mplsLabel.getMplsLabel()); + matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsTcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsTcCase.java new file mode 100644 index 0000000000..7005fc08d5 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalMplsTcCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTc; + +public class OfToSalMplsTcCase extends ConvertorCase { + public OfToSalMplsTcCase() { + super(MplsTcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull MplsTcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = data.getProtocolMatchFieldsBuilder(); + + MplsTc mplsTc = source.getMplsTc(); + + if (mplsTc != null) { + protocolMatchFieldsBuilder.setMplsTc(mplsTc.getTc()); + matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalPbbIsidCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalPbbIsidCase.java new file mode 100644 index 0000000000..1d7d25c421 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalPbbIsidCase.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +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.protocol.match.fields.PbbBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsid; + +public class OfToSalPbbIsidCase extends ConvertorCase { + public OfToSalPbbIsidCase() { + super(PbbIsidCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull PbbIsidCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = data.getProtocolMatchFieldsBuilder(); + + PbbIsid pbbIsid = source.getPbbIsid(); + + if (pbbIsid != null) { + PbbBuilder pbbBuilder = new PbbBuilder(); + pbbBuilder.setPbbIsid(pbbIsid.getIsid()); + byte[] mask = pbbIsid.getMask(); + + if (mask != null) { + pbbBuilder.setPbbMask(ByteUtil.bytesToUnsignedMedium(mask)); + } + + protocolMatchFieldsBuilder.setPbb(pbbBuilder.build()); + matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpDstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpDstCase.java new file mode 100644 index 0000000000..fea5b8399c --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpDstCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDst; + +public class OfToSalSctpDstCase extends ConvertorCase { + public OfToSalSctpDstCase() { + super(SctpDstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull SctpDstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final SctpMatchBuilder sctpMatchBuilder = data.getSctpMatchBuilder(); + + SctpDst sctpDst = source.getSctpDst(); + PortNumber portNumber = sctpDst.getPort(); + + if (portNumber != null) { + sctpMatchBuilder.setSctpDestinationPort(portNumber); + matchBuilder.setLayer4Match(sctpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpSrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpSrcCase.java new file mode 100644 index 0000000000..c5bcb92ef7 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalSctpSrcCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrc; + +public class OfToSalSctpSrcCase extends ConvertorCase { + public OfToSalSctpSrcCase() { + super(SctpSrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull SctpSrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final SctpMatchBuilder sctpMatchBuilder = data.getSctpMatchBuilder(); + + SctpSrc sctpSrc = source.getSctpSrc(); + PortNumber portNumber = sctpSrc.getPort(); + + if (portNumber != null) { + sctpMatchBuilder.setSctpSourcePort(portNumber); + matchBuilder.setLayer4Match(sctpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpDstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpDstCase.java new file mode 100644 index 0000000000..76914b9a06 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpDstCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDst; + +public class OfToSalTcpDstCase extends ConvertorCase { + public OfToSalTcpDstCase() { + super(TcpDstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull TcpDstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final TcpMatchBuilder tcpMatchBuilder = data.getTcpMatchBuilder(); + + TcpDst tcpDst = source.getTcpDst(); + PortNumber portNumber = tcpDst.getPort(); + + if (portNumber != null) { + tcpMatchBuilder.setTcpDestinationPort(portNumber); + matchBuilder.setLayer4Match(tcpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpSrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpSrcCase.java new file mode 100644 index 0000000000..75780742b1 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTcpSrcCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrc; + +public class OfToSalTcpSrcCase extends ConvertorCase { + public OfToSalTcpSrcCase() { + super(TcpSrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull TcpSrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final TcpMatchBuilder tcpMatchBuilder = data.getTcpMatchBuilder(); + + TcpSrc tcpSrc = source.getTcpSrc(); + + if (tcpSrc != null) { + tcpMatchBuilder.setTcpSourcePort(tcpSrc.getPort()); + matchBuilder.setLayer4Match(tcpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIdCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIdCase.java new file mode 100644 index 0000000000..389f8cd3f1 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIdCase.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.math.BigInteger; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelId; + +public class OfToSalTunnelIdCase extends ConvertorCase { + public OfToSalTunnelIdCase() { + super(TunnelIdCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull TunnelIdCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + + TunnelId tunnelId = source.getTunnelId(); + TunnelBuilder tunnelBuilder = new TunnelBuilder(); + + if (tunnelId.getTunnelId() != null) { + tunnelBuilder.setTunnelId(new BigInteger(OFConstants.SIGNUM_UNSIGNED, tunnelId.getTunnelId())); + byte[] mask = tunnelId.getMask(); + + if (null != mask) { + tunnelBuilder.setTunnelMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, mask)); + } + + matchBuilder.setTunnel(tunnelBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4DstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4DstCase.java new file mode 100644 index 0000000000..733c1a886f --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4DstCase.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.nio.ByteBuffer; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst; + +public class OfToSalTunnelIpv4DstCase extends ConvertorCase { + public OfToSalTunnelIpv4DstCase() { + super(Ipv4DstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv4DstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv4MatchBuilder ipv4MatchBuilder = data.getIpv4MatchBuilder(); + final TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = data.getTunnelIpv4MatchBuilder(); + + Ipv4Dst tunnelIpv4Dst = source.getIpv4Dst(); + if (tunnelIpv4Dst != null) { + String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue(); + byte[] mask = tunnelIpv4Dst.getMask(); + ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt(); + final Ipv4Prefix ipv4Prefix; + + if (mask != null) { + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr)); + } + + ipv4MatchBuilder.setIpv4Destination(ipv4Prefix); + matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4SrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4SrcCase.java new file mode 100644 index 0000000000..5586b3484f --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalTunnelIpv4SrcCase.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.nio.ByteBuffer; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src; + +public class OfToSalTunnelIpv4SrcCase extends ConvertorCase { + public OfToSalTunnelIpv4SrcCase() { + super(Ipv4SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull Ipv4SrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final Ipv4MatchBuilder ipv4MatchBuilder = data.getIpv4MatchBuilder(); + final TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = data.getTunnelIpv4MatchBuilder(); + + Ipv4Src tunnelIpv4Dst = source.getIpv4Src(); + + if (tunnelIpv4Dst != null) { + String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue(); + byte[] mask = tunnelIpv4Dst.getMask(); + ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt(); + + final Ipv4Prefix ipv4Prefix; + if (mask != null) { + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask); + } else { + //Openflow Spec : 1.3.2 + //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask. + // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow + // statistics response. + ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr)); + } + + ipv4MatchBuilder.setIpv4Source(ipv4Prefix); + matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpDstCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpDstCase.java new file mode 100644 index 0000000000..78776cebc5 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpDstCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDst; + +public class OfToSalUdpDstCase extends ConvertorCase { + public OfToSalUdpDstCase() { + super(UdpDstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull UdpDstCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final UdpMatchBuilder udpMatchBuilder = data.getUdpMatchBuilder(); + + UdpDst udpDst = source.getUdpDst(); + + if (udpDst != null) { + udpMatchBuilder.setUdpDestinationPort(udpDst.getPort()); + matchBuilder.setLayer4Match(udpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpSrcCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpSrcCase.java new file mode 100644 index 0000000000..ec52f5624d --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalUdpSrcCase.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrc; + +public class OfToSalUdpSrcCase extends ConvertorCase { + public OfToSalUdpSrcCase() { + super(UdpSrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull UdpSrcCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final UdpMatchBuilder udpMatchBuilder = data.getUdpMatchBuilder(); + + UdpSrc udpSrc = source.getUdpSrc(); + + if (udpSrc != null) { + udpMatchBuilder.setUdpSourcePort(udpSrc.getPort()); + matchBuilder.setLayer4Match(udpMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanPcpCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanPcpCase.java new file mode 100644 index 0000000000..807c0b04ae --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanPcpCase.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcp; + +public class OfToSalVlanPcpCase extends ConvertorCase { + public OfToSalVlanPcpCase() { + super(VlanPcpCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull VlanPcpCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final VlanMatchBuilder vlanMatchBuilder = data.getVlanMatchBuilder(); + + final VlanPcp vlanPcp = source.getVlanPcp(); + + if (vlanPcp != null) { + vlanMatchBuilder + .setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp( + vlanPcp.getVlanPcp())); + matchBuilder.setVlanMatch(vlanMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanVidCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanVidCase.java new file mode 100644 index 0000000000..89e387e6c3 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalVlanVidCase.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; +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.vlan.match.fields.VlanIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVid; + +public class OfToSalVlanVidCase extends ConvertorCase { + public OfToSalVlanVidCase() { + super(VlanVidCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3); + } + + @Override + public Optional process(@Nonnull VlanVidCase source, MatchResponseConvertorData data) { + final MatchBuilder matchBuilder = data.getMatchBuilder(); + final VlanMatchBuilder vlanMatchBuilder = data.getVlanMatchBuilder(); + + final VlanVid vlanVid = source.getVlanVid(); + + if (vlanVid != null) { + VlanIdBuilder vlanBuilder = new VlanIdBuilder(); + vlanBuilder.setVlanId(new VlanId(vlanVid.getVlanVid())); + vlanBuilder.setVlanIdPresent(vlanVid.isCfiBit()); + vlanMatchBuilder.setVlanId(vlanBuilder.build()); + matchBuilder.setVlanMatch(vlanMatchBuilder.build()); + } + + return Optional.of(matchBuilder); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfArpMatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfArpMatchCase.java new file mode 100644 index 0000000000..cb3bc68662 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfArpMatchCase.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOpBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpShaBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpaBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpThaBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpaBuilder; + +public class SalToOfArpMatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfArpMatchCase() { + super(ArpMatch.class, true); + } + + @Override + public Optional> process(@Nonnull ArpMatch source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getArpOp() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(ArpOp.class); + ArpOpCaseBuilder arpOpCaseBuilder = new ArpOpCaseBuilder(); + ArpOpBuilder arpOpBuilder = new ArpOpBuilder(); + arpOpBuilder.setOpCode(source.getArpOp()); + arpOpCaseBuilder.setArpOp(arpOpBuilder.build()); + matchEntryBuilder.setMatchEntryValue(arpOpCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getArpSourceTransportAddress() != null) { + Ipv4Prefix ipv4Prefix = source.getArpSourceTransportAddress(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(ArpSpa.class); + + ArpSpaCaseBuilder arpSpaCaseBuilder = new ArpSpaCaseBuilder(); + ArpSpaBuilder arpSpaBuilder = new ArpSpaBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + arpSpaBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + if (null != mask) { + arpSpaBuilder.setMask(mask); + hasMask = true; + } + matchEntryBuilder.setHasMask(hasMask); + arpSpaCaseBuilder.setArpSpa(arpSpaBuilder.build()); + matchEntryBuilder.setMatchEntryValue(arpSpaCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getArpTargetTransportAddress() != null) { + Ipv4Prefix ipv4Prefix = source.getArpTargetTransportAddress(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(ArpTpa.class); + + ArpTpaCaseBuilder arpTpaCaseBuilder = new ArpTpaCaseBuilder(); + ArpTpaBuilder arpTpaBuilder = new ArpTpaBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + arpTpaBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + if (null != mask) { + arpTpaBuilder.setMask(mask); + hasMask = true; + } + matchEntryBuilder.setHasMask(hasMask); + arpTpaCaseBuilder.setArpTpa(arpTpaBuilder.build()); + matchEntryBuilder.setMatchEntryValue(arpTpaCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + ArpSourceHardwareAddress arpSourceHardwareAddress = source.getArpSourceHardwareAddress(); + if (arpSourceHardwareAddress != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(ArpSha.class); + + ArpShaCaseBuilder arpShaCaseBuilder = new ArpShaCaseBuilder(); + ArpShaBuilder arpShaBuilder = new ArpShaBuilder(); + arpShaBuilder.setMacAddress(arpSourceHardwareAddress.getAddress()); + boolean hasMask = false; + if (null != arpSourceHardwareAddress.getMask()) { + arpShaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpSourceHardwareAddress.getMask().getValue())); + hasMask = true; + } + arpShaCaseBuilder.setArpSha(arpShaBuilder.build()); + matchEntryBuilder.setMatchEntryValue(arpShaCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + result.add(matchEntryBuilder.build()); + } + + ArpTargetHardwareAddress arpTargetHardwareAddress = source.getArpTargetHardwareAddress(); + if (arpTargetHardwareAddress != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(ArpTha.class); + + ArpThaCaseBuilder arpThaCaseBuilder = new ArpThaCaseBuilder(); + ArpThaBuilder arpThaBuilder = new ArpThaBuilder(); + arpThaBuilder.setMacAddress(arpTargetHardwareAddress.getAddress()); + boolean hasMask = false; + if (null != arpTargetHardwareAddress.getMask()) { + arpThaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpTargetHardwareAddress.getMask().getValue())); + hasMask = true; + } + arpThaCaseBuilder.setArpTha(arpThaBuilder.build()); + matchEntryBuilder.setMatchEntryValue(arpThaCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchArbitraryBitMaskCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchArbitraryBitMaskCase.java new file mode 100644 index 0000000000..1100cc446a --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchArbitraryBitMaskCase.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder; + +public class SalToOfIpv4MatchArbitraryBitMaskCase extends ConvertorCase, VersionConvertorData> { + public SalToOfIpv4MatchArbitraryBitMaskCase() { + super(Ipv4MatchArbitraryBitMask.class, true); + } + + @Override + public Optional> process(@Nonnull Ipv4MatchArbitraryBitMask source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getIpv4SourceAddressNoMask() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Src.class); + + Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + + ipv4SrcBuilder.setIpv4Address(source.getIpv4SourceAddressNoMask()); + DottedQuad sourceArbitrarySubNetMask = source.getIpv4SourceArbitraryBitmask(); + + boolean hasMask = false; + if (sourceArbitrarySubNetMask != null) { + byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(sourceArbitrarySubNetMask); + if (maskByteArray != null) { + ipv4SrcBuilder.setMask(maskByteArray); + hasMask = true; + } + } + matchEntryBuilder.setHasMask(hasMask); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv4DestinationAddressNoMask() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); + + Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); + + ipv4DstBuilder.setIpv4Address(source.getIpv4DestinationAddressNoMask()); + DottedQuad destArbitrarySubNetMask = source.getIpv4DestinationArbitraryBitmask(); + + boolean hasMask = false; + if (destArbitrarySubNetMask != null) { + byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(destArbitrarySubNetMask); + if (maskByteArray != null) { + ipv4DstBuilder.setMask(maskByteArray); + hasMask = true; + } + } + matchEntryBuilder.setHasMask(hasMask); + ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchCase.java new file mode 100644 index 0000000000..1c7a907a3c --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv4MatchCase.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder; + +public class SalToOfIpv4MatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfIpv4MatchCase() { + super(Ipv4Match.class, true); + } + + @Override + public Optional> process(@Nonnull Ipv4Match source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getIpv4Source() != null) { + Ipv4Prefix ipv4Prefix = source.getIpv4Source(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Src.class); + + Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + ipv4SrcBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + + if (null != mask) { + ipv4SrcBuilder.setMask(mask); + hasMask = true; + } + + matchEntryBuilder.setHasMask(hasMask); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv4Destination() != null) { + Ipv4Prefix ipv4Prefix = source.getIpv4Destination(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); + + Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + ipv4DstBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + + if (null != mask) { + ipv4DstBuilder.setMask(mask); + hasMask = true; + } + + matchEntryBuilder.setHasMask(hasMask); + ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchArbitraryBitMaskCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchArbitraryBitMaskCase.java new file mode 100644 index 0000000000..9ab5674d0e --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchArbitraryBitMaskCase.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6SrcBuilder; + +public class SalToOfIpv6MatchArbitraryBitMaskCase extends ConvertorCase, VersionConvertorData> { + public SalToOfIpv6MatchArbitraryBitMaskCase() { + super(Ipv6MatchArbitraryBitMask.class, true); + } + + @Override + public Optional> process(@Nonnull Ipv6MatchArbitraryBitMask source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getIpv6SourceAddressNoMask() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Src.class); + + Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder(); + Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder(); + ipv6SrcBuilder.setIpv6Address(source.getIpv6SourceAddressNoMask()); + Ipv6ArbitraryMask sourceArbitrarySubNetMask = source.getIpv6SourceArbitraryBitmask(); + boolean hasMask = false; + if (sourceArbitrarySubNetMask != null) { + byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(sourceArbitrarySubNetMask); + if (maskByteArray != null) { + ipv6SrcBuilder.setMask(maskByteArray); + hasMask = true; + } + } + matchEntryBuilder.setHasMask(hasMask); + ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6DestinationAddressNoMask() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Dst.class); + + Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder(); + Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder(); + + ipv6DstBuilder.setIpv6Address(source.getIpv6DestinationAddressNoMask()); + Ipv6ArbitraryMask destinationArbitrarySubNetMask = source.getIpv6DestinationArbitraryBitmask(); + + boolean hasMask = false; + if (destinationArbitrarySubNetMask != null) { + byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(destinationArbitrarySubNetMask); + if (maskByteArray != null) { + ipv6DstBuilder.setMask(maskByteArray); + hasMask = true; + } + } + matchEntryBuilder.setHasMask(hasMask); + ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchCase.java new file mode 100644 index 0000000000..374bc46ec1 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfIpv6MatchCase.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6ExthdrBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6FlabelBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSllBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTargetBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTllBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6SrcBuilder; + +public class SalToOfIpv6MatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfIpv6MatchCase() { + super(Ipv6Match.class, true); + } + + @Override + public Optional> process(@Nonnull Ipv6Match source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getIpv6Source() != null) { + Ipv6Prefix ipv6Prefix = source.getIpv6Source(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Src.class); + + Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder(); + Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder(); + final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix); + boolean hasMask = false; + if (null != prefix) { + ipv6SrcBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix)); + hasMask = true; + } + ipv6SrcBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix)); + ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6Destination() != null) { + Ipv6Prefix ipv6Prefix = source.getIpv6Destination(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Dst.class); + + Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder(); + Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder(); + final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix); + boolean hasMask = false; + if (null != prefix) { + ipv6DstBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix)); + hasMask = true; + } + ipv6DstBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix)); + ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6Label() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + boolean hasmask = false; + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Flabel.class); + Ipv6FlabelCaseBuilder ipv6FlabelCaseBuilder = new Ipv6FlabelCaseBuilder(); + Ipv6FlabelBuilder ipv6FlabelBuilder = new Ipv6FlabelBuilder(); + ipv6FlabelBuilder.setIpv6Flabel(source.getIpv6Label().getIpv6Flabel()); + + if (source.getIpv6Label().getFlabelMask() != null) { + hasmask = true; + ipv6FlabelBuilder.setMask(ByteUtil.unsignedIntToBytes(source.getIpv6Label().getFlabelMask().getValue())); + } + + ipv6FlabelCaseBuilder.setIpv6Flabel(ipv6FlabelBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6FlabelCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasmask); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6NdTarget() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setHasMask(false); + matchEntryBuilder.setOxmMatchField(Ipv6NdTarget.class); + + Ipv6NdTargetCaseBuilder ipv6NdTargetCaseBuilder = new Ipv6NdTargetCaseBuilder(); + Ipv6NdTargetBuilder ipv6NdTargetBuilder = new Ipv6NdTargetBuilder(); + ipv6NdTargetBuilder.setIpv6Address(source.getIpv6NdTarget()); + ipv6NdTargetCaseBuilder.setIpv6NdTarget(ipv6NdTargetBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6NdTargetCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6NdSll() != null) { + MacAddress ipv6NdSll = source.getIpv6NdSll(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6NdSll.class); + + Ipv6NdSllCaseBuilder ipv6NdSllCaseBuilder = new Ipv6NdSllCaseBuilder(); + Ipv6NdSllBuilder ipv6NdSllBuilder = new Ipv6NdSllBuilder(); + ipv6NdSllBuilder.setMacAddress(ipv6NdSll); + ipv6NdSllCaseBuilder.setIpv6NdSll(ipv6NdSllBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6NdSllCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + if (source.getIpv6NdTll() != null) { + MacAddress ipv6NdSll = source.getIpv6NdTll(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6NdTll.class); + + Ipv6NdTllCaseBuilder ipv6NdTllCaseBuilder = new Ipv6NdTllCaseBuilder(); + Ipv6NdTllBuilder ipv6NdTllBuilder = new Ipv6NdTllBuilder(); + ipv6NdTllBuilder.setMacAddress(ipv6NdSll); + ipv6NdTllCaseBuilder.setIpv6NdTll(ipv6NdTllBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6NdTllCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + + } + + if (source.getIpv6ExtHeader() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + boolean hasmask = false; + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv6Exthdr.class); + Ipv6ExthdrCaseBuilder ipv6ExthdrCaseBuilder = new Ipv6ExthdrCaseBuilder(); + Ipv6ExthdrBuilder ipv6ExthdrBuilder = new Ipv6ExthdrBuilder(); + + Integer bitmap = source.getIpv6ExtHeader().getIpv6Exthdr(); + final Boolean NONEXT = ((bitmap) & (1)) != 0; + final Boolean ESP = ((bitmap) & (1 << 1)) != 0; + final Boolean AUTH = ((bitmap) & (1 << 2)) != 0; + final Boolean DEST = ((bitmap) & (1 << 3)) != 0; + final Boolean FRAG = ((bitmap) & (1 << 4)) != 0; + final Boolean ROUTER = ((bitmap) & (1 << 5)) != 0; + final Boolean HOP = ((bitmap) & (1 << 6)) != 0; + final Boolean UNREP = ((bitmap) & (1 << 7)) != 0; + final Boolean UNSEQ = ((bitmap) & (1 << 8)) != 0; + + ipv6ExthdrBuilder.setPseudoField(new Ipv6ExthdrFlags(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ)); + + if (source.getIpv6ExtHeader().getIpv6ExthdrMask() != null) { + hasmask = true; + ipv6ExthdrBuilder.setMask(ByteUtil.unsignedShortToBytes(source.getIpv6ExtHeader().getIpv6ExthdrMask())); + } + + ipv6ExthdrCaseBuilder.setIpv6Exthdr(ipv6ExthdrBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv6ExthdrCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasmask); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfSctpMatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfSctpMatchCase.java new file mode 100644 index 0000000000..5cc9080bb2 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfSctpMatchCase.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrcBuilder; + +public class SalToOfSctpMatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfSctpMatchCase() { + super(SctpMatch.class, true); + } + + @Override + public Optional> process(@Nonnull SctpMatch source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getSctpSourcePort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(SctpSrc.class); + + SctpSrcCaseBuilder sctpSrcCaseBuilder = new SctpSrcCaseBuilder(); + SctpSrcBuilder sctpSrcBuilder = new SctpSrcBuilder(); + sctpSrcBuilder.setPort(source.getSctpSourcePort()); + sctpSrcCaseBuilder.setSctpSrc(sctpSrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(sctpSrcCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + if (source.getSctpDestinationPort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(SctpDst.class); + + SctpDstCaseBuilder sctpDstCaseBuilder = new SctpDstCaseBuilder(); + SctpDstBuilder sctpDstBuilder = new SctpDstBuilder(); + sctpDstBuilder.setPort(source.getSctpDestinationPort()); + sctpDstCaseBuilder.setSctpDst(sctpDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(sctpDstCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTcpMatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTcpMatchCase.java new file mode 100644 index 0000000000..4f6a3d69f4 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTcpMatchCase.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder; + +public class SalToOfTcpMatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfTcpMatchCase() { + super(TcpMatch.class, true); + } + + @Override + public Optional> process(@Nonnull TcpMatch source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getTcpSourcePort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(TcpSrc.class); + + TcpSrcCaseBuilder tcpSrcCaseBuilder = new TcpSrcCaseBuilder(); + TcpSrcBuilder tcpSrcBuilder = new TcpSrcBuilder(); + tcpSrcBuilder.setPort(source.getTcpSourcePort()); + tcpSrcCaseBuilder.setTcpSrc(tcpSrcBuilder.build()); + + matchEntryBuilder.setMatchEntryValue(tcpSrcCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + if (source.getTcpDestinationPort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(TcpDst.class); + + TcpDstCaseBuilder tcpDstCaseBuilder = new TcpDstCaseBuilder(); + TcpDstBuilder tcpDstBuilder = new TcpDstBuilder(); + tcpDstBuilder.setPort(source.getTcpDestinationPort()); + tcpDstCaseBuilder.setTcpDst(tcpDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(tcpDstCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTunnelIpv4MatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTunnelIpv4MatchCase.java new file mode 100644 index 0000000000..88f8d49b20 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfTunnelIpv4MatchCase.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder; + +public class SalToOfTunnelIpv4MatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfTunnelIpv4MatchCase() { + super(TunnelIpv4Match.class, true); + } + + @Override + public Optional> process(@Nonnull TunnelIpv4Match source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getTunnelIpv4Source() != null) { + Ipv4Prefix ipv4Prefix = source.getTunnelIpv4Source(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Src.class); + + Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + ipv4SrcBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + + if (null != mask) { + ipv4SrcBuilder.setMask(mask); + hasMask = true; + } + + matchEntryBuilder.setHasMask(hasMask); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + if (source.getTunnelIpv4Destination() != null) { + Ipv4Prefix ipv4Prefix = source.getTunnelIpv4Destination(); + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(Ipv4Dst.class); + + Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder(); + + Iterator addressParts = IpConversionUtil.splitToParts(ipv4Prefix); + Ipv4Address ipv4Address = new Ipv4Address(addressParts.next()); + ipv4DstBuilder.setIpv4Address(ipv4Address); + boolean hasMask = false; + byte[] mask = MatchConvertorUtil.extractIpv4Mask(addressParts); + + if (null != mask) { + ipv4DstBuilder.setMask(mask); + hasMask = true; + } + + matchEntryBuilder.setHasMask(hasMask); + ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfUdpMatchCase.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfUdpMatchCase.java new file mode 100644 index 0000000000..565c46aa4c --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/SalToOfUdpMatchCase.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.cases; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc; +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.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrcBuilder; + +public class SalToOfUdpMatchCase extends ConvertorCase, VersionConvertorData> { + public SalToOfUdpMatchCase() { + super(UdpMatch.class, true); + } + + @Override + public Optional> process(@Nonnull UdpMatch source, VersionConvertorData data) { + List result = new ArrayList<>(); + + if (source.getUdpSourcePort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(UdpSrc.class); + + UdpSrcCaseBuilder udpSrcCaseBuilder = new UdpSrcCaseBuilder(); + UdpSrcBuilder udpSrcBuilder = new UdpSrcBuilder(); + udpSrcBuilder.setPort(source.getUdpSourcePort()); + udpSrcCaseBuilder.setUdpSrc(udpSrcBuilder.build()); + matchEntryBuilder.setMatchEntryValue(udpSrcCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + if (source.getUdpDestinationPort() != null) { + MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder(); + matchEntryBuilder.setOxmClass(OpenflowBasicClass.class); + matchEntryBuilder.setOxmMatchField(UdpDst.class); + + UdpDstCaseBuilder udpDstCaseBuilder = new UdpDstCaseBuilder(); + UdpDstBuilder udpDstBuilder = new UdpDstBuilder(); + udpDstBuilder.setPort(source.getUdpDestinationPort()); + udpDstCaseBuilder.setUdpDst(udpDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(udpDstCaseBuilder.build()); + matchEntryBuilder.setHasMask(false); + result.add(matchEntryBuilder.build()); + } + + return Optional.of(result); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/data/MatchResponseConvertorData.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/data/MatchResponseConvertorData.java new file mode 100644 index 0000000000..2cf350ecbc --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/data/MatchResponseConvertorData.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.openflow.md.core.sal.convertor.match.data; + +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; +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.ProtocolMatchFieldsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder; +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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField; + +/** + * Convertor data used in {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor} + * containing Openflow version, datapath ID and various builders, because match response convertor cases depends + * on each other and requires shared builders + */ +public class MatchResponseConvertorData extends VersionDatapathIdConvertorData { + private MatchBuilder matchBuilder; + private EthernetMatchBuilder ethernetMatchBuilder; + private VlanMatchBuilder vlanMatchBuilder; + private IpMatchBuilder ipMatchBuilder; + private TcpMatchBuilder tcpMatchBuilder; + private UdpMatchBuilder udpMatchBuilder; + private SctpMatchBuilder sctpMatchBuilder; + private Icmpv4MatchBuilder icmpv4MatchBuilder; + private Icmpv6MatchBuilder icmpv6MatchBuilder; + private Ipv4MatchBuilder ipv4MatchBuilder; + private Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder; + private Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder; + private ArpMatchBuilder arpMatchBuilder; + private Ipv6MatchBuilder ipv6MatchBuilder; + private ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder; + private TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder; + private TcpFlagsMatchBuilder tcpFlagsMatchBuilder; + private Class oxmMatchField; + + /** + * Instantiates a new Match convertor data. + * + * @param version the version + */ + public MatchResponseConvertorData(short version) { + super(version); + } + + /** + * Gets match builder. + * + * @return the match builder + */ + public MatchBuilder getMatchBuilder() { + return matchBuilder; + } + + /** + * Sets match builder. + * + * @param matchBuilder the match builder + */ + public void setMatchBuilder(MatchBuilder matchBuilder) { + this.matchBuilder = matchBuilder; + } + + /** + * Gets ethernet match builder. + * + * @return the ethernet match builder + */ + public EthernetMatchBuilder getEthernetMatchBuilder() { + return ethernetMatchBuilder; + } + + /** + * Sets ethernet match builder. + * + * @param ethernetMatchBuilder the ethernet match builder + */ + public void setEthernetMatchBuilder(EthernetMatchBuilder ethernetMatchBuilder) { + this.ethernetMatchBuilder = ethernetMatchBuilder; + } + + /** + * Gets vlan match builder. + * + * @return the vlan match builder + */ + public VlanMatchBuilder getVlanMatchBuilder() { + return vlanMatchBuilder; + } + + /** + * Sets vlan match builder. + * + * @param vlanMatchBuilder the vlan match builder + */ + public void setVlanMatchBuilder(VlanMatchBuilder vlanMatchBuilder) { + this.vlanMatchBuilder = vlanMatchBuilder; + } + + /** + * Gets ip match builder. + * + * @return the ip match builder + */ + public IpMatchBuilder getIpMatchBuilder() { + return ipMatchBuilder; + } + + /** + * Sets ip match builder. + * + * @param ipMatchBuilder the ip match builder + */ + public void setIpMatchBuilder(IpMatchBuilder ipMatchBuilder) { + this.ipMatchBuilder = ipMatchBuilder; + } + + /** + * Gets tcp match builder. + * + * @return the tcp match builder + */ + public TcpMatchBuilder getTcpMatchBuilder() { + return tcpMatchBuilder; + } + + /** + * Sets tcp match builder. + * + * @param tcpMatchBuilder the tcp match builder + */ + public void setTcpMatchBuilder(TcpMatchBuilder tcpMatchBuilder) { + this.tcpMatchBuilder = tcpMatchBuilder; + } + + /** + * Gets udp match builder. + * + * @return the udp match builder + */ + public UdpMatchBuilder getUdpMatchBuilder() { + return udpMatchBuilder; + } + + /** + * Sets udp match builder. + * + * @param udpMatchBuilder the udp match builder + */ + public void setUdpMatchBuilder(UdpMatchBuilder udpMatchBuilder) { + this.udpMatchBuilder = udpMatchBuilder; + } + + /** + * Gets sctp match builder. + * + * @return the sctp match builder + */ + public SctpMatchBuilder getSctpMatchBuilder() { + return sctpMatchBuilder; + } + + /** + * Sets sctp match builder. + * + * @param sctpMatchBuilder the sctp match builder + */ + public void setSctpMatchBuilder(SctpMatchBuilder sctpMatchBuilder) { + this.sctpMatchBuilder = sctpMatchBuilder; + } + + /** + * Gets icmpv 4 match builder. + * + * @return the icmpv 4 match builder + */ + public Icmpv4MatchBuilder getIcmpv4MatchBuilder() { + return icmpv4MatchBuilder; + } + + /** + * Sets icmpv 4 match builder. + * + * @param icmpv4MatchBuilder the icmpv 4 match builder + */ + public void setIcmpv4MatchBuilder(Icmpv4MatchBuilder icmpv4MatchBuilder) { + this.icmpv4MatchBuilder = icmpv4MatchBuilder; + } + + /** + * Gets icmpv 6 match builder. + * + * @return the icmpv 6 match builder + */ + public Icmpv6MatchBuilder getIcmpv6MatchBuilder() { + return icmpv6MatchBuilder; + } + + /** + * Sets icmpv 6 match builder. + * + * @param icmpv6MatchBuilder the icmpv 6 match builder + */ + public void setIcmpv6MatchBuilder(Icmpv6MatchBuilder icmpv6MatchBuilder) { + this.icmpv6MatchBuilder = icmpv6MatchBuilder; + } + + /** + * Gets ipv 4 match builder. + * + * @return the ipv 4 match builder + */ + public Ipv4MatchBuilder getIpv4MatchBuilder() { + return ipv4MatchBuilder; + } + + /** + * Sets ipv 4 match builder. + * + * @param ipv4MatchBuilder the ipv 4 match builder + */ + public void setIpv4MatchBuilder(Ipv4MatchBuilder ipv4MatchBuilder) { + this.ipv4MatchBuilder = ipv4MatchBuilder; + } + + /** + * Gets ipv 4 match arbitrary bit mask builder. + * + * @return the ipv 4 match arbitrary bit mask builder + */ + public Ipv4MatchArbitraryBitMaskBuilder getIpv4MatchArbitraryBitMaskBuilder() { + return ipv4MatchArbitraryBitMaskBuilder; + } + + /** + * Sets ipv 4 match arbitrary bit mask builder. + * + * @param ipv4MatchArbitraryBitMaskBuilder the ipv 4 match arbitrary bit mask builder + */ + public void setIpv4MatchArbitraryBitMaskBuilder(Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder) { + this.ipv4MatchArbitraryBitMaskBuilder = ipv4MatchArbitraryBitMaskBuilder; + } + + /** + * Gets ipv 6 match arbitrary bit mask builder. + * + * @return the ipv 6 match arbitrary bit mask builder + */ + public Ipv6MatchArbitraryBitMaskBuilder getIpv6MatchArbitraryBitMaskBuilder() { + return ipv6MatchArbitraryBitMaskBuilder; + } + + /** + * Sets ipv 6 match arbitrary bit mask builder. + * + * @param ipv6MatchArbitraryBitMaskBuilder the ipv 6 match arbitrary bit mask builder + */ + public void setIpv6MatchArbitraryBitMaskBuilder(Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder) { + this.ipv6MatchArbitraryBitMaskBuilder = ipv6MatchArbitraryBitMaskBuilder; + } + + /** + * Gets arp match builder. + * + * @return the arp match builder + */ + public ArpMatchBuilder getArpMatchBuilder() { + return arpMatchBuilder; + } + + /** + * Sets arp match builder. + * + * @param arpMatchBuilder the arp match builder + */ + public void setArpMatchBuilder(ArpMatchBuilder arpMatchBuilder) { + this.arpMatchBuilder = arpMatchBuilder; + } + + /** + * Gets ipv 6 match builder. + * + * @return the ipv 6 match builder + */ + public Ipv6MatchBuilder getIpv6MatchBuilder() { + return ipv6MatchBuilder; + } + + /** + * Sets ipv 6 match builder. + * + * @param ipv6MatchBuilder the ipv 6 match builder + */ + public void setIpv6MatchBuilder(Ipv6MatchBuilder ipv6MatchBuilder) { + this.ipv6MatchBuilder = ipv6MatchBuilder; + } + + /** + * Gets protocol match fields builder. + * + * @return the protocol match fields builder + */ + public ProtocolMatchFieldsBuilder getProtocolMatchFieldsBuilder() { + return protocolMatchFieldsBuilder; + } + + /** + * Sets protocol match fields builder. + * + * @param protocolMatchFieldsBuilder the protocol match fields builder + */ + public void setProtocolMatchFieldsBuilder(ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder) { + this.protocolMatchFieldsBuilder = protocolMatchFieldsBuilder; + } + + /** + * Gets tunnel ipv 4 match builder. + * + * @return the tunnel ipv 4 match builder + */ + public TunnelIpv4MatchBuilder getTunnelIpv4MatchBuilder() { + return tunnelIpv4MatchBuilder; + } + + /** + * Sets tunnel ipv 4 match builder. + * + * @param tunnelIpv4MatchBuilder the tunnel ipv 4 match builder + */ + public void setTunnelIpv4MatchBuilder(TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder) { + this.tunnelIpv4MatchBuilder = tunnelIpv4MatchBuilder; + } + + /** + * Sets tcp flags match builder. + * + * @param tcpFlagsMatchBuilder the tcp flags match builder + */ + public void setTcpFlagsMatchBuilder(TcpFlagsMatchBuilder tcpFlagsMatchBuilder) { + this.tcpFlagsMatchBuilder = tcpFlagsMatchBuilder; + } + + /** + * Gets tcp flags match builder. + * + * @return the tcp flags match builder + */ + public TcpFlagsMatchBuilder getTcpFlagsMatchBuilder() { + return tcpFlagsMatchBuilder; + } + + /** + * Sets oxm match field. + * + * @param oxmMatchField the oxm match field + */ + public void setOxmMatchField(Class oxmMatchField) { + this.oxmMatchField = oxmMatchField; + } + + /** + * Gets oxm match field. + * + * @return the oxm match field + */ + public Class getOxmMatchField() { + return oxmMatchField; + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java index 557fc1016a..a889a67097 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.opendaylight.openflowplugin.api.OFConstants; @@ -23,8 +24,9 @@ import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.extension.api.AugmentTuple; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel; @@ -198,8 +200,11 @@ public class FlowRemovedTranslator implements IMDMessageTranslator matchBuilderOptional = ConvertorManager.getInstance().convert(ofFlow.getMatchV10(), data); + salFlowRemoved.setMatch(matchBuilderOptional.orElse(new MatchBuilder()).build()); } salFlowRemoved.setNode(new NodeRef(InventoryDataServiceUtil.identifierFromDatapathId(sc.getFeatures() .getDatapathId()))); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java index b5ff55f4f3..abb3eb7978 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java @@ -10,6 +10,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.translator; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher; import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext; @@ -17,11 +18,11 @@ import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.extension.api.AugmentTuple; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.openflowplugin.openflow.md.util.PacketInUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match; 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.entry.value.grouping.match.entry.value.InPortCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput; @@ -96,10 +97,12 @@ public class PacketInTranslator implements IMDMessageTranslator matchOptional = ConvertorManager.getInstance().convert(message.getMatch(), datapathIdConvertorData); + final MatchBuilder matchBuilder = new MatchBuilder(matchOptional.orElse(new MatchBuilder()).build()); AugmentTuple matchExtensionWrap = MatchExtensionHelper.processAllExtensions( @@ -110,6 +113,7 @@ public class PacketInTranslator implements IMDMessageTranslator portOutOptional = ConvertorManager.getInstance().convert(portBld.build(), data); + PortModInput portOut = portOutOptional.orElse(PortConvertor.defaultResult(OFConstants.OFP_VERSION_1_3)); PortConfigV10 portConfV10 = new PortConfigV10(false, false, false, false, true, true, false); diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java index 09da99443d..edaac8a445 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java @@ -13,10 +13,17 @@ import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.*; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; @@ -43,6 +50,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.layer._3.match.Ipv4MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; @@ -132,8 +140,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase; -import java.math.BigInteger; -import java.util.List; /** * @author michal.polkorab @@ -151,7 +157,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testEmptyAndNullInput() { @@ -166,7 +172,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testConversion() { @@ -338,7 +344,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv4MatchArbitraryBitMaskwithNoMask(){ @@ -361,7 +367,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv4MatchArbitraryBitMaskwithMask(){ @@ -386,7 +392,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testUdpMatchConversion() { @@ -410,7 +416,31 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} + */ + @Test + public void testTunnelIpv4MatchConversion() { + MatchBuilder builder = new MatchBuilder(); + TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder(); + tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32")); + tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32")); + builder.setLayer3Match(tunnelIpv4MatchBuilder.build()); + Match match = builder.build(); + + List entries = convertor.convert(match); + Assert.assertEquals("Wrong entries size", 2, entries.size()); + MatchEntry entry = entries.get(0); + checkEntryHeader(entry, Ipv4Src.class, false); + Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src() + .getIpv4Address().getValue()); + entry = entries.get(1); + checkEntryHeader(entry, Ipv4Dst.class, false); + Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst() + .getIpv4Address().getValue()); + } + + /** + * Test {@link Convertor#convert(Object)} */ @Test public void testSctpMatchConversion() { @@ -434,7 +464,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testArpMatchConversion() { @@ -477,7 +507,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testArpMatchConversionWithMasks() { @@ -527,7 +557,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv6MatchConversion() { @@ -583,7 +613,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv6MatchConversionWithMasks() { @@ -612,7 +642,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv6ExtHeaderConversion() { @@ -636,7 +666,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match)} + * Test {@link Convertor#convert(Object)} */ @Test public void testConversionWithMasks() { @@ -732,7 +762,7 @@ public class MatchConvertorImpl2Test { } /** - * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match, java.math.BigInteger)} + * Test {@link Convertor#convert(Object)} */ @Test public void testIpv6MatchArbitraryBitMask(){ diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor2Test.java similarity index 86% rename from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java rename to openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor2Test.java index d5adffe739..361a69ad46 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor2Test.java @@ -11,10 +11,13 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; @@ -156,7 +159,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc /** * @author michal.polkorab */ -public class MatchConvertorImplV13Test { +public class MatchResponseConvertor2Test { /** * Initializes OpenflowPortsUtil @@ -167,21 +170,17 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test(expected = NullPointerException.class) public void testEmptyMatch() { - final MatchBuilder builder = new MatchBuilder(); - - MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF10); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + convert(new MatchBuilder().build(), datapathIdConvertorData); } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testEmptyMatchEntry() { @@ -192,8 +191,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); Assert.assertEquals("Wrong match entries", null, builtMatch.getEthernetMatch()); @@ -212,9 +215,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryNoMasks() { @@ -499,8 +500,11 @@ public class MatchConvertorImplV13Test { final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); Assert.assertEquals("Wrong in port", "openflow:42:1", builtMatch.getInPort().getValue()); @@ -537,9 +541,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithMasks() { @@ -648,8 +650,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); Assert.assertEquals("Wrong metadata", new BigInteger(1, new byte[]{0, 1, 2, 3, 4, 5, 6, 7}), builtMatch.getMetadata().getMetadata()); @@ -670,9 +675,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithArbitraryMasks() { @@ -711,8 +714,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); @@ -723,9 +729,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithSrcCidrMaskAndDstArbitraryBitMask() { @@ -764,8 +768,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); @@ -776,9 +783,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithSrcArbitraryBitMaskAndDstCidrMask() { @@ -817,8 +822,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); @@ -830,9 +838,7 @@ public class MatchConvertorImplV13Test { /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithDstArbitraryBitMaskAndSrcCidrMask() { @@ -871,8 +877,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); @@ -883,9 +892,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithDstCidrMaskAndSrcArbitraryBitMask() { @@ -924,8 +931,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatch = convert(match, datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); @@ -936,9 +946,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer4MatchUdp() { @@ -972,8 +980,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder builtMatch = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder builtMatch = convert(builder.build(), datapathIdConvertorData); final UdpMatch udpMatch = (UdpMatch) builtMatch.getLayer4Match(); Assert.assertEquals("Wrong udp src port", 11, udpMatch.getUdpSourcePort().getValue().intValue()); @@ -981,9 +992,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer4MatchSctp() { @@ -1016,8 +1025,11 @@ public class MatchConvertorImplV13Test { entries.add(entriesBuilder.build()); builder.setMatchEntry(entries); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatchBuilder = convert(builder.build(), datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final SctpMatch udpMatch = (SctpMatch) builtMatch.getLayer4Match(); @@ -1026,9 +1038,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer3MatchIpv6() { @@ -1113,8 +1123,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); entries.add(entriesBuilder.build()); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatchBuilder = convert(builder.build(), datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6Match ipv6Match = (Ipv6Match) builtMatch.getLayer3Match(); @@ -1131,9 +1144,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer3MatchIpv6ExtHeader2() { @@ -1153,8 +1164,11 @@ public class MatchConvertorImplV13Test { entries.add(entriesBuilder.build()); builder.setMatchEntry(entries); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatchBuilder = convert(builder.build(), datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6Match ipv6Match = (Ipv6Match) builtMatch.getLayer3Match(); @@ -1163,9 +1177,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer3MatchArp() { @@ -1228,8 +1240,11 @@ public class MatchConvertorImplV13Test { entries.add(entriesBuilder.build()); builder.setMatchEntry(entries); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatchBuilder = convert(builder.build(), datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final ArpMatch arpMatch = (ArpMatch) builtMatch.getLayer3Match(); @@ -1241,9 +1256,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testLayer3MatchArpWithMasks() { @@ -1300,8 +1313,11 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13); + .MatchBuilder salMatchBuilder = convert(builder.build(), datapathIdConvertorData); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final ArpMatch arpMatch = (ArpMatch) builtMatch.getLayer3Match(); @@ -1314,9 +1330,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithIpv6ArbitraryMasks() { @@ -1355,9 +1369,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); - final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + .MatchBuilder salMatchBuilder = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match(); Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001", @@ -1367,9 +1384,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithIpv6SrcCidrlMaskAndDstArbitraryBitMask() { @@ -1408,9 +1423,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); - final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + .MatchBuilder salMatchBuilder = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match(); Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001", @@ -1420,9 +1438,7 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWithMatchEntryWithIpv6SrcArbitraryBitMaskAndDstCidrMask() { @@ -1461,9 +1477,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); - final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + .MatchBuilder salMatchBuilder = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match(); Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001", @@ -1474,11 +1493,8 @@ public class MatchConvertorImplV13Test { /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ - @Test public void testWithMatchEntryWithIpv6DstArbitraryBitMaskAndSrcCidrMask() { final MatchBuilder builder = new MatchBuilder(); @@ -1516,9 +1532,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); - final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + .MatchBuilder salMatchBuilder = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match(); Assert.assertEquals("Wrong ipv6 src address", "2002:2002:2002:2002:2002:2002:2002:2002", @@ -1529,11 +1548,8 @@ public class MatchConvertorImplV13Test { /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( - * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, - * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ - @Test public void testWithMatchEntryWithIpv6DstCidrMaskAndSrcArbitraryBitMask() { final MatchBuilder builder = new MatchBuilder(); @@ -1571,9 +1587,12 @@ public class MatchConvertorImplV13Test { builder.setMatchEntry(entries); final Match match = builder.build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow - .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); - final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + .MatchBuilder salMatchBuilder = convert(match, datapathIdConvertorData); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build(); final Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match(); Assert.assertEquals("Wrong ipv6 src address", "2002:2002:2002:2002:2002:2002:2002:2002", @@ -1582,5 +1601,12 @@ public class MatchConvertorImplV13Test { ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().getValue()); } + private org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .MatchBuilder convert(Match match, VersionDatapathIdConvertorData data) { + final Optional salMatchOptional = ConvertorManager.getInstance().convert(match, data); + return salMatchOptional + .orElse(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder()); + } } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertorTest.java similarity index 84% rename from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplTest.java rename to openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertorTest.java index 956f1e74aa..b806e1263c 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertorTest.java @@ -9,13 +9,18 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.junit.BeforeClass; import org.junit.Test; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; @@ -55,9 +60,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc /** * Unit test for {@link MatchConvertorImpl}. */ -public class MatchConvertorImplTest { +public class MatchResponseConvertorTest { private static final BigInteger DPID = BigInteger.TEN; - private static final Long IN_PORT = Long.valueOf(6); + private static final Long IN_PORT = 6L; private static final String URI_IN_PORT = "openflow:" + DPID + ":" + IN_PORT; private static final MacAddress MAC_SRC = @@ -79,9 +84,8 @@ public class MatchConvertorImplTest { } /** - * Test method for {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}. + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchEntriesGrouping, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }. */ - @Test public void testFromOFMatchToSALMatch() { List entries = createDefaultMatchEntry(); @@ -104,12 +108,13 @@ public class MatchConvertorImplTest { org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match ofMatch = createOFMatch(MatchEntry); - MatchBuilder builder = MatchConvertorImpl. - fromOFMatchToSALMatch(ofMatch, DPID, OpenflowVersion.OF13); + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3); + data.setDatapathId(DPID); + final MatchBuilder builder = convert(ofMatch, data); checkDefault(builder); VlanMatch vlanMatch = builder.getVlanMatch(); int expectedVid = (vid < 0) ? 0 : vid; - Boolean expectedCfi = Boolean.valueOf(vid != 0); + Boolean expectedCfi = vid != 0; assertEquals(expectedVid, vlanMatch.getVlanId().getVlanId(). getValue().intValue()); assertEquals(expectedCfi, vlanMatch.getVlanId().isVlanIdPresent()); @@ -118,9 +123,8 @@ public class MatchConvertorImplTest { } /** - * Test method for {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}. + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }. */ - @Test public void testFromOFMatchV10ToSALMatch() { int[] vids = { @@ -151,8 +155,9 @@ public class MatchConvertorImplTest { FlowWildcardsV10 wc = wcBuilder.build(); MatchV10 ofMatch = builder.setWildcards(wc).build(); - Match match = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - ofMatch, DPID, OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + data.setDatapathId(DPID); + Match match = convert(ofMatch, data).build(); checkDefaultV10(match, wc, vid); IpMatch ipMatch = match.getIpMatch(); @@ -163,8 +168,7 @@ public class MatchConvertorImplTest { // Set all wildcard bits. wc = wcBuilder.setAll(true).build(); ofMatch = builder.setWildcards(wc).build(); - match = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - ofMatch, DPID, OpenflowVersion.OF10).build(); + match = convert(ofMatch, data).build(); checkDefaultV10(match, wc, vid); assertEquals(null, match.getIpMatch()); } @@ -249,7 +253,7 @@ public class MatchConvertorImplTest { private static MatchEntry toOfVlanVid(final int vid) { MatchEntryBuilder builder = new MatchEntryBuilder(); boolean cfi = true; - Integer vidValue = Integer.valueOf(vid); + Integer vidValue = vid; byte[] mask = null; builder.setOxmClass(OpenflowBasicClass.class); builder.setOxmMatchField(VlanVid.class); @@ -260,7 +264,7 @@ public class MatchConvertorImplTest { } else if (vid < 0) { // Match packet with VLAN tag regardless of its value. mask = new byte[]{0x10, 0x00}; - vidValue = Integer.valueOf(0); + vidValue = 0; } VlanVidBuilder vlanVidBuilder = new VlanVidBuilder(); @@ -278,7 +282,7 @@ public class MatchConvertorImplTest { private static void checkDefaultV10(final Match match, final FlowWildcardsV10 wc, final int vid) { EthernetMatch ethMatch = match.getEthernetMatch(); - if (wc.isDLSRC().booleanValue()) { + if (wc.isDLSRC()) { if (ethMatch != null) { assertEquals(null, ethMatch.getEthernetSource()); } @@ -286,21 +290,23 @@ public class MatchConvertorImplTest { assertEquals(MAC_SRC, ethMatch.getEthernetSource().getAddress()); } - if (wc.isDLDST().booleanValue()) { - if (ethMatch != null) { + if (ethMatch != null) { + if (wc.isDLDST()) { assertEquals(null, ethMatch.getEthernetDestination()); + } else { + assertNotEquals(null, ethMatch.getEthernetDestination()); + assertEquals(MAC_DST, + ethMatch.getEthernetDestination().getAddress()); } - } else { - assertEquals(MAC_DST, - ethMatch.getEthernetDestination().getAddress()); } - if (wc.isDLTYPE().booleanValue()) { + if (wc.isDLTYPE()) { if (ethMatch != null) { assertEquals(null, ethMatch.getEthernetType()); } assertEquals(null, match.getLayer3Match()); } else { + assert ethMatch != null; assertEquals(ETHTYPE_IPV4, ethMatch.getEthernetType().getType(). getValue().intValue()); @@ -312,7 +318,7 @@ public class MatchConvertorImplTest { } VlanMatch vlanMatch = match.getVlanMatch(); - if (wc.isDLVLAN().booleanValue()) { + if (wc.isDLVLAN()) { assertEquals(null, vlanMatch); } else { int expectedVid; @@ -328,7 +334,7 @@ public class MatchConvertorImplTest { getValue().intValue()); assertEquals(expectedCfi, vlanMatch.getVlanId().isVlanIdPresent()); - if (wc.isDLVLANPCP().booleanValue()) { + if (wc.isDLVLANPCP()) { assertEquals(null, vlanMatch.getVlanPcp()); } else { assertEquals(VLAN_PCP, @@ -336,4 +342,16 @@ public class MatchConvertorImplTest { } } } + + private MatchBuilder convert(MatchV10 match, VersionDatapathIdConvertorData data) { + final Optional salMatchOptional = ConvertorManager.getInstance().convert(match, data); + + return salMatchOptional.orElse(new MatchBuilder()); + } + + private MatchBuilder convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match match, VersionDatapathIdConvertorData data) { + final Optional salMatchOptional = ConvertorManager.getInstance().convert(match, data); + + return salMatchOptional.orElse(new MatchBuilder()); + } } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertorTest.java similarity index 84% rename from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java rename to openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertorTest.java index 1f9116c885..a8198d334c 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertorTest.java @@ -9,14 +9,18 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match; import java.math.BigInteger; +import java.util.Optional; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch; @@ -31,7 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc * @author michal.polkorab * */ -public class MatchConvertorImplV10Test { +public class MatchV10ResponseConvertorTest { /** * Initializes OpenflowPortsUtil @@ -42,7 +46,7 @@ public class MatchConvertorImplV10Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void test() { @@ -65,7 +69,10 @@ public class MatchConvertorImplV10Test { builder.setTpDst(4096); MatchV10 match = builder.build(); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + + final Match salMatch = convert(match, datapathIdConvertorData).build(); Assert.assertEquals("Wrong in port", "openflow:42:6653", salMatch.getInPort().getValue()); Assert.assertEquals("Wrong dl src", new MacAddress("01:01:01:01:01:01"), salMatch.getEthernetMatch() @@ -89,7 +96,7 @@ public class MatchConvertorImplV10Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWildcardedMatch() { @@ -112,7 +119,10 @@ public class MatchConvertorImplV10Test { builder.setTpDst(4096); MatchV10 match = builder.build(); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + + final Match salMatch = convert(match, datapathIdConvertorData).build(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch()); @@ -124,7 +134,7 @@ public class MatchConvertorImplV10Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testWildcardedMatchWithNoValuesSet() { @@ -133,7 +143,10 @@ public class MatchConvertorImplV10Test { true, true, true, true, true, true)); MatchV10 match = builder.build(); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + + final Match salMatch = convert(match, datapathIdConvertorData).build(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch()); @@ -145,7 +158,7 @@ public class MatchConvertorImplV10Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testMatchWithValuesUnset() { @@ -157,7 +170,10 @@ public class MatchConvertorImplV10Test { builder.setTpDst(4096); MatchV10 match = builder.build(); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + + final Match salMatch = convert(match, datapathIdConvertorData).build(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch()); @@ -170,19 +186,21 @@ public class MatchConvertorImplV10Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)} + * Test {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test(expected=NullPointerException.class) public void testEmptyMatch() { MatchV10Builder builder = new MatchV10Builder(); MatchV10 match = builder.build(); - MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(new BigInteger("42")); + + final Match salMatch = convert(match, datapathIdConvertorData).build(); } /** - * ICMPv4 match test for - * {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}. + * ICMPv4 match test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testIcmpv4Match() { @@ -196,8 +214,11 @@ public class MatchConvertorImplV10Test { MatchV10 match = builder.build(); BigInteger dpid = BigInteger.valueOf(12345L); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(dpid); + + Match salMatch = convert(match, datapathIdConvertorData).build(); + EthernetMatch etherMatch = salMatch.getEthernetMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl src", @@ -217,8 +238,8 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, true, true); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl src", @@ -237,8 +258,7 @@ public class MatchConvertorImplV10Test { // Specify ICMPv4 protocol. Short ipProto = 1; match = builder.setNwProto(ipProto).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); IpMatch ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -263,8 +283,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, true, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -288,8 +307,7 @@ public class MatchConvertorImplV10Test { // Specify ICMPv4 type. Short icmpType = 10; match = builder.setTpSrc(icmpType.intValue()).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); Icmpv4Match icmpv4Match = salMatch.getIcmpv4Match(); @@ -317,8 +335,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, false, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); icmpv4Match = salMatch.getIcmpv4Match(); @@ -345,8 +362,7 @@ public class MatchConvertorImplV10Test { // Specify ICMPv4 code only. Short icmpCode = 33; match = builder.setTpSrc(null).setTpDst(icmpCode.intValue()).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); icmpv4Match = salMatch.getIcmpv4Match(); @@ -375,8 +391,7 @@ public class MatchConvertorImplV10Test { icmpCode = 8; match = builder.setTpSrc(icmpType.intValue()). setTpDst(icmpCode.intValue()).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); icmpv4Match = salMatch.getIcmpv4Match(); @@ -402,8 +417,7 @@ public class MatchConvertorImplV10Test { } /** - * TCP match test for - * {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}. + * TCP match test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testTcpMatch() { @@ -418,8 +432,10 @@ public class MatchConvertorImplV10Test { MatchV10 match = builder.build(); BigInteger dpid = BigInteger.valueOf(12345L); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(dpid); + + Match salMatch = convert(match, datapathIdConvertorData).build(); EthernetMatch etherMatch = salMatch.getEthernetMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl src", @@ -438,8 +454,7 @@ public class MatchConvertorImplV10Test { // Specify TCP protocol. Short ipProto = 6; match = builder.setNwProto(ipProto).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); IpMatch ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -464,8 +479,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, true, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -489,8 +503,7 @@ public class MatchConvertorImplV10Test { // Specify TCP source port. Integer srcPort = 60000; match = builder.setTpSrc(srcPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); TcpMatch tcpMatch = (TcpMatch)salMatch.getLayer4Match(); @@ -519,8 +532,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, false, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); tcpMatch = (TcpMatch)salMatch.getLayer4Match(); @@ -548,8 +560,7 @@ public class MatchConvertorImplV10Test { // Specify TCP destination port only. Integer dstPort = 6653; match = builder.setTpSrc(null).setTpDst(dstPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); tcpMatch = (TcpMatch)salMatch.getLayer4Match(); @@ -578,8 +589,7 @@ public class MatchConvertorImplV10Test { srcPort = 32767; dstPort = 9999; match = builder.setTpSrc(srcPort).setTpDst(dstPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); tcpMatch = (TcpMatch)salMatch.getLayer4Match(); @@ -606,8 +616,7 @@ public class MatchConvertorImplV10Test { } /** - * UDP match test for - * {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}. + * UDP match test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} */ @Test public void testUdpMatch() { @@ -622,8 +631,10 @@ public class MatchConvertorImplV10Test { MatchV10 match = builder.build(); BigInteger dpid = BigInteger.valueOf(12345L); - Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + final VersionDatapathIdConvertorData datapathIdConvertorData = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0); + datapathIdConvertorData.setDatapathId(dpid); + + Match salMatch = convert(match, datapathIdConvertorData).build(); EthernetMatch etherMatch = salMatch.getEthernetMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); Assert.assertEquals("Wrong dl src", @@ -642,8 +653,7 @@ public class MatchConvertorImplV10Test { // Specify UDP protocol. Short ipProto = 17; match = builder.setNwProto(ipProto).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); IpMatch ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -668,8 +678,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, true, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); Assert.assertEquals("Wrong in port", null, salMatch.getInPort()); @@ -693,8 +702,7 @@ public class MatchConvertorImplV10Test { // Specify UDP source port. Integer srcPort = 60000; match = builder.setTpSrc(srcPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); UdpMatch udpMatch = (UdpMatch)salMatch.getLayer4Match(); @@ -723,8 +731,7 @@ public class MatchConvertorImplV10Test { wc = new FlowWildcardsV10( true, true, false, true, true, true, false, true, false, false); match = builder.setWildcards(wc).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); udpMatch = (UdpMatch)salMatch.getLayer4Match(); @@ -752,8 +759,7 @@ public class MatchConvertorImplV10Test { // Specify UDP destination port only. Integer dstPort = 6653; match = builder.setTpSrc(null).setTpDst(dstPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); udpMatch = (UdpMatch)salMatch.getLayer4Match(); @@ -782,8 +788,7 @@ public class MatchConvertorImplV10Test { srcPort = 32767; dstPort = 9999; match = builder.setTpSrc(srcPort).setTpDst(dstPort).build(); - salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch( - match, dpid, OpenflowVersion.OF10).build(); + salMatch = convert(match, datapathIdConvertorData).build(); etherMatch = salMatch.getEthernetMatch(); ipMatch = salMatch.getIpMatch(); udpMatch = (UdpMatch)salMatch.getLayer4Match(); @@ -808,4 +813,10 @@ public class MatchConvertorImplV10Test { Assert.assertEquals("Wrong ICMPv4 match", null, salMatch.getIcmpv4Match()); } + + private MatchBuilder convert(MatchV10 match, VersionDatapathIdConvertorData data) { + final Optional salMatchOptional = ConvertorManager.getInstance().convert(match, data); + + return salMatchOptional.orElse(new MatchBuilder()); + } } -- 2.36.6