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