diff options
-rw-r--r-- | src/network/networkd-link.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a7ba46692c..14cc8715ce 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -228,6 +228,7 @@ static int link_enter_set_routes(Link *link) { if (link->dhcp_lease) { _cleanup_route_free_ Route *route = NULL; + _cleanup_route_free_ Route *route_gw = NULL; struct in_addr gateway; r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway); @@ -244,6 +245,30 @@ static int link_enter_set_routes(Link *link) { return r; } + r = route_new_dynamic(&route_gw); + if (r < 0) { + log_error_link(link, "Could not allocate route: %s", + strerror(-r)); + return r; + } + + /* The dhcp netmask may mask out the gateway. Add an explicit + * route for the gw host so that we can route no matter the + * netmask or existing kernel route tables. */ + route_gw->family = AF_INET; + route_gw->dst_addr.in = gateway; + route_gw->dst_prefixlen = 32; + route_gw->scope = RT_SCOPE_LINK; + + r = route_configure(route_gw, link, &route_handler); + if (r < 0) { + log_warning_link(link, + "could not set host route: %s", strerror(-r)); + return r; + } + + link->route_messages ++; + route->family = AF_INET; route->in_addr.in = gateway; |