blob: a8ab648755d46d831a50710973ad8dbfe38f933c [file] [log] [blame]
Jian Li3ff327a2017-03-14 17:02:19 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Jian Li3ff327a2017-03-14 17:02:19 +09003 *
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
17package org.onosproject.drivers.lisp.extensions;
18
Jian Lie47e21a2017-03-18 13:39:51 +090019import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Maps;
Jian Li3ff327a2017-03-14 17:02:19 +090021import org.onosproject.mapping.addresses.ExtensionMappingAddress;
22import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
Jian Lie47e21a2017-03-18 13:39:51 +090023import org.onosproject.mapping.addresses.MappingAddress;
Jian Li3ff327a2017-03-14 17:02:19 +090024import org.onosproject.net.flow.AbstractExtension;
25
Jian Lie47e21a2017-03-18 13:39:51 +090026import java.util.List;
27import java.util.Map;
28import java.util.Objects;
29
30import static com.google.common.base.MoreObjects.toStringHelper;
Jian Li299bc1d2017-03-17 19:17:40 +090031import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
32 .ExtensionMappingAddressTypes.NAT_ADDRESS;
33
Jian Li3ff327a2017-03-14 17:02:19 +090034/**
35 * Implementation of LISP Network Address Translation (NAT) address.
Jian Li299bc1d2017-03-17 19:17:40 +090036 * When a LISP system is conveying global address and mapped port information
37 * when traversing through a NAT device, the NAT-Traversal Type is used.
Jian Li3ff327a2017-03-14 17:02:19 +090038 */
39public class LispNatAddress extends AbstractExtension
40 implements ExtensionMappingAddress {
Jian Lie47e21a2017-03-18 13:39:51 +090041
42 private static final String MS_UDP_PORT_NUMBER = "msUdpPortNumber";
43 private static final String ETR_UDP_PORT_NUMBER = "etrUdpPortNumber";
44 private static final String GLOBAL_ETR_RLOC_ADDRESS = "globalEtrRlocAddress";
45 private static final String MS_RLOC_ADDRESS = "msRlocAddress";
46 private static final String PRIVATE_ETR_RLOC_ADDRESS = "privateEtrRlocAddress";
47 private static final String RTR_RLOC_ADDRESSES = "rtrRlocAddresses";
48
49 private short msUdpPortNumber;
50 private short etrUdpPortNumber;
51 private MappingAddress globalEtrRlocAddress;
52 private MappingAddress msRlocAddress;
53 private MappingAddress privateEtrRlocAddress;
54 private List<MappingAddress> rtrRlocAddresses;
55
56 /**
57 * Default constructor.
58 */
59 public LispNatAddress() {
60 }
61
62 /**
63 * Creates an instance with initialized parameters.
64 *
65 * @param msUdpPortNumber Map Server (MS) UDP port number
66 * @param etrUdpPortNumber ETR UDP port number
67 * @param globalEtrRlocAddress global ETR RLOC address
68 * @param msRlocAddress Map Server (MS) RLOC address
69 * @param privateEtrRlocAddress private ETR RLOC address
70 * @param rtrRlocAddresses a collection of RTR RLOC addresses
71 */
72 private LispNatAddress(short msUdpPortNumber, short etrUdpPortNumber,
73 MappingAddress globalEtrRlocAddress,
74 MappingAddress msRlocAddress,
75 MappingAddress privateEtrRlocAddress,
76 List<MappingAddress> rtrRlocAddresses) {
77 this.msUdpPortNumber = msUdpPortNumber;
78 this.etrUdpPortNumber = etrUdpPortNumber;
79 this.globalEtrRlocAddress = globalEtrRlocAddress;
80 this.msRlocAddress = msRlocAddress;
81 this.privateEtrRlocAddress = privateEtrRlocAddress;
82 this.rtrRlocAddresses = ImmutableList.copyOf(rtrRlocAddresses);
83 }
84
85 /**
86 * Obtains Map Server UDP port number.
87 *
88 * @return Map Server UDP port number
89 */
90 public short getMsUdpPortNumber() {
91 return msUdpPortNumber;
92 }
93
94 /**
95 * Obtains ETR UDP port number.
96 *
97 * @return ETR UDP port number
98 */
99 public short getEtrUdpPortNumber() {
100 return etrUdpPortNumber;
101 }
102
103 /**
104 * Obtains global ETR RLOC address.
105 *
106 * @return global ETR
107 */
108 public MappingAddress getGlobalEtrRlocAddress() {
109 return globalEtrRlocAddress;
110 }
111
112 /**
113 * Obtains Map Server RLOC address.
114 *
115 * @return Map Server RLOC address
116 */
117 public MappingAddress getMsRlocAddress() {
118 return msRlocAddress;
119 }
120
121 /**
122 * Obtains private ETR RLOC address.
123 *
124 * @return private ETR RLOC address
125 */
126 public MappingAddress getPrivateEtrRlocAddress() {
127 return privateEtrRlocAddress;
128 }
129
130 /**
131 * Obtains a collection of RTR RLOC addresses.
132 *
133 * @return a collection of RTR RLOC addresses
134 */
135 public List<MappingAddress> getRtrRlocAddresses() {
136 return ImmutableList.copyOf(rtrRlocAddresses);
137 }
138
Jian Li3ff327a2017-03-14 17:02:19 +0900139 @Override
140 public ExtensionMappingAddressType type() {
Jian Li299bc1d2017-03-17 19:17:40 +0900141 return NAT_ADDRESS.type();
Jian Li3ff327a2017-03-14 17:02:19 +0900142 }
143
144 @Override
145 public byte[] serialize() {
Jian Lie47e21a2017-03-18 13:39:51 +0900146 Map<String, Object> parameterMap = Maps.newHashMap();
147
148 parameterMap.put(MS_UDP_PORT_NUMBER, msUdpPortNumber);
149 parameterMap.put(ETR_UDP_PORT_NUMBER, etrUdpPortNumber);
150 parameterMap.put(GLOBAL_ETR_RLOC_ADDRESS, globalEtrRlocAddress);
151 parameterMap.put(MS_RLOC_ADDRESS, msRlocAddress);
152 parameterMap.put(PRIVATE_ETR_RLOC_ADDRESS, privateEtrRlocAddress);
153 parameterMap.put(RTR_RLOC_ADDRESSES, rtrRlocAddresses);
154
155 return APP_KRYO.serialize(parameterMap);
Jian Li3ff327a2017-03-14 17:02:19 +0900156 }
157
158 @Override
159 public void deserialize(byte[] data) {
Jian Lie47e21a2017-03-18 13:39:51 +0900160 Map<String, Object> parameterMap = APP_KRYO.deserialize(data);
Jian Li3ff327a2017-03-14 17:02:19 +0900161
Jian Lie47e21a2017-03-18 13:39:51 +0900162 this.msUdpPortNumber = (short) parameterMap.get(MS_UDP_PORT_NUMBER);
163 this.etrUdpPortNumber = (short) parameterMap.get(ETR_UDP_PORT_NUMBER);
164 this.globalEtrRlocAddress = (MappingAddress) parameterMap.get(GLOBAL_ETR_RLOC_ADDRESS);
165 this.msRlocAddress = (MappingAddress) parameterMap.get(MS_RLOC_ADDRESS);
166 this.privateEtrRlocAddress = (MappingAddress) parameterMap.get(PRIVATE_ETR_RLOC_ADDRESS);
167 this.rtrRlocAddresses = (List<MappingAddress>) parameterMap.get(RTR_RLOC_ADDRESSES);
168 }
169
170 @Override
171 public int hashCode() {
172 return Objects.hash(msUdpPortNumber, etrUdpPortNumber,
173 globalEtrRlocAddress, msRlocAddress, privateEtrRlocAddress);
174 }
175
176 @Override
177 public boolean equals(Object obj) {
178 if (this == obj) {
179 return true;
180 }
181
182 if (obj instanceof LispNatAddress) {
183 final LispNatAddress other = (LispNatAddress) obj;
184 return Objects.equals(this.msUdpPortNumber, other.msUdpPortNumber) &&
185 Objects.equals(this.etrUdpPortNumber, other.etrUdpPortNumber) &&
186 Objects.equals(this.globalEtrRlocAddress, other.globalEtrRlocAddress) &&
187 Objects.equals(this.msRlocAddress, other.msRlocAddress) &&
188 Objects.equals(this.privateEtrRlocAddress, other.privateEtrRlocAddress) &&
189 Objects.equals(this.rtrRlocAddresses, other.rtrRlocAddresses);
190 }
191 return false;
192 }
193
194 @Override
195 public String toString() {
Jian Lifc90a082017-03-31 23:36:14 +0900196 return toStringHelper(type().toString())
Jian Lie47e21a2017-03-18 13:39:51 +0900197 .add("Map Server UDP port number", msUdpPortNumber)
198 .add("ETR UDP port number", etrUdpPortNumber)
199 .add("global ETR RLOC address", globalEtrRlocAddress)
200 .add("Map Server RLOC address", msRlocAddress)
201 .add("private ETR RLOC address", privateEtrRlocAddress)
202 .add("RTR RLOC addresses", rtrRlocAddresses)
203 .toString();
204 }
205
206 /**
207 * A builder for building LispNatAddress.
208 */
209 public static final class Builder {
210 private short msUdpPortNumber;
211 private short etrUdpPortNumber;
212 private MappingAddress globalEtrRlocAddress;
213 private MappingAddress msRlocAddress;
214 private MappingAddress privateEtrRlocAddress;
215 private List<MappingAddress> rtrRlocAddresses;
216
217 /**
218 * Sets Map Server UDP port number.
219 *
220 * @param msUdpPortNumber Map Server UDP port number
221 * @return Builder object
222 */
223 public Builder withMsUdpPortNumber(short msUdpPortNumber) {
224 this.msUdpPortNumber = msUdpPortNumber;
225 return this;
226 }
227
228 /**
229 * Sets ETR UDP port number.
230 *
231 * @param etrUdpPortNumber ETR UDP port number
232 * @return Builder object
233 */
234 public Builder withEtrUdpPortNumber(short etrUdpPortNumber) {
235 this.etrUdpPortNumber = etrUdpPortNumber;
236 return this;
237 }
238
239 /**
240 * Sets global ETR RLOC address.
241 *
242 * @param globalEtrRlocAddress global ETR RLOC address
243 * @return Builder object
244 */
245 public Builder withGlobalEtrRlocAddress(MappingAddress globalEtrRlocAddress) {
246 this.globalEtrRlocAddress = globalEtrRlocAddress;
247 return this;
248 }
249
250 /**
251 * Sets Map Server RLOC address.
252 *
253 * @param msRlocAddress Map Server RLOC address
254 * @return Builder object
255 */
256 public Builder withMsRlocAddress(MappingAddress msRlocAddress) {
257 this.msRlocAddress = msRlocAddress;
258 return this;
259 }
260
261 /**
262 * Sets private ETR RLOC address.
263 *
264 * @param privateEtrRlocAddress private ETR RLOC address
265 * @return Builder object
266 */
267 public Builder withPrivateEtrRlocAddress(MappingAddress privateEtrRlocAddress) {
268 this.privateEtrRlocAddress = privateEtrRlocAddress;
269 return this;
270 }
271
272 /**
273 * Sets RTR RLOC addresses.
274 *
275 * @param rtrRlocAddresses a collection of RTR RLOC addresses
276 * @return Builder object
277 */
278 public Builder withRtrRlocAddresses(List<MappingAddress> rtrRlocAddresses) {
279 if (rtrRlocAddresses != null) {
280 this.rtrRlocAddresses = ImmutableList.copyOf(rtrRlocAddresses);
281 }
282 return this;
283 }
284
285 /**
286 * Builds LispNatAddress instance.
287 *
288 * @return LispNatAddress instance
289 */
290 public LispNatAddress build() {
291
292 return new LispNatAddress(msUdpPortNumber, etrUdpPortNumber,
293 globalEtrRlocAddress, msRlocAddress,
294 privateEtrRlocAddress, rtrRlocAddresses);
295 }
Jian Li3ff327a2017-03-14 17:02:19 +0900296 }
297}