mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-03 03:30:14 +01:00
systemd: merge branch 'dhcp-router-option-list'
Also adjust "src/dhcp/nm-dhcp-systemd.c" for the change of the internal DHCP client API. https://github.com/systemd/systemd/pull/11208
This commit is contained in:
commit
334d5682ae
8 changed files with 82 additions and 61 deletions
|
|
@ -70,6 +70,14 @@ bool in4_addr_is_localhost(const struct in_addr *a) {
|
|||
return (be32toh(a->s_addr) & UINT32_C(0xFF000000)) == UINT32_C(127) << 24;
|
||||
}
|
||||
|
||||
bool in4_addr_is_non_local(const struct in_addr *a) {
|
||||
/* Whether the address is not null and not localhost.
|
||||
*
|
||||
* As such, it is suitable to configure as DNS/NTP server from DHCP. */
|
||||
return !in4_addr_is_null(a) &&
|
||||
!in4_addr_is_localhost(a);
|
||||
}
|
||||
|
||||
int in_addr_is_localhost(int family, const union in_addr_union *u) {
|
||||
assert(u);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ int in_addr_is_link_local(int family, const union in_addr_union *u);
|
|||
bool in4_addr_is_localhost(const struct in_addr *a);
|
||||
int in_addr_is_localhost(int family, const union in_addr_union *u);
|
||||
|
||||
bool in4_addr_is_non_local(const struct in_addr *a);
|
||||
|
||||
int in_addr_equal(int family, const union in_addr_union *a, const union in_addr_union *b);
|
||||
int in_addr_prefix_intersect(int family, const union in_addr_union *a, unsigned aprefixlen, const union in_addr_union *b, unsigned bprefixlen);
|
||||
int in_addr_prefix_next(int family, union in_addr_union *u, unsigned prefixlen);
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
|
|||
gint64 ts_time = time (NULL);
|
||||
struct in_addr a_address;
|
||||
struct in_addr a_netmask;
|
||||
struct in_addr a_router;
|
||||
const struct in_addr *a_router;
|
||||
guint32 a_plen;
|
||||
guint32 a_lifetime;
|
||||
|
||||
|
|
@ -482,8 +482,10 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
|
|||
}
|
||||
|
||||
/* FIXME: internal client only supports returning the first router. */
|
||||
if (sd_dhcp_lease_get_router (lease, &a_router) >= 0) {
|
||||
nm_utils_inet4_ntop (a_router.s_addr, addr_str);
|
||||
num = sd_dhcp_lease_get_router (lease, &a_router);
|
||||
if ( num > 0
|
||||
&& a_router[0].s_addr) {
|
||||
nm_utils_inet4_ntop (a_router[0].s_addr, addr_str);
|
||||
LOG_LEASE (LOGD_DHCP4, "gateway %s", addr_str);
|
||||
add_option (options, dhcp4_requests, SD_DHCP_OPTION_ROUTER, addr_str);
|
||||
|
||||
|
|
@ -497,7 +499,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
|
|||
nm_ip4_config_add_route (ip4_config,
|
||||
&((const NMPlatformIP4Route) {
|
||||
.rt_source = NM_IP_CONFIG_SOURCE_DHCP,
|
||||
.gateway = a_router.s_addr,
|
||||
.gateway = a_router[0].s_addr,
|
||||
.table_coerced = nm_platform_route_table_coerce (route_table),
|
||||
.metric = route_metric,
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@ struct sd_dhcp_lease {
|
|||
/* each 0 if unset */
|
||||
be32_t address;
|
||||
be32_t server_address;
|
||||
be32_t router;
|
||||
be32_t next_server;
|
||||
|
||||
bool have_subnet_mask;
|
||||
|
|
@ -50,6 +49,9 @@ struct sd_dhcp_lease {
|
|||
bool have_broadcast;
|
||||
be32_t broadcast;
|
||||
|
||||
struct in_addr *router;
|
||||
size_t router_size;
|
||||
|
||||
struct in_addr *dns;
|
||||
size_t dns_size;
|
||||
|
||||
|
|
|
|||
|
|
@ -413,16 +413,33 @@ int config_parse_bridge_port_priority(
|
|||
}
|
||||
#endif /* NM_IGNORED */
|
||||
|
||||
void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size) {
|
||||
unsigned i;
|
||||
size_t serialize_in_addrs(FILE *f,
|
||||
const struct in_addr *addresses,
|
||||
size_t size,
|
||||
bool with_leading_space,
|
||||
bool (*predicate)(const struct in_addr *addr)) {
|
||||
size_t count;
|
||||
size_t i;
|
||||
|
||||
assert(f);
|
||||
assert(addresses);
|
||||
assert(size);
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
fprintf(f, "%s%s", inet_ntoa(addresses[i]),
|
||||
(i < (size - 1)) ? " ": "");
|
||||
count = 0;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
char sbuf[INET_ADDRSTRLEN];
|
||||
|
||||
if (predicate && !predicate(&addresses[i]))
|
||||
continue;
|
||||
if (with_leading_space)
|
||||
fputc(' ', f);
|
||||
else
|
||||
with_leading_space = true;
|
||||
fputs(inet_ntop(AF_INET, &addresses[i], sbuf, sizeof(sbuf)), f);
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int deserialize_in_addrs(struct in_addr **ret, const char *string) {
|
||||
|
|
@ -456,7 +473,7 @@ int deserialize_in_addrs(struct in_addr **ret, const char *string) {
|
|||
size++;
|
||||
}
|
||||
|
||||
*ret = TAKE_PTR(addresses);
|
||||
*ret = size > 0 ? TAKE_PTR(addresses) : NULL;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
|
@ -525,6 +542,7 @@ void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, siz
|
|||
fprintf(f, "%s=", key);
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
char sbuf[INET_ADDRSTRLEN];
|
||||
struct in_addr dest, gw;
|
||||
uint8_t length;
|
||||
|
||||
|
|
@ -532,8 +550,8 @@ void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, siz
|
|||
assert_se(sd_dhcp_route_get_gateway(routes[i], &gw) >= 0);
|
||||
assert_se(sd_dhcp_route_get_destination_prefix_length(routes[i], &length) >= 0);
|
||||
|
||||
fprintf(f, "%s/%" PRIu8, inet_ntoa(dest), length);
|
||||
fprintf(f, ",%s%s", inet_ntoa(gw), (i < (size - 1)) ? " ": "");
|
||||
fprintf(f, "%s/%" PRIu8, inet_ntop(AF_INET, &dest, sbuf, sizeof(sbuf)), length);
|
||||
fprintf(f, ",%s%s", inet_ntop(AF_INET, &gw, sbuf, sizeof(sbuf)), (i < (size - 1)) ? " ": "");
|
||||
}
|
||||
|
||||
fputs("\n", f);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,11 @@ int net_get_unique_predictable_data(sd_device *device, uint64_t *result);
|
|||
const char *net_get_name(sd_device *device);
|
||||
#endif /* NM_IGNORED */
|
||||
|
||||
void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size);
|
||||
size_t serialize_in_addrs(FILE *f,
|
||||
const struct in_addr *addresses,
|
||||
size_t size,
|
||||
bool with_leading_space,
|
||||
bool (*predicate)(const struct in_addr *addr));
|
||||
int deserialize_in_addrs(struct in_addr **addresses, const char *string);
|
||||
void serialize_in6_addrs(FILE *f, const struct in6_addr *addresses,
|
||||
size_t size);
|
||||
|
|
|
|||
|
|
@ -152,15 +152,15 @@ int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, struct in_addr *addr) {
|
||||
int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr) {
|
||||
assert_return(lease, -EINVAL);
|
||||
assert_return(addr, -EINVAL);
|
||||
|
||||
if (lease->router == 0)
|
||||
if (lease->router_size <= 0)
|
||||
return -ENODATA;
|
||||
|
||||
addr->s_addr = lease->router;
|
||||
return 0;
|
||||
*addr = lease->router;
|
||||
return (int) lease->router_size;
|
||||
}
|
||||
|
||||
int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) {
|
||||
|
|
@ -262,6 +262,7 @@ static sd_dhcp_lease *dhcp_lease_free(sd_dhcp_lease *lease) {
|
|||
}
|
||||
|
||||
free(lease->root_path);
|
||||
free(lease->router);
|
||||
free(lease->timezone);
|
||||
free(lease->hostname);
|
||||
free(lease->domainname);
|
||||
|
|
@ -371,23 +372,6 @@ static int lease_parse_domain(const uint8_t *option, size_t len, char **ret) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void filter_bogus_addresses(struct in_addr *addresses, size_t *n) {
|
||||
size_t i, j;
|
||||
|
||||
/* Silently filter DNS/NTP servers supplied to us that do not make outside of the local scope. */
|
||||
|
||||
for (i = 0, j = 0; i < *n; i ++) {
|
||||
|
||||
if (in4_addr_is_null(addresses+i) ||
|
||||
in4_addr_is_localhost(addresses+i))
|
||||
continue;
|
||||
|
||||
addresses[j++] = addresses[i];
|
||||
}
|
||||
|
||||
*n = j;
|
||||
}
|
||||
|
||||
static int lease_parse_in_addrs(const uint8_t *option, size_t len, struct in_addr **ret, size_t *n_ret) {
|
||||
assert(option);
|
||||
assert(ret);
|
||||
|
|
@ -409,8 +393,6 @@ static int lease_parse_in_addrs(const uint8_t *option, size_t len, struct in_add
|
|||
if (!addresses)
|
||||
return -ENOMEM;
|
||||
|
||||
filter_bogus_addresses(addresses, &n_addresses);
|
||||
|
||||
free(*ret);
|
||||
*ret = addresses;
|
||||
*n_ret = n_addresses;
|
||||
|
|
@ -555,11 +537,9 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
|
|||
break;
|
||||
|
||||
case SD_DHCP_OPTION_ROUTER:
|
||||
if (len >= 4) {
|
||||
r = lease_parse_be32(option, 4, &lease->router);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to parse router address, ignoring: %m");
|
||||
}
|
||||
r = lease_parse_in_addrs(option, len, &lease->router, &lease->router_size);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to parse router addresses, ignoring: %m");
|
||||
break;
|
||||
|
||||
case SD_DHCP_OPTION_DOMAIN_NAME_SERVER:
|
||||
|
|
@ -821,7 +801,6 @@ int dhcp_lease_new(sd_dhcp_lease **ret) {
|
|||
if (!lease)
|
||||
return -ENOMEM;
|
||||
|
||||
lease->router = INADDR_ANY;
|
||||
lease->n_ref = 1;
|
||||
|
||||
*ret = lease;
|
||||
|
|
@ -836,6 +815,7 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
|
|||
const struct in_addr *addresses;
|
||||
const void *client_id, *data;
|
||||
size_t client_id_len, data_len;
|
||||
char sbuf[INET_ADDRSTRLEN];
|
||||
const char *string;
|
||||
uint16_t mtu;
|
||||
_cleanup_free_ sd_dhcp_route **routes = NULL;
|
||||
|
|
@ -858,27 +838,30 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
|
|||
|
||||
r = sd_dhcp_lease_get_address(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "ADDRESS=%s\n", inet_ntoa(address));
|
||||
fprintf(f, "ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
|
||||
|
||||
r = sd_dhcp_lease_get_netmask(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "NETMASK=%s\n", inet_ntoa(address));
|
||||
fprintf(f, "NETMASK=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
|
||||
|
||||
r = sd_dhcp_lease_get_router(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "ROUTER=%s\n", inet_ntoa(address));
|
||||
r = sd_dhcp_lease_get_router(lease, &addresses);
|
||||
if (r > 0) {
|
||||
fputs("ROUTER=", f);
|
||||
serialize_in_addrs(f, addresses, r, false, NULL);
|
||||
fputc('\n', f);
|
||||
}
|
||||
|
||||
r = sd_dhcp_lease_get_server_identifier(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "SERVER_ADDRESS=%s\n", inet_ntoa(address));
|
||||
fprintf(f, "SERVER_ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
|
||||
|
||||
r = sd_dhcp_lease_get_next_server(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "NEXT_SERVER=%s\n", inet_ntoa(address));
|
||||
fprintf(f, "NEXT_SERVER=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
|
||||
|
||||
r = sd_dhcp_lease_get_broadcast(lease, &address);
|
||||
if (r >= 0)
|
||||
fprintf(f, "BROADCAST=%s\n", inet_ntoa(address));
|
||||
fprintf(f, "BROADCAST=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
|
||||
|
||||
r = sd_dhcp_lease_get_mtu(lease, &mtu);
|
||||
if (r >= 0)
|
||||
|
|
@ -899,15 +882,15 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
|
|||
r = sd_dhcp_lease_get_dns(lease, &addresses);
|
||||
if (r > 0) {
|
||||
fputs("DNS=", f);
|
||||
serialize_in_addrs(f, addresses, r);
|
||||
fputs("\n", f);
|
||||
serialize_in_addrs(f, addresses, r, false, NULL);
|
||||
fputc('\n', f);
|
||||
}
|
||||
|
||||
r = sd_dhcp_lease_get_ntp(lease, &addresses);
|
||||
if (r > 0) {
|
||||
fputs("NTP=", f);
|
||||
serialize_in_addrs(f, addresses, r);
|
||||
fputs("\n", f);
|
||||
serialize_in_addrs(f, addresses, r, false, NULL);
|
||||
fputc('\n', f);
|
||||
}
|
||||
|
||||
r = sd_dhcp_lease_get_domainname(lease, &string);
|
||||
|
|
@ -918,7 +901,7 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
|
|||
if (r > 0) {
|
||||
fputs("DOMAIN_SEARCH_LIST=", f);
|
||||
fputstrv(f, search_domains, NULL, NULL);
|
||||
fputs("\n", f);
|
||||
fputc('\n', f);
|
||||
}
|
||||
|
||||
r = sd_dhcp_lease_get_hostname(lease, &string);
|
||||
|
|
@ -1081,9 +1064,11 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
|||
}
|
||||
|
||||
if (router) {
|
||||
r = inet_pton(AF_INET, router, &lease->router);
|
||||
if (r <= 0)
|
||||
log_debug("Failed to parse router %s, ignoring.", router);
|
||||
r = deserialize_in_addrs(&lease->router, router);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to deserialize router addresses %s, ignoring: %m", router);
|
||||
else
|
||||
lease->router_size = r;
|
||||
}
|
||||
|
||||
if (netmask) {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1);
|
|||
int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2);
|
||||
int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr);
|
||||
int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
|
||||
int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, struct in_addr *addr);
|
||||
int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||
int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr);
|
||||
int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);
|
||||
int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue