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