dhcp: pass IPv6 link-local address to DHCP client

The DHCP client from new libsystemd-network requires a link-local IPv6
address to be passed to the library; add a new argument to
nm_dhcp_manager_start_ip6() and related functions.
This commit is contained in:
Beniamino Galvani
2015-11-23 14:22:29 +01:00
parent e1ea4b725e
commit b8c2fc26c1
8 changed files with 28 additions and 3 deletions

View File

@@ -4660,6 +4660,9 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
GByteArray *tmp = NULL; GByteArray *tmp = NULL;
const guint8 *hw_addr; const guint8 *hw_addr;
size_t hw_addr_len = 0; size_t hw_addr_len = 0;
const struct in6_addr *ll_addr = NULL;
NMIP6Config *ip6_config;
int i;
g_assert (connection); g_assert (connection);
s_ip6 = nm_connection_get_setting_ip6_config (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); 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 (), priv->dhcp6_client = nm_dhcp_manager_start_ip6 (nm_dhcp_manager_get (),
nm_device_get_ip_iface (self), nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self), nm_device_get_ip_ifindex (self),
tmp, tmp,
ll_addr,
nm_connection_get_uuid (connection), nm_connection_get_uuid (connection),
nm_device_get_ip6_route_metric (self), nm_device_get_ip6_route_metric (self),
nm_setting_ip_config_get_dhcp_send_hostname (s_ip6), nm_setting_ip_config_get_dhcp_send_hostname (s_ip6),

View File

@@ -545,6 +545,7 @@ get_duid (NMDhcpClient *self)
gboolean gboolean
nm_dhcp_client_start_ip6 (NMDhcpClient *self, nm_dhcp_client_start_ip6 (NMDhcpClient *self,
const char *dhcp_anycast_addr, const char *dhcp_anycast_addr,
const struct in6_addr *ll_addr,
const char *hostname, const char *hostname,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy) NMSettingIP6ConfigPrivacy privacy)
@@ -581,6 +582,7 @@ nm_dhcp_client_start_ip6 (NMDhcpClient *self,
return NM_DHCP_CLIENT_GET_CLASS (self)->ip6_start (self, return NM_DHCP_CLIENT_GET_CLASS (self)->ip6_start (self,
dhcp_anycast_addr, dhcp_anycast_addr,
ll_addr,
info_only, info_only,
privacy, privacy,
priv->duid); priv->duid);

View File

@@ -69,6 +69,7 @@ typedef struct {
gboolean (*ip6_start) (NMDhcpClient *self, gboolean (*ip6_start) (NMDhcpClient *self,
const char *anycast_addr, const char *anycast_addr,
const struct in6_addr *ll_addr,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy, NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid); const GByteArray *duid);
@@ -138,6 +139,7 @@ gboolean nm_dhcp_client_start_ip4 (NMDhcpClient *self,
gboolean nm_dhcp_client_start_ip6 (NMDhcpClient *self, gboolean nm_dhcp_client_start_ip6 (NMDhcpClient *self,
const char *dhcp_anycast_addr, const char *dhcp_anycast_addr,
const struct in6_addr *ll_addr,
const char *hostname, const char *hostname,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy); NMSettingIP6ConfigPrivacy privacy);

View File

@@ -487,6 +487,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
static gboolean static gboolean
ip6_start (NMDhcpClient *client, ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr, const char *dhcp_anycast_addr,
const struct in6_addr *ll_addr,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy, NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid) const GByteArray *duid)

View File

@@ -143,6 +143,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
static gboolean static gboolean
ip6_start (NMDhcpClient *client, ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr, const char *dhcp_anycast_addr,
const struct in6_addr *ll_addr,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy, NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid) const GByteArray *duid)

View File

@@ -216,6 +216,7 @@ client_start (NMDhcpManager *self,
const char *uuid, const char *uuid,
guint32 priority, guint32 priority,
gboolean ipv6, gboolean ipv6,
const struct in6_addr *ipv6_ll_addr,
const char *dhcp_client_id, const char *dhcp_client_id,
guint32 timeout, guint32 timeout,
const char *dhcp_anycast_addr, 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); g_signal_connect (client, NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (client_state_changed), self);
if (ipv6) 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 else
success = nm_dhcp_client_start_ip4 (client, dhcp_client_id, dhcp_anycast_addr, hostname, last_ip4_address); 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) if (send_hostname)
hostname = get_send_hostname (self, dhcp_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, dhcp_client_id, timeout, dhcp_anycast_addr, hostname,
FALSE, 0, last_ip_address); FALSE, 0, last_ip_address);
} }
@@ -314,6 +315,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
const char *iface, const char *iface,
int ifindex, int ifindex,
const GByteArray *hwaddr, const GByteArray *hwaddr,
const struct in6_addr *ll_addr,
const char *uuid, const char *uuid,
guint32 priority, guint32 priority,
gboolean send_hostname, gboolean send_hostname,
@@ -330,7 +332,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
if (send_hostname) if (send_hostname)
hostname = get_send_hostname (self, dhcp_hostname); hostname = get_send_hostname (self, dhcp_hostname);
return client_start (self, iface, ifindex, hwaddr, uuid, priority, TRUE, 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); privacy, NULL);
} }

View File

@@ -67,6 +67,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip6 (NMDhcpManager *manager,
const char *iface, const char *iface,
int ifindex, int ifindex,
const GByteArray *hwaddr, const GByteArray *hwaddr,
const struct in6_addr *ll_addr,
const char *uuid, const char *uuid,
guint32 priority, guint32 priority,
gboolean send_hostname, gboolean send_hostname,

View File

@@ -691,6 +691,7 @@ dhcp6_event_cb (sd_dhcp6_client *client, int event, gpointer user_data)
static gboolean static gboolean
ip6_start (NMDhcpClient *client, ip6_start (NMDhcpClient *client,
const char *dhcp_anycast_addr, const char *dhcp_anycast_addr,
const struct in6_addr *ll_addr,
gboolean info_only, gboolean info_only,
NMSettingIP6ConfigPrivacy privacy, NMSettingIP6ConfigPrivacy privacy,
const GByteArray *duid) const GByteArray *duid)