diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/nm-device.c | 15 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.c | 2 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.h | 2 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhclient.c | 1 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhcpcd.c | 1 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 8 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.h | 1 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-systemd.c | 1 |
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) |