diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispExtensionMappingAddressInterpreter.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispExtensionMappingAddressInterpreter.java index e29d8efd98..c4040a7f3b 100644 --- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispExtensionMappingAddressInterpreter.java +++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispExtensionMappingAddressInterpreter.java @@ -110,9 +110,11 @@ public class LispExtensionMappingAddressInterpreter extends AbstractHandlerBehav LispAfiAddress ipv4 = mapping2afi(listAddress.getIpv4()); LispAfiAddress ipv6 = mapping2afi(listAddress.getIpv6()); - List addresses = ImmutableList.of(ipv4, ipv6); - - return new LispListLcafAddress(addresses); + if (ipv4 != null && ipv6 != null) { + return new LispListLcafAddress(ImmutableList.of(ipv4, ipv6)); + } else { + return new LispListLcafAddress(ImmutableList.of()); + } } if (type.equals(SEGMENT_ADDRESS.type())) { diff --git a/drivers/lisp/src/main/resources/lisp-drivers.xml b/drivers/lisp/src/main/resources/lisp-drivers.xml index 35950718a2..0e660380ee 100644 --- a/drivers/lisp/src/main/resources/lisp-drivers.xml +++ b/drivers/lisp/src/main/resources/lisp-drivers.xml @@ -15,7 +15,18 @@ ~ limitations under the License. --> - + + + + + + + diff --git a/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java b/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java index fa032cc557..bcab1bd37b 100644 --- a/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java +++ b/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java @@ -73,7 +73,10 @@ public class LispDeviceProvider extends AbstractProvider implements DeviceProvid private static final String SCHEME_NAME = "lisp"; private static final String DEVICE_PROVIDER_PACKAGE = "org.onosproject.lisp.provider.device"; - private static final String UNKNOWN = "unknown"; + private static final String MANUFACTURER = "IETF"; + private static final String HARDWARE_VERSION = "LISP Reference Router"; + private static final String SOFTWARE_VERSION = "1.0"; + private static final String SERIAL_NUMBER = "unknown"; private static final String IS_NULL_MSG = "LISP device info is null"; private static final String IPADDRESS = "ipaddress"; private static final String LISP = "lisp"; @@ -147,8 +150,8 @@ public class LispDeviceProvider extends AbstractProvider implements DeviceProvid DeviceDescription deviceDescription = new DefaultDeviceDescription( deviceId.uri(), Device.Type.ROUTER, - UNKNOWN, UNKNOWN, - UNKNOWN, UNKNOWN, + MANUFACTURER, HARDWARE_VERSION, + SOFTWARE_VERSION, SERIAL_NUMBER, cid, false, annotations); if (deviceService.getDevice(deviceId) == null) { diff --git a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java index 3cf1e3b205..0eacc60b90 100644 --- a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java +++ b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java @@ -34,6 +34,7 @@ import org.onosproject.mapping.MappingProviderRegistry; import org.onosproject.mapping.MappingProviderService; import org.onosproject.mapping.MappingStore; import org.onosproject.net.DeviceId; +import org.onosproject.net.device.DeviceService; import org.onosproject.net.provider.AbstractProvider; import org.onosproject.net.provider.ProviderId; import org.onosproject.provider.lisp.mapping.util.MappingEntryBuilder; @@ -59,6 +60,9 @@ public class LispMappingProvider extends AbstractProvider implements MappingProv @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected MappingProviderRegistry providerRegistry; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected DeviceService deviceService; + protected MappingProviderService providerService; private static final String SCHEME_NAME = "lisp"; @@ -166,7 +170,8 @@ public class LispMappingProvider extends AbstractProvider implements MappingProv List records, MappingStore.Type type) { records.forEach(r -> { - MappingEntry me = new MappingEntryBuilder(deviceId, r).build(); + MappingEntry me = + new MappingEntryBuilder(deviceId, r, deviceService).build(); providerService.mappingAdded(me, type); }); } diff --git a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilder.java b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilder.java index 1a0ed09e4e..9f78e8056d 100644 --- a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilder.java +++ b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilder.java @@ -19,6 +19,7 @@ import com.google.common.collect.Lists; import org.onlab.packet.IpAddress; import org.onlab.packet.IpPrefix; import org.onlab.packet.MacAddress; +import org.onosproject.lisp.ctl.ExtensionMappingAddressInterpreter; import org.onosproject.lisp.msg.protocols.LispLocator; import org.onosproject.lisp.msg.protocols.LispMapRecord; import org.onosproject.lisp.msg.types.LispAfiAddress; @@ -41,21 +42,26 @@ import org.onosproject.mapping.MappingTreatment; import org.onosproject.mapping.MappingValue; import org.onosproject.mapping.actions.MappingAction; import org.onosproject.mapping.actions.MappingActions; +import org.onosproject.mapping.addresses.ExtensionMappingAddress; import org.onosproject.mapping.addresses.MappingAddress; import org.onosproject.mapping.addresses.MappingAddresses; +import org.onosproject.net.Device; import org.onosproject.net.DeviceId; +import org.onosproject.net.device.DeviceService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.UUID; +import static org.onosproject.mapping.addresses.ExtensionMappingAddressType.ExtensionMappingAddressTypes.*; + /** * Mapping entry builder class. */ public class MappingEntryBuilder { private static final Logger log = - LoggerFactory.getLogger(MappingEntryBuilder.class); + LoggerFactory.getLogger(MappingEntryBuilder.class); private static final int IPV4_PREFIX_LENGTH = 32; private static final int IPV6_PREFIX_LENGTH = 128; @@ -66,17 +72,36 @@ public class MappingEntryBuilder { private final MappingAction action; private final List treatments; + private final DeviceService deviceService; + /** * Default constructor for MappingEntryBuilder. * - * @param deviceId device identifier - * @param record LISP map record + * @param deviceId device identifier + * @param record LISP map record + * @param deviceService device service + */ + public MappingEntryBuilder(DeviceId deviceId, LispMapRecord record, + DeviceService deviceService) { + this.deviceId = deviceId; + this.address = buildAddress(record); + this.action = buildAction(record); + this.treatments = buildTreatments(record); + this.deviceService = deviceService; + } + + /** + * Default constructor for MappingEntryBuilder. + * + * @param deviceId device identifier + * @param record LISP map record */ public MappingEntryBuilder(DeviceId deviceId, LispMapRecord record) { this.deviceId = deviceId; this.address = buildAddress(record); this.action = buildAction(record); this.treatments = buildTreatments(record); + this.deviceService = null; } /** @@ -169,8 +194,7 @@ public class MappingEntryBuilder { */ private MappingAddress buildAddress(LispMapRecord record) { - return record == null ? null : - getAddress(record.getEidPrefixAfi()); + return record == null ? null : getAddress(record.getEidPrefixAfi()); } /** @@ -188,22 +212,22 @@ public class MappingEntryBuilder { switch (address.getAfi()) { case IP4: - return afi2MappingAddress(address); + return afi2mapping(address); case IP6: - return afi2MappingAddress(address); + return afi2mapping(address); case AS: int asNum = ((LispAsAddress) address).getASNum(); return MappingAddresses.asMappingAddress(String.valueOf(asNum)); case DISTINGUISHED_NAME: String dn = ((LispDistinguishedNameAddress) - address).getDistinguishedName(); + address).getDistinguishedName(); return MappingAddresses.dnMappingAddress(dn); case MAC: MacAddress macAddress = ((LispMacAddress) address).getAddress(); return MappingAddresses.ethMappingAddress(macAddress); case LCAF: - LispLcafAddress lcafAddress = (LispLcafAddress) address; - return lcaf2Extension(lcafAddress); + return deviceService == null ? null : + lcaf2extension((LispLcafAddress) address); default: log.warn("Unsupported address type {}", address.getAfi()); break; @@ -215,13 +239,89 @@ public class MappingEntryBuilder { /** * Converts LCAF address to extension mapping address. * - * @param lcaf LCAF address + * @param lcaf LCAF address * @return extension mapping address */ - private MappingAddress lcaf2Extension(LispLcafAddress lcaf) { + private MappingAddress lcaf2extension(LispLcafAddress lcaf) { - // TODO: move LCAF to extension mapping to LISP Extension Interpreter - return null; + Device device = deviceService.getDevice(deviceId); + + ExtensionMappingAddressInterpreter addressInterpreter; + ExtensionMappingAddress mappingAddress = null; + if (device.is(ExtensionMappingAddressInterpreter.class)) { + addressInterpreter = device.as(ExtensionMappingAddressInterpreter.class); + } else { + addressInterpreter = null; + } + + switch (lcaf.getType()) { + case LIST: + if (addressInterpreter != null && + addressInterpreter.supported(LIST_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case SEGMENT: + if (addressInterpreter != null && + addressInterpreter.supported(SEGMENT_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case AS: + if (addressInterpreter != null && + addressInterpreter.supported(AS_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case APPLICATION_DATA: + if (addressInterpreter != null && + addressInterpreter.supported(APPLICATION_DATA_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case GEO_COORDINATE: + if (addressInterpreter != null && + addressInterpreter.supported(GEO_COORDINATE_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case NAT: + if (addressInterpreter != null && + addressInterpreter.supported(NAT_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case NONCE: + if (addressInterpreter != null && + addressInterpreter.supported(NONCE_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case MULTICAST: + if (addressInterpreter != null && + addressInterpreter.supported(MULTICAST_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case TRAFFIC_ENGINEERING: + if (addressInterpreter != null && + addressInterpreter.supported(TRAFFIC_ENGINEERING_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + case SOURCE_DEST: + if (addressInterpreter != null && + addressInterpreter.supported(SOURCE_DEST_ADDRESS.type())) { + mappingAddress = addressInterpreter.mapLcafAddress(lcaf); + } + break; + default: + log.warn("Unsupported extension mapping address type {}", lcaf.getType()); + break; + } + + return mappingAddress != null ? + MappingAddresses.extensionMappingAddressWrapper(mappingAddress, deviceId) : null; } /** @@ -230,7 +330,7 @@ public class MappingEntryBuilder { * @param afiAddress IP typed AFI address * @return generalized mapping address */ - private MappingAddress afi2MappingAddress(LispAfiAddress afiAddress) { + private MappingAddress afi2mapping(LispAfiAddress afiAddress) { switch (afiAddress.getAfi()) { case IP4: IpAddress ipv4Address = ((LispIpv4Address) afiAddress).getAddress(); diff --git a/providers/lisp/mapping/src/test/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilderTest.java b/providers/lisp/mapping/src/test/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilderTest.java index ad6d36af8f..ac7d84fc73 100644 --- a/providers/lisp/mapping/src/test/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilderTest.java +++ b/providers/lisp/mapping/src/test/java/org/onosproject/provider/lisp/mapping/util/MappingEntryBuilderTest.java @@ -74,16 +74,7 @@ import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.AS; import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.DISTINGUISHED_NAME; import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.IP4; import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.IP6; -import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.LCAF; import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.MAC; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.APPLICATION_DATA; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.GEO_COORDINATE; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.LIST; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.MULTICAST; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.NAT; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.NONCE; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.SEGMENT; -import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.SOURCE_DEST; import static org.onosproject.lisp.msg.types.lcaf.LispCanonicalAddressFormatEnum.UNKNOWN; /**