network/tc: fix enumeration logic of traffic control classes

TC class can be enumerated only per link.
This commit is contained in:
Yu Watanabe
2023-10-07 14:24:34 +09:00
parent be8e933900
commit 4147618612
4 changed files with 29 additions and 7 deletions

View File

@@ -716,7 +716,7 @@ int manager_load_config(Manager *m) {
return manager_build_dhcp_pd_subnet_ids(m);
}
static int manager_enumerate_internal(
int manager_enumerate_internal(
Manager *m,
sd_netlink *nl,
sd_netlink_message *req,
@@ -775,17 +775,18 @@ static int manager_enumerate_qdisc(Manager *m) {
}
static int manager_enumerate_tclass(Manager *m) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
Link *link;
int r = 0;
assert(m);
assert(m->rtnl);
r = sd_rtnl_message_new_traffic_control(m->rtnl, &req, RTM_GETTCLASS, 0, 0, 0);
if (r < 0)
return r;
/* TC class can be enumerated only per link. See tc_dump_tclass() in net/sched/sched_api.c. */
return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_tclass);
HASHMAP_FOREACH(link, m->links_by_index)
RET_GATHER(r, link_enumerate_tclass(link, 0));
return r;
}
static int manager_enumerate_addresses(Manager *m) {

View File

@@ -113,6 +113,11 @@ int manager_start(Manager *m);
int manager_load_config(Manager *m);
int manager_enumerate_internal(
Manager *m,
sd_netlink *nl,
sd_netlink_message *req,
int (*process)(sd_netlink *, sd_netlink_message *, Manager *));
int manager_enumerate(Manager *m);
int manager_set_hostname(Manager *m, const char *hostname);

View File

@@ -505,6 +505,21 @@ int manager_rtnl_process_tclass(sd_netlink *rtnl, sd_netlink_message *message, M
return 1;
}
int link_enumerate_tclass(Link *link, uint32_t parent) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
assert(link);
assert(link->manager);
assert(link->manager->rtnl);
r = sd_rtnl_message_new_traffic_control(link->manager->rtnl, &req, RTM_GETTCLASS, link->ifindex, 0, parent);
if (r < 0)
return r;
return manager_enumerate_internal(link->manager, link->manager->rtnl, req, manager_rtnl_process_tclass);
}
static int tclass_section_verify(TClass *tclass) {
int r;

View File

@@ -67,6 +67,7 @@ int link_request_tclass(Link *link, TClass *tclass);
void network_drop_invalid_tclass(Network *network);
int manager_rtnl_process_tclass(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);
int link_enumerate_tclass(Link *link, uint32_t parent);
DEFINE_SECTION_CLEANUP_FUNCTIONS(TClass, tclass_free);