summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/nm-device.c15
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c2
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h2
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.c1
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.c1
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c8
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.h1
-rw-r--r--src/dhcp-manager/nm-dhcp-systemd.c1
8 files changed, 28 insertions, 3 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 1ca9c410ef..9ceb41ad37 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4660,6 +4660,9 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
GByteArray *tmp = NULL;
const guint8 *hw_addr;
size_t hw_addr_len = 0;
+ const struct in6_addr *ll_addr = NULL;
+ NMIP6Config *ip6_config;
+ int i;
g_assert (connection);
s_ip6 = nm_connection_get_setting_ip6_config (connection);
@@ -4671,10 +4674,22 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
g_byte_array_append (tmp, hw_addr, hw_addr_len);
}
+ ip6_config = priv->ext_ip6_config;
+ for (i = 0; ip6_config && i < nm_ip6_config_get_num_addresses (ip6_config); i++) {
+ const NMPlatformIP6Address *addr = nm_ip6_config_get_address (ip6_config, i);
+
+ if (IN6_IS_ADDR_LINKLOCAL (&addr->address)) {
+ ll_addr = &addr->address;
+ break;
+ }
+ }
+ g_return_val_if_fail (ll_addr, FALSE);
+
priv->dhcp6_client = nm_dhcp_manager_start_ip6 (nm_dhcp_manager_get (),
nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self),
tmp,
+ ll_addr,
nm_connection_get_uuid (connection),
nm_device_get_ip6_route_metric (self),
nm_setting_ip_config_get_dhcp_send_hostname (s_ip6),
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index 6f97305774..3881cd750c 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -545,6 +545,7 @@ get_duid (NMDhcpClient *self)
gboolean
nm_dhcp_client_start_ip6 (NMDhcpClient *self,
const char *dhcp_anycast_addr,
+ const struct in6_addr *ll_addr,
const char *hostname,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy)
@@ -581,6 +582,7 @@ nm_dhcp_client_start_ip6 (NMDhcpClient *self,
return NM_DHCP_CLIENT_GET_CLASS (self)->ip6_start (self,
dhcp_anycast_addr,
+ ll_addr,
info_only,
privacy,
priv->duid);
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index ceabf13659..c1c09c9961 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -69,6 +69,7 @@ typedef struct {
gboolean (*ip6_start) (NMDhcpClient *self,
const char *anycast_addr,
+ const struct in6_addr *ll_addr,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid);
@@ -138,6 +139,7 @@ gboolean nm_dhcp_client_start_ip4 (NMDhcpClient *self,
gboolean nm_dhcp_client_start_ip6 (NMDhcpClient *self,
const char *dhcp_anycast_addr,
+ const struct in6_addr *ll_addr,
const char *hostname,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy);
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c
index 92180903ac..5c3d556e14 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient.c
@@ -487,6 +487,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
static gboolean
ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr,
+ const struct in6_addr *ll_addr,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid)
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c
index ff6c568429..c3cc73a48f 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.c
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c
@@ -143,6 +143,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
static gboolean
ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr,
+ const struct in6_addr *ll_addr,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid)
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index c193f98795..0a10b6cf26 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -216,6 +216,7 @@ client_start (NMDhcpManager *self,
const char *uuid,
guint32 priority,
gboolean ipv6,
+ const struct in6_addr *ipv6_ll_addr,
const char *dhcp_client_id,
guint32 timeout,
const char *dhcp_anycast_addr,
@@ -261,7 +262,7 @@ client_start (NMDhcpManager *self,
g_signal_connect (client, NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (client_state_changed), self);
if (ipv6)
- success = nm_dhcp_client_start_ip6 (client, dhcp_anycast_addr, hostname, info_only, privacy);
+ success = nm_dhcp_client_start_ip6 (client, dhcp_anycast_addr, ipv6_ll_addr, hostname, info_only, privacy);
else
success = nm_dhcp_client_start_ip4 (client, dhcp_client_id, dhcp_anycast_addr, hostname, last_ip4_address);
@@ -303,7 +304,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
if (send_hostname)
hostname = get_send_hostname (self, dhcp_hostname);
- return client_start (self, iface, ifindex, hwaddr, uuid, priority, FALSE,
+ return client_start (self, iface, ifindex, hwaddr, uuid, priority, FALSE, NULL,
dhcp_client_id, timeout, dhcp_anycast_addr, hostname,
FALSE, 0, last_ip_address);
}
@@ -314,6 +315,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
const char *iface,
int ifindex,
const GByteArray *hwaddr,
+ const struct in6_addr *ll_addr,
const char *uuid,
guint32 priority,
gboolean send_hostname,
@@ -330,7 +332,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
if (send_hostname)
hostname = get_send_hostname (self, dhcp_hostname);
return client_start (self, iface, ifindex, hwaddr, uuid, priority, TRUE,
- NULL, timeout, dhcp_anycast_addr, hostname, info_only,
+ ll_addr, NULL, timeout, dhcp_anycast_addr, hostname, info_only,
privacy, NULL);
}
diff --git a/src/dhcp-manager/nm-dhcp-manager.h b/src/dhcp-manager/nm-dhcp-manager.h
index 8a298f046d..f7dbd65386 100644
--- a/src/dhcp-manager/nm-dhcp-manager.h
+++ b/src/dhcp-manager/nm-dhcp-manager.h
@@ -67,6 +67,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip6 (NMDhcpManager *manager,
const char *iface,
int ifindex,
const GByteArray *hwaddr,
+ const struct in6_addr *ll_addr,
const char *uuid,
guint32 priority,
gboolean send_hostname,
diff --git a/src/dhcp-manager/nm-dhcp-systemd.c b/src/dhcp-manager/nm-dhcp-systemd.c
index e508ea13bb..3b6cba1b03 100644
--- a/src/dhcp-manager/nm-dhcp-systemd.c
+++ b/src/dhcp-manager/nm-dhcp-systemd.c
@@ -691,6 +691,7 @@ dhcp6_event_cb (sd_dhcp6_client *client, int event, gpointer user_data)
static gboolean
ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr,
+ const struct in6_addr *ll_addr,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid)