import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.CommonPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
*/
public final class ActionConvertor {
private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
- private static final String PREFIX_SEPARATOR = "/";
- final private static Long MAXPortOF13 = new Long(4294967040L); // 0xffffff00
- final private static Long MAXPortOF10 = new Long(0xff00);
private ActionConvertor() {
// NOOP
OpenflowVersion ofVersion = OpenflowVersion.get(version);
Long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(ofVersion, uri.getValue());
- if (portNumber != null && (OpenflowPortsUtil.isPortReserved(ofVersion, portNumber) || portNumber < OpenflowPortsUtil.getMaxPortForVersion(ofVersion)) ) {
+ if (OpenflowPortsUtil.checkPortValidity(ofVersion, portNumber)) {
portAction.setPort(new PortNumber(portNumber));
} else {
logger.error("Invalid Port specified "+ portNumber + " for Output Action for OF version:"+ ofVersion);
for (Action action : actionList) {
if (action.getType().equals(
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class)) {
- bucketActions.add(ofToSALOutputAction(action));
+ bucketActions.add(ofToSALOutputAction(ofVersion, action));
} else if (action.getType().equals(
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group.class)) {
/**
* Method converts OF Output action object to SAL Output action object.
- *
+ * @param ofVersion
+ * @param ofVersion
* @param action
* org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
* action.rev130731.actions.actions.list.Action
+ *
* @return OutputAction
*/
- public static OutputActionCase ofToSALOutputAction(Action action) {
-
+ public static OutputActionCase ofToSALOutputAction(OpenflowVersion ofVersion, Action action) {
OutputActionBuilder outputAction = new OutputActionBuilder();
PortAction port = action.getAugmentation(PortAction.class);
if (port != null) {
- outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
+ CommonPort.PortNumber protocolAgnosticPort = OpenflowPortsUtil.getProtocolAgnosticPort(
+ ofVersion, port.getPort().getValue());
+ String portNumberAsString = OpenflowPortsUtil.portNumberToString(protocolAgnosticPort);
+ outputAction.setOutputNodeConnector(new Uri(portNumberAsString));
} else {
logger.error("Provided action is not OF Output action, no associated port found!");
}
package org.opendaylight.openflowplugin.openflow.md.util;
import com.google.common.collect.ImmutableBiMap;
+
import org.opendaylight.openflowjava.protocol.api.util.BinContent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.CommonPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
public static boolean isPortReserved(OpenflowVersion ofVersion, Long portNumber) {
return versionPortMap.get(ofVersion).inverse().containsKey(portNumber);
}
+
+ /**
+ * @param ofVersion
+ * @param portNumber
+ * @return true if port number is valid for given protocol version
+ */
+ public static boolean checkPortValidity(OpenflowVersion ofVersion, Long portNumber) {
+ boolean portIsValid = true;
+ if (portNumber == null) {
+ portIsValid = false;
+ } else if (portNumber < 0) {
+ portIsValid = false;
+ } else if (portNumber > OpenflowPortsUtil.getMaxPortForVersion(ofVersion)) {
+ if (!OpenflowPortsUtil.isPortReserved(ofVersion, portNumber)) {
+ portIsValid = false;
+ }
+ }
+ return portIsValid;
+ }
+
+ /**
+ * @param portNumber
+ * @return string containing number or logical name
+ */
+ public static String portNumberToString(CommonPort.PortNumber portNumber) {
+ String result = null;
+ if (portNumber.getUint32() != null) {
+ result = String.valueOf(portNumber.getUint32());
+ } else if (portNumber.getString() != null) {
+ result = portNumber.getString();
+ }
+ return result;
+ }
}
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.CommonPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
import java.util.HashMap;
private static Map<String, Long> mapOF13Ports;
private static Map<OpenflowVersion, Map<String, Long>> mapVersionToPorts;
+ /**
+ * initiation before testing - once for all
+ */
@BeforeClass
public static void setupClass() {
OpenflowPortsUtil.init();
}
+ /**
+ * tearing down initiated values after all tests done
+ */
@AfterClass
public static void tearDownClass() {
OpenflowPortsUtil.close();
}
//helper
- private void matchGetLogicalName(OpenflowVersion version, String logicalName) {
+ private static void matchGetLogicalName(OpenflowVersion version, String logicalName) {
Assert.assertEquals("Controller reserve port not matching to logical-name for "+ version,
logicalName,
OpenflowPortsUtil.getPortLogicalName(version, mapVersionToPorts.get(version).get(logicalName)));
}
//helper
- private void matchGetPortfromLogicalName(OpenflowVersion version, String logicalName) {
+ private static void matchGetPortfromLogicalName(OpenflowVersion version, String logicalName) {
Assert.assertEquals("Controller reserve port not matching to logical-name for "+ version,
mapVersionToPorts.get(version).get(logicalName), OpenflowPortsUtil.getPortFromLogicalName(version, logicalName));
}
+ /**
+ * test for method {@link OpenflowPortsUtil#getPortLogicalName(OpenflowVersion, Long)}
+ */
@Test
public void testGetPortLogicalName() {
}
+ /**
+ * test for method {@link OpenflowPortsUtil#getPortFromLogicalName(OpenflowVersion, String)}
+ */
@Test
public void testGetPortFromLogicalName() {
}
+ /**
+ * test for method {@link OpenflowPortsUtil#checkPortValidity(OpenflowVersion, Long)} - OF-1.0
+ */
+ @Test
+ public void testCheckPortValidity10() {
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , -1L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0xFF00L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0xFFF8L));
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0xFFF0L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0xFFFFL));
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF10 , 0x1FFFFL));
+ }
+
+ /**
+ * test for method {@link OpenflowPortsUtil#checkPortValidity(OpenflowVersion, Long)} - OF-1.3
+ */
+ @Test
+ public void testCheckPortValidity13() {
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , -1L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0xFFFFFF00L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0xFFFFFFF8L));
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0xFFFFFFF0L));
+ Assert.assertTrue(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0xFFFFFFFFL));
+ Assert.assertFalse(OpenflowPortsUtil.checkPortValidity(OpenflowVersion.OF13 , 0x1FFFFFFFFL));
+ }
+
+ /**
+ * test for method {@link OpenflowPortsUtil#portNumberToString(CommonPort.PortNumber)}
+ */
+ @Test
+ public void testPortNumberToString() {
+ CommonPort.PortNumber portNumber;
+
+ portNumber = new CommonPort.PortNumber(42L);
+ Assert.assertEquals("42", OpenflowPortsUtil.portNumberToString(portNumber));
+
+ portNumber = new CommonPort.PortNumber(OutputPortValues.FLOOD.toString());
+ Assert.assertEquals("FLOOD", OpenflowPortsUtil.portNumberToString(portNumber));
+
+ portNumber = new CommonPort.PortNumber((String) null);
+ Assert.assertNull(OpenflowPortsUtil.portNumberToString(portNumber));
+ }
+
}