platform: add inet6_token parameter to NMPlatformLink

This commit is contained in:
Thomas Haller
2015-04-27 21:05:13 +02:00
parent 3ce4431695
commit 32ab8c18f5
3 changed files with 32 additions and 0 deletions

View File

@@ -974,6 +974,28 @@ init_link (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllin
} }
#endif #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)); udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex));
if (udev_device) { if (udev_device) {
info->driver = nmp_utils_udev_get_driver (udev_device); info->driver = nmp_utils_udev_get_driver (udev_device);

View File

@@ -2796,11 +2796,14 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b)
_CMP_FIELD (a, b, arptype); _CMP_FIELD (a, b, arptype);
_CMP_FIELD (a, b, addr.len); _CMP_FIELD (a, b, addr.len);
_CMP_FIELD (a, b, inet6_addr_gen_mode_inv); _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_STR_INTERNED (a, b, kind);
_CMP_FIELD_STR0 (a, b, udi); _CMP_FIELD_STR0 (a, b, udi);
_CMP_FIELD_STR_INTERNED (a, b, driver); _CMP_FIELD_STR_INTERNED (a, b, driver);
if (a->addr.len) if (a->addr.len)
_CMP_FIELD_MEMCMP_LEN (a, b, addr.data, 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; return 0;
} }

View File

@@ -29,6 +29,7 @@
#include <nm-dbus-interface.h> #include <nm-dbus-interface.h>
#include "nm-types.h" #include "nm-types.h"
#include "NetworkManagerUtils.h"
#define NM_TYPE_PLATFORM (nm_platform_get_type ()) #define NM_TYPE_PLATFORM (nm_platform_get_type ())
#define NM_PLATFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform)) #define NM_PLATFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform))
@@ -110,6 +111,12 @@ struct _NMPlatformLink {
guint8 len; guint8 len;
} addr; } 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 /* 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 * to have a default of 0 -- meaning: unspecified. That way, a struct
* initialized with memset(0) has and unset value.*/ * initialized with memset(0) has and unset value.*/