diff options
author | Thomas Haller <thaller@redhat.com> | 2015-04-27 21:05:13 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-05-06 12:33:27 +0200 |
commit | b210e091d296b776eb884a65bbd2933ea78409af (patch) | |
tree | 3f8d6ef6b24324121447ebafc9c9d9085a315d43 | |
parent | 00a28af13bf13a92b95888d7ca0326cda5605f4e (diff) | |
download | NetworkManager-b210e091d296b776eb884a65bbd2933ea78409af.tar.gz |
platform: add inet6_token parameter to NMPlatformLink
-rw-r--r-- | src/platform/nm-linux-platform.c | 22 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 3 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 7 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index eb2bb0001b..eeb831b5e6 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -962,6 +962,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 31aa2fc705..82828d93b1 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -2670,11 +2670,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 c2f18b469e..0a3e491ec8 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -29,6 +29,7 @@ #include <nm-dbus-interface.h> #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.*/ |