mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-11 05:17:44 +03:00
network: dhcp4: introduce link_set_dhcp_prefix_route()
This commit is contained in:
parent
7feb1dd654
commit
c0fef8f349
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user