platform: Add support for IPv6 tokenized identifiers on Linux
This commit is contained in:
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user