blob: 7061c6079df96f4ee3326e51425359397dc0abfd [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 Li50b51ee2017-03-19 03:23:29 +090019import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Maps;
21import org.onlab.util.KryoNamespace;
22import org.onosproject.mapping.addresses.ASMappingAddress;
23import org.onosproject.mapping.addresses.DNMappingAddress;
24import org.onosproject.mapping.addresses.EthMappingAddress;
Jian Li3ff327a2017-03-14 17:02:19 +090025import org.onosproject.mapping.addresses.ExtensionMappingAddress;
26import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
Jian Li50b51ee2017-03-19 03:23:29 +090027import org.onosproject.mapping.addresses.IPMappingAddress;
28import org.onosproject.mapping.addresses.MappingAddress;
Jian Li3ff327a2017-03-14 17:02:19 +090029import org.onosproject.net.flow.AbstractExtension;
Jian Li50b51ee2017-03-19 03:23:29 +090030import org.onosproject.store.serializers.KryoNamespaces;
Jian Li3ff327a2017-03-14 17:02:19 +090031
Jian Li50b51ee2017-03-19 03:23:29 +090032import java.util.List;
33import java.util.Map;
34import java.util.Objects;
35
36import static com.google.common.base.MoreObjects.toStringHelper;
Jian Li299bc1d2017-03-17 19:17:40 +090037import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
38 .ExtensionMappingAddressTypes.TRAFFIC_ENGINEERING_ADDRESS;
39
Jian Li3ff327a2017-03-14 17:02:19 +090040/**
41 * Implementation of LISP traffic engineering address.
Jian Li299bc1d2017-03-17 19:17:40 +090042 * For a given EID lookup into the mapping database, this LCAF can be returned
43 * to provide a list of locators in an explicit re-encapsulation path.
Jian Li3ff327a2017-03-14 17:02:19 +090044 */
45public final class LispTeAddress extends AbstractExtension
46 implements ExtensionMappingAddress {
Jian Li50b51ee2017-03-19 03:23:29 +090047
48 private static final String TE_RECORDS = "records";
49
50 private List<TeRecord> records;
51
52 private KryoNamespace appKryo = new KryoNamespace.Builder()
53 .register(KryoNamespaces.API)
54 .register(MappingAddress.class)
55 .register(MappingAddress.Type.class)
56 .register(IPMappingAddress.class)
57 .register(ASMappingAddress.class)
58 .register(DNMappingAddress.class)
59 .register(EthMappingAddress.class)
60 .register(TeRecord.class)
61 .build();
62
63 /**
64 * Default constructor.
65 */
66 public LispTeAddress() {
67 }
68
69 /**
70 * Creates an instance with initialized parameters.
71 *
72 * @param records a collection of TE records
73 */
74 private LispTeAddress(List<TeRecord> records) {
75 this.records = records;
76 }
77
78 /**
79 * Obtains a collection of TE records.
80 *
81 * @return a collection of TE records
82 */
83 public List<TeRecord> getTeRecords() {
84 return ImmutableList.copyOf(records);
85 }
86
Jian Li3ff327a2017-03-14 17:02:19 +090087 @Override
88 public ExtensionMappingAddressType type() {
Jian Li299bc1d2017-03-17 19:17:40 +090089 return TRAFFIC_ENGINEERING_ADDRESS.type();
Jian Li3ff327a2017-03-14 17:02:19 +090090 }
91
92 @Override
93 public byte[] serialize() {
Jian Li50b51ee2017-03-19 03:23:29 +090094 Map<String, Object> parameterMap = Maps.newHashMap();
95
96 parameterMap.put(TE_RECORDS, records);
97 return appKryo.serialize(parameterMap);
Jian Li3ff327a2017-03-14 17:02:19 +090098 }
99
100 @Override
101 public void deserialize(byte[] data) {
Jian Li50b51ee2017-03-19 03:23:29 +0900102 Map<String, Object> parameterMap = appKryo.deserialize(data);
Jian Li3ff327a2017-03-14 17:02:19 +0900103
Jian Li50b51ee2017-03-19 03:23:29 +0900104 this.records = (List<TeRecord>) parameterMap.get(TE_RECORDS);
105 }
106
107 @Override
108 public int hashCode() {
109 return Objects.hash(records);
110 }
111
112 @Override
113 public boolean equals(Object obj) {
114 if (this == obj) {
115 return true;
116 }
117
118 if (obj instanceof LispTeAddress) {
119 final LispTeAddress other = (LispTeAddress) obj;
120 return Objects.equals(records, other.records);
121 }
122 return false;
123 }
124
125 @Override
126 public String toString() {
Jian Lifc90a082017-03-31 23:36:14 +0900127 return toStringHelper(type().toString())
Jian Li50b51ee2017-03-19 03:23:29 +0900128 .add("TE records", records).toString();
129 }
130
131 /**
132 * A builder for building LispTeAddress.
133 */
134 public static final class Builder {
135 private List<TeRecord> records;
136
137 /**
138 * Sets a collection of TE records.
139 *
140 * @param records a collection of TE records
141 * @return Builder object
142 */
143 public Builder withTeRecords(List<TeRecord> records) {
144 this.records = records;
145 return this;
146 }
147
148 /**
149 * Builds LispTeAddress instance.
150 *
151 * @return LispTeAddress instance
152 */
153 public LispTeAddress build() {
154 return new LispTeAddress(records);
155 }
156 }
157
158 /**
159 * Traffic engineering record class.
160 */
161 public static final class TeRecord {
162 private boolean lookup;
163 private boolean rlocProbe;
164 private boolean strict;
165 private MappingAddress address;
166
167 /**
168 *
169 *
170 * @param lookup lookup bit
171 * @param rlocProbe rloc probe bit
172 * @param strict strict bit
173 * @param address RTR address
174 */
175 private TeRecord(boolean lookup, boolean rlocProbe, boolean strict,
176 MappingAddress address) {
177 this.lookup = lookup;
178 this.rlocProbe = rlocProbe;
179 this.strict = strict;
180 this.address = address;
181 }
182
183 /**
184 * Obtains lookup bit flag.
185 *
186 * @return lookup bit flag
187 */
188 public boolean isLookup() {
189 return lookup;
190 }
191
192 /**
193 * Obtains RLOC probe bit flag.
194 *
195 * @return RLOC probe bit flag
196 */
197 public boolean isRlocProbe() {
198 return rlocProbe;
199 }
200
201 /**
202 * Obtains strict bit flag.
203 *
204 * @return strict bit flag
205 */
206 public boolean isStrict() {
207 return strict;
208 }
209
210 /**
211 * Obtains Re-encapsulated RLOC address.
212 *
213 * @return Re-encapsulated RLOC address
214 */
215 public MappingAddress getAddress() {
216 return address;
217 }
218
219 @Override
220 public int hashCode() {
221 return Objects.hash(lookup, rlocProbe, strict, address);
222 }
223
224 @Override
225 public boolean equals(Object obj) {
226 if (this == obj) {
227 return true;
228 }
229
230 if (obj instanceof TeRecord) {
231 final TeRecord other = (TeRecord) obj;
232 return Objects.equals(this.lookup, other.lookup) &&
233 Objects.equals(this.rlocProbe, other.rlocProbe) &&
234 Objects.equals(this.strict, other.strict) &&
235 Objects.equals(this.address, other.address);
236 }
237 return false;
238 }
239
240 @Override
241 public String toString() {
242 return toStringHelper(this)
243 .add("Lookup bit", lookup)
244 .add("RLOC probe bit", rlocProbe)
245 .add("strict bit", strict)
246 .add("RTR address", address)
247 .toString();
248 }
249
250 /**
251 * A builder for building TeRecord.
252 */
253 public static final class Builder {
254 private boolean lookup;
255 private boolean rlocProbe;
256 private boolean strict;
257 private MappingAddress address;
258
259 /**
260 * Sets lookup flag.
261 *
262 * @param lookup lookup flag
263 * @return Builder object
264 */
265 public Builder withIsLookup(boolean lookup) {
266 this.lookup = lookup;
267 return this;
268 }
269
270 /**
271 * Sets RLOC probe flag.
272 *
273 * @param rlocProbe RLOC probe flag
274 * @return Builder object
275 */
276 public Builder withIsRlocProbe(boolean rlocProbe) {
277 this.rlocProbe = rlocProbe;
278 return this;
279 }
280
281 /**
282 * Sets strict flag.
283 *
284 * @param strict strict flag
285 * @return Builder object
286 */
287 public Builder withIsStrict(boolean strict) {
288 this.strict = strict;
289 return this;
290 }
291
292 /**
293 * Sets RTR RLOC address.
294 *
295 * @param address RTR RLOC address
296 * @return Builder object
297 */
298 public Builder withRtrRlocAddress(MappingAddress address) {
299 this.address = address;
300 return this;
301 }
302
303 /**
304 * Builds TeRecord instance.
305 *
306 * @return TeRcord instance
307 */
308 public TeRecord build() {
309
310 return new TeRecord(lookup, rlocProbe, strict, address);
311 }
312 }
Jian Li3ff327a2017-03-14 17:02:19 +0900313 }
314}