platform: Add support for IPv6 tokenized identifiers on Linux

(cherry picked from commit c2f9940470)
This commit is contained in:
Lubomir Rintel 2014-10-13 08:26:52 +02:00 committed by Thomas Haller
parent c3c927d1d1
commit 172f5256a7

View file

@ -2519,6 +2519,38 @@ link_set_noarp (NMPlatform *platform, int ifindex)
return link_change_flags (platform, ifindex, IFF_NOARP, TRUE);
}
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)
{
@ -4603,6 +4635,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;