From: Yu Watanabe Date: Mon, 26 Apr 2021 07:04:07 +0000 (+0900) Subject: network: make neighbor_configure() take callback X-Git-Tag: v249-rc1~240^2~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7575e1f42db568680eea032880529cfa71d5db83;p=thirdparty%2Fsystemd.git network: make neighbor_configure() take callback --- diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index b33f560b798..41ce52a3eed 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -235,34 +235,12 @@ static void log_neighbor_debug(const Neighbor *neighbor, const char *str, const "%s neighbor: lladdr: %s, dst: %s", str, strna(lladdr), strna(dst)); } +static int neighbor_configure( + const Neighbor *neighbor, + Link *link, + link_netlink_message_handler_t callback, + Neighbor **ret) { -static int neighbor_configure_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - int r; - - assert(m); - assert(link); - assert(link->neighbor_messages > 0); - - link->neighbor_messages--; - - if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) - return 1; - - r = sd_netlink_message_get_errno(m); - if (r < 0 && r != -EEXIST) - /* Neighbor may not exist yet. So, do not enter failed state here. */ - log_link_message_warning_errno(link, m, r, "Could not set neighbor, ignoring"); - - if (link->neighbor_messages == 0) { - log_link_debug(link, "Neighbors set"); - link->neighbors_configured = true; - link_check_ready(link); - } - - return 1; -} - -static int neighbor_configure(Neighbor *neighbor, Link *link) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; int r; @@ -271,6 +249,7 @@ static int neighbor_configure(Neighbor *neighbor, Link *link) { assert(link->ifindex > 0); assert(link->manager); assert(link->manager->rtnl); + assert(callback); log_neighbor_debug(neighbor, "Configuring", link); @@ -291,7 +270,7 @@ static int neighbor_configure(Neighbor *neighbor, Link *link) { if (r < 0) return log_link_error_errno(link, r, "Could not append NDA_DST attribute: %m"); - r = netlink_call_async(link->manager->rtnl, NULL, req, neighbor_configure_handler, + r = netlink_call_async(link->manager->rtnl, NULL, req, callback, link_netlink_destroy_callback, link); if (r < 0) return log_link_error_errno(link, r, "Could not send rtnetlink message: %m"); @@ -299,13 +278,39 @@ static int neighbor_configure(Neighbor *neighbor, Link *link) { link->neighbor_messages++; link_ref(link); - r = neighbor_add(link, neighbor, NULL); + r = neighbor_add(link, neighbor, ret); if (r < 0) return log_link_error_errno(link, r, "Could not add neighbor: %m"); return r; } +static int static_neighbor_configure_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { + int r; + + assert(m); + assert(link); + assert(link->neighbor_messages > 0); + + link->neighbor_messages--; + + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return 1; + + r = sd_netlink_message_get_errno(m); + if (r < 0 && r != -EEXIST) + /* Neighbor may not exist yet. So, do not enter failed state here. */ + log_link_message_warning_errno(link, m, r, "Could not set neighbor, ignoring"); + + if (link->neighbor_messages == 0) { + log_link_debug(link, "Neighbors set"); + link->neighbors_configured = true; + link_check_ready(link); + } + + return 1; +} + int link_set_neighbors(Link *link) { Neighbor *neighbor; int r; @@ -322,7 +327,7 @@ int link_set_neighbors(Link *link) { link->neighbors_configured = false; HASHMAP_FOREACH(neighbor, link->network->neighbors_by_section) { - r = neighbor_configure(neighbor, link); + r = neighbor_configure(neighbor, link, static_neighbor_configure_handler, NULL); if (r < 0) return log_link_warning_errno(link, r, "Could not set neighbor: %m"); }