*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+import com.google.common.collect.Iterables;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
import org.opendaylight.controller.sal.common.util.Arguments;
import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
public final class PacketOutConvertor {
- private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
+ private static final Logger LOG = LoggerFactory.getLogger(PacketOutConvertor.class);
private PacketOutConvertor() {
}
// Get all the data for the PacketOut from the Yang/SAL-Layer
+
/**
- * @param version
- * @param Yang
- * Data source
+ * @param version openflow version
+ * @param inputPacket input packet
+ * @param datapathid datapath id
+ * @param xid tx id
* @return PacketOutInput required by OF Library
*/
- public static PacketOutInput toPacketOutInput(TransmitPacketInput inputPacket, short version, Long xid,
- BigInteger datapathid) {
+ public static PacketOutInput toPacketOutInput(final TransmitPacketInput inputPacket, final short version, final Long xid,
+ final BigInteger datapathid) {
+ LOG.trace("toPacketOutInput for datapathId:{}, xid:{}", datapathid, xid);
// Build Port ID from TransmitPacketInput.Ingress
PortNumber inPortNr = null;
Long bufferId = OFConstants.OFP_NO_BUFFER;
- List<Action> actions = new ArrayList<>();
- List<PathArgument> inArgs = null;
+ Iterable<PathArgument> inArgs = null;
PacketOutInputBuilder builder = new PacketOutInputBuilder();
if (inputPacket.getIngress() != null) {
- inArgs = inputPacket.getIngress().getValue().getPath();
+ inArgs = inputPacket.getIngress().getValue().getPathArguments();
}
- if (inArgs != null && inArgs.size() >= 3) {
- inPortNr = getPortNumber(inArgs.get(2), version);
+ if (inArgs != null && Iterables.size(inArgs) >= 3) {
+ inPortNr = getPortNumber(Iterables.get(inArgs, 2), version);
} else {
// The packetOut originated from the controller
inPortNr = new PortNumber(0xfffffffdL);
PortNumber outPort = null;
NodeConnectorRef outRef = inputPacket.getEgress();
- List<PathArgument> outArgs = outRef.getValue().getPath();
- if (outArgs.size() >= 3) {
- outPort = getPortNumber(outArgs.get(2), version);
+ Iterable<PathArgument> outArgs = outRef.getValue().getPathArguments();
+ if (Iterables.size(outArgs) >= 3) {
+ outPort = getPortNumber(Iterables.get(outArgs, 2), version);
} else {
// TODO : P4 search for some normal exception
new Exception("PORT NR not exist in Egress");
}
- // TODO VD P! wait for way to move Actions (e.g. augmentation)
+ List<Action> actions = null;
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> inputActions =
+ inputPacket.getAction();
+ if (inputActions != null) {
+ actions = ActionConvertor.getActions(inputActions, version, datapathid, null);
- // FIXME VD implementation for testing PacketIn (REMOVE IT)
- if (inputPacket.getAction() == null) {
+ } else {
+ actions = new ArrayList<>();
+ // 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, null));
}
+ builder.setAction(actions);
builder.setData(inputPacket.getPayload());
builder.setVersion(version);
builder.setXid(xid);
return builder.build();
}
- private static PortNumber getPortNumber(PathArgument pathArgument, Short ofVersion) {
+ private static PortNumber getPortNumber(final PathArgument pathArgument, final Short ofVersion) {
// FIXME VD P! find InstanceIdentifier helper
- InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(pathArgument,
+ 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 = OpenflowPortsUtil.getPortFromLogicalName(OpenflowVersion.get(ofVersion), split[split.length - 1]);
+ Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+ OpenflowVersion.get(ofVersion), key.getId());
return new PortNumber(port);
}
}