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:
@@ -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),
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user