blob: 920d35640004c0c492dc79511f38776577acfcf8 [file] [log] [blame]
Jian Li09596002016-07-15 17:46:49 +09001/*
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 */
Jian Lif31019a2017-02-05 07:57:46 +090016package org.onosproject.lisp.msg.types.lcaf;
Jian Li09596002016-07-15 17:46:49 +090017
Jian Lia7b394d2016-08-21 23:11:46 +090018import io.netty.buffer.ByteBuf;
19import org.onosproject.lisp.msg.exceptions.LispParseError;
20import org.onosproject.lisp.msg.exceptions.LispReaderException;
GUNiba871702016-08-22 21:06:02 +090021import org.onosproject.lisp.msg.exceptions.LispWriterException;
Jian Lif31019a2017-02-05 07:57:46 +090022import org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum;
23import org.onosproject.lisp.msg.types.LispAddressReader;
24import org.onosproject.lisp.msg.types.LispAddressWriter;
25import org.onosproject.lisp.msg.types.LispAfiAddress;
Jian Lid4e63702016-08-30 18:29:20 +090026import org.slf4j.Logger;
27import org.slf4j.LoggerFactory;
Jian Lia7b394d2016-08-21 23:11:46 +090028
Jian Li09596002016-07-15 17:46:49 +090029import java.util.Objects;
30
31import static com.google.common.base.MoreObjects.toStringHelper;
Jian Lif31019a2017-02-05 07:57:46 +090032import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.APPLICATION_DATA;
33import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.LIST;
Jian Li2af9eaa2017-02-05 09:15:07 +090034import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.MULTICAST;
Jian Lif31019a2017-02-05 07:57:46 +090035import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.NAT;
Jian Li3ff578d2017-02-05 15:34:37 +090036import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.NONCE;
Jian Lif31019a2017-02-05 07:57:46 +090037import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.SEGMENT;
38import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.SOURCE_DEST;
39import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING;
Jian Li55ddcdb2016-11-21 17:04:01 +090040
Jian Li09596002016-07-15 17:46:49 +090041
42/**
43 * LISP Canonical Address Formatted address class.
Jian Lib9e1ac72016-11-07 21:15:17 +090044 * <p>
Jian Li8fc2d2f2016-08-08 14:43:53 +090045 * <pre>
46 * {@literal
Jian Lic7e20a52016-07-18 19:03:49 +090047 * 0 1 2 3
48 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * | AFI = 16387 | Rsvd1 | Flags |
51 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 * | Type | Rsvd2 | Length |
53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Jian Li8fc2d2f2016-08-08 14:43:53 +090054 * }</pre>
Jian Li09596002016-07-15 17:46:49 +090055 */
56public class LispLcafAddress extends LispAfiAddress {
57
Jian Lid4e63702016-08-30 18:29:20 +090058 private static final Logger log = LoggerFactory.getLogger(LispLcafAddress.class);
59
Jian Lia7b394d2016-08-21 23:11:46 +090060 private final LispCanonicalAddressFormatEnum lcafType;
61 private final byte reserved1;
62 private final byte reserved2;
63 private final byte flag;
64 private final short length;
Jian Li09596002016-07-15 17:46:49 +090065
Jian Lib9e1ac72016-11-07 21:15:17 +090066 private static final int LCAF_AFI_CODE_BYTE_LENGTH = 2;
67
Jian Lief0f7232016-11-15 19:55:46 +090068 private static final int LENGTH_FIELD_INDEX = 7;
69 public static final int COMMON_HEADER_SIZE = 8;
70
Jian Li09596002016-07-15 17:46:49 +090071 /**
72 * Initializes LCAF address.
73 *
Jian Lib9e1ac72016-11-07 21:15:17 +090074 * @param lcafType LCAF type
Jian Lic7e20a52016-07-18 19:03:49 +090075 * @param reserved1 reserved1 field
76 * @param reserved2 reserved2 field
Jian Lib9e1ac72016-11-07 21:15:17 +090077 * @param flag flag field
78 * @param length length field
Jian Li09596002016-07-15 17:46:49 +090079 */
Jian Lic7e20a52016-07-18 19:03:49 +090080 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType,
Jian Lia7b394d2016-08-21 23:11:46 +090081 byte reserved1, byte reserved2, byte flag, short length) {
Jian Li09596002016-07-15 17:46:49 +090082 super(AddressFamilyIdentifierEnum.LCAF);
83 this.lcafType = lcafType;
Jian Lic7e20a52016-07-18 19:03:49 +090084 this.reserved1 = reserved1;
85 this.reserved2 = reserved2;
86 this.flag = flag;
87 this.length = length;
88 }
89
90 /**
91 * Initializes LCAF address.
92 *
Jian Lib9e1ac72016-11-07 21:15:17 +090093 * @param lcafType LCAF type
Jian Lic7e20a52016-07-18 19:03:49 +090094 * @param reserved2 reserved2 field
Jian Lib9e1ac72016-11-07 21:15:17 +090095 * @param flag flag field
96 * @param length length field
Jian Lic7e20a52016-07-18 19:03:49 +090097 */
98 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType,
Jian Lia7b394d2016-08-21 23:11:46 +090099 byte reserved2, byte flag, short length) {
Jian Lic7e20a52016-07-18 19:03:49 +0900100 super(AddressFamilyIdentifierEnum.LCAF);
101 this.lcafType = lcafType;
102 this.reserved2 = reserved2;
103 this.flag = flag;
104 this.length = length;
105 this.reserved1 = 0;
106 }
107
108 /**
109 * Initializes LCAF address.
110 *
Jian Lib9e1ac72016-11-07 21:15:17 +0900111 * @param lcafType LCAF type
Jian Lic7e20a52016-07-18 19:03:49 +0900112 * @param reserved2 reserved2 field
Jian Lib9e1ac72016-11-07 21:15:17 +0900113 * @param length length field
Jian Lic7e20a52016-07-18 19:03:49 +0900114 */
115 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType,
Jian Lia7b394d2016-08-21 23:11:46 +0900116 byte reserved2, short length) {
Jian Lic7e20a52016-07-18 19:03:49 +0900117 super(AddressFamilyIdentifierEnum.LCAF);
118 this.lcafType = lcafType;
119 this.reserved2 = reserved2;
120 this.length = length;
121 this.reserved1 = 0;
122 this.flag = 0;
123 }
124
125 /**
126 * Initializes LCAF address.
127 *
Jian Lib9e1ac72016-11-07 21:15:17 +0900128 * @param lcafType LCAF type
Jian Lic7e20a52016-07-18 19:03:49 +0900129 * @param reserved2 reserved2 field
130 */
131 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType, byte reserved2) {
132 super(AddressFamilyIdentifierEnum.LCAF);
133 this.lcafType = lcafType;
134 this.reserved2 = reserved2;
135 this.reserved1 = 0;
136 this.flag = 0;
137 this.length = 0;
138 }
139
140 /**
141 * Initializes LCAF address.
142 *
143 * @param lcafType LCAF type
Jian Lib9e1ac72016-11-07 21:15:17 +0900144 * @param length length field
Jian Lia7b394d2016-08-21 23:11:46 +0900145 */
146 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType, short length) {
147 super(AddressFamilyIdentifierEnum.LCAF);
148 this.lcafType = lcafType;
149 this.reserved1 = 0;
150 this.reserved2 = 0;
151 this.flag = 0;
152 this.length = length;
153 }
154
155 /**
156 * Initializes LCAF address.
157 *
158 * @param lcafType LCAF type
Jian Lic7e20a52016-07-18 19:03:49 +0900159 */
160 protected LispLcafAddress(LispCanonicalAddressFormatEnum lcafType) {
161 super(AddressFamilyIdentifierEnum.LCAF);
162 this.lcafType = lcafType;
163 this.reserved1 = 0;
164 this.reserved2 = 0;
165 this.flag = 0;
166 this.length = 0;
Jian Li09596002016-07-15 17:46:49 +0900167 }
168
169 /**
170 * Obtains LCAF type.
171 *
172 * @return LCAF type
173 */
174 public LispCanonicalAddressFormatEnum getType() {
175 return lcafType;
176 }
177
178 /**
Jian Lic7e20a52016-07-18 19:03:49 +0900179 * Obtains LCAF reserved1 value.
Jian Li09596002016-07-15 17:46:49 +0900180 *
Jian Lic7e20a52016-07-18 19:03:49 +0900181 * @return LCAF reserved1 value
Jian Li09596002016-07-15 17:46:49 +0900182 */
Jian Lic7e20a52016-07-18 19:03:49 +0900183 public byte getReserved1() {
184 return reserved1;
185 }
186
187 /**
188 * Obtains LCAF reserved2 value.
189 *
190 * @return LCAF reserved2 value
191 */
192 public byte getReserved2() {
193 return reserved2;
194 }
195
196 /**
197 * Obtains LCAF flag value.
198 *
199 * @return LCAF flag value
200 */
201 public byte getFlag() {
202 return flag;
203 }
204
205 /**
206 * Obtains LCAF length value.
207 *
208 * @return LCAF length value
209 */
Jian Lia7b394d2016-08-21 23:11:46 +0900210 public short getLength() {
Jian Lic7e20a52016-07-18 19:03:49 +0900211 return length;
Jian Li09596002016-07-15 17:46:49 +0900212 }
213
Jian Lia7b394d2016-08-21 23:11:46 +0900214 /**
215 * Deserializes common fields from byte buffer.
216 *
217 * @param byteBuf byte buffer
218 * @return LispLcafAddress with filled common data fields
219 */
220 public static LispLcafAddress deserializeCommon(ByteBuf byteBuf) {
221
Jian Lib9e1ac72016-11-07 21:15:17 +0900222 // let's skip first and second two bytes
,
223 // because it represents LCAF AFI code
224 byteBuf.skipBytes(LCAF_AFI_CODE_BYTE_LENGTH);
225
Jian Lia7b394d2016-08-21 23:11:46 +0900226 // reserved1 -> 8 bits
227 byte reserved1 = (byte) byteBuf.readUnsignedByte();
228
229 // flags -> 8 bits
230 byte flag = (byte) byteBuf.readUnsignedByte();
231
232 // LCAF type -> 8 bits
233 byte lcafType = (byte) byteBuf.readUnsignedByte();
234
235 // reserved2 -> 8bits
236 byte reserved2 = (byte) byteBuf.readUnsignedByte();
237
238 // length -> 16 bits
239 short length = (short) byteBuf.readUnsignedShort();
240
241 return new LispLcafAddress(LispCanonicalAddressFormatEnum.valueOf(lcafType),
Jian Lib9e1ac72016-11-07 21:15:17 +0900242 reserved1, reserved2, flag, length);
Jian Lia7b394d2016-08-21 23:11:46 +0900243 }
244
GUNiba871702016-08-22 21:06:02 +0900245 /**
Jian Lief0f7232016-11-15 19:55:46 +0900246 * Updates the header length field value based on the size of LISP header.
247 *
248 * @param lcafIndex the index of LCAF address, because LCAF address is
249 * contained inside LISP control message, so to correctly
250 * find the right LCAF length index, we need to know the
251 * absolute lcaf index inside LISP control message byte buf
252 * @param byteBuf netty byte buffer
253 */
254 public static void updateLength(int lcafIndex, ByteBuf byteBuf) {
yoonseon980cd7c2016-11-18 14:18:46 -0800255 byteBuf.setByte(lcafIndex + LENGTH_FIELD_INDEX,
256 byteBuf.writerIndex() - COMMON_HEADER_SIZE - lcafIndex);
Jian Lief0f7232016-11-15 19:55:46 +0900257 }
258
259 /**
GUNiba871702016-08-22 21:06:02 +0900260 * Serializes common fields to byte buffer.
261 *
262 * @param byteBuf byte buffer
263 * @param address LISP LCAF address instance
264 */
265 public static void serializeCommon(ByteBuf byteBuf, LispLcafAddress address) {
Jian Lief0f7232016-11-15 19:55:46 +0900266
Jian Lib9e1ac72016-11-07 21:15:17 +0900267 byteBuf.writeShort(AddressFamilyIdentifierEnum.LCAF.getIanaCode());
GUNiba871702016-08-22 21:06:02 +0900268 byteBuf.writeByte(address.getReserved1());
269 byteBuf.writeByte(address.getFlag());
270 byteBuf.writeByte(address.getType().getLispCode());
271 byteBuf.writeByte(address.getReserved2());
272 byteBuf.writeShort(address.getLength());
273 }
274
Jian Li09596002016-07-15 17:46:49 +0900275 @Override
276 public int hashCode() {
Jian Lid56f97e2016-07-19 15:48:15 +0900277 return Objects.hash(lcafType, reserved1, reserved2, flag, length);
Jian Li09596002016-07-15 17:46:49 +0900278 }
279
280 @Override
281 public boolean equals(Object obj) {
282 if (this == obj) {
283 return true;
284 }
285
286 if (obj instanceof LispLcafAddress) {
287 final LispLcafAddress other = (LispLcafAddress) obj;
288 return Objects.equals(this.lcafType, other.lcafType) &&
Jian Lib9e1ac72016-11-07 21:15:17 +0900289 Objects.equals(this.reserved1, other.reserved1) &&
290 Objects.equals(this.reserved2, other.reserved2) &&
291 Objects.equals(this.flag, other.flag) &&
292 Objects.equals(this.length, other.length);
Jian Li09596002016-07-15 17:46:49 +0900293 }
294 return false;
295 }
296
297 @Override
298 public String toString() {
299 return toStringHelper(this)
300 .add("lcafType", lcafType)
Jian Lic7e20a52016-07-18 19:03:49 +0900301 .add("reserved1", reserved1)
302 .add("reserved2", reserved2)
303 .add("flag", flag)
304 .add("length", length)
Jian Li09596002016-07-15 17:46:49 +0900305 .toString();
306 }
Jian Lia7b394d2016-08-21 23:11:46 +0900307
308 protected static class LcafAddressBuilder<T> {
309
310 protected byte reserved1;
311 protected byte flag;
312 protected byte lcafType;
313 protected byte reserved2;
314 protected short length;
315
316 /**
317 * Sets reserved1 value.
318 *
319 * @param reserved1 reserved1 value
320 * @return LcafAddressBuilder object
321 */
322 public T withReserved1(byte reserved1) {
323 this.reserved1 = reserved1;
324 return (T) this;
325 }
326
327 /**
328 * Sets flag.
329 *
330 * @param flag flag boolean
331 * @return LcafAddressBuilder object
332 */
333 public T withFlag(byte flag) {
334 this.flag = flag;
335 return (T) this;
336 }
337
338 /**
339 * Sets LCAF type.
340 *
341 * @param lcafType LCAF type
342 * @return LcafAddressBuilder object
343 */
344 public T withLcafType(byte lcafType) {
345 this.lcafType = lcafType;
346 return (T) this;
347 }
348
349 /**
350 * Sets reserved2 value.
351 *
352 * @param reserved2 reserved2 value
353 * @return LcafAddressBuilder object
354 */
355 public T withReserved2(byte reserved2) {
356 this.reserved2 = reserved2;
357 return (T) this;
358 }
359
360 /**
361 * Sets length value.
362 *
363 * @param length length value
364 * @return LcafAddressBuilder object
365 */
366 public T withLength(short length) {
367 this.length = length;
368 return (T) this;
369 }
370
371 /**
372 * Builds LispLcafAddress object.
373 *
374 * @return LispLcafAddress instance
375 */
376 public LispLcafAddress build() {
yoonseon980cd7c2016-11-18 14:18:46 -0800377 return new LispLcafAddress(LispCanonicalAddressFormatEnum
378 .valueOf(lcafType),
379 reserved1, reserved2, flag, length);
Jian Lia7b394d2016-08-21 23:11:46 +0900380 }
381 }
382
GUNiba871702016-08-22 21:06:02 +0900383 /**
384 * LISP LCAF reader class.
385 */
yoonseon980cd7c2016-11-18 14:18:46 -0800386 public static class LcafAddressReader
387 implements LispAddressReader<LispLcafAddress> {
Jian Lia7b394d2016-08-21 23:11:46 +0900388
389 private static final int LCAF_TYPE_FIELD_INDEX = 4;
390
391 @Override
yoonseon980cd7c2016-11-18 14:18:46 -0800392 public LispLcafAddress readFrom(ByteBuf byteBuf)
393 throws LispParseError, LispReaderException {
Jian Lia7b394d2016-08-21 23:11:46 +0900394
395 int index = byteBuf.readerIndex();
396
397 // LCAF type -> 8 bits
Jian Li55ddcdb2016-11-21 17:04:01 +0900398 byte lcafType = (byte) byteBuf.getUnsignedByte(index + LCAF_TYPE_FIELD_INDEX);
Jian Lia7b394d2016-08-21 23:11:46 +0900399
400 if (lcafType == APPLICATION_DATA.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900401 return new LispAppDataLcafAddress.AppDataLcafAddressReader().readFrom(byteBuf);
Jian Li55ddcdb2016-11-21 17:04:01 +0900402 }
403
404 if (lcafType == NAT.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900405 return new LispNatLcafAddress.NatLcafAddressReader().readFrom(byteBuf);
Jian Lia7b394d2016-08-21 23:11:46 +0900406 }
407
408 if (lcafType == LIST.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900409 return new LispListLcafAddress.ListLcafAddressReader().readFrom(byteBuf);
Jian Lia7b394d2016-08-21 23:11:46 +0900410 }
411
412 if (lcafType == SEGMENT.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900413 return new LispSegmentLcafAddress.SegmentLcafAddressReader().readFrom(byteBuf);
Jian Lia7b394d2016-08-21 23:11:46 +0900414 }
415
Jian Li3ff578d2017-02-05 15:34:37 +0900416 if (lcafType == NONCE.getLispCode()) {
417 return new LispNonceLcafAddress.NonceLcafAddressReader().readFrom(byteBuf);
418 }
419
Jian Li2af9eaa2017-02-05 09:15:07 +0900420 if (lcafType == MULTICAST.getLispCode()) {
421 return new LispMulticastLcafAddress.MulticastLcafAddressReader().readFrom(byteBuf);
422 }
423
Jian Lia7b394d2016-08-21 23:11:46 +0900424 if (lcafType == SOURCE_DEST.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900425 return new LispSourceDestLcafAddress.SourceDestLcafAddressReader().readFrom(byteBuf);
Jian Lia7b394d2016-08-21 23:11:46 +0900426 }
427
Jian Li99f83ef2016-11-03 19:14:25 +0100428 if (lcafType == TRAFFIC_ENGINEERING.getLispCode()) {
Jian Lif31019a2017-02-05 07:57:46 +0900429 return new LispTeLcafAddress.TeLcafAddressReader().readFrom(byteBuf);
Jian Li99f83ef2016-11-03 19:14:25 +0100430 }
431
Jian Lid4e63702016-08-30 18:29:20 +0900432 log.warn("Unsupported LCAF type, please specify a correct LCAF type");
433
Jian Lia7b394d2016-08-21 23:11:46 +0900434 return null;
435 }
436 }
GUNiba871702016-08-22 21:06:02 +0900437
438 /**
439 * LISP LCAF address writer class.
440 */
yoonseon980cd7c2016-11-18 14:18:46 -0800441 public static class LcafAddressWriter
442 implements LispAddressWriter<LispLcafAddress> {
GUNiba871702016-08-22 21:06:02 +0900443
444 @Override
yoonseon980cd7c2016-11-18 14:18:46 -0800445 public void writeTo(ByteBuf byteBuf, LispLcafAddress address)
446 throws LispWriterException {
GUNiba871702016-08-22 21:06:02 +0900447 switch (address.getType()) {
448 case APPLICATION_DATA:
Jian Lif31019a2017-02-05 07:57:46 +0900449 new LispAppDataLcafAddress.AppDataLcafAddressWriter().writeTo(byteBuf,
Jian Li55ddcdb2016-11-21 17:04:01 +0900450 (LispAppDataLcafAddress) address);
451 break;
452 case NAT:
Jian Lif31019a2017-02-05 07:57:46 +0900453 new LispNatLcafAddress.NatLcafAddressWriter().writeTo(byteBuf,
Jian Li55ddcdb2016-11-21 17:04:01 +0900454 (LispNatLcafAddress) address);
GUNiba871702016-08-22 21:06:02 +0900455 break;
456 case LIST:
Jian Lif31019a2017-02-05 07:57:46 +0900457 new LispListLcafAddress.ListLcafAddressWriter().writeTo(byteBuf,
GUNiba871702016-08-22 21:06:02 +0900458 (LispListLcafAddress) address);
459 break;
460 case SEGMENT:
Jian Lif31019a2017-02-05 07:57:46 +0900461 new LispSegmentLcafAddress.SegmentLcafAddressWriter().writeTo(byteBuf,
Jian Li55ddcdb2016-11-21 17:04:01 +0900462 (LispSegmentLcafAddress) address);
GUNiba871702016-08-22 21:06:02 +0900463 break;
Jian Li3ff578d2017-02-05 15:34:37 +0900464 case NONCE:
465 new LispNonceLcafAddress.NonceLcafAddressWriter().writeTo(byteBuf,
466 (LispNonceLcafAddress) address);
467 break;
Jian Li2af9eaa2017-02-05 09:15:07 +0900468 case MULTICAST:
469 new LispMulticastLcafAddress.MulticastLcafAddressWriter().writeTo(byteBuf,
470 (LispMulticastLcafAddress) address);
471 break;
GUNiba871702016-08-22 21:06:02 +0900472 case SOURCE_DEST:
Jian Lif31019a2017-02-05 07:57:46 +0900473 new LispSourceDestLcafAddress.SourceDestLcafAddressWriter().writeTo(byteBuf,
Jian Li55ddcdb2016-11-21 17:04:01 +0900474 (LispSourceDestLcafAddress) address);
GUNiba871702016-08-22 21:06:02 +0900475 break;
Jian Li99f83ef2016-11-03 19:14:25 +0100476 case TRAFFIC_ENGINEERING:
Jian Lif31019a2017-02-05 07:57:46 +0900477 new LispTeLcafAddress.TeLcafAddressWriter().writeTo(byteBuf,
Jian Li99f83ef2016-11-03 19:14:25 +0100478 (LispTeLcafAddress) address);
479 break;
Jian Lid4e63702016-08-30 18:29:20 +0900480 default:
481 log.warn("Unsupported LCAF type, please specify a correct LCAF type");
482 break;
GUNiba871702016-08-22 21:06:02 +0900483 }
484 }
485 }
Jian Li09596002016-07-15 17:46:49 +0900486}