blob: 01019b066a46802767b1630e712d99e33d35584f [file] [log] [blame]
Yotam Harcholf3f11152013-09-05 16:47:16 -07001package org.projectfloodlight.openflow.types;
2
3import org.jboss.netty.buffer.ChannelBuffer;
4import org.projectfloodlight.openflow.exceptions.OFParseError;
5
Andreas Wundsam22ba3af2013-10-04 16:00:30 -07006import com.google.common.hash.PrimitiveSink;
Andreas Wundsam85c961f2013-09-29 21:22:12 -07007import com.google.common.primitives.Ints;
8
Yotam Harcholf3f11152013-09-05 16:47:16 -07009/**
10 * Represents L4 (Transport Layer) port (TCP, UDP, etc.)
11 *
12 * @author Yotam Harchol (yotam.harchol@bigswitch.com)
13 */
14public class TransportPort implements OFValueType<TransportPort> {
15
16 static final int LENGTH = 2;
17 static final int MAX_PORT = 0xFFFF;
18 static final int MIN_PORT = 0;
19
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070020 private final static int NONE_VAL = 0;
21 public final static TransportPort NONE = new TransportPort(NONE_VAL);
22
Yotam Harcholf3f11152013-09-05 16:47:16 -070023 public static final TransportPort NO_MASK = new TransportPort(0xFFFFFFFF);
24 public static final TransportPort FULL_MASK = TransportPort.of(0x0);
25
26 private final int port;
27
28 private TransportPort(int port) {
29 this.port = port;
30 }
31
32 public static TransportPort of(int port) {
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070033 if(port == NONE_VAL)
34 return NONE;
35 else if (port < MIN_PORT || port > MAX_PORT) {
Yotam Harcholf3f11152013-09-05 16:47:16 -070036 throw new IllegalArgumentException("Illegal transport layer port number: " + port);
37 }
38 return new TransportPort(port);
39 }
40
41 @Override
42 public int getLength() {
43 return LENGTH;
44 }
45
46 public int getPort() {
47 return port;
48 }
49
50 @Override
51 public boolean equals(Object obj) {
52 if (!(obj instanceof TransportPort))
53 return false;
54 TransportPort other = (TransportPort)obj;
55 if (other.port != this.port)
56 return false;
57 return true;
58 }
59
60 @Override
61 public int hashCode() {
62 final int prime = 59;
63 int result = 1;
64 result = prime * result + port;
65 return result;
66 }
67
68 @Override
69 public String toString() {
70 return Integer.toString(port);
71 }
72
73 public void write2Bytes(ChannelBuffer c) {
74 c.writeShort(this.port);
75 }
76
77 public static TransportPort read2Bytes(ChannelBuffer c) throws OFParseError {
78 return TransportPort.of((c.readUnsignedShort() & 0x0FFFF));
79 }
80
81 @Override
82 public TransportPort applyMask(TransportPort mask) {
83 return TransportPort.of(this.port & mask.port);
84 }
85
Andreas Wundsam85c961f2013-09-29 21:22:12 -070086 @Override
87 public int compareTo(TransportPort o) {
88 return Ints.compare(port, o.port);
89 }
90
Andreas Wundsam22ba3af2013-10-04 16:00:30 -070091 @Override
92 public void putTo(PrimitiveSink sink) {
93 sink.putShort((short) port);
94 }
95
Yotam Harcholf3f11152013-09-05 16:47:16 -070096}