Committed by
Gerrit Code Review
[ONOS-4718] Initial implementation of LISP address deserializer
Change-Id: I522e16e7fd197380cf4c99038561fe9aa8f93730
Showing
16 changed files
with
744 additions
and
80 deletions
protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/exceptions/LispReaderException.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 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 | + */ | ||
| 16 | +package org.onosproject.lisp.msg.exceptions; | ||
| 17 | + | ||
| 18 | +/** | ||
| 19 | + * LISP address or message reader exception. | ||
| 20 | + */ | ||
| 21 | +public class LispReaderException extends Exception { | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * Constructor for LispReaderException. | ||
| 25 | + */ | ||
| 26 | + public LispReaderException() { | ||
| 27 | + super(); | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * Constructor for LispReaderException with message and cause parameters. | ||
| 32 | + * | ||
| 33 | + * @param message exception message | ||
| 34 | + * @param cause throwable cause | ||
| 35 | + */ | ||
| 36 | + public LispReaderException(final String message, final Throwable cause) { | ||
| 37 | + super(message, cause); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Constructor for LispReaderException with message parameter. | ||
| 42 | + * | ||
| 43 | + * @param message exception message | ||
| 44 | + */ | ||
| 45 | + public LispReaderException(final String message) { | ||
| 46 | + super(message); | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Constructor for LispReaderException with cause parameter. | ||
| 51 | + * | ||
| 52 | + * @param cause throwable cause | ||
| 53 | + */ | ||
| 54 | + public LispReaderException(final Throwable cause) { | ||
| 55 | + super(cause); | ||
| 56 | + } | ||
| 57 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 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 | + */ | ||
| 16 | +package org.onosproject.lisp.msg.types; | ||
| 17 | + | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | + * An interface for de-serializing LISP address. | ||
| 24 | + */ | ||
| 25 | +public interface LispAddressReader<T> { | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * Reads from byte buffer and de-serialize the LISP address. | ||
| 29 | + * | ||
| 30 | + * @param byteBuf byte buffer | ||
| 31 | + * @return LISP address type instance | ||
| 32 | + * @throws LispParseError LISP address parse error | ||
| 33 | + */ | ||
| 34 | + T readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException; | ||
| 35 | +} |
| ... | @@ -15,6 +15,11 @@ | ... | @@ -15,6 +15,11 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 21 | + | ||
| 22 | +import java.nio.ByteBuffer; | ||
| 18 | import java.util.Objects; | 23 | import java.util.Objects; |
| 19 | 24 | ||
| 20 | import static com.google.common.base.MoreObjects.toStringHelper; | 25 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -44,41 +49,35 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -44,41 +49,35 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 44 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 49 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 45 | * }</pre> | 50 | * }</pre> |
| 46 | */ | 51 | */ |
| 47 | -public class LispAppDataLcafAddress extends LispLcafAddress { | 52 | +public final class LispAppDataLcafAddress extends LispLcafAddress { |
| 48 | 53 | ||
| 49 | private final byte protocol; | 54 | private final byte protocol; |
| 50 | private final int ipTos; | 55 | private final int ipTos; |
| 51 | - private final short localPort; | 56 | + private final short localPortLow; |
| 52 | - private final short remotePort; | 57 | + private final short localPortHigh; |
| 58 | + private final short remotePortLow; | ||
| 59 | + private final short remotePortHigh; | ||
| 53 | private LispAfiAddress address; | 60 | private LispAfiAddress address; |
| 54 | 61 | ||
| 55 | /** | 62 | /** |
| 56 | - * Initializes application data type LCAF address. | 63 | + * @param protocol protocol number |
| 57 | - */ | 64 | + * @param ipTos IP type of service |
| 58 | - public LispAppDataLcafAddress() { | 65 | + * @param localPortLow low-ranged local port number |
| 59 | - super(LispCanonicalAddressFormatEnum.APPLICATION_DATA); | 66 | + * @param localPortHigh high-ranged local port number |
| 60 | - this.protocol = 0; | 67 | + * @param remotePortLow low-ranged remote port number |
| 61 | - this.ipTos = 0; | 68 | + * @param remotePortHigh high-ranged remote port number |
| 62 | - this.localPort = 0; | 69 | + * @param address address |
| 63 | - this.remotePort = 0; | ||
| 64 | - } | ||
| 65 | - | ||
| 66 | - /** | ||
| 67 | - * Initializes application data type LCAF address. | ||
| 68 | - * | ||
| 69 | - * @param protocol protocol number | ||
| 70 | - * @param ipTos ip type of service | ||
| 71 | - * @param localPort local port number | ||
| 72 | - * @param remotePort remote port number | ||
| 73 | - * @param address address | ||
| 74 | */ | 70 | */ |
| 75 | - public LispAppDataLcafAddress(byte protocol, int ipTos, short localPort, short remotePort, | 71 | + private LispAppDataLcafAddress(byte protocol, int ipTos, short localPortLow, |
| 76 | - LispAfiAddress address) { | 72 | + short localPortHigh, short remotePortLow, |
| 73 | + short remotePortHigh, LispAfiAddress address) { | ||
| 77 | super(LispCanonicalAddressFormatEnum.APPLICATION_DATA); | 74 | super(LispCanonicalAddressFormatEnum.APPLICATION_DATA); |
| 78 | this.protocol = protocol; | 75 | this.protocol = protocol; |
| 79 | this.ipTos = ipTos; | 76 | this.ipTos = ipTos; |
| 80 | - this.localPort = localPort; | 77 | + this.localPortLow = localPortLow; |
| 81 | - this.remotePort = remotePort; | 78 | + this.localPortHigh = localPortHigh; |
| 79 | + this.remotePortLow = remotePortLow; | ||
| 80 | + this.remotePortHigh = remotePortHigh; | ||
| 82 | this.address = address; | 81 | this.address = address; |
| 83 | } | 82 | } |
| 84 | 83 | ||
| ... | @@ -101,21 +100,39 @@ public class LispAppDataLcafAddress extends LispLcafAddress { | ... | @@ -101,21 +100,39 @@ public class LispAppDataLcafAddress extends LispLcafAddress { |
| 101 | } | 100 | } |
| 102 | 101 | ||
| 103 | /** | 102 | /** |
| 104 | - * Obtains local port number. | 103 | + * Obtains low-ranged local port number. |
| 104 | + * | ||
| 105 | + * @return low-ranged local port number | ||
| 106 | + */ | ||
| 107 | + public short getLocalPortLow() { | ||
| 108 | + return localPortLow; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + /** | ||
| 112 | + * Obtains high-ranged local port number. | ||
| 105 | * | 113 | * |
| 106 | - * @return local port number | 114 | + * @return high-ranged local port number |
| 107 | */ | 115 | */ |
| 108 | - public short getLocalPort() { | 116 | + public short getLocalPortHigh() { |
| 109 | - return localPort; | 117 | + return localPortHigh; |
| 110 | } | 118 | } |
| 111 | 119 | ||
| 112 | /** | 120 | /** |
| 113 | - * Obtains remote port number. | 121 | + * Obtains low-ranged remote port number. |
| 114 | * | 122 | * |
| 115 | - * @return remote port number | 123 | + * @return low-ranged remote port number |
| 116 | */ | 124 | */ |
| 117 | - public short getRemotePort() { | 125 | + public short getRemotePortLow() { |
| 118 | - return remotePort; | 126 | + return remotePortLow; |
| 127 | + } | ||
| 128 | + | ||
| 129 | + /** | ||
| 130 | + * Obtains high-ranged remote port number. | ||
| 131 | + * | ||
| 132 | + * @return high-ranged remote port number | ||
| 133 | + */ | ||
| 134 | + public short getRemotePortHigh() { | ||
| 135 | + return remotePortHigh; | ||
| 119 | } | 136 | } |
| 120 | 137 | ||
| 121 | /** | 138 | /** |
| ... | @@ -129,7 +146,8 @@ public class LispAppDataLcafAddress extends LispLcafAddress { | ... | @@ -129,7 +146,8 @@ public class LispAppDataLcafAddress extends LispLcafAddress { |
| 129 | 146 | ||
| 130 | @Override | 147 | @Override |
| 131 | public int hashCode() { | 148 | public int hashCode() { |
| 132 | - return Objects.hash(address, protocol, ipTos, localPort, remotePort); | 149 | + return Objects.hash(address, protocol, ipTos, localPortLow, |
| 150 | + localPortHigh, remotePortLow, remotePortHigh); | ||
| 133 | } | 151 | } |
| 134 | 152 | ||
| 135 | @Override | 153 | @Override |
| ... | @@ -143,8 +161,10 @@ public class LispAppDataLcafAddress extends LispLcafAddress { | ... | @@ -143,8 +161,10 @@ public class LispAppDataLcafAddress extends LispLcafAddress { |
| 143 | return Objects.equals(this.address, other.address) && | 161 | return Objects.equals(this.address, other.address) && |
| 144 | Objects.equals(this.protocol, other.protocol) && | 162 | Objects.equals(this.protocol, other.protocol) && |
| 145 | Objects.equals(this.ipTos, other.ipTos) && | 163 | Objects.equals(this.ipTos, other.ipTos) && |
| 146 | - Objects.equals(this.localPort, other.localPort) && | 164 | + Objects.equals(this.localPortLow, other.localPortLow) && |
| 147 | - Objects.equals(this.remotePort, other.remotePort); | 165 | + Objects.equals(this.localPortHigh, other.localPortHigh) && |
| 166 | + Objects.equals(this.remotePortLow, other.remotePortLow) && | ||
| 167 | + Objects.equals(this.remotePortHigh, other.remotePortHigh); | ||
| 148 | } | 168 | } |
| 149 | return false; | 169 | return false; |
| 150 | } | 170 | } |
| ... | @@ -155,8 +175,154 @@ public class LispAppDataLcafAddress extends LispLcafAddress { | ... | @@ -155,8 +175,154 @@ public class LispAppDataLcafAddress extends LispLcafAddress { |
| 155 | .add("address", address) | 175 | .add("address", address) |
| 156 | .add("protocol", protocol) | 176 | .add("protocol", protocol) |
| 157 | .add("ip type of service", ipTos) | 177 | .add("ip type of service", ipTos) |
| 158 | - .add("local port number", localPort) | 178 | + .add("low-ranged local port number", localPortLow) |
| 159 | - .add("remote port number", remotePort) | 179 | + .add("high-ranged local port number", localPortHigh) |
| 180 | + .add("low-ranged remote port number", remotePortLow) | ||
| 181 | + .add("high-ranged remote port number", remotePortHigh) | ||
| 160 | .toString(); | 182 | .toString(); |
| 161 | } | 183 | } |
| 184 | + | ||
| 185 | + public static final class AppDataAddressBuilder { | ||
| 186 | + private byte protocol; | ||
| 187 | + private int ipTos; | ||
| 188 | + private short localPortLow; | ||
| 189 | + private short localPortHigh; | ||
| 190 | + private short remotePortLow; | ||
| 191 | + private short remotePortHigh; | ||
| 192 | + private LispAfiAddress address; | ||
| 193 | + | ||
| 194 | + /** | ||
| 195 | + * Sets protocol number. | ||
| 196 | + * | ||
| 197 | + * @param protocol protocol number | ||
| 198 | + * @return AppDataAddressBuilder object | ||
| 199 | + */ | ||
| 200 | + AppDataAddressBuilder withProtocol(byte protocol) { | ||
| 201 | + this.protocol = protocol; | ||
| 202 | + return this; | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + /** | ||
| 206 | + * Sets IP type of service. | ||
| 207 | + * | ||
| 208 | + * @param ipTos IP type of service | ||
| 209 | + * @return AppDataAddressBuilder object | ||
| 210 | + */ | ||
| 211 | + AppDataAddressBuilder withIpTos(int ipTos) { | ||
| 212 | + this.ipTos = ipTos; | ||
| 213 | + return this; | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + /** | ||
| 217 | + * Sets low-ranged local port number. | ||
| 218 | + * | ||
| 219 | + * @param localPortLow low-ranged local port number | ||
| 220 | + * @return AppDataAddressBuilder object | ||
| 221 | + */ | ||
| 222 | + AppDataAddressBuilder withLocalPortLow(short localPortLow) { | ||
| 223 | + this.localPortLow = localPortLow; | ||
| 224 | + return this; | ||
| 225 | + } | ||
| 226 | + | ||
| 227 | + /** | ||
| 228 | + * Sets high-ranged local port number. | ||
| 229 | + * | ||
| 230 | + * @param localPortHigh high-ranged local port number | ||
| 231 | + * @return AppDataAddressBuilder object | ||
| 232 | + */ | ||
| 233 | + AppDataAddressBuilder withLocalPortHigh(short localPortHigh) { | ||
| 234 | + this.localPortHigh = localPortHigh; | ||
| 235 | + return this; | ||
| 236 | + } | ||
| 237 | + | ||
| 238 | + /** | ||
| 239 | + * Sets low-ranged remote port number. | ||
| 240 | + * | ||
| 241 | + * @param remotePortLow low-ranged remote port number | ||
| 242 | + * @return AppDataAddressBuilder object | ||
| 243 | + */ | ||
| 244 | + AppDataAddressBuilder withRemotePortLow(short remotePortLow) { | ||
| 245 | + this.remotePortLow = remotePortLow; | ||
| 246 | + return this; | ||
| 247 | + } | ||
| 248 | + | ||
| 249 | + /** | ||
| 250 | + * Sets high-ranged remote port number. | ||
| 251 | + * | ||
| 252 | + * @param remotePortHigh high-ranged remote port number | ||
| 253 | + * @return AppDataAddressBuilder object | ||
| 254 | + */ | ||
| 255 | + AppDataAddressBuilder withRemotePortHigh(short remotePortHigh) { | ||
| 256 | + this.remotePortHigh = remotePortHigh; | ||
| 257 | + return this; | ||
| 258 | + } | ||
| 259 | + | ||
| 260 | + /** | ||
| 261 | + * Sets AFI address. | ||
| 262 | + * | ||
| 263 | + * @param address AFI address | ||
| 264 | + * @return AppDataAddressBuilder object | ||
| 265 | + */ | ||
| 266 | + AppDataAddressBuilder withAddress(LispAfiAddress address) { | ||
| 267 | + this.address = address; | ||
| 268 | + return this; | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + /** | ||
| 272 | + * Builds LispAppDataLcafAddress instance. | ||
| 273 | + * | ||
| 274 | + * @return LispAddDataLcafAddress instance | ||
| 275 | + */ | ||
| 276 | + LispAppDataLcafAddress build() { | ||
| 277 | + return new LispAppDataLcafAddress(protocol, ipTos, localPortLow, | ||
| 278 | + localPortHigh, remotePortLow, remotePortHigh, address); | ||
| 279 | + } | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + /** | ||
| 283 | + * Application data LCAF address reader class. | ||
| 284 | + */ | ||
| 285 | + public static class AppDataLcafAddressReader | ||
| 286 | + implements LispAddressReader<LispAppDataLcafAddress> { | ||
| 287 | + | ||
| 288 | + @Override | ||
| 289 | + public LispAppDataLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException { | ||
| 290 | + | ||
| 291 | + byte[] ipTosByte = new byte[3]; | ||
| 292 | + byteBuf.readBytes(ipTosByte); | ||
| 293 | + | ||
| 294 | + byte protocol = (byte) byteBuf.readUnsignedByte(); | ||
| 295 | + int ipTos = getPartialInt(ipTosByte); | ||
| 296 | + short localPortLow = (short) byteBuf.readUnsignedShort(); | ||
| 297 | + short localPortHigh = (short) byteBuf.readUnsignedShort(); | ||
| 298 | + short remotePortLow = (short) byteBuf.readUnsignedShort(); | ||
| 299 | + short remotePortHigh = (short) byteBuf.readUnsignedShort(); | ||
| 300 | + | ||
| 301 | + LispAfiAddress address = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 302 | + | ||
| 303 | + return new AppDataAddressBuilder() | ||
| 304 | + .withProtocol(protocol) | ||
| 305 | + .withIpTos(ipTos) | ||
| 306 | + .withLocalPortLow(localPortLow) | ||
| 307 | + .withLocalPortHigh(localPortHigh) | ||
| 308 | + .withRemotePortLow(remotePortLow) | ||
| 309 | + .withRemotePortHigh(remotePortHigh) | ||
| 310 | + .withAddress(address) | ||
| 311 | + .build(); | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | + /** | ||
| 315 | + * A utility function that obtains the partial int value from byte arrays. | ||
| 316 | + * | ||
| 317 | + * @param bytes an array of bytes | ||
| 318 | + * @return converted integer | ||
| 319 | + */ | ||
| 320 | + public static int getPartialInt(byte[] bytes) { | ||
| 321 | + ByteBuffer buffer = ByteBuffer.allocate(4); | ||
| 322 | + buffer.position(4 - bytes.length); | ||
| 323 | + buffer.put(bytes); | ||
| 324 | + buffer.position(0); | ||
| 325 | + return buffer.getInt(); | ||
| 326 | + } | ||
| 327 | + } | ||
| 162 | } | 328 | } | ... | ... |
| ... | @@ -15,6 +15,10 @@ | ... | @@ -15,6 +15,10 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 21 | + | ||
| 18 | import java.util.Objects; | 22 | import java.util.Objects; |
| 19 | 23 | ||
| 20 | /** | 24 | /** |
| ... | @@ -73,4 +77,15 @@ public class LispAsAddress extends LispAfiAddress { | ... | @@ -73,4 +77,15 @@ public class LispAsAddress extends LispAfiAddress { |
| 73 | public String toString() { | 77 | public String toString() { |
| 74 | return String.valueOf(asNum); | 78 | return String.valueOf(asNum); |
| 75 | } | 79 | } |
| 80 | + | ||
| 81 | + /** | ||
| 82 | + * Autonomous system address reader class. | ||
| 83 | + */ | ||
| 84 | + public static class AsAddressReader implements LispAddressReader<LispAsAddress> { | ||
| 85 | + | ||
| 86 | + @Override | ||
| 87 | + public LispAsAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException { | ||
| 88 | + throw new LispReaderException("Unimplemented method"); | ||
| 89 | + } | ||
| 90 | + } | ||
| 76 | } | 91 | } | ... | ... |
| ... | @@ -15,6 +15,9 @@ | ... | @@ -15,6 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | + | ||
| 18 | import java.util.Objects; | 21 | import java.util.Objects; |
| 19 | 22 | ||
| 20 | import static com.google.common.base.MoreObjects.toStringHelper; | 23 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -69,4 +72,24 @@ public class LispDistinguishedNameAddress extends LispAfiAddress { | ... | @@ -69,4 +72,24 @@ public class LispDistinguishedNameAddress extends LispAfiAddress { |
| 69 | .add("distinguished name", distinguishedName) | 72 | .add("distinguished name", distinguishedName) |
| 70 | .toString(); | 73 | .toString(); |
| 71 | } | 74 | } |
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * Distinguished name address reader class. | ||
| 78 | + */ | ||
| 79 | + public static class DistinguishedNameAddressReader | ||
| 80 | + implements LispAddressReader<LispDistinguishedNameAddress> { | ||
| 81 | + | ||
| 82 | + @Override | ||
| 83 | + public LispDistinguishedNameAddress readFrom(ByteBuf byteBuf) throws LispParseError { | ||
| 84 | + | ||
| 85 | + StringBuilder sb = new StringBuilder(); | ||
| 86 | + byte character = byteBuf.readByte(); | ||
| 87 | + while (character != 0) { | ||
| 88 | + sb.append((char) character); | ||
| 89 | + character = byteBuf.readByte(); | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + return new LispDistinguishedNameAddress(sb.toString()); | ||
| 93 | + } | ||
| 94 | + } | ||
| 72 | } | 95 | } | ... | ... |
| ... | @@ -15,7 +15,10 @@ | ... | @@ -15,7 +15,10 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 18 | import org.onlab.packet.IpAddress; | 19 | import org.onlab.packet.IpAddress; |
| 20 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 21 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 19 | 22 | ||
| 20 | /** | 23 | /** |
| 21 | * IP address that is used by LISP Locator. | 24 | * IP address that is used by LISP Locator. |
| ... | @@ -58,4 +61,25 @@ public abstract class LispIpAddress extends LispAfiAddress { | ... | @@ -58,4 +61,25 @@ public abstract class LispIpAddress extends LispAfiAddress { |
| 58 | public String toString() { | 61 | public String toString() { |
| 59 | return address.toString(); | 62 | return address.toString(); |
| 60 | } | 63 | } |
| 64 | + | ||
| 65 | + /** | ||
| 66 | + * IP Address reader class. | ||
| 67 | + */ | ||
| 68 | + public static class IpAddressReader implements LispAddressReader<LispIpAddress> { | ||
| 69 | + | ||
| 70 | + @Override | ||
| 71 | + public LispIpAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException { | ||
| 72 | + | ||
| 73 | + // AFI code -> 16 bits | ||
| 74 | + short afiCode = (short) byteBuf.readUnsignedShort(); | ||
| 75 | + | ||
| 76 | + if (afiCode == 1) { | ||
| 77 | + return new LispIpv4Address.Ipv4AddressReader().readFrom(byteBuf); | ||
| 78 | + } else if (afiCode == 2) { | ||
| 79 | + return new LispIpv6Address.Ipv6AddressReader().readFrom(byteBuf); | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + return null; | ||
| 83 | + } | ||
| 84 | + } | ||
| 61 | } | 85 | } | ... | ... |
| ... | @@ -15,7 +15,9 @@ | ... | @@ -15,7 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 18 | import org.onlab.packet.IpAddress; | 19 | import org.onlab.packet.IpAddress; |
| 20 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 19 | 21 | ||
| 20 | import java.util.Objects; | 22 | import java.util.Objects; |
| 21 | 23 | ||
| ... | @@ -54,4 +56,22 @@ public class LispIpv4Address extends LispIpAddress { | ... | @@ -54,4 +56,22 @@ public class LispIpv4Address extends LispIpAddress { |
| 54 | public int hashCode() { | 56 | public int hashCode() { |
| 55 | return Objects.hash(address, getAfi()); | 57 | return Objects.hash(address, getAfi()); |
| 56 | } | 58 | } |
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * IPv4 address reader class. | ||
| 62 | + */ | ||
| 63 | + public static class Ipv4AddressReader implements LispAddressReader<LispIpv4Address> { | ||
| 64 | + | ||
| 65 | + private static final int SIZE_OF_IPV4_ADDRESS = 4; | ||
| 66 | + | ||
| 67 | + @Override | ||
| 68 | + public LispIpv4Address readFrom(ByteBuf byteBuf) throws LispParseError { | ||
| 69 | + | ||
| 70 | + byte[] ipByte = new byte[SIZE_OF_IPV4_ADDRESS]; | ||
| 71 | + byteBuf.readBytes(ipByte); | ||
| 72 | + IpAddress ipAddress = IpAddress.valueOf(IpAddress.Version.INET, ipByte); | ||
| 73 | + | ||
| 74 | + return new LispIpv4Address(ipAddress); | ||
| 75 | + } | ||
| 76 | + } | ||
| 57 | } | 77 | } | ... | ... |
| ... | @@ -15,7 +15,9 @@ | ... | @@ -15,7 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 18 | import org.onlab.packet.IpAddress; | 19 | import org.onlab.packet.IpAddress; |
| 20 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 19 | 21 | ||
| 20 | import java.util.Objects; | 22 | import java.util.Objects; |
| 21 | 23 | ||
| ... | @@ -54,4 +56,22 @@ public class LispIpv6Address extends LispIpAddress { | ... | @@ -54,4 +56,22 @@ public class LispIpv6Address extends LispIpAddress { |
| 54 | public int hashCode() { | 56 | public int hashCode() { |
| 55 | return Objects.hash(address, getAfi()); | 57 | return Objects.hash(address, getAfi()); |
| 56 | } | 58 | } |
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * IPv6 address reader class. | ||
| 62 | + */ | ||
| 63 | + public static class Ipv6AddressReader implements LispAddressReader<LispIpv6Address> { | ||
| 64 | + | ||
| 65 | + private static final int SIZE_OF_IPV6_ADDRESS = 16; | ||
| 66 | + | ||
| 67 | + @Override | ||
| 68 | + public LispIpv6Address readFrom(ByteBuf byteBuf) throws LispParseError { | ||
| 69 | + | ||
| 70 | + byte[] ipByte = new byte[SIZE_OF_IPV6_ADDRESS]; | ||
| 71 | + byteBuf.readBytes(ipByte); | ||
| 72 | + IpAddress ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, ipByte); | ||
| 73 | + | ||
| 74 | + return new LispIpv6Address(ipAddress); | ||
| 75 | + } | ||
| 76 | + } | ||
| 57 | } | 77 | } | ... | ... |
| ... | @@ -16,6 +16,9 @@ | ... | @@ -16,6 +16,9 @@ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | import com.google.common.collect.ImmutableList; | 18 | import com.google.common.collect.ImmutableList; |
| 19 | +import io.netty.buffer.ByteBuf; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 21 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 19 | 22 | ||
| 20 | import java.util.List; | 23 | import java.util.List; |
| 21 | import java.util.Objects; | 24 | import java.util.Objects; |
| ... | @@ -51,7 +54,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -51,7 +54,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 51 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 54 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 52 | * }</pre> | 55 | * }</pre> |
| 53 | */ | 56 | */ |
| 54 | -public class LispListLcafAddress extends LispLcafAddress { | 57 | +public final class LispListLcafAddress extends LispLcafAddress { |
| 55 | 58 | ||
| 56 | private static final byte LENGTH = 24; | 59 | private static final byte LENGTH = 24; |
| 57 | List<LispAfiAddress> addresses; | 60 | List<LispAfiAddress> addresses; |
| ... | @@ -99,4 +102,20 @@ public class LispListLcafAddress extends LispLcafAddress { | ... | @@ -99,4 +102,20 @@ public class LispListLcafAddress extends LispLcafAddress { |
| 99 | .add("addresses", addresses) | 102 | .add("addresses", addresses) |
| 100 | .toString(); | 103 | .toString(); |
| 101 | } | 104 | } |
| 105 | + | ||
| 106 | + /** | ||
| 107 | + * List LCAF address reader class. | ||
| 108 | + */ | ||
| 109 | + public static class ListLcafAddressReader implements LispAddressReader<LispListLcafAddress> { | ||
| 110 | + | ||
| 111 | + @Override | ||
| 112 | + public LispListLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException { | ||
| 113 | + | ||
| 114 | + | ||
| 115 | + LispAfiAddress ipv4 = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 116 | + LispAfiAddress ipv6 = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 117 | + | ||
| 118 | + return new LispListLcafAddress(ImmutableList.of(ipv4, ipv6)); | ||
| 119 | + } | ||
| 120 | + } | ||
| 102 | } | 121 | } | ... | ... |
| ... | @@ -15,7 +15,9 @@ | ... | @@ -15,7 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 18 | import org.onlab.packet.MacAddress; | 19 | import org.onlab.packet.MacAddress; |
| 20 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 19 | 21 | ||
| 20 | import java.util.Objects; | 22 | import java.util.Objects; |
| 21 | 23 | ||
| ... | @@ -68,4 +70,22 @@ public class LispMacAddress extends LispAfiAddress { | ... | @@ -68,4 +70,22 @@ public class LispMacAddress extends LispAfiAddress { |
| 68 | public String toString() { | 70 | public String toString() { |
| 69 | return address.toString(); | 71 | return address.toString(); |
| 70 | } | 72 | } |
| 73 | + | ||
| 74 | + /** | ||
| 75 | + * MAC address reader class. | ||
| 76 | + */ | ||
| 77 | + public static class MacAddressReader implements LispAddressReader<LispMacAddress> { | ||
| 78 | + | ||
| 79 | + private static final int SIZE_OF_MAC_ADDRESS = 6; | ||
| 80 | + | ||
| 81 | + @Override | ||
| 82 | + public LispMacAddress readFrom(ByteBuf byteBuf) throws LispParseError { | ||
| 83 | + | ||
| 84 | + byte[] macByte = new byte[SIZE_OF_MAC_ADDRESS]; | ||
| 85 | + byteBuf.readBytes(macByte); | ||
| 86 | + MacAddress macAddress = MacAddress.valueOf(macByte); | ||
| 87 | + | ||
| 88 | + return new LispMacAddress(macAddress); | ||
| 89 | + } | ||
| 90 | + } | ||
| 71 | } | 91 | } | ... | ... |
| ... | @@ -15,6 +15,9 @@ | ... | @@ -15,6 +15,9 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | + | ||
| 18 | /** | 21 | /** |
| 19 | * No address. | 22 | * No address. |
| 20 | */ | 23 | */ |
| ... | @@ -26,4 +29,15 @@ public class LispNoAddress extends LispAfiAddress { | ... | @@ -26,4 +29,15 @@ public class LispNoAddress extends LispAfiAddress { |
| 26 | public LispNoAddress() { | 29 | public LispNoAddress() { |
| 27 | super(AddressFamilyIdentifierEnum.NO_ADDRESS); | 30 | super(AddressFamilyIdentifierEnum.NO_ADDRESS); |
| 28 | } | 31 | } |
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * LISP no address reader class. | ||
| 35 | + */ | ||
| 36 | + public static class NoAddressReader implements LispAddressReader<LispNoAddress> { | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public LispNoAddress readFrom(ByteBuf byteBuf) throws LispParseError { | ||
| 40 | + return new LispNoAddress(); | ||
| 41 | + } | ||
| 42 | + } | ||
| 29 | } | 43 | } | ... | ... |
| ... | @@ -15,6 +15,10 @@ | ... | @@ -15,6 +15,10 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 21 | + | ||
| 18 | import java.util.Objects; | 22 | import java.util.Objects; |
| 19 | 23 | ||
| 20 | import static com.google.common.base.MoreObjects.toStringHelper; | 24 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -40,7 +44,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -40,7 +44,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 40 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 44 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 41 | * }</pre> | 45 | * }</pre> |
| 42 | */ | 46 | */ |
| 43 | -public class LispSegmentLcafAddress extends LispLcafAddress { | 47 | +public final class LispSegmentLcafAddress extends LispLcafAddress { |
| 44 | 48 | ||
| 45 | private final LispAfiAddress address; | 49 | private final LispAfiAddress address; |
| 46 | private final int instanceId; | 50 | private final int instanceId; |
| ... | @@ -52,7 +56,7 @@ public class LispSegmentLcafAddress extends LispLcafAddress { | ... | @@ -52,7 +56,7 @@ public class LispSegmentLcafAddress extends LispLcafAddress { |
| 52 | * @param instanceId instance id | 56 | * @param instanceId instance id |
| 53 | * @param address address | 57 | * @param address address |
| 54 | */ | 58 | */ |
| 55 | - public LispSegmentLcafAddress(byte idMaskLength, int instanceId, LispAfiAddress address) { | 59 | + private LispSegmentLcafAddress(byte idMaskLength, int instanceId, LispAfiAddress address) { |
| 56 | super(LispCanonicalAddressFormatEnum.SEGMENT, idMaskLength); | 60 | super(LispCanonicalAddressFormatEnum.SEGMENT, idMaskLength); |
| 57 | this.address = address; | 61 | this.address = address; |
| 58 | this.instanceId = instanceId; | 62 | this.instanceId = instanceId; |
| ... | @@ -113,4 +117,75 @@ public class LispSegmentLcafAddress extends LispLcafAddress { | ... | @@ -113,4 +117,75 @@ public class LispSegmentLcafAddress extends LispLcafAddress { |
| 113 | .add("idMaskLength", reserved2) | 117 | .add("idMaskLength", reserved2) |
| 114 | .toString(); | 118 | .toString(); |
| 115 | } | 119 | } |
| 120 | + | ||
| 121 | + public static final class SegmentAddressBuilder { | ||
| 122 | + private byte idMaskLength; | ||
| 123 | + private LispAfiAddress address; | ||
| 124 | + private int instanceId; | ||
| 125 | + | ||
| 126 | + /** | ||
| 127 | + * Sets identifier mask length. | ||
| 128 | + * | ||
| 129 | + * @param idMaskLength identifier mask length | ||
| 130 | + * @return SegmentAddressBuilder object | ||
| 131 | + */ | ||
| 132 | + public SegmentAddressBuilder withIdMaskLength(byte idMaskLength) { | ||
| 133 | + this.idMaskLength = idMaskLength; | ||
| 134 | + return this; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + /** | ||
| 138 | + * Sets instance identifer. | ||
| 139 | + * | ||
| 140 | + * @param instanceId instance identifier | ||
| 141 | + * @return SegmentAddressBuilder object | ||
| 142 | + */ | ||
| 143 | + public SegmentAddressBuilder withInstanceId(int instanceId) { | ||
| 144 | + this.instanceId = instanceId; | ||
| 145 | + return this; | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + /** | ||
| 149 | + * Sets AFI address. | ||
| 150 | + * | ||
| 151 | + * @param address AFI address | ||
| 152 | + * @return SegmentAddressBuilder object | ||
| 153 | + */ | ||
| 154 | + public SegmentAddressBuilder withAddress(LispAfiAddress address) { | ||
| 155 | + this.address = address; | ||
| 156 | + return this; | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + /** | ||
| 160 | + * Builds LispSegmentLcafAddress instance. | ||
| 161 | + * | ||
| 162 | + * @return LispSegmentLcafAddress instance | ||
| 163 | + */ | ||
| 164 | + public LispSegmentLcafAddress build() { | ||
| 165 | + return new LispSegmentLcafAddress(idMaskLength, instanceId, address); | ||
| 166 | + } | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + /** | ||
| 170 | + * Segment LCAF address reader class. | ||
| 171 | + */ | ||
| 172 | + public static class SegmentLcafAddressReader | ||
| 173 | + implements LispAddressReader<LispSegmentLcafAddress> { | ||
| 174 | + | ||
| 175 | + @Override | ||
| 176 | + public LispSegmentLcafAddress readFrom(ByteBuf byteBuf) | ||
| 177 | + throws LispParseError, LispReaderException { | ||
| 178 | + | ||
| 179 | + // TODO: need to de-serialize IdMaskLength | ||
| 180 | + byte idMaskLength = 0x01; | ||
| 181 | + int instanceId = (int) byteBuf.readUnsignedInt(); | ||
| 182 | + LispAfiAddress address = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 183 | + | ||
| 184 | + return new SegmentAddressBuilder() | ||
| 185 | + .withIdMaskLength(idMaskLength) | ||
| 186 | + .withInstanceId(instanceId) | ||
| 187 | + .withAddress(address) | ||
| 188 | + .build(); | ||
| 189 | + } | ||
| 190 | + } | ||
| 116 | } | 191 | } | ... | ... |
| ... | @@ -15,6 +15,10 @@ | ... | @@ -15,6 +15,10 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.lisp.msg.types; | 16 | package org.onosproject.lisp.msg.types; |
| 17 | 17 | ||
| 18 | +import io.netty.buffer.ByteBuf; | ||
| 19 | +import org.onosproject.lisp.msg.exceptions.LispParseError; | ||
| 20 | +import org.onosproject.lisp.msg.exceptions.LispReaderException; | ||
| 21 | + | ||
| 18 | import java.util.Objects; | 22 | import java.util.Objects; |
| 19 | 23 | ||
| 20 | import static com.google.common.base.MoreObjects.toStringHelper; | 24 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -42,37 +46,27 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -42,37 +46,27 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 42 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 46 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 43 | * }</pre> | 47 | * }</pre> |
| 44 | */ | 48 | */ |
| 45 | -public class LispSourceDestLcafAddress extends LispLcafAddress { | 49 | +public final class LispSourceDestLcafAddress extends LispLcafAddress { |
| 46 | 50 | ||
| 47 | - private LispAfiAddress srcPrefix; | 51 | + private final LispAfiAddress srcPrefix; |
| 48 | - private LispAfiAddress dstPrefix; | 52 | + private final LispAfiAddress dstPrefix; |
| 49 | private final byte srcMaskLength; | 53 | private final byte srcMaskLength; |
| 50 | private final byte dstMaskLength; | 54 | private final byte dstMaskLength; |
| 51 | private final short reserved; | 55 | private final short reserved; |
| 52 | 56 | ||
| 53 | /** | 57 | /** |
| 54 | * Initializes source/dest key type LCAF address. | 58 | * Initializes source/dest key type LCAF address. |
| 55 | - */ | ||
| 56 | - public LispSourceDestLcafAddress() { | ||
| 57 | - super(LispCanonicalAddressFormatEnum.SOURCE_DEST); | ||
| 58 | - srcMaskLength = 0; | ||
| 59 | - dstMaskLength = 0; | ||
| 60 | - reserved = 0; | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - /** | ||
| 64 | - * Initializes source/dest key type LCAF address. | ||
| 65 | * | 59 | * |
| 66 | - * @param reserved reserved | 60 | + * @param reserved reserved |
| 67 | * @param srcMaskLength source mask length | 61 | * @param srcMaskLength source mask length |
| 68 | * @param dstMaskLength destination mask length | 62 | * @param dstMaskLength destination mask length |
| 69 | - * @param srcPrefix source address prefix | 63 | + * @param srcPrefix source address prefix |
| 70 | - * @param dstPrefix destination address prefix | 64 | + * @param dstPrefix destination address prefix |
| 71 | */ | 65 | */ |
| 72 | - public LispSourceDestLcafAddress(short reserved, byte srcMaskLength, | 66 | + private LispSourceDestLcafAddress(short reserved, byte srcMaskLength, |
| 73 | - byte dstMaskLength, | 67 | + byte dstMaskLength, |
| 74 | - LispAfiAddress srcPrefix, | 68 | + LispAfiAddress srcPrefix, |
| 75 | - LispAfiAddress dstPrefix) { | 69 | + LispAfiAddress dstPrefix) { |
| 76 | super(LispCanonicalAddressFormatEnum.SOURCE_DEST); | 70 | super(LispCanonicalAddressFormatEnum.SOURCE_DEST); |
| 77 | this.reserved = reserved; | 71 | this.reserved = reserved; |
| 78 | this.srcMaskLength = srcMaskLength; | 72 | this.srcMaskLength = srcMaskLength; |
| ... | @@ -140,10 +134,10 @@ public class LispSourceDestLcafAddress extends LispLcafAddress { | ... | @@ -140,10 +134,10 @@ public class LispSourceDestLcafAddress extends LispLcafAddress { |
| 140 | if (obj instanceof LispSourceDestLcafAddress) { | 134 | if (obj instanceof LispSourceDestLcafAddress) { |
| 141 | final LispSourceDestLcafAddress other = (LispSourceDestLcafAddress) obj; | 135 | final LispSourceDestLcafAddress other = (LispSourceDestLcafAddress) obj; |
| 142 | return Objects.equals(this.srcPrefix, other.srcPrefix) && | 136 | return Objects.equals(this.srcPrefix, other.srcPrefix) && |
| 143 | - Objects.equals(this.dstPrefix, other.dstPrefix) && | 137 | + Objects.equals(this.dstPrefix, other.dstPrefix) && |
| 144 | - Objects.equals(this.srcMaskLength, other.srcMaskLength) && | 138 | + Objects.equals(this.srcMaskLength, other.srcMaskLength) && |
| 145 | - Objects.equals(this.dstMaskLength, other.dstMaskLength) && | 139 | + Objects.equals(this.dstMaskLength, other.dstMaskLength) && |
| 146 | - Objects.equals(this.reserved, other.reserved); | 140 | + Objects.equals(this.reserved, other.reserved); |
| 147 | } | 141 | } |
| 148 | return false; | 142 | return false; |
| 149 | } | 143 | } |
| ... | @@ -158,4 +152,103 @@ public class LispSourceDestLcafAddress extends LispLcafAddress { | ... | @@ -158,4 +152,103 @@ public class LispSourceDestLcafAddress extends LispLcafAddress { |
| 158 | .add("reserved", reserved) | 152 | .add("reserved", reserved) |
| 159 | .toString(); | 153 | .toString(); |
| 160 | } | 154 | } |
| 155 | + | ||
| 156 | + public static final class SourceDestAddressBuilder { | ||
| 157 | + private LispAfiAddress srcPrefix; | ||
| 158 | + private LispAfiAddress dstPrefix; | ||
| 159 | + private byte srcMaskLength; | ||
| 160 | + private byte dstMaskLength; | ||
| 161 | + private short reserved; | ||
| 162 | + | ||
| 163 | + /** | ||
| 164 | + * Sets source address prefix. | ||
| 165 | + * | ||
| 166 | + * @param srcPrefix source prefix | ||
| 167 | + * @return SourceDestAddressBuilder object | ||
| 168 | + */ | ||
| 169 | + public SourceDestAddressBuilder withSrcPrefix(LispAfiAddress srcPrefix) { | ||
| 170 | + this.srcPrefix = srcPrefix; | ||
| 171 | + return this; | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + /** | ||
| 175 | + * Sets destination address prefix. | ||
| 176 | + * | ||
| 177 | + * @param dstPrefix | ||
| 178 | + * @return SourceDestAddressBuilder object | ||
| 179 | + */ | ||
| 180 | + public SourceDestAddressBuilder withDstPrefix(LispAfiAddress dstPrefix) { | ||
| 181 | + this.dstPrefix = dstPrefix; | ||
| 182 | + return this; | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + /** | ||
| 186 | + * Sets source mask length. | ||
| 187 | + * | ||
| 188 | + * @param srcMaskLength source mask length | ||
| 189 | + * @return SourceDestAddressBuilder object | ||
| 190 | + */ | ||
| 191 | + public SourceDestAddressBuilder withSrcMaskLength(byte srcMaskLength) { | ||
| 192 | + this.srcMaskLength = srcMaskLength; | ||
| 193 | + return this; | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + /** | ||
| 197 | + * Sets destination mask length. | ||
| 198 | + * | ||
| 199 | + * @param dstMaskLength destination mask length | ||
| 200 | + * @return SourceDestAddressBuilder object | ||
| 201 | + */ | ||
| 202 | + public SourceDestAddressBuilder withDstMaskLength(byte dstMaskLength) { | ||
| 203 | + this.dstMaskLength = dstMaskLength; | ||
| 204 | + return this; | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + /** | ||
| 208 | + * Sets reserved value. | ||
| 209 | + * | ||
| 210 | + * @param reserved reserved field value | ||
| 211 | + * @return SourceDestAddressBuilder object | ||
| 212 | + */ | ||
| 213 | + public SourceDestAddressBuilder withReserved(short reserved) { | ||
| 214 | + this.reserved = reserved; | ||
| 215 | + return this; | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + /** | ||
| 219 | + * Builds LispSourceDestLcafAddress instance. | ||
| 220 | + * | ||
| 221 | + * @return LispSourceDestLcafAddress instance | ||
| 222 | + */ | ||
| 223 | + public LispSourceDestLcafAddress build() { | ||
| 224 | + return new LispSourceDestLcafAddress(reserved, srcMaskLength, | ||
| 225 | + dstMaskLength, srcPrefix, dstPrefix); | ||
| 226 | + } | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + /** | ||
| 230 | + * SourceDest LCAF address reader class. | ||
| 231 | + */ | ||
| 232 | + public static class SourceDestLcafAddressReader | ||
| 233 | + implements LispAddressReader<LispSourceDestLcafAddress> { | ||
| 234 | + | ||
| 235 | + @Override | ||
| 236 | + public LispSourceDestLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException { | ||
| 237 | + | ||
| 238 | + short reserved = byteBuf.readShort(); | ||
| 239 | + byte srcMaskLength = (byte) byteBuf.readUnsignedByte(); | ||
| 240 | + byte dstMaskLength = (byte) byteBuf.readUnsignedByte(); | ||
| 241 | + | ||
| 242 | + LispAfiAddress srcPrefix = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 243 | + LispAfiAddress dstPrefix = new LispIpAddress.IpAddressReader().readFrom(byteBuf); | ||
| 244 | + | ||
| 245 | + return new SourceDestAddressBuilder() | ||
| 246 | + .withReserved(reserved) | ||
| 247 | + .withSrcMaskLength(srcMaskLength) | ||
| 248 | + .withDstMaskLength(dstMaskLength) | ||
| 249 | + .withSrcPrefix(srcPrefix) | ||
| 250 | + .withDstPrefix(dstPrefix) | ||
| 251 | + .build(); | ||
| 252 | + } | ||
| 253 | + } | ||
| 161 | } | 254 | } | ... | ... |
| ... | @@ -35,13 +35,48 @@ public class LispAppDataLcafAddressTest { | ... | @@ -35,13 +35,48 @@ public class LispAppDataLcafAddressTest { |
| 35 | @Before | 35 | @Before |
| 36 | public void setup() { | 36 | public void setup() { |
| 37 | 37 | ||
| 38 | + LispAppDataLcafAddress.AppDataAddressBuilder builder1 = | ||
| 39 | + new LispAppDataLcafAddress.AppDataAddressBuilder(); | ||
| 40 | + | ||
| 38 | LispAfiAddress ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); | 41 | LispAfiAddress ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); |
| 39 | - address1 = new LispAppDataLcafAddress((byte) 0x01, 1, (short) 10, (short) 20, ipv4Address1); | ||
| 40 | 42 | ||
| 41 | - sameAsAddress1 = new LispAppDataLcafAddress((byte) 0x01, 1, (short) 10, (short) 20, ipv4Address1); | 43 | + address1 = builder1 |
| 44 | + .withProtocol((byte) 0x01) | ||
| 45 | + .withIpTos((short) 10) | ||
| 46 | + .withLocalPortLow((short) 1) | ||
| 47 | + .withLocalPortHigh((short) 255) | ||
| 48 | + .withRemotePortLow((short) 2) | ||
| 49 | + .withRemotePortHigh((short) 254) | ||
| 50 | + .withAddress(ipv4Address1) | ||
| 51 | + .build(); | ||
| 52 | + | ||
| 53 | + LispAppDataLcafAddress.AppDataAddressBuilder builder2 = | ||
| 54 | + new LispAppDataLcafAddress.AppDataAddressBuilder(); | ||
| 55 | + | ||
| 56 | + sameAsAddress1 = builder2 | ||
| 57 | + .withProtocol((byte) 0x01) | ||
| 58 | + .withIpTos((short) 10) | ||
| 59 | + .withLocalPortLow((short) 1) | ||
| 60 | + .withLocalPortHigh((short) 255) | ||
| 61 | + .withRemotePortLow((short) 2) | ||
| 62 | + .withRemotePortHigh((short) 254) | ||
| 63 | + .withAddress(ipv4Address1) | ||
| 64 | + .build(); | ||
| 65 | + | ||
| 66 | + LispAppDataLcafAddress.AppDataAddressBuilder builder3 = | ||
| 67 | + new LispAppDataLcafAddress.AppDataAddressBuilder(); | ||
| 42 | 68 | ||
| 43 | LispAfiAddress ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); | 69 | LispAfiAddress ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); |
| 44 | - address2 = new LispAppDataLcafAddress((byte) 0x02, 2, (short) 20, (short) 40, ipv4Address2); | 70 | + |
| 71 | + address2 = builder3 | ||
| 72 | + .withProtocol((byte) 0x02) | ||
| 73 | + .withIpTos((short) 20) | ||
| 74 | + .withLocalPortLow((short) 1) | ||
| 75 | + .withLocalPortHigh((short) 255) | ||
| 76 | + .withRemotePortLow((short) 2) | ||
| 77 | + .withRemotePortHigh((short) 254) | ||
| 78 | + .withAddress(ipv4Address2) | ||
| 79 | + .build(); | ||
| 45 | } | 80 | } |
| 46 | 81 | ||
| 47 | @Test | 82 | @Test |
| ... | @@ -58,9 +93,11 @@ public class LispAppDataLcafAddressTest { | ... | @@ -58,9 +93,11 @@ public class LispAppDataLcafAddressTest { |
| 58 | LispAfiAddress ipv4Address = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); | 93 | LispAfiAddress ipv4Address = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); |
| 59 | 94 | ||
| 60 | assertThat(appDataLcafAddress.getProtocol(), is((byte) 0x01)); | 95 | assertThat(appDataLcafAddress.getProtocol(), is((byte) 0x01)); |
| 61 | - assertThat(appDataLcafAddress.getIpTos(), is(1)); | 96 | + assertThat(appDataLcafAddress.getIpTos(), is(10)); |
| 62 | - assertThat(appDataLcafAddress.getLocalPort(), is((short) 10)); | 97 | + assertThat(appDataLcafAddress.getLocalPortLow(), is((short) 1)); |
| 63 | - assertThat(appDataLcafAddress.getRemotePort(), is((short) 20)); | 98 | + assertThat(appDataLcafAddress.getLocalPortHigh(), is((short) 255)); |
| 99 | + assertThat(appDataLcafAddress.getRemotePortLow(), is((short) 2)); | ||
| 100 | + assertThat(appDataLcafAddress.getRemotePortHigh(), is((short) 254)); | ||
| 64 | assertThat(appDataLcafAddress.getAddress(), is(ipv4Address)); | 101 | assertThat(appDataLcafAddress.getAddress(), is(ipv4Address)); |
| 65 | } | 102 | } |
| 66 | } | 103 | } | ... | ... |
| ... | @@ -35,13 +35,35 @@ public class LispSegmentLcafAddressTest { | ... | @@ -35,13 +35,35 @@ public class LispSegmentLcafAddressTest { |
| 35 | @Before | 35 | @Before |
| 36 | public void setup() { | 36 | public void setup() { |
| 37 | 37 | ||
| 38 | + LispSegmentLcafAddress.SegmentAddressBuilder builder1 = | ||
| 39 | + new LispSegmentLcafAddress.SegmentAddressBuilder(); | ||
| 40 | + | ||
| 38 | LispIpv4Address ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); | 41 | LispIpv4Address ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); |
| 39 | - address1 = new LispSegmentLcafAddress((byte) 0x01, 1, ipv4Address1); | ||
| 40 | 42 | ||
| 41 | - sameAsAddress1 = new LispSegmentLcafAddress((byte) 0x01, 1, ipv4Address1); | 43 | + address1 = builder1 |
| 44 | + .withIdMaskLength((byte) 0x01) | ||
| 45 | + .withInstanceId(1) | ||
| 46 | + .withAddress(ipv4Address1) | ||
| 47 | + .build(); | ||
| 48 | + | ||
| 49 | + LispSegmentLcafAddress.SegmentAddressBuilder builder2 = | ||
| 50 | + new LispSegmentLcafAddress.SegmentAddressBuilder(); | ||
| 51 | + | ||
| 52 | + sameAsAddress1 = builder2 | ||
| 53 | + .withIdMaskLength((byte) 0x01) | ||
| 54 | + .withInstanceId(1) | ||
| 55 | + .withAddress(ipv4Address1) | ||
| 56 | + .build(); | ||
| 57 | + | ||
| 58 | + LispSegmentLcafAddress.SegmentAddressBuilder builder3 = | ||
| 59 | + new LispSegmentLcafAddress.SegmentAddressBuilder(); | ||
| 42 | 60 | ||
| 43 | LispIpv4Address ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); | 61 | LispIpv4Address ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); |
| 44 | - address2 = new LispSegmentLcafAddress((byte) 0x02, 2, ipv4Address2); | 62 | + address2 = builder3 |
| 63 | + .withIdMaskLength((byte) 0x02) | ||
| 64 | + .withInstanceId(2) | ||
| 65 | + .withAddress(ipv4Address2) | ||
| 66 | + .build(); | ||
| 45 | } | 67 | } |
| 46 | 68 | ||
| 47 | @Test | 69 | @Test | ... | ... |
| ... | @@ -35,20 +35,44 @@ public class LispSourceDestLcafAddressTest { | ... | @@ -35,20 +35,44 @@ public class LispSourceDestLcafAddressTest { |
| 35 | @Before | 35 | @Before |
| 36 | public void setup() { | 36 | public void setup() { |
| 37 | 37 | ||
| 38 | + LispSourceDestLcafAddress.SourceDestAddressBuilder builder1 = | ||
| 39 | + new LispSourceDestLcafAddress.SourceDestAddressBuilder(); | ||
| 40 | + | ||
| 38 | LispIpv4Address srcAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); | 41 | LispIpv4Address srcAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1")); |
| 39 | LispIpv4Address dstAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2")); | 42 | LispIpv4Address dstAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2")); |
| 40 | 43 | ||
| 41 | - address1 = new LispSourceDestLcafAddress((short) 1, (byte) 0x01, | 44 | + address1 = builder1 |
| 42 | - (byte) 0x01, srcAddress1, dstAddress1); | 45 | + .withReserved((short) 1) |
| 46 | + .withSrcMaskLength((byte) 0x01) | ||
| 47 | + .withDstMaskLength((byte) 0x01) | ||
| 48 | + .withSrcPrefix(srcAddress1) | ||
| 49 | + .withDstPrefix(dstAddress1) | ||
| 50 | + .build(); | ||
| 51 | + | ||
| 52 | + LispSourceDestLcafAddress.SourceDestAddressBuilder builder2 = | ||
| 53 | + new LispSourceDestLcafAddress.SourceDestAddressBuilder(); | ||
| 54 | + | ||
| 55 | + sameAsAddress1 = builder2 | ||
| 56 | + .withReserved((short) 1) | ||
| 57 | + .withSrcMaskLength((byte) 0x01) | ||
| 58 | + .withDstMaskLength((byte) 0x01) | ||
| 59 | + .withSrcPrefix(srcAddress1) | ||
| 60 | + .withDstPrefix(dstAddress1) | ||
| 61 | + .build(); | ||
| 43 | 62 | ||
| 44 | - sameAsAddress1 = new LispSourceDestLcafAddress((short) 1, (byte) 0x01, | 63 | + LispSourceDestLcafAddress.SourceDestAddressBuilder builder3 = |
| 45 | - (byte) 0x01, srcAddress1, dstAddress1); | 64 | + new LispSourceDestLcafAddress.SourceDestAddressBuilder(); |
| 46 | 65 | ||
| 47 | LispIpv4Address srcAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); | 66 | LispIpv4Address srcAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1")); |
| 48 | LispIpv4Address dstAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.2")); | 67 | LispIpv4Address dstAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.2")); |
| 49 | 68 | ||
| 50 | - address2 = new LispSourceDestLcafAddress((short) 2, (byte) 0x02, | 69 | + address2 = builder3 |
| 51 | - (byte) 0x02, srcAddress2, dstAddress2); | 70 | + .withReserved((short) 2) |
| 71 | + .withSrcMaskLength((byte) 0x02) | ||
| 72 | + .withDstMaskLength((byte) 0x02) | ||
| 73 | + .withSrcPrefix(srcAddress2) | ||
| 74 | + .withDstPrefix(dstAddress2) | ||
| 75 | + .build(); | ||
| 52 | } | 76 | } |
| 53 | 77 | ||
| 54 | @Test | 78 | @Test | ... | ... |
-
Please register or login to post a comment