blob: 38051ffc393459dcc2f07c6e149721f8eb86b72d [file] [log] [blame]
Yuta HIGUCHIa507baf2014-08-22 13:42:40 -07001package net.onrc.onos.core.util;
2
3import static com.google.common.base.Preconditions.checkNotNull;
4
5import org.projectfloodlight.openflow.protocol.OFPortDesc;
6import org.projectfloodlight.openflow.protocol.OFVersion;
7import org.projectfloodlight.openflow.types.OFPort;
8
9/**
10 * {@link PortNumber} related utilities.
11 */
12public final class PortNumberUtils {
13
14 /**
15 * Gets {@link PortNumber} for specified port.
16 *
17 * @param ofVersion OF version to use translating {@code portNumber}
18 * @param portNumber treated as uint16 if {@link OFVersion#OF_10}
19 * uint32 otherwise
20 * @return {@link PortNumber}
21 */
22 public static PortNumber openFlow(OFVersion ofVersion, int portNumber) {
23 if (ofVersion == OFVersion.OF_10) {
24 return PortNumber.uint16(toOF10(portNumber));
25 } else {
26 return PortNumber.uint32(portNumber);
27 }
28 }
29
30 /**
31 * Gets {@link PortNumber} for specified port.
32 *
33 * @param desc {@link OFPortDesc}
34 * @return {@link PortNumber}
35 */
36 public static PortNumber openFlow(final OFPortDesc desc) {
37 if (checkNotNull(desc).getVersion() == OFVersion.OF_10) {
38 return PortNumber.uint16(desc.getPortNo().getShortPortNumber());
39 } else {
40 return PortNumber.uint32(desc.getPortNo().getPortNumber());
41 }
42 }
43
44 /**
45 * Validate OF1.0 port number.
46 *
47 * @param of10PortNumber 0F1.0 port number or {@link OFPort#getPortNumber()}
48 * @return OF1.0 port number
49 * @throws IllegalArgumentException if out of valid OF1.0 range
50 */
51 public static short toOF10(final int of10PortNumber) {
52 try {
53 // if the input was from OFPort#getPortNumber()
54 // some named/reserved port number to OF1.0 constants.
55 return OFPort.ofInt(of10PortNumber).getShortPortNumber();
56 } catch (IllegalArgumentException e) {
57 // OFPort#getShortPortNumber will rejects OF1.0 special ports
58 if (0xFFf8 <= of10PortNumber && of10PortNumber <= 0xFFff) {
59 // allow OF1.0 Fake output "ports" to pass
60 return (short) (0xFFFF & of10PortNumber);
61 } else if (0xFF00 == of10PortNumber) {
62 // allow OFPP_MAX
63 return (short) (0xFFFF & of10PortNumber);
64 }
65 throw e;
66 }
67 }
68
69 /**
70 * Avoid instantiation.
71 */
72 private PortNumberUtils() {}
73
74}