* 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.util;
import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.Maps;
import java.util.Objects;
-import javax.annotation.Nullable;
+import org.eclipse.jdt.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.opendaylight.yangtools.yang.common.Uint32;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
}
private static final Logger LOG = LoggerFactory.getLogger(OpenflowPortsUtil.class);
- private static final ImmutableBiMap<Short, ImmutableBiMap<String, Long>> VERSION_PORT_MAP;
+
+ // TODO: deprecate this
private static final ImmutableBiMap<Short, ImmutableBiMap<Long, String>> VERSION_INVERSE_PORT_MAP;
+ private static final ImmutableBiMap<Short, ImmutableBiMap<String, Uint32>> VERSION_PORT_MAP_UINT;
+ private static final ImmutableBiMap<Short, ImmutableBiMap<Uint32, String>> VERSION_INVERSE_PORT_MAP_UINT;
+
private static boolean inportWarnignAlreadyFired = false;
static {
BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())) // 0xffffffff
.build();
- VERSION_PORT_MAP = new ImmutableBiMap.Builder<Short, ImmutableBiMap<String, Long>>()
- .put(OFConstants.OFP_VERSION_1_0, ofv10ports)
- .put(OFConstants.OFP_VERSION_1_3, ofv13ports)
- .build();
-
VERSION_INVERSE_PORT_MAP = new ImmutableBiMap.Builder<Short, ImmutableBiMap<Long, String>>()
.put(OFConstants.OFP_VERSION_1_0, ofv10ports.inverse())
.put(OFConstants.OFP_VERSION_1_3, ofv13ports.inverse())
.build();
+
+ final ImmutableBiMap<String, Uint32> ofv10portsUint = ImmutableBiMap.copyOf(Maps.transformValues(ofv10ports,
+ l -> Uint32.valueOf(l).intern()));
+ final ImmutableBiMap<String, Uint32> ofv13portsUint = ImmutableBiMap.copyOf(Maps.transformValues(ofv13ports,
+ l -> Uint32.valueOf(l).intern()));
+
+ VERSION_PORT_MAP_UINT = new ImmutableBiMap.Builder<Short, ImmutableBiMap<String, Uint32>>()
+ .put(OFConstants.OFP_VERSION_1_0, ofv10portsUint)
+ .put(OFConstants.OFP_VERSION_1_3, ofv13portsUint)
+ .build();
+
+ VERSION_INVERSE_PORT_MAP_UINT = new ImmutableBiMap.Builder<Short, ImmutableBiMap<Uint32, String>>()
+ .put(OFConstants.OFP_VERSION_1_0, ofv10portsUint.inverse())
+ .put(OFConstants.OFP_VERSION_1_3, ofv13portsUint.inverse())
+ .build();
}
+ // TODO: deprecate and migrate
public static String getPortLogicalName(final short ofVersion, final Long portNumber) {
return VERSION_INVERSE_PORT_MAP.get(ofVersion).get(portNumber);
}
+ public static String getPortLogicalName(final short ofVersion, final Uint32 portNumber) {
+ return VERSION_INVERSE_PORT_MAP_UINT.get(ofVersion).get(portNumber);
+ }
+
+ // TODO: deprecate and migrate
public static String getPortLogicalName(final OpenflowVersion ofVersion, final Long portNumber) {
return ofVersion.equals(OpenflowVersion.UNSUPPORTED)
? null
: getPortLogicalName(ofVersion.getVersion(), portNumber);
}
+ public static String getPortLogicalName(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+ return ofVersion.equals(OpenflowVersion.UNSUPPORTED)
+ ? null
+ : getPortLogicalName(ofVersion.getVersion(), portNumber);
+ }
+
@Nullable
- static Long getPortFromLogicalName(final OpenflowVersion ofVersion, final String logicalNameOrPort) {
+ static Uint32 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;
+ Uint32 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 = VERSION_PORT_MAP.get(ofVersion.getVersion()).get(OutputPortValues.INPORT.getName());
+ port = VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(OutputPortValues.INPORT.getName());
} else {
- port = VERSION_PORT_MAP.get(ofVersion.getVersion()).get(logicalNameOrPort);
+ port = VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(logicalNameOrPort);
}
if (port == null) {
try {
- port = Long.decode(logicalNameOrPort);
- } catch (final NumberFormatException ne) {
+ port = Uint32.valueOf(Long.decode(logicalNameOrPort));
+ } catch (final IllegalArgumentException ne) {
//ignore, sent null back.
- if (logicalNameOrPort.contains(":")) {
- port = Long.parseLong(logicalNameOrPort.substring(logicalNameOrPort.lastIndexOf(":") + 1));
+ final int lastColon = logicalNameOrPort.lastIndexOf(':');
+ if (lastColon != -1) {
+ port = Uint32.valueOf(logicalNameOrPort.substring(lastColon + 1));
}
}
}
public static PortNumberUni getProtocolAgnosticPort(final OpenflowVersion ofVersion, final Long portNumber) {
final String reservedPortLogicalName = getPortLogicalName(ofVersion, portNumber);
+ return reservedPortLogicalName == null
+ ? new PortNumberUni(portNumber == null ? (Uint32) null : Uint32.valueOf(portNumber))
+ : new PortNumberUni(reservedPortLogicalName);
+ }
+
+ // TODO: deprecate and migrate
+ public static PortNumberUni getProtocolAgnosticPort(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+ final String reservedPortLogicalName = getPortLogicalName(ofVersion, portNumber);
+
return reservedPortLogicalName == null
? new PortNumberUni(portNumber)
: new PortNumberUni(reservedPortLogicalName);
}
- public static Long getProtocolPortNumber(final OpenflowVersion ofVersion, final PortNumberUni port) {
+
+ public static Uint32 getProtocolPortNumber(final OpenflowVersion ofVersion, final PortNumberUni port) {
final String portLogicalName = port.getString();
return portLogicalName != null
- ? VERSION_PORT_MAP.get(ofVersion.getVersion()).get(portLogicalName)
+ ? VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(portLogicalName)
: port.getUint32();
}
- public static Long getMaxPortForVersion(final OpenflowVersion ofVersion) {
+ public static Uint32 getMaxPortForVersion(final OpenflowVersion ofVersion) {
return getPortFromLogicalName(ofVersion, OutputPortValues.MAX.getName());
}
- public static boolean isPortReserved(final OpenflowVersion ofVersion, final Long portNumber) {
- return VERSION_INVERSE_PORT_MAP.get(ofVersion.getVersion()).containsKey(portNumber);
+ public static boolean isPortReserved(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+ return VERSION_INVERSE_PORT_MAP_UINT.get(ofVersion.getVersion()).containsKey(portNumber);
}
/**
* @param portNumber port number
* @return true if port number is valid for given protocol version
*/
- public static boolean checkPortValidity(final OpenflowVersion ofVersion, final Long portNumber) {
+ public static boolean checkPortValidity(final OpenflowVersion ofVersion, final Uint32 portNumber) {
boolean portIsValid = true;
if (portNumber == null) {
portIsValid = false;
- } else if (portNumber < 0) {
- portIsValid = false;
- } else if (portNumber > getMaxPortForVersion(ofVersion)) {
+ } else if (portNumber.compareTo(getMaxPortForVersion(ofVersion)) > 0) {
if (!isPortReserved(ofVersion, portNumber)) {
portIsValid = false;
}
* @param portNumber port number
* @return port number uri
*/
+ // TODO: deprecate and migrate
public static Uri getProtocolAgnosticPortUri(final short version, final long portNumber) {
return new Uri(portNumberToString(getProtocolAgnosticPort(OpenflowVersion.get(version), portNumber)));
}
+
+ /**
+ * Converts port number to Uri.
+ *
+ * @param version openflow version
+ * @param portNumber port number
+ * @return port number uri
+ */
+ public static Uri getProtocolAgnosticPortUri(final short version, final Uint32 portNumber) {
+ return new Uri(portNumberToString(getProtocolAgnosticPort(OpenflowVersion.get(version), portNumber)));
+ }
}