platform: Add support for IPv6 tokenized identifiers on Linux

This commit is contained in:
Lubomir Rintel
2014-10-13 08:26:52 +02:00
parent 954a4b69b8
commit c2f9940470

View File

@@ -2514,6 +2514,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)
{
@@ -4583,6 +4615,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;