summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-04-27 21:05:13 +0200
committerThomas Haller <thaller@redhat.com>2015-05-06 12:33:27 +0200
commitb210e091d296b776eb884a65bbd2933ea78409af (patch)
tree3f8d6ef6b24324121447ebafc9c9d9085a315d43
parent00a28af13bf13a92b95888d7ca0326cda5605f4e (diff)
downloadNetworkManager-b210e091d296b776eb884a65bbd2933ea78409af.tar.gz
platform: add inet6_token parameter to NMPlatformLink
-rw-r--r--src/platform/nm-linux-platform.c22
-rw-r--r--src/platform/nm-platform.c3
-rw-r--r--src/platform/nm-platform.h7
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.*/