X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-route.c;h=a99eae86bf8ba2417c452bcb31023942c55a9115;hb=76b31bbb2442f52c5877ff99047955adf806a5b2;hp=e855f67a269bc4c4b0e693dca29d248e472b7524;hpb=7a08d314f20b5d6ca44c573426a8a5c812020344;p=thirdparty%2Fsystemd.git diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index e855f67a269..a99eae86bf8 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -372,8 +372,25 @@ void route_update(Route *route, route->type = type; } +static int route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { + int r; + + assert(m); + assert(link); + assert(link->ifname); + + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return 1; + + r = sd_netlink_message_get_errno(m); + if (r < 0 && r != -ESRCH) + log_link_warning_errno(link, r, "Could not drop route: %m"); + + return 1; +} + int route_remove(Route *route, Link *link, - sd_netlink_message_handler_t callback) { + link_netlink_message_handler_t callback) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; int r; @@ -448,8 +465,9 @@ int route_remove(Route *route, Link *link, return log_error_errno(r, "Could not append RTA_OIF attribute: %m"); } - r = sd_netlink_call_async(link->manager->rtnl, NULL, req, callback, - link_netlink_destroy_callback, link, 0, __func__); + r = netlink_call_async(link->manager->rtnl, NULL, req, + callback ?: route_remove_handler, + link_netlink_destroy_callback, link); if (r < 0) return log_error_errno(r, "Could not send rtnetlink message: %m"); @@ -464,7 +482,7 @@ int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) { assert(route); - r = route_remove(route, route->link, link_route_remove_handler); + r = route_remove(route, route->link, NULL); if (r < 0) log_warning_errno(r, "Could not remove route: %m"); else @@ -476,7 +494,7 @@ int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) { int route_configure( Route *route, Link *link, - sd_netlink_message_handler_t callback) { + link_netlink_message_handler_t callback) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL; @@ -488,6 +506,7 @@ int route_configure( assert(link->manager->rtnl); assert(link->ifindex > 0); assert(IN_SET(route->family, AF_INET, AF_INET6)); + assert(callback); if (route_get(link, route->family, &route->dst, route->dst_prefixlen, route->tos, route->priority, route->table, NULL) <= 0 && set_size(link->routes) >= routes_max()) @@ -629,8 +648,8 @@ int route_configure( if (r < 0) return log_error_errno(r, "Could not append RTA_METRICS attribute: %m"); - r = sd_netlink_call_async(link->manager->rtnl, NULL, req, callback, - link_netlink_destroy_callback, link, 0, __func__); + r = netlink_call_async(link->manager->rtnl, NULL, req, callback, + link_netlink_destroy_callback, link); if (r < 0) return log_error_errno(r, "Could not send rtnetlink message: %m"); @@ -672,8 +691,7 @@ int config_parse_gateway( Network *network = userdata; _cleanup_(route_freep) Route *n = NULL; - union in_addr_union buffer; - int r, f; + int r; assert(filename); assert(section); @@ -691,14 +709,12 @@ int config_parse_gateway( if (r < 0) return r; - r = in_addr_from_string_auto(rvalue, &f, &buffer); + r = in_addr_from_string_auto(rvalue, &n->family, &n->gw); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Route is invalid, ignoring assignment: %s", rvalue); return 0; } - n->family = f; - n->gw = buffer; TAKE_PTR(n); return 0; @@ -718,8 +734,7 @@ int config_parse_preferred_src( Network *network = userdata; _cleanup_(route_freep) Route *n = NULL; - union in_addr_union buffer; - int r, f; + int r; assert(filename); assert(section); @@ -731,15 +746,13 @@ int config_parse_preferred_src( if (r < 0) return r; - r = in_addr_from_string_auto(rvalue, &f, &buffer); + r = in_addr_from_string_auto(rvalue, &n->family, &n->prefsrc); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Preferred source is invalid, ignoring assignment: %s", rvalue); return 0; } - n->family = f; - n->prefsrc = buffer; TAKE_PTR(n); return 0; @@ -759,8 +772,8 @@ int config_parse_destination( Network *network = userdata; _cleanup_(route_freep) Route *n = NULL; - union in_addr_union buffer; - unsigned char prefixlen; + union in_addr_union *buffer; + unsigned char *prefixlen; int r; assert(filename); @@ -773,29 +786,23 @@ int config_parse_destination( if (r < 0) return r; - r = in_addr_prefix_from_string(rvalue, AF_INET, &buffer, &prefixlen); - if (r < 0) { - r = in_addr_prefix_from_string(rvalue, AF_INET6, &buffer, &prefixlen); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, - "Route %s= prefix is invalid, ignoring assignment: %s", - lvalue, rvalue); - return 0; - } - - n->family = AF_INET6; - } else - n->family = AF_INET; - if (streq(lvalue, "Destination")) { - n->dst = buffer; - n->dst_prefixlen = prefixlen; + buffer = &n->dst; + prefixlen = &n->dst_prefixlen; } else if (streq(lvalue, "Source")) { - n->src = buffer; - n->src_prefixlen = prefixlen; + buffer = &n->src; + prefixlen = &n->src_prefixlen; } else assert_not_reached(lvalue); + r = in_addr_prefix_from_string_auto(rvalue, &n->family, buffer, prefixlen); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, + "Route %s= prefix is invalid, ignoring assignment: %s", + lvalue, rvalue); + return 0; + } + TAKE_PTR(n); return 0; }