"%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;
assert(link->ifindex > 0);
assert(link->manager);
assert(link->manager->rtnl);
+ assert(callback);
log_neighbor_debug(neighbor, "Configuring", 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");
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;
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");
}