summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2014-10-13 08:26:52 +0200
committerLubomir Rintel <lkundrak@v3.sk>2015-01-26 13:05:06 +0100
commitc2f9940470fc891e2c743e6e33e43b43687414d2 (patch)
tree62df07c353c7f1cd377a9673d7140fc2175a8539
parent954a4b69b83bf71397cbb27dc742b0244e478bca (diff)
downloadNetworkManager-lr/ipv6-tokens.tar.gz
platform: Add support for IPv6 tokenized identifiers on Linuxlr/ipv6-tokens
-rw-r--r--src/platform/nm-linux-platform.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index fa7919b003..091791f4b8 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -2515,6 +2515,38 @@ link_set_noarp (NMPlatform *platform, int ifindex)
}
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)
{
#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
@@ -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;