network/nexthop: cache requested nexthop IDs

This commit is contained in:
Yu Watanabe
2023-12-21 04:22:46 +09:00
parent 015b243207
commit fb126bb168
5 changed files with 49 additions and 20 deletions
+10 -1
View File
@@ -650,6 +650,7 @@ Manager* manager_free(Manager *m) {
m->routes = set_free(m->routes);
m->nexthops_by_id = hashmap_free(m->nexthops_by_id);
m->nexthop_ids = set_free(m->nexthop_ids);
sd_event_source_unref(m->speed_meter_event_source);
sd_event_unref(m->event);
@@ -708,7 +709,15 @@ int manager_load_config(Manager *m) {
if (r < 0)
return r;
return manager_build_dhcp_pd_subnet_ids(m);
r = manager_build_dhcp_pd_subnet_ids(m);
if (r < 0)
return r;
r = manager_build_nexthop_ids(m);
if (r < 0)
return r;
return 0;
}
int manager_enumerate_internal(
+1
View File
@@ -73,6 +73,7 @@ struct Manager {
/* Manage nexthops by id. */
Hashmap *nexthops_by_id;
Set *nexthop_ids; /* requested IDs in .network files */
/* Manager stores routes without RTA_OIF attribute. */
unsigned route_remove_messages;
+9 -1
View File
@@ -636,7 +636,15 @@ int network_reload(Manager *manager) {
ordered_hashmap_free_with_destructor(manager->networks, network_unref);
manager->networks = new_networks;
return manager_build_dhcp_pd_subnet_ids(manager);
r = manager_build_dhcp_pd_subnet_ids(manager);
if (r < 0)
return r;
r = manager_build_nexthop_ids(manager);
if (r < 0)
return r;
return 0;
failure:
ordered_hashmap_free_with_destructor(new_networks, network_unref);
+28 -18
View File
@@ -344,10 +344,6 @@ static int nexthop_add_new(Manager *manager, uint32_t id, NextHop **ret) {
}
static int nexthop_acquire_id(Manager *manager, NextHop *nexthop) {
_cleanup_set_free_ Set *ids = NULL;
Network *network;
int r;
assert(manager);
assert(nexthop);
@@ -360,25 +356,12 @@ static int nexthop_acquire_id(Manager *manager, NextHop *nexthop) {
/* Find the lowest unused ID. */
ORDERED_HASHMAP_FOREACH(network, manager->networks) {
NextHop *tmp;
ORDERED_HASHMAP_FOREACH(tmp, network->nexthops_by_section) {
if (tmp->id == 0)
continue;
r = set_ensure_put(&ids, NULL, UINT32_TO_PTR(tmp->id));
if (r < 0)
return r;
}
}
for (uint32_t id = 1; id < UINT32_MAX; id++) {
if (nexthop_get_by_id(manager, id, NULL) >= 0)
continue;
if (nexthop_get_request_by_id(manager, id, NULL) >= 0)
continue;
if (set_contains(ids, UINT32_TO_PTR(id)))
if (set_contains(manager->nexthop_ids, UINT32_TO_PTR(id)))
continue;
nexthop->id = id;
@@ -1100,6 +1083,33 @@ int network_drop_invalid_nexthops(Network *network) {
return 0;
}
int manager_build_nexthop_ids(Manager *manager) {
Network *network;
int r;
assert(manager);
if (!manager->manage_foreign_nexthops)
return 0;
manager->nexthop_ids = set_free(manager->nexthop_ids);
ORDERED_HASHMAP_FOREACH(network, manager->networks) {
NextHop *nh;
ORDERED_HASHMAP_FOREACH(nh, network->nexthops_by_section) {
if (nh->id == 0)
continue;
r = set_ensure_put(&manager->nexthop_ids, NULL, UINT32_TO_PTR(nh->id));
if (r < 0)
return r;
}
}
return 0;
}
int config_parse_nexthop_id(
const char *unit,
const char *filename,
+1
View File
@@ -52,6 +52,7 @@ int link_request_static_nexthops(Link *link, bool only_ipv4);
int nexthop_get_by_id(Manager *manager, uint32_t id, NextHop **ret);
int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);
int manager_build_nexthop_ids(Manager *manager);
DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(NextHop, nexthop);