Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 1 | package org.onlab.packet; |
2 | |||||
3 | /** | ||||
4 | * Representation of a VLAN ID. | ||||
5 | */ | ||||
tom | c370ebd | 2014-09-16 01:25:21 -0700 | [diff] [blame] | 6 | // FIXME: This will end-up looking like a constant; we should name it 'VlanId', 'IpAddress', 'MacAddress'. |
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 7 | public class VlanId { |
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 8 | |
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 9 | private final short value; |
Ayaka Koshibe | 1a10098 | 2014-09-13 19:32:19 -0700 | [diff] [blame] | 10 | // Based on convention used elsewhere? Check and change if needed |
Ayaka Koshibe | 16698a3 | 2014-09-13 22:19:02 -0700 | [diff] [blame] | 11 | public static final short UNTAGGED = (short) 0xffff; |
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 12 | // A VLAN ID is actually 12 bits of a VLAN tag. |
Ayaka Koshibe | 16698a3 | 2014-09-13 22:19:02 -0700 | [diff] [blame] | 13 | public static final short MAX_VLAN = 4095; |
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 14 | |
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 15 | protected VlanId() { |
Ayaka Koshibe | 1a10098 | 2014-09-13 19:32:19 -0700 | [diff] [blame] | 16 | this.value = UNTAGGED; |
17 | } | ||||
18 | |||||
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 19 | protected VlanId(short value) { |
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 20 | this.value = value; |
21 | } | ||||
22 | |||||
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 23 | public static VlanId vlanId() { |
24 | return new VlanId(UNTAGGED); | ||||
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 25 | } |
26 | |||||
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 27 | public static VlanId vlanId(short value) { |
Ayaka Koshibe | 1a10098 | 2014-09-13 19:32:19 -0700 | [diff] [blame] | 28 | if (value == UNTAGGED) { |
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 29 | return new VlanId(); |
Ayaka Koshibe | 1a10098 | 2014-09-13 19:32:19 -0700 | [diff] [blame] | 30 | } |
31 | |||||
32 | if (value > MAX_VLAN) { | ||||
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 33 | throw new IllegalArgumentException( |
34 | "value exceeds allowed maximum VLAN ID value (4095)"); | ||||
35 | } | ||||
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 36 | return new VlanId(value); |
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 37 | } |
38 | |||||
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 39 | public short toShort() { |
40 | return this.value; | ||||
41 | } | ||||
42 | |||||
43 | @Override | ||||
44 | public boolean equals(Object obj) { | ||||
45 | if (this == obj) { | ||||
46 | return true; | ||||
47 | } | ||||
48 | |||||
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 49 | if (obj instanceof VlanId) { |
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 50 | |
Ayaka Koshibe | a9c199f | 2014-09-16 16:21:40 -0700 | [diff] [blame^] | 51 | VlanId other = (VlanId) obj; |
Ayaka Koshibe | 50ee924 | 2014-09-12 16:37:46 -0700 | [diff] [blame] | 52 | |
53 | if (this.value == other.value) { | ||||
54 | return true; | ||||
55 | } | ||||
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 56 | } |
57 | |||||
58 | return false; | ||||
59 | } | ||||
60 | |||||
61 | @Override | ||||
62 | public int hashCode() { | ||||
63 | return this.value; | ||||
64 | } | ||||
Ayaka Koshibe | 3a25aec | 2014-09-12 11:52:53 -0700 | [diff] [blame] | 65 | |
66 | @Override | ||||
67 | public String toString() { | ||||
68 | return String.valueOf(this.value); | ||||
69 | } | ||||
Ayaka Koshibe | 04a1a4e | 2014-09-11 14:31:29 -0700 | [diff] [blame] | 70 | } |
71 |