about summary refs log tree commit diff
path: root/src/nm-ip6-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-ip6-config.c')
-rw-r--r--src/nm-ip6-config.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index 2f231638..f06e4069 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -71,7 +71,7 @@ enum {
 
 
 static struct nl_addr *
-nm_utils_ip6_addr_to_nl_addr (const struct in6_addr *ip6_addr)
+nm_utils_ip6_addr_to_nl_addr (const struct in6_addr *ip6_addr, guint prefix)
 {
 	struct nl_addr * nla = NULL;
 
@@ -79,6 +79,8 @@ nm_utils_ip6_addr_to_nl_addr (const struct in6_addr *ip6_addr)
 		return NULL;
 	nl_addr_set_family (nla, AF_INET6);
 	nl_addr_set_binary_addr (nla, (struct in6_addr *)ip6_addr, sizeof (struct in6_addr));
+	if (prefix)
+		nl_addr_set_prefixlen (nla, prefix);
 
 	return nla;
 }
@@ -428,14 +430,16 @@ nm_ip6_config_set_never_default (NMIP6Config *config, gboolean never_default)
 
 /* libnl convenience/conversion functions */
 
-static int ip6_addr_to_rtnl_local (const struct in6_addr *ip6_address, struct rtnl_addr *addr)
+static int ip6_addr_to_rtnl_local (const struct in6_addr *ip6_address,
+                                   struct rtnl_addr *addr,
+                                   guint prefix)
 {
 	struct nl_addr * local = NULL;
 	int err = 0;
 
 	g_return_val_if_fail (addr != NULL, -1);
 
-	local = nm_utils_ip6_addr_to_nl_addr (ip6_address);
+	local = nm_utils_ip6_addr_to_nl_addr (ip6_address, prefix);
 	err = rtnl_addr_set_local (addr, local);
 	nl_addr_put (local);
 
@@ -449,7 +453,7 @@ static int ip6_addr_to_rtnl_peer (const struct in6_addr *ip6_address, struct rtn
 
 	g_return_val_if_fail (addr != NULL, -1);
 
-	peer = nm_utils_ip6_addr_to_nl_addr (ip6_address);
+	peer = nm_utils_ip6_addr_to_nl_addr (ip6_address, 0);
 	err = rtnl_addr_set_peer (addr, peer);
 	nl_addr_put (peer);
 
@@ -472,8 +476,11 @@ nm_ip6_config_to_rtnl_addr (NMIP6Config *config, guint32 i, guint32 flags)
 	if (!(addr = rtnl_addr_alloc()))
 		return NULL;
 
-	if (flags & NM_RTNL_ADDR_ADDR)
-		success = (ip6_addr_to_rtnl_local (nm_ip6_address_get_address (config_addr), addr) >= 0);
+	if (flags & NM_RTNL_ADDR_ADDR) {
+		success = (ip6_addr_to_rtnl_local (nm_ip6_address_get_address (config_addr),
+		                                   addr,
+		                                   nm_ip6_address_get_prefix (config_addr)) >= 0);
+	}
 
 	if (flags & NM_RTNL_ADDR_PTP_ADDR)
 		success = (ip6_addr_to_rtnl_peer (&priv->ptp_address, addr) >= 0);