diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 979890f9a5..027e89ca69 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1472,17 +1472,18 @@ int link_drop_static_addresses(Link *link) { return r; } -int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg) { +int address_configure_handler_internal(sd_netlink_message *m, Link *link, Address *address) { int r; - assert(rtnl); assert(m); assert(link); - assert(error_msg); + assert(address); r = sd_netlink_message_get_errno(m); if (r < 0 && r != -EEXIST) { - log_link_message_warning_errno(link, m, r, error_msg); + log_link_message_warning_errno(link, m, r, "Failed to set %s address %s", + network_config_source_to_string(address->source), + IN_ADDR_TO_STRING(address->family, &address->in_addr)); link_enter_failed(link); return 0; } @@ -1725,8 +1726,9 @@ static int static_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reque int r; assert(link); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Failed to set static address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index f8d6b6c3a1..1c171a476a 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -103,7 +103,7 @@ int address_new(Address **ret); int address_new_static(Network *network, const char *filename, unsigned section_line, Address **ret); int address_get(Link *link, const Address *in, Address **ret); int address_get_harder(Link *link, const Address *in, Address **ret); -int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg); +int address_configure_handler_internal(sd_netlink_message *m, Link *link, Address *address); int address_remove(Address *address, Link *link); int address_remove_and_cancel(Address *address, Link *link); int address_dup(const Address *src, Address **ret); diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index 41f215ba53..e519896fa0 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -271,8 +271,9 @@ static int dhcp_pd_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Failed to add prefix route for DHCP delegated subnet prefix"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; @@ -328,8 +329,9 @@ static int dhcp_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Requ int r; assert(link); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Could not set DHCP-PD address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; @@ -698,8 +700,9 @@ static int dhcp4_unreachable_route_handler(sd_netlink *rtnl, sd_netlink_message assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Failed to set unreachable route for DHCPv4 delegated prefix"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; @@ -715,8 +718,9 @@ static int dhcp6_unreachable_route_handler(sd_netlink *rtnl, sd_netlink_message assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Failed to set unreachable route for DHCPv6 delegated prefix"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 96b82a447c..b94935ebd9 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -341,11 +341,11 @@ int dhcp4_check_ready(Link *link) { static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, Link *link, Route *route) { int r; - assert(m); assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Could not set DHCPv4 route"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; @@ -897,8 +897,9 @@ static int dhcp4_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques int r; assert(link); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Could not set DHCPv4 address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 90b4b33bbc..222d791e4b 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -134,8 +134,9 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques int r; assert(link); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Could not set DHCPv6 address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index d154574a3f..7c20c7f49f 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -80,8 +80,9 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reque assert(link); assert(!link->ipv4ll_address_configured); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Could not set ipv4ll address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 0bd27a45c8..d58b21da9e 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2914,7 +2914,7 @@ int link_getlink_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link r = sd_netlink_message_get_errno(m); if (r < 0) { - log_link_message_warning_errno(link, m, r, error_msg); + log_link_message_warning_errno(link, m, r, "%s", error_msg); link_enter_failed(link); return 0; } diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 26d5611ba3..4b988dcaf4 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -370,8 +370,9 @@ static int ndisc_nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques int r; assert(link); + assert(nexthop); - r = nexthop_configure_handler_internal(m, link, "Could not set NDisc route"); + r = nexthop_configure_handler_internal(m, link, nexthop); if (r <= 0) return r; @@ -441,8 +442,9 @@ static int ndisc_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Request assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Could not set NDisc route"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; @@ -670,8 +672,9 @@ static int ndisc_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques int r; assert(link); + assert(address); - r = address_configure_handler_internal(rtnl, m, link, "Could not set NDisc address"); + r = address_configure_handler_internal(m, link, address); if (r <= 0) return r; diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 51ee49ae38..87056882a8 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -458,9 +458,30 @@ static int nexthop_acquire_id(Manager *manager, NextHop *nexthop) { return -EBUSY; } -void log_nexthop_debug(const NextHop *nexthop, const char *str, Manager *manager) { - _cleanup_free_ char *state = NULL, *group = NULL, *flags = NULL; +static int nexthop_to_string(const NextHop *nexthop, Manager *manager, char **ret) { + _cleanup_free_ char *group = NULL, *flags = NULL; + + assert(nexthop); + assert(manager); + assert(ret); + + (void) route_flags_to_string_alloc(nexthop->flags, &flags); + struct nexthop_grp *nhg; + HASHMAP_FOREACH(nhg, nexthop->group) + (void) strextendf_with_separator(&group, ",", "%"PRIu32":%"PRIu32, nhg->id, nhg->weight+1u); + + if (asprintf(ret, "id: %"PRIu32", gw: %s, blackhole: %s, group: %s, flags: %s", + nexthop->id, + IN_ADDR_TO_STRING(nexthop->family, &nexthop->gw.address), + yes_no(nexthop->blackhole), strna(group), strna(flags)) < 0) + return -ENOMEM; + + return 0; +} + +void log_nexthop_debug(const NextHop *nexthop, const char *str, Manager *manager) { + _cleanup_free_ char *state = NULL, *nexthop_str = NULL; Link *link = NULL; assert(nexthop); @@ -472,16 +493,10 @@ void log_nexthop_debug(const NextHop *nexthop, const char *str, Manager *manager (void) link_get_by_index(manager, nexthop->ifindex, &link); (void) network_config_state_to_string_alloc(nexthop->state, &state); - (void) route_flags_to_string_alloc(nexthop->flags, &flags); + (void) nexthop_to_string(nexthop, manager, &nexthop_str); - HASHMAP_FOREACH(nhg, nexthop->group) - (void) strextendf_with_separator(&group, ",", "%"PRIu32":%"PRIu32, nhg->id, nhg->weight+1u); - - log_link_debug(link, "%s %s nexthop (%s): id: %"PRIu32", gw: %s, blackhole: %s, group: %s, flags: %s", - str, strna(network_config_source_to_string(nexthop->source)), strna(state), - nexthop->id, - IN_ADDR_TO_STRING(nexthop->family, &nexthop->gw.address), - yes_no(nexthop->blackhole), strna(group), strna(flags)); + log_link_debug(link, "%s %s nexthop (%s): %s", + str, strna(network_config_source_to_string(nexthop->source)), strna(state), strna(nexthop_str)); } static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) { @@ -672,16 +687,19 @@ static int nexthop_configure(NextHop *nexthop, Link *link, Request *req) { return request_call_netlink_async(link->manager->rtnl, m, req); } -int nexthop_configure_handler_internal(sd_netlink_message *m, Link *link, const char *error_msg) { +int nexthop_configure_handler_internal(sd_netlink_message *m, Link *link, NextHop *nexthop) { int r; assert(m); assert(link); - assert(error_msg); + assert(nexthop); r = sd_netlink_message_get_errno(m); if (r < 0 && r != -EEXIST) { - log_link_message_warning_errno(link, m, r, error_msg); + _cleanup_free_ char *str = NULL; + (void) nexthop_to_string(nexthop, link->manager, &str); + log_link_message_warning_errno(link, m, r, "Failed to set %s nexthop (%s)", + network_config_source_to_string(nexthop->source), strna(str)); link_enter_failed(link); return 0; } @@ -694,7 +712,7 @@ static int static_nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Reque assert(link); - r = nexthop_configure_handler_internal(m, link, "Failed to set static nexthop"); + r = nexthop_configure_handler_internal(m, link, nexthop); if (r <= 0) return r; diff --git a/src/network/networkd-nexthop.h b/src/network/networkd-nexthop.h index 1b0679fc37..8e345c6d53 100644 --- a/src/network/networkd-nexthop.h +++ b/src/network/networkd-nexthop.h @@ -76,7 +76,7 @@ static inline int link_drop_static_nexthops(Link *link) { } void link_forget_nexthops(Link *link); -int nexthop_configure_handler_internal(sd_netlink_message *m, Link *link, const char *error_msg); +int nexthop_configure_handler_internal(sd_netlink_message *m, Link *link, NextHop *nexthop); int link_request_nexthop( Link *link, const NextHop *nexthop, diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index ab56e6f5dc..665155e1ba 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -417,22 +417,14 @@ int route_dup(const Route *src, const RouteNextHop *nh, Route **ret) { return 0; } -void log_route_debug(const Route *route, const char *str, Manager *manager) { - _cleanup_free_ char *state = NULL, *nexthop = NULL, *prefsrc = NULL, +static int route_to_string(const Route *route, Manager *manager, char **ret) { + _cleanup_free_ char *nexthop = NULL, *prefsrc = NULL, *table = NULL, *scope = NULL, *proto = NULL, *flags = NULL; const char *dst, *src; - Link *link = NULL; assert(route); - assert(str); assert(manager); - - if (!DEBUG_LOGGING) - return; - - (void) route_get_link(manager, route, &link); - - (void) network_config_state_to_string_alloc(route->state, &state); + assert(ret); dst = in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0 ? IN_ADDR_PREFIX_TO_STRING(route->family, &route->dst, route->dst_prefixlen) : NULL; @@ -448,14 +440,37 @@ void log_route_debug(const Route *route, const char *str, Manager *manager) { (void) route_protocol_full_to_string_alloc(route->protocol, &proto); (void) route_flags_to_string_alloc(route->flags, &flags); - log_link_debug(link, - "%s %s route (%s): dst: %s, src: %s, %s, prefsrc: %s, " - "table: %s, priority: %"PRIu32", " - "proto: %s, scope: %s, type: %s, flags: %s", - str, strna(network_config_source_to_string(route->source)), strna(state), - strna(dst), strna(src), strna(nexthop), strna(prefsrc), - strna(table), route->priority, - strna(proto), strna(scope), strna(route_type_to_string(route->type)), strna(flags)); + if (asprintf(ret, + "dst: %s, src: %s, %s, prefsrc: %s, " + "table: %s, priority: %"PRIu32", " + "proto: %s, scope: %s, " + "type: %s, flags: %s", + strna(dst), strna(src), strna(nexthop), strna(prefsrc), + strna(table), route->priority, + strna(proto), strna(scope), + strna(route_type_to_string(route->type)), strna(flags)) < 0) + return -ENOMEM; + + return 0; +} + +void log_route_debug(const Route *route, const char *str, Manager *manager) { + _cleanup_free_ char *state = NULL, *route_str = NULL; + Link *link = NULL; + + assert(route); + assert(str); + assert(manager); + + if (!DEBUG_LOGGING) + return; + + (void) route_get_link(manager, route, &link); + (void) network_config_state_to_string_alloc(route->state, &state); + (void) route_to_string(route, manager, &route_str); + + log_link_debug(link, "%s %s route (%s): %s", + str, strna(network_config_source_to_string(route->source)), strna(state), strna(route_str)); } static void route_forget(Manager *manager, Route *route, const char *msg) { @@ -768,12 +783,12 @@ static int route_update_on_existing(Request *req) { return 0; } -int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Request *req, const char *error_msg) { +int route_configure_handler_internal(sd_netlink_message *m, Request *req, Route *route) { int r; assert(m); assert(req); - assert(error_msg); + assert(route); Link *link = ASSERT_PTR(req->link); @@ -791,7 +806,10 @@ int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Re return 1; } if (r < 0) { - log_link_message_warning_errno(link, m, r, error_msg); + _cleanup_free_ char *str = NULL; + (void) route_to_string(route, link->manager, &str); + log_link_message_warning_errno(link, m, r, "Failed to configure %s route (%s)", + network_config_source_to_string(route->source), strna(str)); link_enter_failed(link); return 0; } @@ -1015,9 +1033,11 @@ int link_request_route( static int static_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, Link *link, Route *route) { int r; + assert(req); assert(link); + assert(route); - r = route_configure_handler_internal(rtnl, m, req, "Could not set static route"); + r = route_configure_handler_internal(m, req, route); if (r <= 0) return r; diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index 5dba22b447..4ce81342a7 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -96,7 +96,7 @@ int route_new(Route **ret); int route_new_static(Network *network, const char *filename, unsigned section_line, Route **ret); int route_dup(const Route *src, const RouteNextHop *nh, Route **ret); -int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Request *req, const char *error_msg); +int route_configure_handler_internal(sd_netlink_message *m, Request *req, Route *route); int route_remove(Route *route, Manager *manager); int route_remove_and_cancel(Route *route, Manager *manager); diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index 9c4dbc74f7..255ad5a271 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -56,10 +56,9 @@ static int set_link_handler_internal( r = sd_netlink_message_get_errno(m); if (r < 0) { - const char *error_msg; - - error_msg = strjoina("Failed to set ", request_type_to_string(req->type), ignore ? ", ignoring" : ""); - log_link_message_warning_errno(link, m, r, error_msg); + log_link_message_warning_errno(link, m, r, "Failed to set %s%s", + request_type_to_string(req->type), + ignore ? ", ignoring" : ""); if (!ignore) link_enter_failed(link); @@ -1073,9 +1072,7 @@ static int link_up_or_down_handler(sd_netlink *rtnl, sd_netlink_message *m, Requ if (r == -ENETDOWN && up && link_up_dsa_slave(link) > 0) log_link_message_debug_errno(link, m, r, "Could not bring up dsa slave, retrying again after dsa master becomes up"); else if (r < 0) - log_link_message_warning_errno(link, m, r, up ? - "Could not bring up interface, ignoring" : - "Could not bring down interface, ignoring"); + log_link_message_warning_errno(link, m, r, "Could not bring %s interface, ignoring", up ? "up" : "down"); r = link_call_getlink(link, get_link_update_flag_handler); if (r < 0) { @@ -1277,7 +1274,7 @@ int link_request_to_bring_up_or_down(Link *link, bool up) { return 0; } -static int link_up_or_down_now_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *msg) { +static int link_up_or_down_now_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link, bool up) { int r; assert(m); @@ -1291,7 +1288,7 @@ static int link_up_or_down_now_handler(sd_netlink *rtnl, sd_netlink_message *m, r = sd_netlink_message_get_errno(m); if (r < 0) - log_link_message_warning_errno(link, m, r, msg); + log_link_message_warning_errno(link, m, r, "Could not bring %s interface, ignoring", up ? "up" : "down"); r = link_call_getlink(link, get_link_update_flag_handler); if (r < 0) { @@ -1304,11 +1301,11 @@ static int link_up_or_down_now_handler(sd_netlink *rtnl, sd_netlink_message *m, } static int link_up_now_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - return link_up_or_down_now_handler(rtnl, m, link, "Could not bring up interface, ignoring"); + return link_up_or_down_now_handler(rtnl, m, link, /* up = */ true); } static int link_down_now_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - return link_up_or_down_now_handler(rtnl, m, link, "Could not bring down interface, ignoring"); + return link_up_or_down_now_handler(rtnl, m, link, /* up = */ false); } int link_up_or_down_now(Link *link, bool up) { diff --git a/src/network/networkd-sriov.c b/src/network/networkd-sriov.c index 44b5c6ecf3..cb974f881d 100644 --- a/src/network/networkd-sriov.c +++ b/src/network/networkd-sriov.c @@ -17,7 +17,9 @@ static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, r = sd_netlink_message_get_errno(m); if (r < 0) - log_link_message_warning_errno(link, m, r, "Failed to set up SR-IOV virtual function, ignoring"); + log_link_message_warning_errno(link, m, r, "Failed to set up %s for SR-IOV virtual function %"PRIu32", ignoring", + sr_iov_attribute_to_string(req->type - _REQUEST_TYPE_SRIOV_BASE), + sr_iov->vf); if (link->sr_iov_messages == 0) { log_link_debug(link, "Applied settings for SR-IOV virtual functions."); @@ -70,7 +72,8 @@ static int sr_iov_process_request(Request *req, Link *link, SRIOV *sr_iov) { r = sr_iov_configure(sr_iov, link, req); if (r < 0) return log_link_warning_errno(link, r, - "Failed to set up SR-IOV virtual function %"PRIu32": %m", + "Failed to set up %s for SR-IOV virtual function %"PRIu32": %m", + sr_iov_attribute_to_string(req->type - _REQUEST_TYPE_SRIOV_BASE), sr_iov->vf); return 1; @@ -103,8 +106,8 @@ int link_request_sr_iov_vfs(Link *link) { NULL); if (r < 0) return log_link_warning_errno(link, r, - "Failed to request to set up SR-IOV virtual function %"PRIu32": %m", - sr_iov->vf); + "Failed to request to set up %s for SR-IOV virtual function %"PRIu32": %m", + sr_iov_attribute_to_string(attr), sr_iov->vf); } } @@ -112,7 +115,7 @@ int link_request_sr_iov_vfs(Link *link) { link->sr_iov_configured = true; link_check_ready(link); } else - log_link_debug(link, "Setting up SR-IOV virtual functions."); + log_link_debug(link, "Applying settings for SR-IOV virtual functions."); return 0; } diff --git a/src/network/networkd-util.c b/src/network/networkd-util.c index 80cce4dcdc..87139ba47f 100644 --- a/src/network/networkd-util.c +++ b/src/network/networkd-util.c @@ -233,17 +233,3 @@ int config_parse_mud_url( return free_and_replace(*url, unescaped); } - -int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg) { - const char *err_msg = NULL; - - /* link may be NULL. */ - - (void) sd_netlink_message_read_string(m, NLMSGERR_ATTR_MSG, &err_msg); - return log_link_full_errno(link, level, err, - "%s: %s%s%s%m", - msg, - strempty(err_msg), - err_msg && !endswith(err_msg, ".") ? "." : "", - err_msg ? " " : ""); -} diff --git a/src/network/networkd-util.h b/src/network/networkd-util.h index 2a3b5683fa..ea600043cf 100644 --- a/src/network/networkd-util.h +++ b/src/network/networkd-util.h @@ -153,15 +153,34 @@ sd_dhcp_lease_server_type_t dhcp_lease_server_type_from_string(const char *s) _p bool link_should_mark_config(Link *link, bool only_static, NetworkConfigSource source, uint8_t protocol); -int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg); -#define log_link_message_error_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_ERR, err, msg) -#define log_link_message_warning_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_WARNING, err, msg) -#define log_link_message_notice_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_NOTICE, err, msg) -#define log_link_message_info_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_INFO, err, msg) -#define log_link_message_debug_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_DEBUG, err, msg) -#define log_message_full_errno(m, level, err, msg) log_link_message_full_errno(NULL, m, level, err, msg) -#define log_message_error_errno(m, err, msg) log_message_full_errno(m, LOG_ERR, err, msg) -#define log_message_warning_errno(m, err, msg) log_message_full_errno(m, LOG_WARNING, err, msg) -#define log_message_notice_errno(m, err, msg) log_message_full_errno(m, LOG_NOTICE, err, msg) -#define log_message_info_errno(m, err, msg) log_message_full_errno(m, LOG_INFO, err, msg) -#define log_message_debug_errno(m, err, msg) log_message_full_errno(m, LOG_DEBUG, err, msg) +#define _log_link_message_full_errno(link, link_u, message, error_msg, level, level_u, error, error_u, format, ...) \ + ({ \ + Link *link_u = (link); \ + int level_u = (level); \ + int error_u = (error); \ + \ + const char *error_msg = NULL; \ + if (message) \ + (void) sd_netlink_message_read_string(message, NLMSGERR_ATTR_MSG, &error_msg); \ + \ + error_msg ? \ + log_link_full_errno(link_u, level_u, error_u, format ": %s%s %m", ##__VA_ARGS__, \ + error_msg, endswith(error_msg, ".") ? "" : ".") : \ + log_link_full_errno(link_u, level_u, error_u, format ": %m", ##__VA_ARGS__); \ + }) + + +#define log_link_message_full_errno(link, message, level, error, format, ...) \ + _log_link_message_full_errno(link, UNIQ_T(lnk, UNIQ), message, UNIQ_T(emsg, UNIQ), level, UNIQ_T(lvl, UNIQ), error, UNIQ_T(err, UNIQ), format, ##__VA_ARGS__) + +#define log_link_message_error_errno(link, m, err, fmt, ...) log_link_message_full_errno(link, m, LOG_ERR, err, fmt, ##__VA_ARGS__) +#define log_link_message_warning_errno(link, m, err, fmt, ...) log_link_message_full_errno(link, m, LOG_WARNING, err, fmt, ##__VA_ARGS__) +#define log_link_message_notice_errno(link, m, err, fmt, ...) log_link_message_full_errno(link, m, LOG_NOTICE, err, fmt, ##__VA_ARGS__) +#define log_link_message_info_errno(link, m, err, fmt, ...) log_link_message_full_errno(link, m, LOG_INFO, err, fmt, ##__VA_ARGS__) +#define log_link_message_debug_errno(link, m, err, fmt, ...) log_link_message_full_errno(link, m, LOG_DEBUG, err, fmt, ##__VA_ARGS__) +#define log_message_full_errno(m, level, err, fmt, ...) log_link_message_full_errno(NULL, m, level, err, fmt, ##__VA_ARGS__) +#define log_message_error_errno(m, err, fmt, ...) log_message_full_errno(m, LOG_ERR, err, fmt, ##__VA_ARGS__) +#define log_message_warning_errno(m, err, fmt, ...) log_message_full_errno(m, LOG_WARNING, err, fmt, ##__VA_ARGS__) +#define log_message_notice_errno(m, err, fmt, ...) log_message_full_errno(m, LOG_NOTICE, err, fmt, ##__VA_ARGS__) +#define log_message_info_errno(m, err, fmt, ...) log_message_full_errno(m, LOG_INFO, err, fmt, ##__VA_ARGS__) +#define log_message_debug_errno(m, err, fmt, ...) log_message_full_errno(m, LOG_DEBUG, err, fmt, ##__VA_ARGS__) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 5c67cf2dc6..85a2d8490a 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -854,38 +854,32 @@ static int link_generate_alternative_names(Link *link) { return 0; } -static int sr_iov_configure(Link *link, sd_netlink **rtnl, SRIOV *sr_iov) { +static int sr_iov_configure(Link *link, sd_netlink **rtnl, SRIOV *sr_iov, SRIOVAttribute attr) { int r; assert(link); assert(rtnl); assert(link->ifindex > 0); - for (SRIOVAttribute attr = 0; attr < _SR_IOV_ATTRIBUTE_MAX; attr++) { - if (!sr_iov_has_config(sr_iov, attr)) - continue; + if (!sr_iov_has_config(sr_iov, attr)) + return 0; - if (!*rtnl) { - r = sd_netlink_open(rtnl); - if (r < 0) - return r; - } - - _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; - r = sd_rtnl_message_new_link(*rtnl, &req, RTM_SETLINK, link->ifindex); - if (r < 0) - return r; - - r = sr_iov_set_netlink_message(sr_iov, attr, req); - if (r < 0) - return r; - - r = sd_netlink_call(*rtnl, req, 0, NULL); + if (!*rtnl) { + r = sd_netlink_open(rtnl); if (r < 0) return r; } - return 0; + _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; + r = sd_rtnl_message_new_link(*rtnl, &req, RTM_SETLINK, link->ifindex); + if (r < 0) + return r; + + r = sr_iov_set_netlink_message(sr_iov, attr, req); + if (r < 0) + return r; + + return sd_netlink_call(*rtnl, req, 0, NULL); } static int link_apply_sr_iov_config(Link *link) { @@ -911,25 +905,27 @@ static int link_apply_sr_iov_config(Link *link) { r = sr_iov_get_num_vfs(link->event->dev, &n); if (r < 0) { - log_link_warning_errno(link, r, "Failed to get the number of SR-IOV virtual functions, ignoring [SR-IOV] sections: %m"); + log_link_warning_errno(link, r, "Failed to get the number of SR-IOV virtual functions, ignoring all [SR-IOV] sections: %m"); return 0; } if (n == 0) { - log_link_warning(link, "No SR-IOV virtual function exists, ignoring [SR-IOV] sections: %m"); + log_link_warning(link, "No SR-IOV virtual function exists, ignoring all [SR-IOV] sections: %m"); return 0; } ORDERED_HASHMAP_FOREACH(sr_iov, link->config->sr_iov_by_section) { if (sr_iov->vf >= n) { - log_link_warning(link, "SR-IOV virtual function %"PRIu32" does not exist, ignoring.", sr_iov->vf); + log_link_warning(link, "SR-IOV virtual function %"PRIu32" does not exist, ignoring [SR-IOV] section for the virtual function.", sr_iov->vf); continue; } - r = sr_iov_configure(link, &link->event->rtnl, sr_iov); - if (r < 0) - log_link_warning_errno(link, r, - "Failed to set up SR-IOV virtual function %"PRIu32", ignoring: %m", - sr_iov->vf); + for (SRIOVAttribute attr = 0; attr < _SR_IOV_ATTRIBUTE_MAX; attr++) { + r = sr_iov_configure(link, &link->event->rtnl, sr_iov, attr); + if (r < 0) + log_link_warning_errno(link, r, + "Failed to set up %s for SR-IOV virtual function %"PRIu32", ignoring: %m", + sr_iov_attribute_to_string(attr), sr_iov->vf); + } } return 0;