12 #include <netlink-local.h>
13 #include <netlink-tc.h>
14 #include <netlink/netlink.h>
15 #include <netlink/utils.h>
16 #include <netlink/route/qdisc.h>
17 #include <netlink/route/qdisc-modules.h>
18 #include <netlink/route/class.h>
19 #include <netlink/route/class-modules.h>
20 #include <netlink/route/link.h>
21 #include <netlink/route/sch/cbq.h>
22 #include <netlink/route/cls/police.h>
31 static struct trans_tbl ovl_strategies[] = {
32 __ADD(TC_CBQ_OVL_CLASSIC,classic)
33 __ADD(TC_CBQ_OVL_DELAY,delay)
34 __ADD(TC_CBQ_OVL_LOWPRIO,lowprio)
35 __ADD(TC_CBQ_OVL_DROP,drop)
36 __ADD(TC_CBQ_OVL_RCLASSIC,rclassic)
51 return __type2str(type, buf, len, ovl_strategies,
52 ARRAY_SIZE(ovl_strategies));
64 return __str2type(name, ovl_strategies, ARRAY_SIZE(ovl_strategies));
67 static struct nla_policy cbq_policy[TCA_CBQ_MAX+1] = {
68 [TCA_CBQ_LSSOPT] = { .
minlen =
sizeof(
struct tc_cbq_lssopt) },
69 [TCA_CBQ_RATE] = { .minlen =
sizeof(
struct tc_ratespec) },
70 [TCA_CBQ_WRROPT] = { .minlen =
sizeof(
struct tc_cbq_wrropt) },
71 [TCA_CBQ_OVL_STRATEGY] = { .minlen =
sizeof(
struct tc_cbq_ovl) },
72 [TCA_CBQ_FOPT] = { .minlen =
sizeof(
struct tc_cbq_fopt) },
73 [TCA_CBQ_POLICE] = { .minlen =
sizeof(
struct tc_cbq_police) },
76 static inline struct rtnl_cbq *cbq_qdisc(
struct rtnl_tca *tca)
78 return (
struct rtnl_cbq *) tca->tc_subdata;
81 static inline struct rtnl_cbq *cbq_alloc(
struct rtnl_tca *tca)
84 tca->tc_subdata = calloc(1,
sizeof(
struct rtnl_qdisc));
86 return cbq_qdisc(tca);
90 static int cbq_msg_parser(
struct rtnl_tca *tca)
92 struct nlattr *tb[TCA_CBQ_MAX + 1];
96 err = tca_parse(tb, TCA_CBQ_MAX, tca, cbq_policy);
100 cbq = cbq_alloc(tca);
102 return nl_errno(ENOMEM);
104 nla_memcpy(&cbq->cbq_lss, tb[TCA_CBQ_LSSOPT],
sizeof(cbq->cbq_lss));
105 nla_memcpy(&cbq->cbq_rate, tb[TCA_CBQ_RATE],
sizeof(cbq->cbq_rate));
106 nla_memcpy(&cbq->cbq_wrr, tb[TCA_CBQ_WRROPT],
sizeof(cbq->cbq_wrr));
107 nla_memcpy(&cbq->cbq_fopt, tb[TCA_CBQ_FOPT],
sizeof(cbq->cbq_fopt));
108 nla_memcpy(&cbq->cbq_ovl, tb[TCA_CBQ_OVL_STRATEGY],
109 sizeof(cbq->cbq_ovl));
110 nla_memcpy(&cbq->cbq_police, tb[TCA_CBQ_POLICE],
111 sizeof(cbq->cbq_police));
116 static int cbq_qdisc_msg_parser(
struct rtnl_qdisc *qdisc)
118 return cbq_msg_parser((
struct rtnl_tca *) qdisc);
121 static int cbq_class_msg_parser(
struct rtnl_class *
class)
123 return cbq_msg_parser((
struct rtnl_tca *)
class);
126 static void cbq_qdisc_free_data(
struct rtnl_qdisc *qdisc)
128 free(qdisc->q_subdata);
131 static int cbq_clone(
struct rtnl_tca *_dst,
struct rtnl_tca *_src)
133 struct rtnl_cbq *src = cbq_qdisc(_src);
135 if (src && !cbq_alloc(_dst))
136 return nl_errno(ENOMEM);
141 static int cbq_qdisc_clone(
struct rtnl_qdisc *dst,
struct rtnl_qdisc *src)
143 return cbq_clone((
struct rtnl_tca *) dst, (
struct rtnl_tca *) src);
146 static void cbq_class_free_data(
struct rtnl_class *
class)
148 free(class->c_subdata);
151 static int cbq_class_clone(
struct rtnl_class *dst,
struct rtnl_class *src)
153 return cbq_clone((
struct rtnl_tca *) dst, (
struct rtnl_tca *) src);
156 static int cbq_dump_brief(
struct rtnl_tca *tca,
struct nl_dump_params *p,
159 struct rtnl_cbq *cbq;
163 cbq = cbq_qdisc(tca);
170 dp_dump(p,
" rate %.2f%s/s (%.0f%s) prio %u",
171 r, ru, rbit, rubit, cbq->cbq_wrr.priority);
177 static int cbq_qdisc_dump_brief(
struct rtnl_qdisc *qdisc,
180 return cbq_dump_brief((
struct rtnl_tca *) qdisc, p, line);
183 static int cbq_class_dump_brief(
struct rtnl_class *
class,
186 return cbq_dump_brief((
struct rtnl_tca *)
class, p, line);
189 static int cbq_dump_full(
struct rtnl_tca *tca,
struct nl_dump_params *p,
192 struct rtnl_cbq *cbq;
197 cbq = cbq_qdisc(tca);
203 dp_dump(p,
"avgpkt %u mpu %u cell %u allot %u weight %.0f%s\n",
206 1 << cbq->cbq_rate.cell_log,
207 cbq->cbq_wrr.allot, w, unit);
209 el = cbq->cbq_lss.ewma_log;
210 dp_dump_line(p, line++,
" minidle %uus maxidle %uus offtime "
211 "%uus level %u ewma_log %u\n",
216 cbq->cbq_lss.ewma_log);
218 dp_dump_line(p, line++,
" penalty %uus strategy %s ",
222 dp_dump(p,
"split %s defmap 0x%08x ",
224 cbq->cbq_fopt.defmap);
226 dp_dump(p,
"police %s",
227 nl_police2str(cbq->cbq_police.police, buf,
sizeof(buf)));
233 static int cbq_qdisc_dump_full(
struct rtnl_qdisc *qdisc,
236 return cbq_dump_full((
struct rtnl_tca *) qdisc, p, line);
239 static int cbq_class_dump_full(
struct rtnl_class *
class,
242 return cbq_dump_full((
struct rtnl_tca *)
class, p, line);
245 static int cbq_dump_with_stats(
struct rtnl_tca *tca,
struct nl_dump_params *p,
248 struct tc_cbq_xstats *x = tca_xstats(tca);
253 dp_dump_line(p, line++,
" borrows overact "
254 " avgidle undertime\n");
255 dp_dump_line(p, line++,
" %10u %10u %10u %10u\n",
256 x->borrows, x->overactions, x->avgidle, x->undertime);
262 static int cbq_qdisc_dump_with_stats(
struct rtnl_qdisc *qdisc,
265 return cbq_dump_with_stats((
struct rtnl_tca *) qdisc, p, line);
268 static int cbq_class_dump_with_stats(
struct rtnl_class *
class,
271 return cbq_dump_with_stats((
struct rtnl_tca *)
class, p, line);
276 .qo_msg_parser = cbq_qdisc_msg_parser,
277 .qo_free_data = cbq_qdisc_free_data,
278 .qo_clone = cbq_qdisc_clone,
286 .co_msg_parser = cbq_class_msg_parser,
287 .co_free_data = cbq_class_free_data,
288 .co_clone = cbq_class_clone,
294 static void __init cbq_init(
void)
300 static void __exit cbq_exit(
void)
Dump object in a brief one-liner.
char qo_kind[32]
Kind/Name of Qdisc.
int rtnl_class_register(struct rtnl_class_ops *cops)
Register a class module.
attribute validation policy
double nl_cancel_down_bits(unsigned long long l, char **unit)
Cancel down a bit counter.
int rtnl_qdisc_unregister(struct rtnl_qdisc_ops *qops)
Unregister a qdisc module.
int nla_memcpy(void *dest, struct nlattr *src, int count)
Copy a netlink attribute into another memory area.
char * rtnl_tc_handle2str(uint32_t handle, char *buf, size_t len)
Convert a traffic control handle to a character string (Reentrant).
double nl_cancel_down_bytes(unsigned long long l, char **unit)
Cancel down a byte counter.
int rtnl_class_unregister(struct rtnl_class_ops *cops)
Unregister a class module.
uint32_t nl_ticks2us(uint32_t ticks)
Convert ticks to micro seconds.
int nl_str2ovl_strategy(const char *name)
Convert a string to a CBQ OVL strategy.
uint16_t minlen
Minimal length of payload required to be available.
int rtnl_qdisc_register(struct rtnl_qdisc_ops *qops)
Register a qdisc module.
Dump all attributes but no statistics.
Dump all attributes including statistics.
char * nl_ovl_strategy2str(int type, char *buf, size_t len)
Convert a CBQ OVL strategy to a character string.
char co_kind[32]
Kind/Name of class.