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%2FPacketOutConvertor.java;h=3db52261d80b3ad97fc3f147d4376afe17ef5ec6;hb=d7510952ad1add03ee34bc96bf1a68daa2d5a59a;hp=2761f71f69014a0480f25b9414ea34f6a6ddd378;hpb=6971f7a3e149e423435125ca14a094a68e523696;p=openflowplugin.git diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java index 2761f71f69..3db52261d8 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java @@ -1,26 +1,31 @@ -/** +/* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ + package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; -import java.math.BigInteger; +import com.google.common.collect.Iterables; import java.util.ArrayList; +import java.util.Collections; import java.util.List; - +import java.util.Optional; import org.opendaylight.controller.sal.common.util.Arguments; -import org.opendaylight.openflowplugin.openflow.md.OFConstants; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder; @@ -30,91 +35,118 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PacketOutConvertor { - private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class); - private static final String PREFIX_SEPARATOR = "/"; +/** + * Converts a MD-SAL packet out data into the OF library packet out input. + * + * Example usage: + *
+ * {@code
+ * PacketOutConvertorData data = new PacketOutConvertorData(version);
+ * data.setDatapathId(datapathId);
+ * data.setXid(xid);
+ * Optional ofPacketInput = ConvertorManager.getInstance().convert(salPacket, data);
+ * }
+ * 
+ */ +public class PacketOutConvertor implements ParametrizedConvertor { + private static final Logger LOG = LoggerFactory.getLogger(PacketOutConvertor.class); - private PacketOutConvertor() { + /** + * Create default empty meter mot input builder. + * Use this method, if result from convertor is empty. + * + * @param version Openflow version + * @return default empty meter mod input builder + */ + public static PacketOutInput defaultResult(short version) { + return new PacketOutInputBuilder() + .setVersion(version) + .build(); + } + private static PortNumber getPortNumber(final PathArgument pathArgument, final Short ofVersion) { + // FIXME VD P! find InstanceIdentifier helper + InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(pathArgument, + InstanceIdentifier.IdentifiableItem.class); + NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class); + Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId( + OpenflowVersion.get(ofVersion), key.getId()); + return new PortNumber(port); } - // Get all the data for the PacketOut from the Yang/SAL-Layer - /** - * @param version - * @param Yang - * Data source - * @return PacketOutInput required by OF Library - */ - public static PacketOutInput toPacketOutInput(TransmitPacketInput inputPacket, short version, Long xid, - BigInteger datapathid) { + @Override + public Class getType() { + return TransmitPacketInput.class; + } + @Override + public PacketOutInput convert(TransmitPacketInput source, PacketOutConvertorData data) { + LOG.trace("toPacketOutInput for datapathId:{}, xid:{}", data.getDatapathId(), data.getXid()); // Build Port ID from TransmitPacketInput.Ingress - PortNumber inPortNr = null; + PortNumber inPortNr; Long bufferId = OFConstants.OFP_NO_BUFFER; - List actions = new ArrayList<>(); - List inArgs = null; + Iterable inArgs = null; PacketOutInputBuilder builder = new PacketOutInputBuilder(); - if (inputPacket.getIngress() != null) { - inArgs = inputPacket.getIngress().getValue().getPath(); + + if (source.getIngress() != null) { + inArgs = source.getIngress().getValue().getPathArguments(); } - if (inArgs != null && inArgs.size() >= 3) { - inPortNr = getPortNumber(inArgs.get(2)); + + if (inArgs != null && Iterables.size(inArgs) >= 3) { + inPortNr = getPortNumber(Iterables.get(inArgs, 2), data.getVersion()); } else { // The packetOut originated from the controller inPortNr = new PortNumber(0xfffffffdL); } // Build Buffer ID to be NO_OFP_NO_BUFFER - if (inputPacket.getBufferId() != null) { - bufferId = inputPacket.getBufferId(); + if (source.getBufferId() != null) { + bufferId = source.getBufferId(); } PortNumber outPort = null; - NodeConnectorRef outRef = inputPacket.getEgress(); - List outArgs = outRef.getValue().getPath(); - if (outArgs.size() >= 3) { - outPort = getPortNumber(outArgs.get(2)); + NodeConnectorRef outRef = source.getEgress(); + Iterable outArgs = outRef.getValue().getPathArguments(); + + if (Iterables.size(outArgs) >= 3) { + outPort = getPortNumber(Iterables.get(outArgs, 2), data.getVersion()); } else { - new Exception("PORT NR not exist in Egress"); // TODO : P4 search - // for some normal - // exception + // TODO : P4 search for some normal exception + // new Exception("PORT NR not exist in Egress"); + LOG.error("PORT NR not exist in Egress"); } - // TODO VD P! wait for way to move Actions (e.g. augmentation) + List actions = new ArrayList<>(); + List inputActions = source.getAction(); + + if (inputActions != null) { + final ActionConvertorData actionConvertorData = new ActionConvertorData(data.getVersion()); + actionConvertorData.setDatapathId(data.getDatapathId()); + + final Optional> convertedActions = ConvertorManager.getInstance().convert( + inputActions, actionConvertorData); + + actions = convertedActions.orElse(Collections.emptyList()); - // FIXME VD implementation for testing PacketIn (REMOVE IT) - if (inputPacket.getAction() == null) { + } else { + // TODO VD P! wait for way to move Actions (e.g. augmentation) ActionBuilder aBuild = new ActionBuilder(); - aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class); - PortActionBuilder paBuild = new PortActionBuilder(); - paBuild.setPort(outPort); - aBuild.addAugmentation(PortAction.class, paBuild.build()); - MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder(); - mlBuild.setMaxLength(0xffff); - aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build()); + OutputActionCaseBuilder outputActionCaseBuilder = new OutputActionCaseBuilder(); + OutputActionBuilder outputActionBuilder = new OutputActionBuilder(); + outputActionBuilder.setPort(outPort); + outputActionBuilder.setMaxLength(OFConstants.OFPCML_NO_BUFFER); + outputActionCaseBuilder.setOutputAction(outputActionBuilder.build()); + aBuild.setActionChoice(outputActionCaseBuilder.build()); actions.add(aBuild.build()); - builder.setAction(actions); - } else { - builder.setAction(ActionConvertor.getActions(inputPacket.getAction(), version, datapathid)); } - builder.setData(inputPacket.getPayload()); - builder.setVersion(version); - builder.setXid(xid); + builder.setAction(actions); + builder.setData(source.getPayload()); + builder.setVersion(data.getVersion()); + builder.setXid(data.getXid()); builder.setInPort(inPortNr); builder.setBufferId(bufferId); - // -------------------------------------------------------- return builder.build(); } - - private static PortNumber getPortNumber(PathArgument pathArgument) { - // FIXME VD P! find InstanceIdentifier helper - InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(pathArgument, - InstanceIdentifier.IdentifiableItem.class); - NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class); - String[] split = key.getId().getValue().split(":"); - Long port = Long.decode(split[split.length - 1]); - return new PortNumber(port); - } -} +} \ No newline at end of file