network/nexthop: cache requested nexthop IDs
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user