mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-08 13:00:22 +01:00
dhcp: merge branch 'th/dhcpv6-otherconf-ignore-addr'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1220
This commit is contained in:
commit
19a96f64ed
3 changed files with 59 additions and 46 deletions
|
|
@ -330,7 +330,7 @@ create_dhclient_config(NMDhcpDhclient *self,
|
|||
|
||||
static gboolean
|
||||
dhclient_start(NMDhcpClient *client,
|
||||
const char *mode_opt,
|
||||
gboolean set_mode,
|
||||
gboolean release,
|
||||
pid_t *out_pid,
|
||||
GError **error)
|
||||
|
|
@ -439,14 +439,19 @@ dhclient_start(NMDhcpClient *client,
|
|||
}
|
||||
|
||||
if (addr_family == AF_INET6) {
|
||||
guint prefixes = client_config->v6.needed_prefixes;
|
||||
guint prefixes = client_config->v6.needed_prefixes;
|
||||
const char *mode_opt;
|
||||
|
||||
g_ptr_array_add(argv, (gpointer) "-6");
|
||||
|
||||
if (prefixes > 0 && nm_streq0(mode_opt, "-S")) {
|
||||
/* -S is incompatible with -P, only use the latter */
|
||||
if (!set_mode)
|
||||
mode_opt = NULL;
|
||||
else if (!client_config->v6.info_only)
|
||||
mode_opt = "-N";
|
||||
else if (prefixes == 0)
|
||||
mode_opt = "-S";
|
||||
else
|
||||
mode_opt = NULL;
|
||||
}
|
||||
|
||||
if (mode_opt)
|
||||
g_ptr_array_add(argv, (gpointer) mode_opt);
|
||||
|
|
@ -546,7 +551,7 @@ ip4_start(NMDhcpClient *client, GError **error)
|
|||
nm_assert(!client_config->client_id);
|
||||
nm_dhcp_client_set_effective_client_id(client, new_client_id);
|
||||
}
|
||||
return dhclient_start(client, NULL, FALSE, NULL, error);
|
||||
return dhclient_start(client, FALSE, FALSE, NULL, error);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -581,7 +586,7 @@ ip6_start(NMDhcpClient *client, const struct in6_addr *ll_addr, GError **error)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
return dhclient_start(client, config->v6.needed_prefixes ? "-S" : "-N", FALSE, NULL, error);
|
||||
return dhclient_start(client, TRUE, FALSE, NULL, error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -615,7 +620,7 @@ stop(NMDhcpClient *client, gboolean release)
|
|||
if (release) {
|
||||
pid_t rpid = -1;
|
||||
|
||||
if (dhclient_start(client, NULL, TRUE, &rpid, NULL)) {
|
||||
if (dhclient_start(client, FALSE, TRUE, &rpid, NULL)) {
|
||||
/* Wait a few seconds for the release to happen */
|
||||
nm_dhcp_client_stop_pid(rpid, nm_dhcp_client_get_iface(client));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,14 +80,12 @@ lease_to_ip6_config(NMDedupMultiIndex *multi_idx,
|
|||
gs_unref_hashtable GHashTable *options = NULL;
|
||||
struct in6_addr tmp_addr;
|
||||
const struct in6_addr *dns;
|
||||
uint32_t lft_pref, lft_valid;
|
||||
char addr_str[NM_UTILS_INET_ADDRSTRLEN];
|
||||
char **domains;
|
||||
char **ntp_fqdns;
|
||||
const struct in6_addr *ntp_addrs;
|
||||
const char *s;
|
||||
nm_auto_free_gstring GString *str = NULL;
|
||||
gboolean has_any_addresses = FALSE;
|
||||
nm_auto_free_gstring GString *str = NULL;
|
||||
int num, i;
|
||||
|
||||
nm_assert(lease);
|
||||
|
|
@ -96,36 +94,45 @@ lease_to_ip6_config(NMDedupMultiIndex *multi_idx,
|
|||
|
||||
options = nm_dhcp_option_create_options_dict();
|
||||
|
||||
sd_dhcp6_lease_reset_address_iter(lease);
|
||||
nm_gstring_prepare(&str);
|
||||
while (sd_dhcp6_lease_get_address(lease, &tmp_addr, &lft_pref, &lft_valid) >= 0) {
|
||||
const NMPlatformIP6Address address = {
|
||||
.plen = 128,
|
||||
.address = tmp_addr,
|
||||
.timestamp = ts,
|
||||
.lifetime = lft_valid,
|
||||
.preferred = lft_pref,
|
||||
.addr_source = NM_IP_CONFIG_SOURCE_DHCP,
|
||||
};
|
||||
if (!info_only) {
|
||||
gboolean has_any_addresses = FALSE;
|
||||
uint32_t lft_pref;
|
||||
uint32_t lft_valid;
|
||||
|
||||
nm_l3_config_data_add_address_6(l3cd, &address);
|
||||
sd_dhcp6_lease_reset_address_iter(lease);
|
||||
nm_gstring_prepare(&str);
|
||||
while (sd_dhcp6_lease_get_address(lease, &tmp_addr, &lft_pref, &lft_valid) >= 0) {
|
||||
const NMPlatformIP6Address address = {
|
||||
.plen = 128,
|
||||
.address = tmp_addr,
|
||||
.timestamp = ts,
|
||||
.lifetime = lft_valid,
|
||||
.preferred = lft_pref,
|
||||
.addr_source = NM_IP_CONFIG_SOURCE_DHCP,
|
||||
};
|
||||
|
||||
_nm_utils_inet6_ntop(&tmp_addr, addr_str);
|
||||
g_string_append(nm_gstring_add_space_delimiter(str), addr_str);
|
||||
nm_l3_config_data_add_address_6(l3cd, &address);
|
||||
|
||||
has_any_addresses = TRUE;
|
||||
}
|
||||
_nm_utils_inet6_ntop(&tmp_addr, addr_str);
|
||||
g_string_append(nm_gstring_add_space_delimiter(str), addr_str);
|
||||
|
||||
if (str->len) {
|
||||
nm_dhcp_option_add_option(options, AF_INET6, NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS, str->str);
|
||||
}
|
||||
has_any_addresses = TRUE;
|
||||
}
|
||||
|
||||
if (!info_only && !has_any_addresses) {
|
||||
g_set_error_literal(error,
|
||||
NM_MANAGER_ERROR,
|
||||
NM_MANAGER_ERROR_FAILED,
|
||||
"no address received in managed mode");
|
||||
return NULL;
|
||||
if (str->len) {
|
||||
nm_dhcp_option_add_option(options,
|
||||
AF_INET6,
|
||||
NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS,
|
||||
str->str);
|
||||
}
|
||||
|
||||
if (!has_any_addresses) {
|
||||
g_set_error_literal(error,
|
||||
NM_MANAGER_ERROR,
|
||||
NM_MANAGER_ERROR_FAILED,
|
||||
"no address received in managed mode");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
num = sd_dhcp6_lease_get_dns(lease, &dns);
|
||||
|
|
@ -294,11 +301,10 @@ ip6_start(NMDhcpClient *client, const struct in6_addr *ll_addr, GError **error)
|
|||
|
||||
_LOGT("dhcp-client6: set %p", sd_client);
|
||||
|
||||
if (client_config->v6.info_only) {
|
||||
sd_dhcp6_client_set_address_request(sd_client, 0);
|
||||
if (client_config->v6.needed_prefixes == 0)
|
||||
sd_dhcp6_client_set_information_request(sd_client, 1);
|
||||
}
|
||||
sd_dhcp6_client_set_address_request(sd_client, !client_config->v6.info_only);
|
||||
sd_dhcp6_client_set_information_request(sd_client,
|
||||
client_config->v6.info_only
|
||||
&& client_config->v6.needed_prefixes == 0);
|
||||
|
||||
r = sd_dhcp6_client_set_iaid(sd_client, client_config->v6.iaid);
|
||||
if (r < 0) {
|
||||
|
|
|
|||
|
|
@ -670,8 +670,13 @@ nm_dhcp_utils_ip6_config_from_options(NMDedupMultiIndex *multi_idx,
|
|||
_LOG2I(LOGD_DHCP6, iface, " preferred_lft %u", address.preferred);
|
||||
}
|
||||
|
||||
str = g_hash_table_lookup(options, "ip6_address");
|
||||
if (str) {
|
||||
if (!info_only) {
|
||||
str = g_hash_table_lookup(options, "ip6_address");
|
||||
if (!str) {
|
||||
/* No address in Managed mode is a hard error */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!inet_pton(AF_INET6, str, &tmp_addr)) {
|
||||
_LOG2W(LOGD_DHCP6, iface, "(%s): DHCP returned invalid address '%s'", iface, str);
|
||||
return NULL;
|
||||
|
|
@ -681,9 +686,6 @@ nm_dhcp_utils_ip6_config_from_options(NMDedupMultiIndex *multi_idx,
|
|||
address.addr_source = NM_IP_CONFIG_SOURCE_DHCP;
|
||||
nm_l3_config_data_add_address_6(l3cd, &address);
|
||||
_LOG2I(LOGD_DHCP6, iface, " address %s", str);
|
||||
} else if (info_only == FALSE) {
|
||||
/* No address in Managed mode is a hard error */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
str = g_hash_table_lookup(options, "host_name");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue