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),