summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/networkd-nexthop.c72
1 files changed, 39 insertions, 33 deletions
diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c
index f3dbd98ed1..b0759cac90 100644
--- a/src/network/networkd-nexthop.c
+++ b/src/network/networkd-nexthop.c
@@ -406,37 +406,12 @@ static int nexthop_remove(const NextHop *nexthop, Manager *manager, Link *link)
return 0;
}
-static int nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
- int r;
-
- assert(link);
- assert(link->nexthop_messages > 0);
+static int nexthop_configure(
+ const NextHop *nexthop,
+ Link *link,
+ link_netlink_message_handler_t callback,
+ NextHop **ret) {
- link->nexthop_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) {
- log_link_message_warning_errno(link, m, r, "Could not set nexthop");
- link_enter_failed(link);
- return 1;
- }
-
- if (link->nexthop_messages == 0) {
- log_link_debug(link, "Nexthops set");
- link->static_nexthops_configured = true;
- /* Now all nexthops are configured. Let's configure remaining routes. */
- r = link_set_routes_with_gateway(link);
- if (r < 0)
- link_enter_failed(link);
- }
-
- return 1;
-}
-
-static int nexthop_configure(const NextHop *nexthop, Link *link) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
@@ -445,6 +420,7 @@ static int nexthop_configure(const NextHop *nexthop, Link *link) {
assert(link->manager->rtnl);
assert(link->ifindex > 0);
assert(IN_SET(nexthop->family, AF_INET, AF_INET6));
+ assert(callback);
log_nexthop_debug(nexthop, nexthop->id, "Configuring", link);
@@ -482,20 +458,50 @@ static int nexthop_configure(const NextHop *nexthop, Link *link) {
}
}
- r = netlink_call_async(link->manager->rtnl, NULL, req, nexthop_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");
link_ref(link);
- r = nexthop_add(link, nexthop, NULL);
+ r = nexthop_add(link, nexthop, ret);
if (r < 0)
return log_link_error_errno(link, r, "Could not add nexthop: %m");
return r;
}
+static int static_nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+ int r;
+
+ assert(link);
+ assert(link->nexthop_messages > 0);
+
+ link->nexthop_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) {
+ log_link_message_warning_errno(link, m, r, "Could not set nexthop");
+ link_enter_failed(link);
+ return 1;
+ }
+
+ if (link->nexthop_messages == 0) {
+ log_link_debug(link, "Nexthops set");
+ link->static_nexthops_configured = true;
+ /* Now all nexthops are configured. Let's configure remaining routes. */
+ r = link_set_routes_with_gateway(link);
+ if (r < 0)
+ link_enter_failed(link);
+ }
+
+ return 1;
+}
+
int link_set_nexthops(Link *link) {
enum {
PHASE_ID, /* First phase: Nexthops with ID */
@@ -520,7 +526,7 @@ int link_set_nexthops(Link *link) {
if ((nh->id > 0) != (phase == PHASE_ID))
continue;
- r = nexthop_configure(nh, link);
+ r = nexthop_configure(nh, link, static_nexthop_handler, NULL);
if (r < 0)
return log_link_warning_errno(link, r, "Could not set nexthop: %m");