X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Futil%2FMatchUtil.java;h=ce4f5b7d93c52cd07503b080a203ff3d753b58c0;hb=05f8db12159673d0e0a95642fe86e62c14b7dc7b;hp=f855c2ed858394fab326a93cc02a507322ae7d07;hpb=bf683e2b61f3afe8042f5e3931032ea60035180e;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MatchUtil.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MatchUtil.java index f855c2ed85..ce4f5b7d93 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MatchUtil.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MatchUtil.java @@ -5,29 +5,121 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.openflowplugin.impl.util; -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.yang.types.rev100924.MacAddress; +import com.google.common.collect.ImmutableMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.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.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowWriteActionsSetField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowWriteActionsSetFieldBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchPacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchPacketInMessageBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; -/** - * Created by Martin Bobak <mbobak@cisco.com> on 21.4.2015. - */ public final class MatchUtil { private static final MacAddress ZERO_MAC_ADDRESS = new MacAddress("00:00:00:00:00:00"); private static final Ipv4Address ZERO_IPV4_ADDRESS = new Ipv4Address("0.0.0.0"); - private MatchUtil(){ + + private static final Map, Function> TRANSFORMERS = ImmutableMap + ., Function>builder() + .put(SetField.class, match -> { + final SetFieldBuilder matchBuilder = new SetFieldBuilder(match); + + resolveExtensions(match).ifPresent(extensionLists -> matchBuilder + .addAugmentation(GeneralAugMatchNodesNodeTableFlowWriteActionsSetField.class, + new GeneralAugMatchNodesNodeTableFlowWriteActionsSetFieldBuilder() + .setExtensionList(extensionLists) + .build())); + + return matchBuilder.build(); + }) + .put(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .Match.class, (match) -> { + final MatchBuilder matchBuilder = new MatchBuilder(match); + + resolveExtensions(match).ifPresent(extensionLists -> matchBuilder + .addAugmentation(GeneralAugMatchNotifUpdateFlowStats.class, + new GeneralAugMatchNodesNodeTableFlowBuilder() + .setExtensionList(extensionLists) + .build())); + + return matchBuilder.build(); + }) + .put(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed + .Match.class, (match) -> { + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed + .MatchBuilder matchBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types + .rev131026.flow.mod.removed.MatchBuilder(match); + + resolveExtensions(match).ifPresent(extensionLists -> matchBuilder + .addAugmentation(GeneralAugMatchNotifSwitchFlowRemoved.class, + new GeneralAugMatchNotifSwitchFlowRemovedBuilder() + .setExtensionList(extensionLists) + .build())); + + return matchBuilder.build(); + }) + .put(org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received + .Match.class, (match) -> { + final org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received + .MatchBuilder matchBuilder = + new org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service + .rev130709.packet.received.MatchBuilder(match); + + resolveExtensions(match).ifPresent(extensionLists -> matchBuilder + .addAugmentation(GeneralAugMatchNotifPacketIn.class, + new GeneralAugMatchNotifPacketInBuilder() + .setExtensionList(extensionLists) + .build())); + + return matchBuilder.build(); + }) + .put(org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message + .Match.class, (match) -> { + final org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message + .MatchBuilder matchBuilder = + new org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service + .rev130709.packet.in.message.MatchBuilder(match); + + resolveExtensions(match).ifPresent(extensionLists -> matchBuilder + .addAugmentation(GeneralAugMatchPacketInMessage.class, + new GeneralAugMatchPacketInMessageBuilder() + .setExtensionList(extensionLists) + .build())); + + return matchBuilder.build(); + }) + .build(); + + private MatchUtil() { throw new IllegalStateException("This class should not be instantiated."); } public static MatchV10Builder createEmptyV10Match() { - Short zeroShort = Short.valueOf("0"); - Integer zeroInteger = Integer.valueOf(0); + Short zeroShort = 0; + Integer zeroInteger = 0; MatchV10Builder matchV10Builder = new MatchV10Builder(); matchV10Builder.setDlDst(ZERO_MAC_ADDRESS); matchV10Builder.setDlSrc(ZERO_MAC_ADDRESS); @@ -43,11 +135,33 @@ public final class MatchUtil { matchV10Builder.setNwTos(zeroShort); matchV10Builder.setTpDst(zeroInteger); matchV10Builder.setTpSrc(zeroInteger); - FlowWildcardsV10 flowWildcardsV10 = new FlowWildcardsV10(false, false, false, false, false, false, false, false, false, false); + FlowWildcardsV10 flowWildcardsV10 = + new FlowWildcardsV10(true, true, true, true, true, true, true, true, true, true); matchV10Builder.setWildcards(flowWildcardsV10); return matchV10Builder; } + @Nullable + public static T transformMatch(@Nullable final Match match, + @NonNull final Class implementedInterface) { + if (match == null) { + return null; + } + + if (implementedInterface.equals(match.implementedInterface())) { + return implementedInterface.cast(match); + } + final Function matchMatchFunction = TRANSFORMERS.get(implementedInterface); + return matchMatchFunction == null ? null : implementedInterface.cast(matchMatchFunction.apply(match)); + } + private static Optional> resolveExtensions(final Match match) { + return ExtensionResolvers + .getMatchExtensionResolver() + .getExtension(match) + .flatMap(matchExtension -> + Optional.ofNullable(matchExtension.nonnullExtensionList().values() + .stream().collect(Collectors.toList()))); + } }