18 #include <netlink-local.h> 19 #include <netlink-tc.h> 20 #include <netlink/netlink.h> 21 #include <netlink/route/tc.h> 22 #include <netlink/route/class.h> 23 #include <netlink/route/class-modules.h> 24 #include <netlink/route/qdisc.h> 25 #include <netlink/route/classifier.h> 26 #include <netlink/utils.h> 28 static void class_free_data(
struct nl_object *obj)
30 struct rtnl_class *
class = (struct rtnl_class *) obj;
33 tca_free_data((
struct rtnl_tca *)
class);
40 static int class_clone(
struct nl_object *_dst,
struct nl_object *_src)
42 struct rtnl_class *dst = nl_object_priv(_dst);
43 struct rtnl_class *src = nl_object_priv(_src);
47 err = tca_clone((
struct rtnl_tca *) dst, (
struct rtnl_tca *) src);
58 static int class_dump_brief(
struct nl_object *obj,
struct nl_dump_params *p)
60 struct rtnl_class *
class = (struct rtnl_class *) obj;
63 int line = tca_dump_brief((
struct rtnl_tca *)
class,
"class", p, 0);
73 static int class_dump_full(
struct nl_object *obj,
struct nl_dump_params *p)
75 struct rtnl_class *
class = (struct rtnl_class *) obj;
79 line = class_dump_brief(obj, p);
80 line = tca_dump_full((
struct rtnl_tca *)
class, p, line);
84 dp_dump(p,
"child-qdisc %s ",
91 else if (!class->c_info)
92 dp_dump(p,
"noop (no leaf qdisc)");
99 static int class_dump_stats(
struct nl_object *obj,
struct nl_dump_params *p)
101 struct rtnl_class *
class = (struct rtnl_class *) obj;
105 line = class_dump_full(obj, p);
106 line = tca_dump_stats((
struct rtnl_tca *)
class, p, line);
121 struct rtnl_class *rtnl_class_alloc(
void)
126 void rtnl_class_put(
struct rtnl_class *
class)
146 struct nl_cache *cache)
148 struct rtnl_qdisc *leaf;
155 if (!leaf || leaf->q_handle != class->c_info)
178 void (*cb)(
struct nl_object *,
void *),
void *arg)
180 struct rtnl_class *filter;
182 filter = rtnl_class_alloc();
186 rtnl_class_set_parent(filter, class->c_handle);
187 rtnl_class_set_ifindex(filter, class->c_ifindex);
188 rtnl_class_set_kind(filter, class->c_kind);
191 rtnl_class_put(filter);
203 void (*cb)(
struct nl_object *,
void *),
void *arg)
205 struct rtnl_cls *filter;
207 filter = rtnl_cls_alloc();
211 rtnl_cls_set_ifindex(filter, class->c_ifindex);
212 rtnl_cls_set_parent(filter, class->c_parent);
215 rtnl_cls_put(filter);
226 void rtnl_class_set_ifindex(
struct rtnl_class *
class,
int ifindex)
228 tca_set_ifindex((
struct rtnl_tca *)
class, ifindex);
231 int rtnl_class_get_ifindex(
struct rtnl_class *
class)
233 return tca_get_ifindex((
struct rtnl_tca *)
class);
236 void rtnl_class_set_handle(
struct rtnl_class *
class, uint32_t handle)
238 tca_set_handle((
struct rtnl_tca *)
class, handle);
241 uint32_t rtnl_class_get_handle(
struct rtnl_class *
class)
243 return tca_get_handle((
struct rtnl_tca *)
class);
246 void rtnl_class_set_parent(
struct rtnl_class *
class, uint32_t parent)
248 tca_set_parent((
struct rtnl_tca *)
class, parent);
251 uint32_t rtnl_class_get_parent(
struct rtnl_class *
class)
253 return tca_get_parent((
struct rtnl_tca *)
class);
256 void rtnl_class_set_kind(
struct rtnl_class *
class,
const char *name)
258 tca_set_kind((
struct rtnl_tca *)
class, name);
259 class->c_ops = __rtnl_class_lookup_ops(name);
262 char *rtnl_class_get_kind(
struct rtnl_class *
class)
264 return tca_get_kind((
struct rtnl_tca *)
class);
267 uint64_t rtnl_class_get_stat(
struct rtnl_class *
class,
270 return tca_get_stat((
struct rtnl_tca *)
class,
id);
277 .oo_size =
sizeof(
struct rtnl_class),
278 .oo_free_data = class_free_data,
279 .oo_clone = class_clone,
283 .oo_compare = tca_compare,
284 .oo_id_attrs = (TCA_ATTR_IFINDEX | TCA_ATTR_HANDLE),
Dump object in a brief one-liner.
struct rtnl_qdisc * rtnl_qdisc_get_by_parent(struct nl_cache *cache, int ifindex, uint32_t parent)
Look up qdisc by its parent in the provided cache.
struct rtnl_qdisc * rtnl_class_leaf_qdisc(struct rtnl_class *class, struct nl_cache *cache)
Lookup the leaf qdisc of a class.
int(* co_clone)(struct rtnl_class *, struct rtnl_class *)
Called whenever a class object needs to be cloned.
int(* co_dump[NL_DUMP_MAX+1])(struct rtnl_class *, struct nl_dump_params *, int)
Dump callbacks.
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
struct rtnl_class_ops * rtnl_class_lookup_ops(struct rtnl_class *class)
Lookup class operations for a class object.
void rtnl_class_foreach_child(struct rtnl_class *class, struct nl_cache *cache, void(*cb)(struct nl_object *, void *), void *arg)
Call a callback for each child of a class.
void nl_cache_foreach_filter(struct nl_cache *cache, struct nl_object *filter, void(*cb)(struct nl_object *, void *), void *arg)
Call a callback on each element of the cache (filtered).
char * rtnl_tc_handle2str(uint32_t handle, char *buf, size_t len)
Convert a traffic control handle to a character string (Reentrant).
rtnl_tc_stats_id
TC statistics identifiers.
void nl_object_put(struct nl_object *obj)
Release a reference from an object.
void(* co_free_data)(struct rtnl_class *)
Called before a class object gets destroyed.
char * oo_name
Unique name of object type.
Dump all attributes but no statistics.
Dump all attributes including statistics.
void rtnl_class_foreach_cls(struct rtnl_class *class, struct nl_cache *cache, void(*cb)(struct nl_object *, void *), void *arg)
Call a callback for each classifier attached to the class.