summaryrefslogtreecommitdiffstats
path: root/src/network/networkd-dhcp4.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-04-11 12:11:26 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-04-22 05:49:56 +0200
commitc0fef8f349a650bde3929ff14585916cb1581eda (patch)
treec0ab19d622dae73fcd8f09c638d379a0c8733cb8 /src/network/networkd-dhcp4.c
parentMerge pull request #19387 from poettering/discoverable-part-fix (diff)
downloadsystemd-c0fef8f349a650bde3929ff14585916cb1581eda.tar.xz
systemd-c0fef8f349a650bde3929ff14585916cb1581eda.zip
network: dhcp4: introduce link_set_dhcp_prefix_route()
Diffstat (limited to '')
-rw-r--r--src/network/networkd-dhcp4.c58
1 files changed, 28 insertions, 30 deletions
diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c
index 4987c8fc53..050be0a167 100644
--- a/src/network/networkd-dhcp4.c
+++ b/src/network/networkd-dhcp4.c
@@ -156,12 +156,6 @@ static int route_scope_from_address(const Route *route, const struct in_addr *se
return RT_SCOPE_UNIVERSE;
}
-static bool link_prefixroute(Link *link) {
- return !link->network->dhcp_route_table_set ||
- link->network->dhcp_route_table == RT_TABLE_MAIN ||
- link->manager->dhcp4_prefix_root_cannot_set_table;
-}
-
static int dhcp_route_configure(Route *route, Link *link) {
Route *ret;
int r;
@@ -231,17 +225,29 @@ static int link_set_dns_routes(Link *link, const struct in_addr *address) {
return 0;
}
-static int dhcp_prefix_route_from_lease(
- const sd_dhcp_lease *lease,
- uint32_t table,
- const struct in_addr *address,
- Route **ret_route) {
+static bool link_prefixroute(Link *link) {
+ return !link->network->dhcp_route_table_set ||
+ link->network->dhcp_route_table == RT_TABLE_MAIN ||
+ link->manager->dhcp4_prefix_root_cannot_set_table;
+}
- Route *route;
- struct in_addr netmask;
+static int link_set_dhcp_prefix_route(Link *link) {
+ _cleanup_(route_freep) Route *route = NULL;
+ struct in_addr address, netmask;
int r;
- r = sd_dhcp_lease_get_netmask((sd_dhcp_lease*) lease, &netmask);
+ assert(link);
+ assert(link->dhcp_lease);
+
+ if (link_prefixroute(link))
+ /* When true, the route will be created by kernel. See dhcp4_update_address(). */
+ return 0;
+
+ r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
+ if (r < 0)
+ return r;
+
+ r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
if (r < 0)
return r;
@@ -250,14 +256,14 @@ static int dhcp_prefix_route_from_lease(
return r;
route->family = AF_INET;
- route->dst.in.s_addr = address->s_addr & netmask.s_addr;
+ route->dst.in.s_addr = address.s_addr & netmask.s_addr;
route->dst_prefixlen = in4_addr_netmask_to_prefixlen(&netmask);
- route->prefsrc.in = *address;
+ route->prefsrc.in = address;
route->scope = RT_SCOPE_LINK;
route->protocol = RTPROT_DHCP;
- route->table = table;
- *ret_route = route;
- return 0;
+ route->table = link_get_dhcp_route_table(link);
+
+ return dhcp_route_configure(route, link);
}
static int link_set_dhcp_routes(Link *link) {
@@ -293,17 +299,9 @@ static int link_set_dhcp_routes(Link *link) {
if (r < 0)
return log_link_warning_errno(link, r, "DHCP error: could not get address: %m");
- if (!link_prefixroute(link)) {
- _cleanup_(route_freep) Route *prefix_route = NULL;
-
- r = dhcp_prefix_route_from_lease(link->dhcp_lease, table, &address, &prefix_route);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not create prefix route: %m");
-
- r = dhcp_route_configure(prefix_route, link);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not set prefix route: %m");
- }
+ r = link_set_dhcp_prefix_route(link);
+ if (r < 0)
+ return log_link_error_errno(link, r, "DHCP error: Could not set prefix route: %m");
n = sd_dhcp_lease_get_routes(link->dhcp_lease, &static_routes);
if (n == -ENODATA)