From 79f2c30099f0f010abbd2bf4a4ccd6b453947c74 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 27 Apr 2015 21:05:13 +0200 Subject: [PATCH] platform: add inet6_token parameter to NMPlatformLink (cherry picked from commit 32ab8c18f54fe0979b06ec50d0e4344184cc9bfd) --- src/platform/nm-linux-platform.c | 22 ++++++++++++++++++++++ src/platform/nm-platform.c | 3 +++ src/platform/nm-platform.h | 7 +++++++ 3 files changed, 32 insertions(+) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 346c4a5482..3330d79923 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -974,6 +974,28 @@ init_link (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllin } #endif +#if HAVE_LIBNL_INET6_TOKEN + if ((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)) { + struct in6_addr *addr; + NMUtilsIPv6IfaceId *iid = &info->inet6_token.iid; + + 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]; + info->inet6_token.is_valid = TRUE; + } + nl_addr_put (nladdr); + } +#endif + udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex)); if (udev_device) { info->driver = nmp_utils_udev_get_driver (udev_device); diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 73d925e9f8..28f8fc50e1 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -2993,11 +2993,14 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b) _CMP_FIELD (a, b, arptype); _CMP_FIELD (a, b, addr.len); _CMP_FIELD (a, b, inet6_addr_gen_mode_inv); + _CMP_FIELD (a, b, inet6_token.is_valid); _CMP_FIELD_STR_INTERNED (a, b, kind); _CMP_FIELD_STR0 (a, b, udi); _CMP_FIELD_STR_INTERNED (a, b, driver); if (a->addr.len) _CMP_FIELD_MEMCMP_LEN (a, b, addr.data, a->addr.len); + if (a->inet6_token.is_valid) + _CMP_FIELD_MEMCMP (a, b, inet6_token.iid); return 0; } diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index e71a45caa6..3a6c616839 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -29,6 +29,7 @@ #include #include "nm-types.h" +#include "NetworkManagerUtils.h" #define NM_TYPE_PLATFORM (nm_platform_get_type ()) #define NM_PLATFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform)) @@ -110,6 +111,12 @@ struct _NMPlatformLink { guint8 len; } addr; + /* rtnl_link_inet6_get_token() */ + struct { + NMUtilsIPv6IfaceId iid; + guint8 is_valid; + } inet6_token; + /* The bitwise inverse of rtnl_link_inet6_get_addr_gen_mode(). It is inverse * to have a default of 0 -- meaning: unspecified. That way, a struct * initialized with memset(0) has and unset value.*/