Magnesium platform upgrade
[lispflowmapping.git] / mappingservice / lisp-proto / src / main / java / org / opendaylight / lispflowmapping / lisp / util / LispAddressStringifier.java
index ea92e9a6963c5d1c66ca63722b4ccc280b31c88e..29e2409077818fff41ac68a0df89c26daf0e2916 100644 (file)
@@ -7,30 +7,41 @@
  */
 package org.opendaylight.lispflowmapping.lisp.util;
 
+import com.google.common.io.BaseEncoding;
+import com.google.common.net.InetAddresses;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.UnknownHostException;
 import java.util.List;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lcaflistaddress.Addresses;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lcaftrafficengineeringaddress.Hops;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.LispAddressContainer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.AS;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.DistinguishedName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Ipv4;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Ipv6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafApplicationData;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafKeyValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSegment;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSourceDest;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafTrafficEngineering;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Mac;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.No;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.lcafapplicationdata.LcafApplicationDataAddr;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.lcafkeyvalue.LcafKeyValueAddressAddr;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.lcafsourcedest.LcafSourceDestAddr;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress.PrimitiveAddress;
-
-import com.google.common.base.Preconditions;
+import java.util.Set;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AfiList;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedName;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.InstanceId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Utility class with static methods returning string representations of
@@ -40,14 +51,17 @@ import com.google.common.base.Preconditions;
  * @author Lorand Jakab
  *
  */
-public class LispAddressStringifier {
+public final class LispAddressStringifier {
+    protected static final Logger LOG = LoggerFactory.getLogger(LispAddressStringifier.class);
 
     private static final String PREFIX_SEPARATOR = ":";
+
     /*
      * In the unlikely event that a AFI 0 address is used a key, we use a
      * sequence number to ensure uniqueness
      */
     protected static int noAddrSeq = 0;
+
     /*
      * There are three possible destinations for rendering an address as a
      * string:
@@ -65,89 +79,160 @@ public class LispAddressStringifier {
         URL;
     }
 
-    public static String getString(LispAddressContainer container) {
-        return getAddrString(Destination.USER, container);
+    // Utility class, should not be instantiated
+    private LispAddressStringifier() {
+    }
+
+    public static String getString(LispAddress lispAddress) {
+        return getAddrString(Destination.USER, lispAddress);
+    }
+
+    public static String getString(Set<Eid> eids) {
+        StringBuilder sb = new StringBuilder("{");
+        boolean first = true;
+        for (Eid eid : eids) {
+            if (!first) {
+                sb.append(", ");
+            }
+            sb.append(getString(eid));
+            first = false;
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    public static String getString(Address address) {
+        return getAddrString(Destination.USER, address, null);
     }
 
-    public static String getURIString(LispAddressContainer container) {
-        return getString(Destination.URI, container);
+    public static String getString(XtrId xtrId) {
+        return getXtrIdString(xtrId);
     }
 
-    public static String getURLString(LispAddressContainer container) {
-        return getString(Destination.URL, container);
+    public static String getURIString(LispAddress lispAddress) {
+        return getAddrString(Destination.URI, lispAddress);
     }
 
-    private static String getAddrString(Destination dst, LispAddressContainer container) {
-        Preconditions.checkNotNull(container, "address should not be null");
-        Address addr = container.getAddress();
-        String prefix = null;
-        String address = null;
+    public static String getURIString(XtrId xtrId) {
+        return getXtrIdString(xtrId);
+    }
+
+    public static String getURLString(LispAddress lispAddress) {
+        return getAddrString(Destination.URL, lispAddress);
+    }
+
+    public static String getURLString(XtrId xtrId) {
+        return getXtrIdString(xtrId);
+    }
+
+    private static String getXtrIdString(XtrId xtrId) {
+        return BaseEncoding.base16().encode(xtrId.getValue());
+    }
+
+    private static String getAddrString(Destination dst, LispAddress lispAddress) {
+        if (lispAddress == null) {
+            return "null";
+        }
+
+        Address addr = lispAddress.getAddress();
+        Long vni = null;
+
+        if (lispAddress.getVirtualNetworkId() != null) {
+            vni = lispAddress.getVirtualNetworkId().getValue().toJava();
+        }
+
+        return getAddrString(dst, addr, vni);
+    }
+
+    private static String getAddrString(Destination dst, Address addr, Long virtualNetworkId) {
+        String prefix = "";
+        String vni = "";
+        String address = "";
+
+        if (virtualNetworkId != null) {
+            vni = "[" + virtualNetworkId + "] ";
+        }
 
         if (addr instanceof Ipv4) {
             prefix = "ipv4" + PREFIX_SEPARATOR;
             address = getStringFromIpv4(dst, (Ipv4) addr);
+        } else if (addr instanceof Ipv4Binary) {
+            prefix = "ipv4" + PREFIX_SEPARATOR;
+            address = getStringFromIpv4Binary(dst, (Ipv4Binary) addr);
+        } else if (addr instanceof Ipv4Prefix) {
+            prefix = "ipv4" + PREFIX_SEPARATOR;
+            address = getStringFromIpv4Prefix(dst, (Ipv4Prefix) addr);
+        } else if (addr instanceof Ipv4PrefixBinary) {
+            prefix = "ipv4" + PREFIX_SEPARATOR;
+            address = getStringFromIpv4PrefixBinary(dst, (Ipv4PrefixBinary) addr);
         } else if (addr instanceof Ipv6) {
             prefix = "ipv6" + PREFIX_SEPARATOR;
             address = getStringFromIpv6(dst, (Ipv6) addr);
+        } else if (addr instanceof Ipv6Binary) {
+            prefix = "ipv6" + PREFIX_SEPARATOR;
+            address = getStringFromIpv6Binary(dst, (Ipv6Binary) addr);
+        } else if (addr instanceof Ipv6Prefix) {
+            prefix = "ipv6" + PREFIX_SEPARATOR;
+            address = getStringFromIpv6Prefix(dst, (Ipv6Prefix) addr);
+        } else if (addr instanceof Ipv6PrefixBinary) {
+            prefix = "ipv6" + PREFIX_SEPARATOR;
+            address = getStringFromIpv6PrefixBinary(dst, (Ipv6PrefixBinary) addr);
         } else if (addr instanceof Mac) {
             prefix = "mac" + PREFIX_SEPARATOR;
             address = getStringFromMac(dst, (Mac) addr);
-        } else if (addr instanceof LcafSegment) {
-            PrimitiveAddress pa = ((LcafSegment) addr).getLcafSegmentAddr().getAddress().getPrimitiveAddress();
+        } else if (addr instanceof InstanceId) {
+            SimpleAddress pa = ((InstanceId)addr).getInstanceId().getAddress();
             // Instance ID is a separate parent hierarchy, so we use the simple address prefix
-            prefix = LispPrimitiveAddressStringifier.getURLPrefix(pa) + PREFIX_SEPARATOR;
-            address = getStringFromLcafSegment(dst, (LcafSegment) addr);
-        } else if (addr instanceof No) {
+            prefix = LispSimpleAddressStringifier.getURLPrefix(pa) + PREFIX_SEPARATOR;
+            address = getStringFromInstanceId(dst, (InstanceId) addr);
+        } else if (addr instanceof NoAddress) {
             prefix = "no" + PREFIX_SEPARATOR;
-            address = getStringFromNo(dst, (No) addr);
+            address = getStringFromNoAddress(dst, (NoAddress) addr);
         } else if (addr instanceof DistinguishedName) {
             prefix = "dn" + PREFIX_SEPARATOR;
             address = getStringFromDistinguishedName(dst, (DistinguishedName) addr);
-        } else if (addr instanceof AS) {
+        } else if (addr instanceof AsNumber) {
             prefix = "as" + PREFIX_SEPARATOR;
-            address = getStringFromAS(dst, (AS) addr);
-        } else if (addr instanceof LcafList) {
+            address = getStringFromAsNumber(dst, (AsNumber) addr);
+        } else if (addr instanceof AfiList) {
             prefix = "list" + PREFIX_SEPARATOR;
-            address = getStringFromLcafList(dst, (LcafList) addr);
-        } else if (addr instanceof LcafApplicationData) {
+            address = getStringFromAfiList(dst, (AfiList) addr);
+        } else if (addr instanceof ApplicationData) {
             prefix = "appdata" + PREFIX_SEPARATOR;
-            address = getStringFromLcafApplicationData(dst, (LcafApplicationData) addr);
-        } else if (addr instanceof LcafTrafficEngineering) {
+            address = getStringFromApplicationData(dst, (ApplicationData) addr);
+        } else if (addr instanceof ExplicitLocatorPath) {
             prefix = "elp" + PREFIX_SEPARATOR;
-            address = getStringFromLcafTrafficEngineering(dst, (LcafTrafficEngineering) addr);
-        } else if (addr instanceof LcafSourceDest) {
+            address = getStringFromExplicitLocatorPath(dst, (ExplicitLocatorPath) addr);
+        } else if (addr instanceof SourceDestKey) {
             prefix = "srcdst" + PREFIX_SEPARATOR;
-            address = getStringFromLcafSourceDest(dst, (LcafSourceDest) addr);
-        } else if (addr instanceof LcafKeyValue) {
+            address = getStringFromSourceDestKey(dst, (SourceDestKey) addr);
+        } else if (addr instanceof KeyValueAddress) {
             prefix = "kv" + PREFIX_SEPARATOR;
-            address = getStringFromLcafKeyValue(dst, (LcafKeyValue) addr);
+            address = getStringFromKeyValueAddress(dst, (KeyValueAddress) addr);
+        } else if (addr instanceof ServicePath) {
+            prefix = "sp" + PREFIX_SEPARATOR;
+            address = getStringFromServicePath(dst, (ServicePath) addr);
+        } else {
+            return null;
         }
 
         if (dst == Destination.USER) {
-            return address;
+            return vni + address;
         } else {
             return prefix + address;
         }
 
     }
 
-    private static String getString(Destination dst, LispAddressContainer container) {
-        if (MaskUtil.isMaskable(container)) {
-            return (getAddrString(dst, container) + getMaskSeparator(dst) + MaskUtil.getMaskForAddress(container));
-        } else {
-            return getAddrString(dst, container);
-        }
-    }
-
-    private static String getMaskSeparator(Destination dst) {
+    private static String getPrefixString(Destination dst, String prefix) {
         if (dst == Destination.URL) {
-            return "%2f";
+            return prefix.replace("/", "%2f");
         } else {
-            return "/";
+            return prefix;
         }
     }
 
-    protected static String getStringFromNo(Destination dst, No addr) {
+    protected static String getStringFromNoAddress(Destination dst, NoAddress addr) {
         // AFI = 0
         if (dst == Destination.USER) {
             return "No Address Present";
@@ -158,88 +243,151 @@ public class LispAddressStringifier {
 
     protected static String getStringFromIpv4(Destination dst, Ipv4 addr) {
         // AFI = 1; IPv4
-        return addr.getIpv4Address().getIpv4Address().getValue();
+        return addr.getIpv4().getValue();
+    }
+
+    protected static String getStringFromIpv4Binary(Destination dst, Ipv4Binary addr) {
+        // AFI = 1; IPv4
+        try {
+            return InetAddresses.toAddrString(Inet4Address.getByAddress(addr.getIpv4Binary().getValue()));
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv4 to string", e);
+        }
+        return null;
+    }
+
+    protected static String getStringFromIpv4Prefix(Destination dst, Ipv4Prefix addr) {
+        // AFI = 1; IPv4
+        String prefix = addr.getIpv4Prefix().getValue();
+        return getPrefixString(dst, prefix);
+    }
+
+    protected static String getStringFromIpv4PrefixBinary(Destination dst, Ipv4PrefixBinary addr) {
+        // AFI = 1; IPv4
+        try {
+            StringBuilder prefixBuilder = new StringBuilder(InetAddresses.toAddrString(
+                    Inet4Address.getByAddress(addr.getIpv4AddressBinary().getValue())));
+            prefixBuilder.append('/');
+            prefixBuilder.append(addr.getIpv4MaskLength().toString());
+            return getPrefixString(dst, prefixBuilder.toString());
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv4 prefix to string", e);
+        }
+        return null;
     }
 
     protected static String getStringFromIpv6(Destination dst, Ipv6 addr) {
         // AFI = 2; IPv6
-        return addr.getIpv6Address().getIpv6Address().getValue();
+        return addr.getIpv6().getValue();
+    }
+
+    protected static String getStringFromIpv6Binary(Destination dst, Ipv6Binary addr) {
+        // AFI = 2; IPv6
+        try {
+            return InetAddresses.toAddrString(Inet6Address.getByAddress(addr.getIpv6Binary().getValue()));
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv6 to string", e);
+        }
+        return null;
+    }
+
+    protected static String getStringFromIpv6Prefix(Destination dst, Ipv6Prefix addr) {
+        // AFI = 2; IPv6
+        return addr.getIpv6Prefix().getValue();
+    }
+
+    protected static String getStringFromIpv6PrefixBinary(Destination dst, Ipv6PrefixBinary addr) {
+        // AFI = 2; IPv5
+        try {
+            StringBuilder prefixBuilder = new StringBuilder(InetAddresses.toAddrString(
+                    Inet6Address.getByAddress(addr.getIpv6AddressBinary().getValue())));
+            prefixBuilder.append('/');
+            prefixBuilder.append(addr.getIpv6MaskLength().toString());
+            return getPrefixString(dst, prefixBuilder.toString());
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv6 prefix to string", e);
+        }
+        return null;
     }
 
     protected static String getStringFromDistinguishedName(Destination dst, DistinguishedName addr) {
         // AFI = 17; Distinguished Name
-        return addr.getDistinguishedName().getDistinguishedName();
+        return addr.getDistinguishedName().getValue();
     }
 
-    protected static String getStringFromAS(Destination dst, AS addr) {
+    protected static String getStringFromAsNumber(Destination dst, AsNumber addr) {
         // AFI = 18; Autonomous System Number
-        return "AS" + addr.getAS().getAS();
+        return "AS" + addr.getAsNumber().getValue();
     }
-    protected static String getStringFromLcafList(Destination dst, LcafList addr) {
+
+    protected static String getStringFromAfiList(Destination dst, AfiList addr) {
         // AFI 16387, LCAF Type 1; Address List
         // Example rendering:
         //    {192.0.2.1,192.0.2.2,2001:db8::1}
-        List<Addresses> addresses = addr.getLcafListAddr().getAddresses();
+        List<SimpleAddress> addresses = addr.getAfiList().getAddressList();
         StringBuilder sb = new StringBuilder("{");
         boolean needComma = false;
-        for (Addresses a : addresses) {
+        for (SimpleAddress a : addresses) {
             if (needComma) {
                 sb.append(",");
             }
-            sb.append(LispPrimitiveAddressStringifier.getString(dst, a.getPrimitiveAddress()));
+            sb.append(a.stringValue());
             needComma = true;
         }
         sb.append("}");
         return sb.toString();
     }
 
-    protected static String getStringFromLcafSegment(Destination dst, LcafSegment addr) {
+    protected static String getStringFromInstanceId(Destination dst, InstanceId addr) {
         // AFI = 16387, LCAF Type 2; Instance ID
         // Example rendering:
         //    [223] 192.0.2.0/24
-        PrimitiveAddress pa = addr.getLcafSegmentAddr().getAddress().getPrimitiveAddress();
+        SimpleAddress pa = addr.getInstanceId().getAddress();
         if (dst == Destination.USER) {
-            return "[" + addr.getLcafSegmentAddr().getInstanceId() + "] "
-                    + LispPrimitiveAddressStringifier.getString(dst, pa);
+            return "[" + addr.getInstanceId().getIid().getValue() + "] "
+                    + LispSimpleAddressStringifier.getString(dst, pa);
         } else {
-            return LispPrimitiveAddressStringifier.getString(dst, pa);
+            return LispSimpleAddressStringifier.getString(dst, pa);
         }
     }
 
-    protected static String getStringFromLcafApplicationData(Destination dst, LcafApplicationData addr) {
+    protected static String getStringFromApplicationData(Destination dst, ApplicationData addr) {
         // AFI = 16387, LCAF Type 4; Application Data
         // Example rendering:
         //    192.0.2.1!128!17!80-81!6667-7000
-        LcafApplicationDataAddr a = addr.getLcafApplicationDataAddr();
-        return LispPrimitiveAddressStringifier.getString(dst, a.getAddress().getPrimitiveAddress())
-                + "!" + a.getIpTos() + "!" + a.getProtocol()
-                + "!" + a.getLocalPortLow() + "-" + a.getLocalPortHigh()
-                + "!" + a.getRemotePortLow() + "-" + a.getRemotePortHigh();
-
+        return LispSimpleAddressStringifier.getString(dst, addr.getApplicationData().getAddress())
+                + "!" + addr.getApplicationData().getIpTos()
+                + "!" + addr.getApplicationData().getProtocol()
+                + "!" + addr.getApplicationData().getLocalPortLow()
+                + "-" + addr.getApplicationData().getLocalPortHigh()
+                + "!" + addr.getApplicationData().getRemotePortLow()
+                + "-" + addr.getApplicationData().getRemotePortHigh();
     }
-    protected static String getStringFromLcafTrafficEngineering(Destination dst, LcafTrafficEngineering addr) {
+
+    protected static String getStringFromExplicitLocatorPath(Destination dst, ExplicitLocatorPath addr) {
         // AFI = 16387, LCAF Type 10, Explicit Locator Path
         // Example rendering:
         //    {192.0.2.1->192.0.2.2|lps->192.0.2.3}
-        List<Hops> hops = addr.getLcafTrafficEngineeringAddr().getHops();
+        List<Hop> hops = addr.getExplicitLocatorPath().getHop();
         StringBuilder sb = new StringBuilder();
         sb.append("{");
         boolean needArrow = false;
-        for (Hops hop : hops) {
+        for (Hop hop : hops) {
             if (needArrow) {
                 sb.append("->");
             }
-            sb.append(LispPrimitiveAddressStringifier.getString(dst, hop.getHop().getPrimitiveAddress()));
-            if (hop.isLookup() || hop.isRLOCProbe() || hop.isStrict()) {
+            sb.append(LispSimpleAddressStringifier.getString(dst, hop.getAddress()));
+            LrsBits lrs = hop.getLrsBits();
+            if (lrs.isLookup() || lrs.isRlocProbe() || lrs.isStrict()) {
                 sb.append("|");
             }
-            if (hop.isLookup()) {
+            if (lrs.isLookup()) {
                 sb.append("l");
             }
-            if (hop.isRLOCProbe()) {
+            if (lrs.isRlocProbe()) {
                 sb.append("p");
             }
-            if (hop.isStrict()) {
+            if (lrs.isStrict()) {
                 sb.append("s");
             }
             needArrow = true;
@@ -248,29 +396,33 @@ public class LispAddressStringifier {
         return sb.toString();
     }
 
-    protected static String getStringFromLcafSourceDest(Destination dst, LcafSourceDest addr) {
+    protected static String getStringFromSourceDestKey(Destination dst, SourceDestKey addr) {
         // AFI = 16387, LCAF Type 12, Source/Destination Key
         // Example rendering:
         //    192.0.2.1/32|192.0.2.2/32
-        LcafSourceDestAddr a = ((LcafSourceDest) addr).getLcafSourceDestAddr();
-        return LispPrimitiveAddressStringifier.getString(dst, a.getSrcAddress().getPrimitiveAddress())
-                + getMaskSeparator(dst) + a.getSrcMaskLength() + "|"
-                + LispPrimitiveAddressStringifier.getString(dst, a.getDstAddress().getPrimitiveAddress())
-                + getMaskSeparator(dst) + a.getDstMaskLength();
+        return getPrefixString(dst, addr.getSourceDestKey().getSource().stringValue()
+                + "|" + getPrefixString(dst, addr.getSourceDestKey().getDest().stringValue()));
     }
 
-    protected static String getStringFromLcafKeyValue(Destination dst, LcafKeyValue addr) {
+    protected static String getStringFromKeyValueAddress(Destination dst, KeyValueAddress addr) {
         // AFI = 16387, LCAF Type 15, Key/Value Address Pair
         // Example rendering:
         //    192.0.2.1=>192.0.2.2
-        LcafKeyValueAddressAddr a = addr.getLcafKeyValueAddressAddr();
-        return LispPrimitiveAddressStringifier.getString(dst, a.getKey().getPrimitiveAddress()) + "=>"
-                + LispPrimitiveAddressStringifier.getString(dst, a.getValue().getPrimitiveAddress());
+        return getPrefixString(dst, addr.getKeyValueAddress().getKey().stringValue()
+                + "=>" + getPrefixString(dst, addr.getKeyValueAddress().getValue().stringValue()));
     }
 
     protected static String getStringFromMac(Destination dst, Mac addr) {
         // AFI = 16389; MAC
-        return addr.getMacAddress().getMacAddress().getValue();
+        return addr.getMac().getValue();
+    }
+
+    protected static String getStringFromServicePath(Destination dst, ServicePath addr) {
+        // AFI = 16387; LCAF http://tools.ietf.org/html/draft-ermagan-lisp-nsh-00
+        // Example rendering:
+        //     42(3)
+        return getPrefixString(dst, new String(addr.getServicePath().getServicePathId().getValue() + "("
+                + addr.getServicePath().getServiceIndex() + ")"));
     }
 
 }