network: introduce address_forget() and friends and use it where applicable
No functional change, just refactoring.
This commit is contained in:
@@ -510,6 +510,24 @@ static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) {
|
||||
nexthop->routes = set_free(nexthop->routes);
|
||||
}
|
||||
|
||||
static void nexthop_forget(Manager *manager, NextHop *nexthop, const char *msg) {
|
||||
assert(manager);
|
||||
assert(nexthop);
|
||||
assert(msg);
|
||||
|
||||
Request *req;
|
||||
if (nexthop_get_request_by_id(manager, nexthop->id, &req) >= 0)
|
||||
nexthop_enter_removed(req->userdata);
|
||||
|
||||
if (!nexthop->manager && nexthop_get_by_id(manager, nexthop->id, &nexthop) < 0)
|
||||
return;
|
||||
|
||||
nexthop_enter_removed(nexthop);
|
||||
log_nexthop_debug(nexthop, msg, manager);
|
||||
nexthop_forget_dependents(nexthop, nexthop->manager);
|
||||
nexthop_detach(nexthop);
|
||||
}
|
||||
|
||||
static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, RemoveRequest *rreq) {
|
||||
int r;
|
||||
|
||||
@@ -525,18 +543,8 @@ static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Remov
|
||||
(r == -ENOENT || !nexthop->manager) ? LOG_DEBUG : LOG_WARNING,
|
||||
r, "Could not drop nexthop, ignoring");
|
||||
|
||||
nexthop_forget_dependents(nexthop, manager);
|
||||
|
||||
if (nexthop->manager) {
|
||||
/* If the nexthop cannot be removed, then assume the nexthop is already removed. */
|
||||
log_nexthop_debug(nexthop, "Forgetting", manager);
|
||||
|
||||
Request *req;
|
||||
if (nexthop_get_request_by_id(manager, nexthop->id, &req) >= 0)
|
||||
nexthop_enter_removed(req->userdata);
|
||||
|
||||
nexthop_detach(nexthop);
|
||||
}
|
||||
/* If the nexthop cannot be removed, then assume the nexthop is already removed. */
|
||||
nexthop_forget(manager, nexthop, "Forgetting");
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -969,20 +977,6 @@ int link_drop_nexthops(Link *link, bool only_static) {
|
||||
return r;
|
||||
}
|
||||
|
||||
static void nexthop_forget_one(NextHop *nexthop) {
|
||||
assert(nexthop);
|
||||
assert(nexthop->manager);
|
||||
|
||||
Request *req;
|
||||
if (nexthop_get_request_by_id(nexthop->manager, nexthop->id, &req) >= 0)
|
||||
nexthop_enter_removed(req->userdata);
|
||||
|
||||
nexthop_enter_removed(nexthop);
|
||||
log_nexthop_debug(nexthop, "Forgetting silently removed", nexthop->manager);
|
||||
nexthop_forget_dependents(nexthop, nexthop->manager);
|
||||
nexthop_detach(nexthop);
|
||||
}
|
||||
|
||||
void link_forget_nexthops(Link *link) {
|
||||
assert(link);
|
||||
assert(link->manager);
|
||||
@@ -999,7 +993,7 @@ void link_forget_nexthops(Link *link) {
|
||||
if (nexthop->family != AF_INET)
|
||||
continue;
|
||||
|
||||
nexthop_forget_one(nexthop);
|
||||
nexthop_forget(link->manager, nexthop, "Forgetting silently removed");
|
||||
}
|
||||
|
||||
/* Remove all group nexthops their all members are removed in the above. */
|
||||
@@ -1020,7 +1014,7 @@ void link_forget_nexthops(Link *link) {
|
||||
if (!hashmap_isempty(nexthop->group))
|
||||
continue; /* At least one group member still exists. */
|
||||
|
||||
nexthop_forget_one(nexthop);
|
||||
nexthop_forget(link->manager, nexthop, "Forgetting silently removed");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1084,11 +1078,6 @@ static int nexthop_update_group(NextHop *nexthop, sd_netlink_message *message) {
|
||||
}
|
||||
|
||||
int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
|
||||
uint16_t type;
|
||||
uint32_t id, ifindex;
|
||||
NextHop *nexthop = NULL;
|
||||
Request *req = NULL;
|
||||
bool is_new = false;
|
||||
int r;
|
||||
|
||||
assert(rtnl);
|
||||
@@ -1103,6 +1092,7 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t type;
|
||||
r = sd_netlink_message_get_type(message, &type);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "rtnl: could not get message type, ignoring: %m");
|
||||
@@ -1112,6 +1102,7 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t id;
|
||||
r = sd_netlink_message_read_u32(message, NHA_ID, &id);
|
||||
if (r == -ENODATA) {
|
||||
log_warning_errno(r, "rtnl: received nexthop message without NHA_ID attribute, ignoring: %m");
|
||||
@@ -1124,25 +1115,23 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
|
||||
return 0;
|
||||
}
|
||||
|
||||
NextHop *nexthop = NULL;
|
||||
(void) nexthop_get_by_id(m, id, &nexthop);
|
||||
(void) nexthop_get_request_by_id(m, id, &req);
|
||||
|
||||
if (type == RTM_DELNEXTHOP) {
|
||||
if (nexthop) {
|
||||
nexthop_enter_removed(nexthop);
|
||||
log_nexthop_debug(nexthop, "Forgetting removed", m);
|
||||
nexthop_forget_dependents(nexthop, m);
|
||||
nexthop_detach(nexthop);
|
||||
} else
|
||||
if (nexthop)
|
||||
nexthop_forget(m, nexthop, "Forgetting removed");
|
||||
else
|
||||
log_nexthop_debug(&(const NextHop) { .id = id }, "Kernel removed unknown", m);
|
||||
|
||||
if (req)
|
||||
nexthop_enter_removed(req->userdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Request *req = NULL;
|
||||
(void) nexthop_get_request_by_id(m, id, &req);
|
||||
|
||||
/* If we did not know the nexthop, then save it. */
|
||||
bool is_new = false;
|
||||
if (!nexthop) {
|
||||
if (!req && !m->manage_foreign_nexthops) {
|
||||
log_nexthop_debug(&(const NextHop) { .id = id }, "Ignoring received", m);
|
||||
@@ -1194,6 +1183,7 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
|
||||
else
|
||||
nexthop->blackhole = r;
|
||||
|
||||
uint32_t ifindex;
|
||||
r = sd_netlink_message_read_u32(message, NHA_OIF, &ifindex);
|
||||
if (r == -ENODATA)
|
||||
nexthop->ifindex = 0;
|
||||
|
||||
Reference in New Issue
Block a user