blob: 2016f82781b85f8e0980395158a7a8c624b20e6c [file] [log] [blame]
Jian Li52015762016-10-04 17:51:16 +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 Li52015762016-10-04 17:51:16 +090017
18import com.google.common.collect.ImmutableList;
19import com.google.common.collect.Lists;
20import io.netty.buffer.ByteBuf;
21import org.onosproject.lisp.msg.exceptions.LispParseError;
22import org.onosproject.lisp.msg.exceptions.LispReaderException;
23import org.onosproject.lisp.msg.exceptions.LispWriterException;
Jian Lif31019a2017-02-05 07:57:46 +090024import org.onosproject.lisp.msg.types.LispAddressReader;
25import org.onosproject.lisp.msg.types.LispAddressWriter;
26import org.onosproject.lisp.msg.types.LispAfiAddress;
Jian Li52015762016-10-04 17:51:16 +090027
28import java.util.List;
29import java.util.Objects;
30
31import static com.google.common.base.MoreObjects.toStringHelper;
32
33/**
34 * Network Address Translation (NAT) address class.
35 * <p>
Jian Lid6483cc2016-12-12 02:26:13 +090036 * Instance ID type is defined in draft-ietf-lisp-lcaf-22
Jian Li299bc1d2017-03-17 19:17:40 +090037 * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-13
Jian Li89c9ca92016-11-11 04:09:02 +090038 *
Jian Li52015762016-10-04 17:51:16 +090039 * <pre>
40 * {@literal
Jian Li3109de82016-12-06 01:34:08 +090041 * 0 1 2 3
42 * 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
Jian Li52015762016-10-04 17:51:16 +090043 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44 * | AFI = 16387 | Rsvd1 | Flags |
45 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Jian Li89c9ca92016-11-11 04:09:02 +090046 * | Type = 7 | Rsvd2 | Length |
Jian Li52015762016-10-04 17:51:16 +090047 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 * | MS UDP Port Number | ETR UDP Port Number |
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * | AFI = x | Global ETR RLOC Address ... |
51 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 * | AFI = x | MS RLOC Address ... |
53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 * | AFI = x | Private ETR RLOC Address ... |
55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * | AFI = x | RTR RLOC Address 1 ... |
57 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 * | AFI = x | RTR RLOC Address k ... |
59 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 * }</pre>
61 */
62public final class LispNatLcafAddress extends LispLcafAddress {
63
64 private final short msUdpPortNumber;
65 private final short etrUdpPortNumber;
66 private final LispAfiAddress globalEtrRlocAddress;
67 private final LispAfiAddress msRlocAddress;
68 private final LispAfiAddress privateEtrRlocAddress;
69 private final List<LispAfiAddress> rtrRlocAddresses;
70
71 /**
72 * Initializes NAT type LCAF address.
73 *
74 * @param reserved2 reserved2
75 * @param length length
76 * @param msUdpPortNumber Map Server (MS) UDP port number
77 * @param etrUdpPortNumber ETR UDP port number
78 * @param globalEtrRlocAddress global ETR RLOC address
79 * @param msRlocAddress Map Server (MS) RLOC address
80 * @param privateEtrRlocAddress private ETR RLOC address
81 * @param rtrRlocAddresses a collection of RTR RLOC addresses
82 */
83 private LispNatLcafAddress(byte reserved2, short length, short msUdpPortNumber,
84 short etrUdpPortNumber, LispAfiAddress globalEtrRlocAddress,
85 LispAfiAddress msRlocAddress, LispAfiAddress privateEtrRlocAddress,
86 List<LispAfiAddress> rtrRlocAddresses) {
87 super(LispCanonicalAddressFormatEnum.NAT, reserved2, length);
88 this.msUdpPortNumber = msUdpPortNumber;
89 this.etrUdpPortNumber = etrUdpPortNumber;
90 this.globalEtrRlocAddress = globalEtrRlocAddress;
91 this.msRlocAddress = msRlocAddress;
92 this.privateEtrRlocAddress = privateEtrRlocAddress;
93 this.rtrRlocAddresses = ImmutableList.copyOf(rtrRlocAddresses);
94 }
95
96 /**
97 * Obtains Map Server UDP port number.
98 *
99 * @return Map Server UDP port number
100 */
101 public short getMsUdpPortNumber() {
102 return msUdpPortNumber;
103 }
104
105 /**
106 * Obtains ETR UDP port number.
107 *
108 * @return ETR UDP port number
109 */
110 public short getEtrUdpPortNumber() {
111 return etrUdpPortNumber;
112 }
113
114 /**
115 * Obtains global ETR RLOC address.
116 *
117 * @return global ETR
118 */
119 public LispAfiAddress getGlobalEtrRlocAddress() {
120 return globalEtrRlocAddress;
121 }
122
123 /**
124 * Obtains Map Server RLOC address.
125 *
126 * @return Map Server RLOC address
127 */
128 public LispAfiAddress getMsRlocAddress() {
129 return msRlocAddress;
130 }
131
132 /**
133 * Obtains private ETR RLOC address.
134 *
135 * @return private ETR RLOC address
136 */
137 public LispAfiAddress getPrivateEtrRlocAddress() {
138 return privateEtrRlocAddress;
139 }
140
141 /**
142 * Obtains a collection of RTR RLOC addresses.
143 *
144 * @return a collection of RTR RLOC addresses
145 */
146 public List<LispAfiAddress> getRtrRlocAddresses() {
147 return ImmutableList.copyOf(rtrRlocAddresses);
148 }
149
150 @Override
151 public int hashCode() {
152 return Objects.hash(msUdpPortNumber, etrUdpPortNumber,
153 globalEtrRlocAddress, msRlocAddress, privateEtrRlocAddress);
154 }
155
156 @Override
157 public boolean equals(Object obj) {
158 if (this == obj) {
159 return true;
160 }
161
162 if (obj instanceof LispNatLcafAddress) {
163 final LispNatLcafAddress other = (LispNatLcafAddress) obj;
164 return Objects.equals(this.msUdpPortNumber, other.msUdpPortNumber) &&
165 Objects.equals(this.etrUdpPortNumber, other.etrUdpPortNumber) &&
166 Objects.equals(this.globalEtrRlocAddress, other.globalEtrRlocAddress) &&
167 Objects.equals(this.msRlocAddress, other.msRlocAddress) &&
yoonseon980cd7c2016-11-18 14:18:46 -0800168 Objects.equals(this.privateEtrRlocAddress, other.privateEtrRlocAddress) &&
169 Objects.equals(this.rtrRlocAddresses, other.rtrRlocAddresses);
Jian Li52015762016-10-04 17:51:16 +0900170 }
171 return false;
172 }
173
174 @Override
175 public String toString() {
176 return toStringHelper(this)
177 .add("Map Server UDP port number", msUdpPortNumber)
178 .add("ETR UDP port number", etrUdpPortNumber)
179 .add("global ETR RLOC address", globalEtrRlocAddress)
180 .add("Map Server RLOC address", msRlocAddress)
181 .add("private ETR RLOC address", privateEtrRlocAddress)
yoonseon980cd7c2016-11-18 14:18:46 -0800182 .add("RTR RLOC addresses", rtrRlocAddresses)
Jian Li52015762016-10-04 17:51:16 +0900183 .toString();
184 }
185
186 public static final class NatAddressBuilder extends LcafAddressBuilder<NatAddressBuilder> {
187
188 private short msUdpPortNumber;
189 private short etrUdpPortNumber;
190 private LispAfiAddress globalEtrRlocAddress;
191 private LispAfiAddress msRlocAddress;
192 private LispAfiAddress privateEtrRlocAddress;
193 private List<LispAfiAddress> rtrRlocAddresses = Lists.newArrayList();
194
195 /**
196 * Sets Map Server UDP port number.
197 *
198 * @param msUdpPortNumber Map Server UDP port number
199 * @return NatAddressBuilder object
200 */
201 public NatAddressBuilder withMsUdpPortNumber(short msUdpPortNumber) {
202 this.msUdpPortNumber = msUdpPortNumber;
203 return this;
204 }
205
206 /**
207 * Sets ETR UDP port number.
208 *
209 * @param etrUdpPortNumber ETR UDP port number
210 * @return NatAddressBuilder object
211 */
212 public NatAddressBuilder withEtrUdpPortNumber(short etrUdpPortNumber) {
213 this.etrUdpPortNumber = etrUdpPortNumber;
214 return this;
215 }
216
217 /**
218 * Sets global ETR RLOC address.
219 *
220 * @param globalEtrRlocAddress global ETR RLOC address
221 * @return NatAddressBuilder object
222 */
223 public NatAddressBuilder withGlobalEtrRlocAddress(LispAfiAddress globalEtrRlocAddress) {
224 this.globalEtrRlocAddress = globalEtrRlocAddress;
225 return this;
226 }
227
228 /**
229 * Sets Map Server RLOC address.
230 *
231 * @param msRlocAddress Map Server RLOC address
232 * @return NatAddressBuilder object
233 */
234 public NatAddressBuilder withMsRlocAddress(LispAfiAddress msRlocAddress) {
235 this.msRlocAddress = msRlocAddress;
236 return this;
237 }
238
239 /**
240 * Sets private ETR RLOC address.
241 *
242 * @param privateEtrRlocAddress private ETR RLOC address
243 * @return NatAddressBuilder object
244 */
245 public NatAddressBuilder withPrivateEtrRlocAddress(LispAfiAddress privateEtrRlocAddress) {
246 this.privateEtrRlocAddress = privateEtrRlocAddress;
247 return this;
248 }
249
250 /**
251 * Sets RTR RLOC addresses.
252 *
253 * @param rtrRlocAddresses a collection of RTR RLOC addresses
254 * @return NatAddressBuilder object
255 */
256 public NatAddressBuilder withRtrRlocAddresses(List<LispAfiAddress> rtrRlocAddresses) {
257 if (rtrRlocAddresses != null) {
258 this.rtrRlocAddresses = ImmutableList.copyOf(rtrRlocAddresses);
259 }
260 return this;
261 }
262
263 public LispNatLcafAddress build() {
264
265 // TODO: need to do null check
266
267 return new LispNatLcafAddress(reserved2, length, msUdpPortNumber,
268 etrUdpPortNumber, globalEtrRlocAddress, msRlocAddress,
269 privateEtrRlocAddress, rtrRlocAddresses);
270 }
271 }
272
273 /**
274 * NAT LCAF address reader class.
275 */
276 public static class NatLcafAddressReader
277 implements LispAddressReader<LispNatLcafAddress> {
278
279 @Override
280 public LispNatLcafAddress readFrom(ByteBuf byteBuf)
281 throws LispParseError, LispReaderException {
282
Jian Li5e505c62016-12-05 02:44:24 +0900283 LispLcafAddress lcafAddress = deserializeCommon(byteBuf);
Jian Li52015762016-10-04 17:51:16 +0900284
285 short msUdpPortNumber = (short) byteBuf.readUnsignedShort();
286 short etrUdpPortNumber = (short) byteBuf.readUnsignedShort();
287
Jian Lief0f7232016-11-15 19:55:46 +0900288 LispAfiAddress globalEtrRlocAddress = new AfiAddressReader().readFrom(byteBuf);
289 LispAfiAddress msRlocAddress = new AfiAddressReader().readFrom(byteBuf);
290 LispAfiAddress privateEtrRlocAddress = new AfiAddressReader().readFrom(byteBuf);
Jian Li52015762016-10-04 17:51:16 +0900291
292 List<LispAfiAddress> rtrRlocAddresses = Lists.newArrayList();
Jian Lief0f7232016-11-15 19:55:46 +0900293
Jian Li5e505c62016-12-05 02:44:24 +0900294 while (byteBuf.readerIndex() - COMMON_HEADER_SIZE < lcafAddress.getLength()) {
Jian Lief0f7232016-11-15 19:55:46 +0900295 rtrRlocAddresses.add(new AfiAddressReader().readFrom(byteBuf));
Jian Li52015762016-10-04 17:51:16 +0900296 }
297
298 return new NatAddressBuilder()
Jian Li3a99e712016-12-16 21:23:16 +0900299 .withMsUdpPortNumber(msUdpPortNumber)
300 .withEtrUdpPortNumber(etrUdpPortNumber)
301 .withGlobalEtrRlocAddress(globalEtrRlocAddress)
302 .withMsRlocAddress(msRlocAddress)
303 .withPrivateEtrRlocAddress(privateEtrRlocAddress)
304 .withRtrRlocAddresses(rtrRlocAddresses)
305 .build();
Jian Li52015762016-10-04 17:51:16 +0900306 }
307 }
308
309 /**
310 * NAT LCAF address writer class.
311 */
312 public static class NatLcafAddressWriter
313 implements LispAddressWriter<LispNatLcafAddress> {
314
315 @Override
316 public void writeTo(ByteBuf byteBuf, LispNatLcafAddress address)
317 throws LispWriterException {
318
Jian Lief0f7232016-11-15 19:55:46 +0900319 int lcafIndex = byteBuf.writerIndex();
Jian Li5e505c62016-12-05 02:44:24 +0900320 serializeCommon(byteBuf, address);
Jian Li52015762016-10-04 17:51:16 +0900321
322 byteBuf.writeShort(address.getMsUdpPortNumber());
323 byteBuf.writeShort(address.getEtrUdpPortNumber());
324
325 AfiAddressWriter writer = new LispAfiAddress.AfiAddressWriter();
326 writer.writeTo(byteBuf, address.getGlobalEtrRlocAddress());
327 writer.writeTo(byteBuf, address.getMsRlocAddress());
328 writer.writeTo(byteBuf, address.getPrivateEtrRlocAddress());
329
330 List<LispAfiAddress> rtrRlocAddresses = address.getRtrRlocAddresses();
331
332 for (int i = 0; i < rtrRlocAddresses.size(); i++) {
333 writer.writeTo(byteBuf, rtrRlocAddresses.get(i));
334 }
Jian Lief0f7232016-11-15 19:55:46 +0900335
Jian Li5e505c62016-12-05 02:44:24 +0900336 updateLength(lcafIndex, byteBuf);
Jian Li52015762016-10-04 17:51:16 +0900337 }
338 }
339}