Fixing ONOS-4875
Change-Id: I2b4fec44f623cc6df90c45c1cabc8c40601bf4b6 (cherry picked from commit 1a5491ec)
Showing
2 changed files
with
49 additions
and
11 deletions
... | @@ -60,11 +60,11 @@ public class InterfaceIpAddress { | ... | @@ -60,11 +60,11 @@ public class InterfaceIpAddress { |
60 | * @param subnetAddress the IP subnet address | 60 | * @param subnetAddress the IP subnet address |
61 | */ | 61 | */ |
62 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress) { | 62 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress) { |
63 | - this.ipAddress = checkNotNull(ipAddress); | 63 | + checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(), |
64 | - this.subnetAddress = checkNotNull(subnetAddress); | 64 | + "IP and subnet version mismatch"); |
65 | - // TODO: Recompute the default broadcast address from the subnet | 65 | + this.ipAddress = ipAddress; |
66 | - // address | 66 | + this.subnetAddress = subnetAddress; |
67 | - this.broadcastAddress = null; | 67 | + this.broadcastAddress = computeBroadcastAddress(ipAddress, subnetAddress); |
68 | this.peerAddress = null; | 68 | this.peerAddress = null; |
69 | } | 69 | } |
70 | 70 | ||
... | @@ -78,8 +78,10 @@ public class InterfaceIpAddress { | ... | @@ -78,8 +78,10 @@ public class InterfaceIpAddress { |
78 | */ | 78 | */ |
79 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress, | 79 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress, |
80 | IpAddress broadcastAddress) { | 80 | IpAddress broadcastAddress) { |
81 | - this.ipAddress = checkNotNull(ipAddress); | 81 | + checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(), |
82 | - this.subnetAddress = checkNotNull(subnetAddress); | 82 | + "IP and subnet version mismatch"); |
83 | + this.ipAddress = ipAddress; | ||
84 | + this.subnetAddress = subnetAddress; | ||
83 | this.broadcastAddress = broadcastAddress; | 85 | this.broadcastAddress = broadcastAddress; |
84 | this.peerAddress = null; | 86 | this.peerAddress = null; |
85 | } | 87 | } |
... | @@ -97,8 +99,10 @@ public class InterfaceIpAddress { | ... | @@ -97,8 +99,10 @@ public class InterfaceIpAddress { |
97 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress, | 99 | public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress, |
98 | IpAddress broadcastAddress, | 100 | IpAddress broadcastAddress, |
99 | IpAddress peerAddress) { | 101 | IpAddress peerAddress) { |
100 | - this.ipAddress = checkNotNull(ipAddress); | 102 | + checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(), |
101 | - this.subnetAddress = checkNotNull(subnetAddress); | 103 | + "IP and subnet version mismatch"); |
104 | + this.ipAddress = ipAddress; | ||
105 | + this.subnetAddress = subnetAddress; | ||
102 | this.broadcastAddress = broadcastAddress; | 106 | this.broadcastAddress = broadcastAddress; |
103 | this.peerAddress = peerAddress; | 107 | this.peerAddress = peerAddress; |
104 | } | 108 | } |
... | @@ -157,6 +161,21 @@ public class InterfaceIpAddress { | ... | @@ -157,6 +161,21 @@ public class InterfaceIpAddress { |
157 | return new InterfaceIpAddress(addr, subnet); | 161 | return new InterfaceIpAddress(addr, subnet); |
158 | } | 162 | } |
159 | 163 | ||
164 | + /** | ||
165 | + * Compute the IP broadcast address. | ||
166 | + * | ||
167 | + * @return the IP broadcast address | ||
168 | + */ | ||
169 | + public static IpAddress computeBroadcastAddress(IpAddress ipAddress, IpPrefix subnetAddress) { | ||
170 | + if (ipAddress.isIp6()) { | ||
171 | + return null; | ||
172 | + } else { | ||
173 | + IpAddress maskedIP = IpAddress.makeMaskedAddress(ipAddress, subnetAddress.prefixLength()); | ||
174 | + int ipB = maskedIP.getIp4Address().toInt() | ((1 << (32 - subnetAddress.prefixLength())) - 1); | ||
175 | + return IpAddress.valueOf(ipB); | ||
176 | + } | ||
177 | + } | ||
178 | + | ||
160 | @Override | 179 | @Override |
161 | public boolean equals(Object other) { | 180 | public boolean equals(Object other) { |
162 | if (other == this) { | 181 | if (other == this) { | ... | ... |
... | @@ -34,6 +34,10 @@ public class InterfaceIpAddressTest { | ... | @@ -34,6 +34,10 @@ public class InterfaceIpAddressTest { |
34 | private static final IpAddress BROADCAST_ADDRESS = | 34 | private static final IpAddress BROADCAST_ADDRESS = |
35 | IpAddress.valueOf("1.2.0.255"); // NOTE: non-default broadcast | 35 | IpAddress.valueOf("1.2.0.255"); // NOTE: non-default broadcast |
36 | private static final IpAddress PEER_ADDRESS = IpAddress.valueOf("5.6.7.8"); | 36 | private static final IpAddress PEER_ADDRESS = IpAddress.valueOf("5.6.7.8"); |
37 | + private static final IpAddress DEF_BROADCAST_ADDRESS = | ||
38 | + IpAddress.valueOf("1.2.255.255"); // NOTE: default broadcast | ||
39 | + private static final IpPrefix V6_SUBNET_ADDRESS = | ||
40 | + IpPrefix.valueOf("::/64"); | ||
37 | 41 | ||
38 | private static final IpAddress IP_ADDRESS2 = IpAddress.valueOf("10.2.3.4"); | 42 | private static final IpAddress IP_ADDRESS2 = IpAddress.valueOf("10.2.3.4"); |
39 | private static final IpPrefix SUBNET_ADDRESS2 = | 43 | private static final IpPrefix SUBNET_ADDRESS2 = |
... | @@ -97,8 +101,16 @@ public class InterfaceIpAddressTest { | ... | @@ -97,8 +101,16 @@ public class InterfaceIpAddressTest { |
97 | new InterfaceIpAddress(IP_ADDRESS, SUBNET_ADDRESS); | 101 | new InterfaceIpAddress(IP_ADDRESS, SUBNET_ADDRESS); |
98 | assertThat(addr.ipAddress(), is(IP_ADDRESS)); | 102 | assertThat(addr.ipAddress(), is(IP_ADDRESS)); |
99 | assertThat(addr.subnetAddress(), is(SUBNET_ADDRESS)); | 103 | assertThat(addr.subnetAddress(), is(SUBNET_ADDRESS)); |
100 | - assertThat(addr.broadcastAddress(), nullValue()); | 104 | + assertThat(addr.broadcastAddress(), is(DEF_BROADCAST_ADDRESS)); |
101 | assertThat(addr.peerAddress(), nullValue()); | 105 | assertThat(addr.peerAddress(), nullValue()); |
106 | + | ||
107 | + IpPrefix subnetAddr = IpPrefix.valueOf("10.2.3.0/24"); | ||
108 | + InterfaceIpAddress addr1 = new InterfaceIpAddress(IP_ADDRESS2, subnetAddr); | ||
109 | + assertThat(addr1.broadcastAddress().toString(), is("10.2.3.255")); | ||
110 | + | ||
111 | + IpAddress ipAddress = IpAddress.valueOf("2001::4"); | ||
112 | + InterfaceIpAddress addr2 = new InterfaceIpAddress(ipAddress, V6_SUBNET_ADDRESS); | ||
113 | + assertThat(addr2.broadcastAddress(), is(nullValue())); | ||
102 | } | 114 | } |
103 | 115 | ||
104 | /** | 116 | /** |
... | @@ -144,7 +156,7 @@ public class InterfaceIpAddressTest { | ... | @@ -144,7 +156,7 @@ public class InterfaceIpAddressTest { |
144 | addr = new InterfaceIpAddress(IP_ADDRESS, SUBNET_ADDRESS); | 156 | addr = new InterfaceIpAddress(IP_ADDRESS, SUBNET_ADDRESS); |
145 | assertThat(addr.ipAddress().toString(), is("1.2.3.4")); | 157 | assertThat(addr.ipAddress().toString(), is("1.2.3.4")); |
146 | assertThat(addr.subnetAddress().toString(), is("1.2.0.0/16")); | 158 | assertThat(addr.subnetAddress().toString(), is("1.2.0.0/16")); |
147 | - assertThat(addr.broadcastAddress(), is(nullValue())); // TODO: Fix | 159 | + assertThat(addr.broadcastAddress(), is(DEF_BROADCAST_ADDRESS)); |
148 | assertThat(addr.peerAddress(), is(nullValue())); | 160 | assertThat(addr.peerAddress(), is(nullValue())); |
149 | 161 | ||
150 | // Interface address with non-default broadcast address | 162 | // Interface address with non-default broadcast address |
... | @@ -243,4 +255,11 @@ public class InterfaceIpAddressTest { | ... | @@ -243,4 +255,11 @@ public class InterfaceIpAddressTest { |
243 | assertThat(addr3, is(not(addr4))); | 255 | assertThat(addr3, is(not(addr4))); |
244 | } | 256 | } |
245 | 257 | ||
258 | + /** | ||
259 | + * Tests invalid class copy constructor for a null object to copy from. | ||
260 | + */ | ||
261 | + @Test(expected = IllegalArgumentException.class) | ||
262 | + public void testIllegalConstructorArgument() { | ||
263 | + InterfaceIpAddress toAddr = new InterfaceIpAddress(IP_ADDRESS, V6_SUBNET_ADDRESS); | ||
264 | + } | ||
246 | } | 265 | } | ... | ... |
-
Please register or login to post a comment