2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.northbound;
11 import java.util.ArrayList;
12 import java.util.Iterator;
13 import java.util.List;
15 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSourceDestAddress;
16 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
17 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress;
18 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRegister;
19 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
20 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecordBuilder;
21 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
22 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
23 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
24 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.DstAddressBuilder;
25 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.SrcAddressBuilder;
26 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainer;
27 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainerBuilder;
28 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.Address;
29 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.AS;
30 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.ASBuilder;
31 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedName;
32 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4;
33 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4Builder;
34 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6;
35 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6Builder;
36 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSegment;
37 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDest;
38 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDestBuilder;
39 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Mac;
40 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.NoBuilder;
41 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.PrimitiveAddress;
42 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedNameBuilder;
43 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.MacBuilder;
44 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
45 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
46 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapregisternotification.MapRegisterBuilder;
47 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRloc;
48 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRlocBuilder;
49 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.SourceEidBuilder;
50 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequestnotification.MapRequestBuilder;
51 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
52 import org.opendaylight.lispflowmapping.type.LispCanonicalAddressFormatEnum;
53 import org.opendaylight.lispflowmapping.type.lisp.EidRecord;
54 import org.opendaylight.lispflowmapping.type.lisp.MapReplyAction;
55 import org.opendaylight.lispflowmapping.type.lisp.address.LispASAddress;
56 import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress;
57 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv4Address;
58 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv6Address;
59 import org.opendaylight.lispflowmapping.type.lisp.address.LispLCAFAddress;
60 import org.opendaylight.lispflowmapping.type.lisp.address.LispSourceDestLCAFAddress;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
63 import org.slf4j.Logger;
64 import org.slf4j.LoggerFactory;
66 public class YangTransformerNB {
68 protected static final Logger logger = LoggerFactory.getLogger(YangTransformerNB.class);
70 public static LispAddressContainer toContainer(LispAFIAddress address) {
71 if (address instanceof Address) {
72 return new LispAddressContainerBuilder().setAddress((Address) address).build();
78 public static LispAddressContainer transformLispAddress(LispAddress lispAddress) {
80 if (lispAddress == null) {
84 LispAFIAddress lispAFIAddress = null;
85 short ianaCode = lispAddress.getAfi().getIanaCode();
87 switch (lispAddress.getAfi()) {
90 LispIpv4Address lispIpv4Address = (LispIpv4Address) lispAddress;
91 Ipv4Address ipv4Address = new Ipv4Address(lispIpv4Address.getAddress().getHostAddress());
92 lispAFIAddress = new Ipv4Builder().setIpv4Address(ipv4Address).setAfi(ianaCode).build();
95 lispAFIAddress = new NoBuilder().setAfi(ianaCode).build();
97 LispASAddress lispASAddress = (LispASAddress) lispAddress;
98 lispAFIAddress = new ASBuilder().setAS(lispASAddress.getAS()).setAfi(ianaCode).build();
100 case DISTINGUISHED_NAME:
103 LispIpv6Address lispIpv6Address = (LispIpv6Address) lispAddress;
104 Ipv6Address ipv6Address = new Ipv6Address(lispIpv6Address.getAddress().getHostAddress());
105 lispAFIAddress = new Ipv6Builder().setIpv6Address(ipv6Address).setAfi(ianaCode).build();
108 LispLCAFAddress lcafAddress = (LispLCAFAddress) lispAddress;
109 switch (lcafAddress.getType()) {
111 LispSourceDestLCAFAddress sourceDest = (LispSourceDestLCAFAddress) lcafAddress;
112 LcafSourceDestBuilder SourceDestBuider = new LcafSourceDestBuilder();
114 .setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
115 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
116 .setSrcMaskLength((short) sourceDest.getSrcMaskLength())
117 .setDstMaskLength((short) sourceDest.getDstMaskLength())
119 new SrcAddressBuilder().setPrimitiveAddress(
120 toPrimitive((LispAFIAddress) transformLispAddress(sourceDest.getSrcAddress()).getAddress())).build())
122 new DstAddressBuilder().setPrimitiveAddress(
123 toPrimitive((LispAFIAddress) transformLispAddress(sourceDest.getDstAddress()).getAddress())).build());
124 lispAFIAddress = SourceDestBuider.build();
140 return toContainer(lispAFIAddress);
144 public static LispAddress transformToLispAddress(LispAddressContainer lispAddress) {
146 LispAddress legacyAddres = null;
147 LispAFIAddress address = (LispAFIAddress) lispAddress.getAddress();
148 short ianaCode = address.getAfi();
150 // TODO: add all other cases.
155 org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address lispIpv4Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address) address;
156 legacyAddres = new LispIpv4Address(lispIpv4Address.getIpv4Address().getValue());
159 org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address lispIpv6Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address) address;
160 legacyAddres = new LispIpv6Address(lispIpv6Address.getIpv6Address().getValue());
163 LispLcafAddress lcafAddress = (LispLcafAddress) address;
164 short lcafType = lcafAddress.getLcafType();
167 LcafSourceDest yangSourceDest = (LcafSourceDest) lcafAddress;
168 LispSourceDestLCAFAddress sourceDest = new LispSourceDestLCAFAddress((byte) 0);
169 sourceDest.setSrcAddress(transformToLispAddress(toContainer(toNonPrimitive(yangSourceDest.getSrcAddress().getPrimitiveAddress()))));
170 sourceDest.setDstAddress(transformToLispAddress(toContainer(toNonPrimitive(yangSourceDest.getDstAddress().getPrimitiveAddress()))));
171 sourceDest.setSrcMaskLength(yangSourceDest.getSrcMaskLength().byteValue());
172 sourceDest.setDstMaskLength(yangSourceDest.getDstMaskLength().byteValue());
173 legacyAddres = sourceDest;
188 public static MapRegister transformMapRegister(org.opendaylight.lispflowmapping.type.lisp.MapRegister legacyMapRegister) {
190 List<EidToLocatorRecord> listEidToLocatorRecord = new ArrayList<EidToLocatorRecord>();
192 // for (EidToLocatorRecord legacyRecord:
193 // legacyMapRegister.getEidToLocatorRecords()){
194 for (int i = 0; i < legacyMapRegister.getEidToLocatorRecords().size(); i++) {
196 listEidToLocatorRecord.add(transformEidToLocatorRecord(legacyMapRegister.getEidToLocatorRecords().get(i)));
200 MapRegisterBuilder builder = new MapRegisterBuilder();
202 MapRegister yangMapRegister = builder.setKeyId(legacyMapRegister.getKeyId()).setProxyMapReply(legacyMapRegister.isProxyMapReply())
203 .setEidToLocatorRecord(listEidToLocatorRecord).setWantMapNotify(true).build();
205 return yangMapRegister;
209 public static EidToLocatorRecord transformEidToLocatorRecord(
210 org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord legacyEidToLocatorRecord) {
212 List<LocatorRecord> listLocatorRecord = new ArrayList<LocatorRecord>();
214 for (int j = 0; j < legacyEidToLocatorRecord.getLocators().size(); j++) {
216 org.opendaylight.lispflowmapping.type.lisp.LocatorRecord legacyLocatorRecord = legacyEidToLocatorRecord.getLocators().get(j);
218 LispAddressContainer rloc = transformLispAddress(legacyLocatorRecord.getLocator());
220 LocatorRecordBuilder locatorRecordBuilder = new LocatorRecordBuilder();
222 LocatorRecord locatorRecord = locatorRecordBuilder.setLispAddressContainer((LispAddressContainer) rloc)
223 .setLocalLocator(legacyLocatorRecord.isLocalLocator()).setPriority((short) legacyLocatorRecord.getPriority())
224 .setWeight((short) legacyLocatorRecord.getWeight()).setMulticastPriority((short) legacyLocatorRecord.getMulticastPriority())
225 .setMulticastWeight((short) legacyLocatorRecord.getMulticastWeight()).setRlocProbed(legacyLocatorRecord.isRlocProbed())
226 .setRouted(legacyLocatorRecord.isRouted()).build();
228 listLocatorRecord.add(locatorRecord);
231 LispAddressContainer eid = transformLispAddress(legacyEidToLocatorRecord.getPrefix());
232 EidToLocatorRecordBuilder eidToLocatorRecordBuilder = new EidToLocatorRecordBuilder();
233 EidToLocatorRecord eidToLocatorRecord = eidToLocatorRecordBuilder.setLispAddressContainer((LispAddressContainer) eid)
234 .setAction(Action.forValue(legacyEidToLocatorRecord.getAction().getCode()))
235 .setAuthoritative(legacyEidToLocatorRecord.isAuthoritative()).setMaskLength((short) legacyEidToLocatorRecord.getMaskLength())
236 .setRecordTtl(legacyEidToLocatorRecord.getRecordTtl()).setLocatorRecord(listLocatorRecord).build();
237 return eidToLocatorRecord;
240 public static org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord reTransformEidToLocatorRecord(EidToLocatorRecord eidToLocatorRecord) {
242 org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord legacyRecord = new org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord();
244 for (int j = 0; j < eidToLocatorRecord.getLocatorRecord().size(); j++) {
246 LocatorRecord locatorRecord = eidToLocatorRecord.getLocatorRecord().get(j);
248 org.opendaylight.lispflowmapping.type.lisp.LocatorRecord legacyLocatorRecord = new org.opendaylight.lispflowmapping.type.lisp.LocatorRecord();
250 LispAddressContainer rloc = locatorRecord.getLispAddressContainer();
252 legacyLocatorRecord.setLocator(YangTransformerNB.transformToLispAddress(rloc));
254 legacyLocatorRecord.setLocalLocator(legacyLocatorRecord.isLocalLocator()).setPriority((byte) legacyLocatorRecord.getPriority())
255 .setWeight((byte) legacyLocatorRecord.getWeight()).setMulticastPriority((byte) legacyLocatorRecord.getMulticastPriority())
256 .setMulticastWeight((byte) legacyLocatorRecord.getMulticastWeight()).setRlocProbed(legacyLocatorRecord.isRlocProbed())
257 .setRouted(legacyLocatorRecord.isRouted());
259 legacyRecord.addLocator(legacyLocatorRecord);
262 LispAddress eid = transformToLispAddress(eidToLocatorRecord.getLispAddressContainer());
263 legacyRecord.setPrefix(eid).setAction(MapReplyAction.valueOf(eidToLocatorRecord.getAction().getIntValue()))
264 .setAuthoritative(eidToLocatorRecord.isAuthoritative()).setMaskLength((short) eidToLocatorRecord.getMaskLength())
265 .setRecordTtl(eidToLocatorRecord.getRecordTtl());
269 public static MapRequest transformMapRequest(org.opendaylight.lispflowmapping.type.lisp.MapRequest legacyMapRequest) {
271 MapRequestBuilder builder = new MapRequestBuilder();
272 builder.setAuthoritative(legacyMapRequest.isAuthoritative());
273 builder.setMapDataPresent(legacyMapRequest.isMapDataPresent());
274 builder.setPitr(legacyMapRequest.isPitr());
275 builder.setProbe(legacyMapRequest.isProbe());
276 builder.setSmr(legacyMapRequest.isSmr());
277 builder.setSmrInvoked(legacyMapRequest.isSmrInvoked());
279 builder.setEidRecord(new ArrayList<org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecord>());
280 for (EidRecord record : legacyMapRequest.getEids()) {
281 LispAddressContainer container = transformLispAddress(record.getPrefix());
282 builder.getEidRecord().add(
284 new EidRecordBuilder().setMask((short) record.getMaskLength()).setLispAddressContainer(container).build());
287 builder.setItrRloc(new ArrayList<ItrRloc>());
288 for (LispAddress itr : legacyMapRequest.getItrRlocs()) {
289 builder.getItrRloc().add(new ItrRlocBuilder().setLispAddressContainer(transformLispAddress(itr)).build());
292 builder.setMapReply(null);
293 builder.setNonce(legacyMapRequest.getNonce());
294 if (legacyMapRequest.getSourceEid() != null) {
295 builder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(transformLispAddress(legacyMapRequest.getSourceEid())).build());
297 return builder.build();
301 public static PrimitiveAddress toPrimitive(LispAFIAddress address) {
302 if (address instanceof Ipv4) {
303 return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4Builder()
304 .setIpv4Address(((Ipv4) address).getIpv4Address()).setAfi(address.getAfi()).build();
306 if (address instanceof Ipv6) {
307 return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6Builder()
308 .setIpv6Address(((Ipv6) address).getIpv6Address()).setAfi(address.getAfi()).build();
310 if (address instanceof Mac) {
311 return new MacBuilder().setAfi(address.getAfi()).setMacAddress(((Mac) address).getMacAddress()).build();
313 if (address instanceof DistinguishedName) {
314 return new DistinguishedNameBuilder().setAfi(address.getAfi()).setDistinguishedName(((DistinguishedName) address).getDistinguishedName())
320 public static LispAFIAddress toNonPrimitive(PrimitiveAddress address) {
321 if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) {
322 return new Ipv4Builder()
324 ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) address)
325 .getIpv4Address()).setAfi(((LispAFIAddress) address).getAfi()).build();
327 if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) {
328 return new Ipv6Builder()
330 ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) address)
331 .getIpv6Address()).setAfi(((LispAFIAddress) address).getAfi()).build();
333 if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) {
334 return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.MacBuilder()
335 .setAfi(((LispAFIAddress) address).getAfi())
337 ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) address).getMacAddress())
340 if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) {
341 return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedNameBuilder()
342 .setAfi(((LispAFIAddress) address).getAfi())
343 .setDistinguishedName(
344 ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) address)
345 .getDistinguishedName()).build();