X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fcore%2Fsal%2Fconvertor%2Fmatch%2FMatchConvertorImpl.java;h=56c7d5056248f797a4c98bbdf4c118837d939983;hb=2ab0cfc068b6b21786c792e77e1b7b36ebd22426;hp=59f1e3b0d16b3f4d091d72ea97cab492246f66d9;hpb=d71b537fbe53421d8990e5fa13e61297bd18b8c2;p=openflowplugin.git 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 59f1e3b0d1..56c7d50562 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,218 +8,97 @@ 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 java.util.Optional; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; 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.IpConversionUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds; +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.rev100924.Dscp; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.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.TunnelBuilder; +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.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.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.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.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.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.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.types.rev130731.EtherType; -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.ExperimenterId; 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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code; 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; @@ -229,1301 +108,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, ConvertorExecutor convertorExecutor) { + java.util.Optional> result = LAYER3_PROCESSOR.process(layer3Match, convertorExecutor); - @Override - public List convert( - final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match, final BigInteger datapathid) { - 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, ConvertorExecutor convertorExecutor) { + java.util.Optional> result = LAYER4_PROCESSOR.process(layer4Match, convertorExecutor); - 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()); - - 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 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())); - } - - if (protocolMatchFields.getPbb() != null) { - matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb())); - } + 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; } - } + 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)); - private static void layer3Match(final List matchEntryList, final Layer3Match layer3Match) { - if (layer3Match != null) { - 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()); - } + if (hasmask) { + metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES)); + } - 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; } - } + if (icmpv6Match.getIcmpv6Type() != null) { + matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type())); + } - private static void icmpv4Match(final List matchEntryList, final Icmpv4Match icmpv4Match) { - if (icmpv4Match != null) { - if (icmpv4Match.getIcmpv4Type() != null) { - matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type())); - } - - 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) { - String ipv4PrefixStr = swMatch.getNwSrc().getValue(); - if (swMatch.getNwSrcMask() != null) { - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + 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. - - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + "32"; - } - if (!NO_IP.equals(ipv4PrefixStr)) { - ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(ipv4PrefixStr)); - matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); - } - } - if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getNwDst() != null) { - String ipv4PrefixStr = swMatch.getNwDst().getValue(); - if (swMatch.getNwDstMask() != null) { - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + 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. - - ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + "32"; - } - if (!NO_IP.equals(ipv4PrefixStr)) { - ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(ipv4PrefixStr)); - 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.rev100924.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.rev100924.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.rev100924.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.rev100924.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(); - ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder(); - Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder(); - ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder(); - TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder(); - - 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.rev100924.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.rev100924.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.rev100924.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(); - String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr); - 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(); - 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 ipv6Src = ((Ipv6SrcCase) ofMatch.getMatchEntryValue()).getIpv6Src(); - - if (ipv6Src != null) { - String ipv6PrefixStr = ipv6Src.getIpv6Address().getValue(); - byte[] mask = ipv6Src.getMask(); - setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, ipv6PrefixStr, mask); - 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 ipv6Dst = ((Ipv6DstCase) ofMatch.getMatchEntryValue()).getIpv6Dst(); - - if (ipv6Dst != null) { - String ipv6PrefixStr = ipv6Dst.getIpv6Address().getValue(); - byte[] mask = ipv6Dst.getMask(); - setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, ipv6PrefixStr, mask); - 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()); - } + 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 String ipv6PrefixStr, final byte[] mask) { - Ipv6Prefix ipv6Prefix; - if (mask != null) { - ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask); - } else { - ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr)); + ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build()); + matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build()); + matchEntryBuilder.setHasMask(hasMask); + matchEntryList.add(matchEntryBuilder.build()); } - if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) { - ipv6MatchBuilder.setIpv6Source(ipv6Prefix); - } - if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) { - ipv6MatchBuilder.setIpv6Destination(ipv6Prefix); + if (ethernetMatch.getEthernetType() != null) { + matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType())); } } - private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv4PrefixStr) { - 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); + 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 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); @@ -1550,13 +468,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(); } @@ -1566,7 +479,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); @@ -1575,102 +487,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); @@ -1737,35 +553,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); @@ -1792,54 +579,47 @@ 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, ConvertorExecutor convertorExecutor) { + 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(), convertorExecutor); + icmpv4Match(result, match.getIcmpv4Match()); + icmpv6Match(result, match.getIcmpv6Match()); + layer3Match(result, match.getLayer3Match(), convertorExecutor); + 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 + */ + Optional extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match); + if (extensionListOpt.isPresent()) { + List extensionListList = extensionListOpt.get().getExtensionList(); + for (ExtensionList extensionItem : extensionListList) { + // TODO: get real version + ConverterExtensionKey key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3); + ConvertorToOFJava convertor = OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + if (convertor == null) { + throw new IllegalStateException("No converter found for key: " + key.toString()); + } + 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; } - - }