package org.opendaylight.openflowplugin.openflow.md.util;
import com.google.common.collect.ImmutableBiMap;
+import java.util.Objects;
+import javax.annotation.Nullable;
import org.opendaylight.openflowjava.protocol.api.util.BinContent;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Class which integrates the port constants defined and used by MDSAL and the ports defined in openflow java
* @author Kamal Rameshan on 5/2/14.
*/
public class OpenflowPortsUtil {
+
+ private static final Logger LOG = LoggerFactory.getLogger(OpenflowPortsUtil.class);
private static final ImmutableBiMap<Short, ImmutableBiMap<String, Long>> versionPortMap;
private static final ImmutableBiMap<Short, ImmutableBiMap<Long, String>> versionInversePortMap;
+ private static boolean inportWarnignAlreadyFired = false;
+
static {
// v1.0 ports
final ImmutableBiMap<String, Long> ofv10ports = new ImmutableBiMap.Builder<String, Long>()
- .put(OutputPortValues.MAX.toString(), (long) PortNumberValuesV10.MAX.getIntValue()) //0xff00
- .put(OutputPortValues.INPORT.toString(), (long) PortNumberValuesV10.INPORT.getIntValue()) //0xfff8
- .put(OutputPortValues.TABLE.toString(), (long) PortNumberValuesV10.TABLE.getIntValue()) //0xfff9
- .put(OutputPortValues.NORMAL.toString(), (long) PortNumberValuesV10.NORMAL.getIntValue()) //0xfffa
- .put(OutputPortValues.FLOOD.toString(), (long) PortNumberValuesV10.FLOOD.getIntValue()) //0xfffb
- .put(OutputPortValues.ALL.toString(), (long) PortNumberValuesV10.ALL.getIntValue()) //0xfffc
- .put(OutputPortValues.CONTROLLER.toString(), (long) PortNumberValuesV10.CONTROLLER.getIntValue()) //0xfffd
- .put(OutputPortValues.LOCAL.toString(), (long) PortNumberValuesV10.LOCAL.getIntValue()) //0xfffe
- .put(OutputPortValues.NONE.toString(), (long) PortNumberValuesV10.NONE.getIntValue()) //0xffff
+ .put(OutputPortValues.MAX.getName(), (long) PortNumberValuesV10.MAX.getIntValue()) //0xff00
+ .put(OutputPortValues.INPORT.getName(), (long) PortNumberValuesV10.INPORT.getIntValue()) //0xfff8
+ .put(OutputPortValues.TABLE.getName(), (long) PortNumberValuesV10.TABLE.getIntValue()) //0xfff9
+ .put(OutputPortValues.NORMAL.getName(), (long) PortNumberValuesV10.NORMAL.getIntValue()) //0xfffa
+ .put(OutputPortValues.FLOOD.getName(), (long) PortNumberValuesV10.FLOOD.getIntValue()) //0xfffb
+ .put(OutputPortValues.ALL.getName(), (long) PortNumberValuesV10.ALL.getIntValue()) //0xfffc
+ .put(OutputPortValues.CONTROLLER.getName(), (long) PortNumberValuesV10.CONTROLLER.getIntValue()) //0xfffd
+ .put(OutputPortValues.LOCAL.getName(), (long) PortNumberValuesV10.LOCAL.getIntValue()) //0xfffe
+ .put(OutputPortValues.NONE.getName(), (long) PortNumberValuesV10.NONE.getIntValue()) //0xffff
.build();
// openflow 1.3 reserved ports.
// PortNumberValues are defined in OFJava yang. And yang maps an int to all enums. Hence we need to create longs from (-ve) ints
// TODO: do we need to define these ports in yang?
final ImmutableBiMap<String, Long> ofv13ports = new ImmutableBiMap.Builder<String, Long>()
- .put(OutputPortValues.MAX.toString(), BinContent.intToUnsignedLong(PortNumberValues.MAX.getIntValue())) //0xffffff00
- .put(OutputPortValues.INPORT.toString(), BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())) //0xfffffff8
- .put(OutputPortValues.TABLE.toString(), BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())) //0xfffffff9
- .put(OutputPortValues.NORMAL.toString(), BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())) //0xfffffffa
- .put(OutputPortValues.FLOOD.toString(), BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())) //0xfffffffb
- .put(OutputPortValues.ALL.toString(), BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())) //0xfffffffc
- .put(OutputPortValues.CONTROLLER.toString(), BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER.getIntValue())) //0xfffffffd
- .put(OutputPortValues.LOCAL.toString(), BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())) //0xfffffffe
- .put(OutputPortValues.ANY.toString(), BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())) //0xffffffff
+ .put(OutputPortValues.MAX.getName(), BinContent.intToUnsignedLong(PortNumberValues.MAX.getIntValue())) //0xffffff00
+ .put(OutputPortValues.INPORT.getName(), BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())) //0xfffffff8
+ .put(OutputPortValues.TABLE.getName(), BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())) //0xfffffff9
+ .put(OutputPortValues.NORMAL.getName(), BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())) //0xfffffffa
+ .put(OutputPortValues.FLOOD.getName(), BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())) //0xfffffffb
+ .put(OutputPortValues.ALL.getName(), BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())) //0xfffffffc
+ .put(OutputPortValues.CONTROLLER.getName(), BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER.getIntValue())) //0xfffffffd
+ .put(OutputPortValues.LOCAL.getName(), BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())) //0xfffffffe
+ .put(OutputPortValues.ANY.getName(), BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())) //0xffffffff
.build();
versionPortMap = new ImmutableBiMap.Builder<Short, ImmutableBiMap<String, Long>>()
: getPortLogicalName(ofVersion.getVersion(), portNumber);
}
- public static Long getPortFromLogicalName(final OpenflowVersion ofVersion, final String logicalNameOrPort) {
- Long port = versionPortMap.get(ofVersion.getVersion()).get(logicalNameOrPort);
+ @Nullable
+ static Long getPortFromLogicalName(final OpenflowVersion ofVersion, final String logicalNameOrPort) {
+
+ //The correct keyword defined in openflow specification in IN_PORT so we need to allow to use it
+ //for legacy reasons we can't just simply drop the misspelled INPORT
+ //TODO: Consider to remove 'INPORT' keyword
+ Long port;
+ if (Objects.equals(logicalNameOrPort, "INPORT")) {
+ if (!inportWarnignAlreadyFired) {
+ LOG.warn("Using '{}' in port field is not recommended use 'IN_PORT' instead", logicalNameOrPort);
+ inportWarnignAlreadyFired = true;
+ }
+ port = versionPortMap.get(ofVersion.getVersion()).get(OutputPortValues.INPORT.getName());
+ } else {
+ port = versionPortMap.get(ofVersion.getVersion()).get(logicalNameOrPort);
+ }
if (port == null) {
try {
port = Long.decode(logicalNameOrPort);
@BeforeClass
public static void setupClass() {
mapOF10Ports = new HashMap<String, Long>();
- mapOF10Ports.put(OutputPortValues.MAX.toString(), 65280L);
- mapOF10Ports.put(OutputPortValues.INPORT.toString(), 65528L);
- mapOF10Ports.put(OutputPortValues.TABLE.toString(), 65529L);
- mapOF10Ports.put(OutputPortValues.NORMAL.toString(), 65530L);
- mapOF10Ports.put(OutputPortValues.FLOOD.toString(), 65531L);
- mapOF10Ports.put(OutputPortValues.ALL.toString(), 65532L);
- mapOF10Ports.put(OutputPortValues.CONTROLLER.toString(), 65533L);
- mapOF10Ports.put(OutputPortValues.LOCAL.toString(), 65534L);
- mapOF10Ports.put(OutputPortValues.NONE.toString(), 65535L);
+ mapOF10Ports.put(OutputPortValues.MAX.getName(), 65280L);
+ mapOF10Ports.put(OutputPortValues.INPORT.getName(), 65528L);
+ mapOF10Ports.put(OutputPortValues.TABLE.getName(), 65529L);
+ mapOF10Ports.put(OutputPortValues.NORMAL.getName(), 65530L);
+ mapOF10Ports.put(OutputPortValues.FLOOD.getName(), 65531L);
+ mapOF10Ports.put(OutputPortValues.ALL.getName(), 65532L);
+ mapOF10Ports.put(OutputPortValues.CONTROLLER.getName(), 65533L);
+ mapOF10Ports.put(OutputPortValues.LOCAL.getName(), 65534L);
+ mapOF10Ports.put(OutputPortValues.NONE.getName(), 65535L);
mapOF13Ports = new HashMap<String, Long>();
- mapOF13Ports.put(OutputPortValues.MAX.toString(), 4294967040L);
- mapOF13Ports.put(OutputPortValues.INPORT.toString(), 4294967288L);
- mapOF13Ports.put(OutputPortValues.TABLE.toString(), 4294967289L);
- mapOF13Ports.put(OutputPortValues.NORMAL.toString(), 4294967290L);
- mapOF13Ports.put(OutputPortValues.FLOOD.toString(), 4294967291L);
- mapOF13Ports.put(OutputPortValues.ALL.toString(), 4294967292L);
- mapOF13Ports.put(OutputPortValues.CONTROLLER.toString(), 4294967293L);
- mapOF13Ports.put(OutputPortValues.LOCAL.toString(), 4294967294L);
- mapOF13Ports.put(OutputPortValues.ANY.toString(), 4294967295L);
+ mapOF13Ports.put(OutputPortValues.MAX.getName(), 4294967040L);
+ mapOF13Ports.put(OutputPortValues.INPORT.getName(), 4294967288L);
+ mapOF13Ports.put(OutputPortValues.TABLE.getName(), 4294967289L);
+ mapOF13Ports.put(OutputPortValues.NORMAL.getName(), 4294967290L);
+ mapOF13Ports.put(OutputPortValues.FLOOD.getName(), 4294967291L);
+ mapOF13Ports.put(OutputPortValues.ALL.getName(), 4294967292L);
+ mapOF13Ports.put(OutputPortValues.CONTROLLER.getName(), 4294967293L);
+ mapOF13Ports.put(OutputPortValues.LOCAL.getName(), 4294967294L);
+ mapOF13Ports.put(OutputPortValues.ANY.getName(), 4294967295L);
mapVersionToPorts = new HashMap<OpenflowVersion, Map<String, Long>>();
mapVersionToPorts.put(OpenflowVersion.OF10, mapOF10Ports);
@Test
public void testGetPortLogicalName() {
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.toString());
- matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.toString());
-
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.toString());
- matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.toString());
+ String s = OutputPortValues.INPORT.getName();
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.getName());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.getName());
+
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.getName());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.getName());
Assert.assertNull("Invalid port number should return a null",
OpenflowPortsUtil.getPortLogicalName(OpenflowVersion.OF10, 99999L));
Assert.assertNull("Invalid port number should return a null",
OpenflowPortsUtil.getPortLogicalName(OpenflowVersion.OF13, 99999L));
+ Assert.assertFalse(s.equals("a"));
}
+
/**
* test for method {@link OpenflowPortsUtil#getPortFromLogicalName(OpenflowVersion, String)}
*/
@Test
public void testGetPortFromLogicalName() {
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.toString());
-
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.toString());
- matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.getName());
+
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.getName());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.getName());
Assert.assertNull("Invalid port logical name should return a null",
OpenflowPortsUtil.getPortFromLogicalName(OpenflowVersion.OF10, "abc"));
}
/**
- * test for method {@link OpenflowPortsUtil#portNumberToString(PortNumber)}
+ * test for method {@link OpenflowPortsUtil}
*/
@Test
public void testPortNumberToString() {