TC class can be enumerated only per link.
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,
}
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. */
+
+ HASHMAP_FOREACH(link, m->links_by_index)
+ RET_GATHER(r, link_enumerate_tclass(link, 0));
- return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_tclass);
+ return r;
}
static int manager_enumerate_addresses(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);
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;
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);