blob: 93ec91d157cb2f07e328d63edb62d61fbd422740 [file] [log] [blame]
tom0eb04ca2014-08-25 14:34:51 -07001package org.onlab.onos.net;
2
tomca20e0c2014-09-03 23:22:24 -07003import java.util.Objects;
4
alshabib4680bb62014-09-04 17:15:08 -07005import com.google.common.primitives.UnsignedLongs;
tomca20e0c2014-09-03 23:22:24 -07006
tom0eb04ca2014-08-25 14:34:51 -07007/**
8 * Representation of a port number.
9 */
tomca20e0c2014-09-03 23:22:24 -070010public final class PortNumber {
11
tom613d8142014-09-11 15:09:37 -070012 // TODO: revisit the max and the logical port value assignments
13
tomca20e0c2014-09-03 23:22:24 -070014 private static final long MAX_NUMBER = (2L * Integer.MAX_VALUE) + 1;
15
tom613d8142014-09-11 15:09:37 -070016 public static final PortNumber FLOOD = new PortNumber(-1);
17 public static final PortNumber IN_PORT = new PortNumber(-2);
18 public static final PortNumber TABLE = new PortNumber(-3);
19 public static final PortNumber NORMAL = new PortNumber(-4);
20 public static final PortNumber ALL = new PortNumber(-4);
21 public static final PortNumber LOCAL = new PortNumber(-5);
22
tomca20e0c2014-09-03 23:22:24 -070023 private final long number;
24
25 // Public creation is prohibited
26 private PortNumber(long number) {
tomca20e0c2014-09-03 23:22:24 -070027 this.number = number;
28 }
29
30 /**
31 * Returns the port number representing the specified long value.
32 *
33 * @param number port number as long value
34 * @return port number
35 */
36 public static PortNumber portNumber(long number) {
37 return new PortNumber(number);
38 }
39
40 /**
41 * Returns the port number representing the specified string value.
42 *
43 * @param string port number as string value
44 * @return port number
45 */
46 public static PortNumber portNumber(String string) {
47 return new PortNumber(UnsignedLongs.decode(string));
48 }
49
50 /**
tom613d8142014-09-11 15:09:37 -070051 * Indicates whether or not this port number is a reserved logical one or
52 * whether it corresponds to a normal physical port of a device or NIC.
53 *
54 * @return true if logical port number
55 */
56 public boolean isLogical() {
57 return number < 0 || number > MAX_NUMBER;
58 }
59
60 /**
tomca20e0c2014-09-03 23:22:24 -070061 * Returns the backing long value.
62 *
63 * @return port number as long
64 */
65 public long toLong() {
66 return number;
67 }
68
69 @Override
70 public String toString() {
71 return UnsignedLongs.toString(number);
72 }
73
74 @Override
75 public int hashCode() {
76 return Objects.hash(number);
77 }
78
79 @Override
80 public boolean equals(Object obj) {
81 if (obj instanceof PortNumber) {
82 final PortNumber other = (PortNumber) obj;
83 return this.number == other.number;
84 }
85 return false;
86 }
tom0eb04ca2014-08-25 14:34:51 -070087}