144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/route/qdisc_obj.c            Queueing Discipline Object
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @ingroup qdisc
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @defgroup qdisc_obj Queueing Discipline Object
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-local.h>
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-tc.h>
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h>
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h>
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/link.h>
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/tc.h>
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/qdisc.h>
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/class.h>
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/classifier.h>
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/qdisc-modules.h>
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf
2944d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void qdisc_free_data(struct nl_object *obj)
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *qdisc = (struct rtnl_qdisc *) obj;
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *qops;
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf	tca_free_data((struct rtnl_tca *) qdisc);
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf	qops = rtnl_qdisc_lookup_ops(qdisc);
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (qops && qops->qo_free_data)
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf		qops->qo_free_data(qdisc);
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf
4144d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic int qdisc_clone(struct nl_object *_dst, struct nl_object *_src)
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *dst = (struct rtnl_qdisc *) _dst;
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *src = (struct rtnl_qdisc *) _src;
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *qops;
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf	int err;
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf	err = tca_clone((struct rtnl_tca *) dst, (struct rtnl_tca *) src);
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (err < 0)
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout;
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf	qops = rtnl_qdisc_lookup_ops(src);
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (qops && qops->qo_clone)
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf		err = qops->qo_clone(dst, src);
5544d362409d5469aed47d19e7908d19bd194493aThomas Graferrout:
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf	return err;
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf
59d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void qdisc_dump_line(struct nl_object *obj, struct nl_dump_params *p)
6044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *qdisc = (struct rtnl_qdisc *) obj;
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *qops;
63d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf
64d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	tca_dump_line((struct rtnl_tca *) qdisc, "qdisc", p);
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf	qops = rtnl_qdisc_lookup_ops(qdisc);
67d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	if (qops && qops->qo_dump[NL_DUMP_LINE])
68d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		qops->qo_dump[NL_DUMP_LINE](qdisc, p);
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf
70d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf
73d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void qdisc_dump_details(struct nl_object *arg, struct nl_dump_params *p)
7444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *qdisc = (struct rtnl_qdisc *) arg;
7644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *qops;
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf
78d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	qdisc_dump_line(arg, p);
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf
80d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	tca_dump_details((struct rtnl_tca *) qdisc, p);
81d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "refcnt %u ", qdisc->q_info);
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf	qops = rtnl_qdisc_lookup_ops(qdisc);
84d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	if (qops && qops->qo_dump[NL_DUMP_DETAILS])
85d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		qops->qo_dump[NL_DUMP_DETAILS](qdisc, p);
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf
87d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf
90d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void qdisc_dump_stats(struct nl_object *arg, struct nl_dump_params *p)
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc *qdisc = (struct rtnl_qdisc *) arg;
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *qops;
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf
95d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	qdisc_dump_details(arg, p);
96d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	tca_dump_stats((struct rtnl_tca *) qdisc, p);
97d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	nl_dump(p, "\n");
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf	qops = rtnl_qdisc_lookup_ops(qdisc);
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (qops && qops->qo_dump[NL_DUMP_STATS])
101d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		qops->qo_dump[NL_DUMP_STATS](qdisc, p);
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
10344d362409d5469aed47d19e7908d19bd194493aThomas Graf
10444d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
10544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Allocation/Freeing
10644d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
10744d362409d5469aed47d19e7908d19bd194493aThomas Graf */
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf
10944d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_qdisc *rtnl_qdisc_alloc(void)
11044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf	return (struct rtnl_qdisc *) nl_object_alloc(&qdisc_obj_ops);
11244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf
11444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_put(struct rtnl_qdisc *qdisc)
11544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_object_put((struct nl_object *) qdisc);
11744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
11844d362409d5469aed47d19e7908d19bd194493aThomas Graf
11944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
12044d362409d5469aed47d19e7908d19bd194493aThomas Graf
12144d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
12244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Iterators
12344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf */
12544d362409d5469aed47d19e7908d19bd194493aThomas Graf
12644d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
12744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Call a callback for each child class of a qdisc
12844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg qdisc		the parent qdisc
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cache		a class cache including all classes of the interface
13044d362409d5469aed47d19e7908d19bd194493aThomas Graf *                      the specified qdisc is attached to
13144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cb              callback function
13244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg arg             argument to be passed to callback function
13344d362409d5469aed47d19e7908d19bd194493aThomas Graf */
13444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_foreach_child(struct rtnl_qdisc *qdisc, struct nl_cache *cache,
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf			      void (*cb)(struct nl_object *, void *), void *arg)
13644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
13744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_class *filter;
13844d362409d5469aed47d19e7908d19bd194493aThomas Graf
13944d362409d5469aed47d19e7908d19bd194493aThomas Graf	filter = rtnl_class_alloc();
14044d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!filter)
14144d362409d5469aed47d19e7908d19bd194493aThomas Graf		return;
14244d362409d5469aed47d19e7908d19bd194493aThomas Graf
14344d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_class_set_parent(filter, qdisc->q_handle);
14444d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_class_set_ifindex(filter, qdisc->q_ifindex);
14544d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_class_set_kind(filter, qdisc->q_kind);
14644d362409d5469aed47d19e7908d19bd194493aThomas Graf
14744d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_cache_foreach_filter(cache, (struct nl_object *) filter, cb, arg);
14844d362409d5469aed47d19e7908d19bd194493aThomas Graf
14944d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_class_put(filter);
15044d362409d5469aed47d19e7908d19bd194493aThomas Graf}
15144d362409d5469aed47d19e7908d19bd194493aThomas Graf
15244d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
15344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Call a callback for each filter attached to the qdisc
15444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg qdisc		the parent qdisc
15544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cache		a filter cache including at least all the filters
15644d362409d5469aed47d19e7908d19bd194493aThomas Graf *                      attached to the specified qdisc
15744d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cb              callback function
15844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg arg             argument to be passed to callback function
15944d362409d5469aed47d19e7908d19bd194493aThomas Graf */
16044d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_foreach_cls(struct rtnl_qdisc *qdisc, struct nl_cache *cache,
16144d362409d5469aed47d19e7908d19bd194493aThomas Graf			    void (*cb)(struct nl_object *, void *), void *arg)
16244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
16344d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_cls *filter;
16444d362409d5469aed47d19e7908d19bd194493aThomas Graf
16544d362409d5469aed47d19e7908d19bd194493aThomas Graf	filter = rtnl_cls_alloc();
16644d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!filter)
16744d362409d5469aed47d19e7908d19bd194493aThomas Graf		return;
16844d362409d5469aed47d19e7908d19bd194493aThomas Graf
16944d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_cls_set_ifindex(filter, qdisc->q_ifindex);
17044d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_cls_set_parent(filter, qdisc->q_parent);
17144d362409d5469aed47d19e7908d19bd194493aThomas Graf
17244d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_cache_foreach_filter(cache, (struct nl_object *) filter, cb, arg);
17344d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_cls_put(filter);
17444d362409d5469aed47d19e7908d19bd194493aThomas Graf}
17544d362409d5469aed47d19e7908d19bd194493aThomas Graf
17644d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
17744d362409d5469aed47d19e7908d19bd194493aThomas Graf
17844d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
17944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Attributes
18044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
18144d362409d5469aed47d19e7908d19bd194493aThomas Graf */
18244d362409d5469aed47d19e7908d19bd194493aThomas Graf
18344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_set_ifindex(struct rtnl_qdisc *qdisc, int ifindex)
18444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
18544d362409d5469aed47d19e7908d19bd194493aThomas Graf	tca_set_ifindex((struct rtnl_tca *) qdisc, ifindex);
18644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
18744d362409d5469aed47d19e7908d19bd194493aThomas Graf
18844d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_qdisc_get_ifindex(struct rtnl_qdisc *qdisc)
18944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
19044d362409d5469aed47d19e7908d19bd194493aThomas Graf	return tca_get_ifindex((struct rtnl_tca *) qdisc);
19144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
19244d362409d5469aed47d19e7908d19bd194493aThomas Graf
19344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_set_handle(struct rtnl_qdisc *qdisc, uint32_t handle)
19444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
19544d362409d5469aed47d19e7908d19bd194493aThomas Graf	tca_set_handle((struct rtnl_tca *) qdisc, handle);
19644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
19744d362409d5469aed47d19e7908d19bd194493aThomas Graf
19844d362409d5469aed47d19e7908d19bd194493aThomas Grafuint32_t rtnl_qdisc_get_handle(struct rtnl_qdisc *qdisc)
19944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
20044d362409d5469aed47d19e7908d19bd194493aThomas Graf	return tca_get_handle((struct rtnl_tca *) qdisc);
20144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
20244d362409d5469aed47d19e7908d19bd194493aThomas Graf
20344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_set_parent(struct rtnl_qdisc *qdisc, uint32_t parent)
20444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
20544d362409d5469aed47d19e7908d19bd194493aThomas Graf	tca_set_parent((struct rtnl_tca *) qdisc, parent);
20644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
20744d362409d5469aed47d19e7908d19bd194493aThomas Graf
20844d362409d5469aed47d19e7908d19bd194493aThomas Grafuint32_t rtnl_qdisc_get_parent(struct rtnl_qdisc *qdisc)
20944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
21044d362409d5469aed47d19e7908d19bd194493aThomas Graf	return tca_get_parent((struct rtnl_tca *) qdisc);
21144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
21244d362409d5469aed47d19e7908d19bd194493aThomas Graf
21344d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid rtnl_qdisc_set_kind(struct rtnl_qdisc *qdisc, const char *name)
21444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
21544d362409d5469aed47d19e7908d19bd194493aThomas Graf	tca_set_kind((struct rtnl_tca *) qdisc, name);
21644d362409d5469aed47d19e7908d19bd194493aThomas Graf	qdisc->q_ops = __rtnl_qdisc_lookup_ops(name);
21744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
21844d362409d5469aed47d19e7908d19bd194493aThomas Graf
21944d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *rtnl_qdisc_get_kind(struct rtnl_qdisc *qdisc)
22044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
22144d362409d5469aed47d19e7908d19bd194493aThomas Graf	return tca_get_kind((struct rtnl_tca *) qdisc);
22244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
22344d362409d5469aed47d19e7908d19bd194493aThomas Graf
22444d362409d5469aed47d19e7908d19bd194493aThomas Grafuint64_t rtnl_qdisc_get_stat(struct rtnl_qdisc *qdisc,
22544d362409d5469aed47d19e7908d19bd194493aThomas Graf			     enum rtnl_tc_stats_id id)
22644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
22744d362409d5469aed47d19e7908d19bd194493aThomas Graf	return tca_get_stat((struct rtnl_tca *) qdisc, id);
22844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
22944d362409d5469aed47d19e7908d19bd194493aThomas Graf
23044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
23144d362409d5469aed47d19e7908d19bd194493aThomas Graf
23244d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
23344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Qdisc Specific Options
23444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
23544d362409d5469aed47d19e7908d19bd194493aThomas Graf */
23644d362409d5469aed47d19e7908d19bd194493aThomas Graf
23744d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
23844d362409d5469aed47d19e7908d19bd194493aThomas Graf * Return qdisc specific options for use in TCA_OPTIONS
23944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg qdisc		qdisc carrying the optiosn
24044d362409d5469aed47d19e7908d19bd194493aThomas Graf *
24144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return new headerless netlink message carrying the options as payload
24244d362409d5469aed47d19e7908d19bd194493aThomas Graf */
24344d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_msg *rtnl_qdisc_get_opts(struct rtnl_qdisc *qdisc)
24444d362409d5469aed47d19e7908d19bd194493aThomas Graf{
24544d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_qdisc_ops *ops;
24644d362409d5469aed47d19e7908d19bd194493aThomas Graf
24744d362409d5469aed47d19e7908d19bd194493aThomas Graf	ops = rtnl_qdisc_lookup_ops(qdisc);
24844d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (ops && ops->qo_get_opts)
24944d362409d5469aed47d19e7908d19bd194493aThomas Graf		return ops->qo_get_opts(qdisc);
25044d362409d5469aed47d19e7908d19bd194493aThomas Graf
25144d362409d5469aed47d19e7908d19bd194493aThomas Graf	return NULL;
25244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
25344d362409d5469aed47d19e7908d19bd194493aThomas Graf
25444d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
25544d362409d5469aed47d19e7908d19bd194493aThomas Graf
25644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_object_ops qdisc_obj_ops = {
25744d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_name		= "route/qdisc",
25844d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_size		= sizeof(struct rtnl_qdisc),
25944d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_free_data		= qdisc_free_data,
26044d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_clone		= qdisc_clone,
261d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	.oo_dump = {
262d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_LINE]	= qdisc_dump_line,
263d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_DETAILS]	= qdisc_dump_details,
264d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	    [NL_DUMP_STATS]	= qdisc_dump_stats,
265d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf	},
26644d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_compare		= tca_compare,
26744d362409d5469aed47d19e7908d19bd194493aThomas Graf	.oo_id_attrs		= (TCA_ATTR_IFINDEX | TCA_ATTR_HANDLE),
26844d362409d5469aed47d19e7908d19bd194493aThomas Graf};
26944d362409d5469aed47d19e7908d19bd194493aThomas Graf
27044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
271