]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: make neighbor_configure() take callback
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 26 Apr 2021 07:04:07 +0000 (16:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 12 May 2021 01:30:45 +0000 (10:30 +0900)
src/network/networkd-neighbor.c

index b33f560b79870af8497b848c7c6c02f5f4d5b392..41ce52a3eedb7331f5ea505d483a03d7f8fc34ea 100644 (file)
@@ -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");
         }