diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2014-09-29 18:02:24 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-10-10 17:21:01 +0200 |
commit | 5facd420e543ea9e0e8c557791d440b383878a73 (patch) | |
tree | 709969180dddcfd2784bb71380d994c5a8e50112 | |
parent | 9b09ab1a6861c1ddcb39041ea83a26f923dd5fee (diff) | |
download | NetworkManager-5facd420e543ea9e0e8c557791d440b383878a73.tar.gz |
platform: Add support for IPv6 tokenized identifiers on Linux
-rw-r--r-- | src/platform/nm-linux-platform.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index bef70392bb..6c600b9f49 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -44,9 +44,9 @@ #include <netlink/route/route.h> #include <gudev/gudev.h> -#if HAVE_LIBNL_INET6_ADDR_GEN_MODE +#if HAVE_LIBNL_INET6_ADDR_GEN_MODE || HAVE_LIBNL_INET6_TOKEN #include <netlink/route/link/inet6.h> -#if HAVE_KERNEL_INET6_ADDR_GEN_MODE +#if HAVE_LIBNL_INET6_ADDR_GEN_MODE && HAVE_KERNEL_INET6_ADDR_GEN_MODE #include <linux/if_link.h> #else #define IN6_ADDR_GEN_MODE_EUI64 0 @@ -2505,6 +2505,38 @@ link_set_noarp (NMPlatform *platform, int ifindex) } static gboolean +link_get_ipv6_token (NMPlatform *platform, int ifindex, NMUtilsIPv6IfaceId *iid) +{ +#if HAVE_LIBNL_INET6_TOKEN + auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex); + struct nl_addr *nladdr; + struct in6_addr *addr; + + if (rtnllink && + (rtnl_link_inet6_get_token (rtnllink, &nladdr)) == 0) { + if (nl_addr_get_family (nladdr) != AF_INET6 || + nl_addr_get_len (nladdr) != sizeof (struct in6_addr)) { + nl_addr_put (nladdr); + return FALSE; + } + + addr = nl_addr_get_binary_addr (nladdr); + iid->id_u8[7] = addr->s6_addr[15]; + iid->id_u8[6] = addr->s6_addr[14]; + iid->id_u8[5] = addr->s6_addr[13]; + iid->id_u8[4] = addr->s6_addr[12]; + iid->id_u8[3] = addr->s6_addr[11]; + iid->id_u8[2] = addr->s6_addr[10]; + iid->id_u8[1] = addr->s6_addr[9]; + iid->id_u8[0] = addr->s6_addr[8]; + nl_addr_put (nladdr); + return TRUE; + } +#endif + return FALSE; +} + +static gboolean link_get_user_ipv6ll_enabled (NMPlatform *platform, int ifindex) { #if HAVE_LIBNL_INET6_ADDR_GEN_MODE @@ -4333,6 +4365,8 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass) platform_class->link_is_connected = link_is_connected; platform_class->link_uses_arp = link_uses_arp; + platform_class->link_get_ipv6_token = link_get_ipv6_token; + platform_class->link_get_user_ipv6ll_enabled = link_get_user_ipv6ll_enabled; platform_class->link_set_user_ipv6ll_enabled = link_set_user_ipv6ll_enabled; |