blob: 03e6dba91b6a482da17f0063fcaa9c67558685f4 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net;
tom0eb04ca2014-08-25 14:34:51 -070017
alshabib4680bb62014-09-04 17:15:08 -070018import com.google.common.primitives.UnsignedLongs;
tomca20e0c2014-09-03 23:22:24 -070019
tom0eb04ca2014-08-25 14:34:51 -070020/**
21 * Representation of a port number.
22 */
tomca20e0c2014-09-03 23:22:24 -070023public final class PortNumber {
24
toma1d16b62014-10-02 23:45:11 -070025 public static final PortNumber P0 = portNumber(0);
26
tom613d8142014-09-11 15:09:37 -070027 // TODO: revisit the max and the logical port value assignments
28
tomca20e0c2014-09-03 23:22:24 -070029 private static final long MAX_NUMBER = (2L * Integer.MAX_VALUE) + 1;
30
alshabib63d5afe2014-09-15 09:40:24 -070031
Ray Milkey8717be22015-01-12 14:16:27 -080032 static final long IN_PORT_NUMBER = -8L;
33 static final long TABLE_NUMBER = -7L;
34 static final long NORMAL_NUMBER = -6L;
35 static final long FLOOD_NUMBER = -5L;
36 static final long ALL_NUMBER = -4L;
37 static final long LOCAL_NUMBER = -2L;
38 static final long CONTROLLER_NUMBER = -3L;
39
40 public static final PortNumber IN_PORT = new PortNumber(IN_PORT_NUMBER);
41 public static final PortNumber TABLE = new PortNumber(TABLE_NUMBER);
42 public static final PortNumber NORMAL = new PortNumber(NORMAL_NUMBER);
43 public static final PortNumber FLOOD = new PortNumber(FLOOD_NUMBER);
44 public static final PortNumber ALL = new PortNumber(ALL_NUMBER);
45 public static final PortNumber LOCAL = new PortNumber(LOCAL_NUMBER);
46 public static final PortNumber CONTROLLER = new PortNumber(CONTROLLER_NUMBER);
tom613d8142014-09-11 15:09:37 -070047
tomca20e0c2014-09-03 23:22:24 -070048 private final long number;
Marc De Leenheer171c2e82015-04-13 17:20:37 -070049 private final String name;
Marc De Leenheer76d89742015-04-16 15:03:03 -070050 private final boolean hasName;
tomca20e0c2014-09-03 23:22:24 -070051
52 // Public creation is prohibited
53 private PortNumber(long number) {
tomca20e0c2014-09-03 23:22:24 -070054 this.number = number;
Marc De Leenheer171c2e82015-04-13 17:20:37 -070055 this.name = UnsignedLongs.toString(number);
Marc De Leenheer76d89742015-04-16 15:03:03 -070056 this.hasName = false;
Marc De Leenheer171c2e82015-04-13 17:20:37 -070057 }
58
59 private PortNumber(long number, String name) {
60 this.number = number;
61 this.name = name;
Marc De Leenheer76d89742015-04-16 15:03:03 -070062 this.hasName = true;
tomca20e0c2014-09-03 23:22:24 -070063 }
64
65 /**
66 * Returns the port number representing the specified long value.
67 *
68 * @param number port number as long value
69 * @return port number
70 */
71 public static PortNumber portNumber(long number) {
72 return new PortNumber(number);
73 }
74
75 /**
76 * Returns the port number representing the specified string value.
77 *
78 * @param string port number as string value
79 * @return port number
80 */
81 public static PortNumber portNumber(String string) {
82 return new PortNumber(UnsignedLongs.decode(string));
83 }
84
85 /**
Marc De Leenheer171c2e82015-04-13 17:20:37 -070086 * Returns the port number representing the specified long value and name.
87 *
88 * @param number port number as long value
89 * @param name port name as string value
90 * @return port number
91 */
92 public static PortNumber portNumber(long number, String name) {
93 return new PortNumber(number, name);
94 }
95
96 /**
tom613d8142014-09-11 15:09:37 -070097 * Indicates whether or not this port number is a reserved logical one or
98 * whether it corresponds to a normal physical port of a device or NIC.
99 *
100 * @return true if logical port number
101 */
102 public boolean isLogical() {
Marc De Leenheer76d89742015-04-16 15:03:03 -0700103 if (hasName) {
104 return false;
105 } else {
106 return (number < 0 || number > MAX_NUMBER);
107 }
tom613d8142014-09-11 15:09:37 -0700108 }
109
110 /**
tomca20e0c2014-09-03 23:22:24 -0700111 * Returns the backing long value.
112 *
113 * @return port number as long
114 */
115 public long toLong() {
116 return number;
117 }
118
Marc De Leenheerc0e37ec2015-04-14 22:53:23 -0700119 /**
120 * Returns the backing string value.
121 *
122 * @return port name as string value
123 */
124 public String name() {
125 return name;
126 }
127
Marc De Leenheer76d89742015-04-16 15:03:03 -0700128 /**
129 * Indicates whether this port number was created with a port name,
130 * or only with a number.
131 *
132 * @return true if port was created with name
133 */
134 public boolean hasName() {
135 return hasName;
136 }
137
Ray Milkey8717be22015-01-12 14:16:27 -0800138 private String decodeLogicalPort() {
139 if (number == CONTROLLER_NUMBER) {
140 return "CONTROLLER";
141 } else if (number == LOCAL_NUMBER) {
142 return "LOCAL";
143 } else if (number == ALL_NUMBER) {
144 return "ALL";
145 } else if (number == FLOOD_NUMBER) {
146 return "FLOOD";
147 } else if (number == NORMAL_NUMBER) {
148 return "NORMAL";
149 } else if (number == TABLE_NUMBER) {
150 return "TABLE";
151 } else if (number == IN_PORT_NUMBER) {
152 return "IN_PORT";
153 }
154 return "UNKNOWN";
155 }
156
tomca20e0c2014-09-03 23:22:24 -0700157 @Override
158 public String toString() {
Ray Milkey8717be22015-01-12 14:16:27 -0800159 if (!isLogical()) {
Marc De Leenheer171c2e82015-04-13 17:20:37 -0700160 return name;
Ray Milkey8717be22015-01-12 14:16:27 -0800161 } else {
162 return decodeLogicalPort();
163 }
tomca20e0c2014-09-03 23:22:24 -0700164 }
165
166 @Override
167 public int hashCode() {
Sho SHIMIZUd5c66af2015-06-30 09:43:11 -0700168 return Long.hashCode(number);
tomca20e0c2014-09-03 23:22:24 -0700169 }
170
171 @Override
172 public boolean equals(Object obj) {
tomfc9a4ff2014-09-22 18:22:47 -0700173 if (this == obj) {
174 return true;
175 }
tomca20e0c2014-09-03 23:22:24 -0700176 if (obj instanceof PortNumber) {
177 final PortNumber other = (PortNumber) obj;
178 return this.number == other.number;
179 }
180 return false;
181 }
tom0eb04ca2014-08-25 14:34:51 -0700182}