8#include <netlink/netlink.h>
9#include <netlink/utils.h>
10#include <netlink/route/qdisc.h>
11#include <netlink/route/class.h>
12#include <netlink/route/link.h>
13#include <netlink/route/qdisc/cbq.h>
14#include <netlink/route/cls/police.h>
19 struct tc_cbq_lssopt cbq_lss;
20 struct tc_ratespec cbq_rate;
21 struct tc_cbq_wrropt cbq_wrr;
22 struct tc_cbq_ovl cbq_ovl;
23 struct tc_cbq_fopt cbq_fopt;
24 struct tc_cbq_police cbq_police;
34static const struct trans_tbl ovl_strategies[] = {
35 __ADD(TC_CBQ_OVL_CLASSIC,classic),
36 __ADD(TC_CBQ_OVL_DELAY,delay),
37 __ADD(TC_CBQ_OVL_LOWPRIO,lowprio),
38 __ADD(TC_CBQ_OVL_DROP,drop),
39 __ADD(TC_CBQ_OVL_RCLASSIC,rclassic),
54 return __type2str(type, buf, len, ovl_strategies,
55 ARRAY_SIZE(ovl_strategies));
67 return __str2type(name, ovl_strategies, ARRAY_SIZE(ovl_strategies));
70static struct nla_policy cbq_policy[TCA_CBQ_MAX+1] = {
71 [TCA_CBQ_LSSOPT] = { .
minlen =
sizeof(
struct tc_cbq_lssopt) },
72 [TCA_CBQ_RATE] = { .minlen =
sizeof(
struct tc_ratespec) },
73 [TCA_CBQ_WRROPT] = { .minlen =
sizeof(
struct tc_cbq_wrropt) },
74 [TCA_CBQ_OVL_STRATEGY] = { .minlen =
sizeof(
struct tc_cbq_ovl) },
75 [TCA_CBQ_FOPT] = { .minlen =
sizeof(
struct tc_cbq_fopt) },
76 [TCA_CBQ_POLICE] = { .minlen =
sizeof(
struct tc_cbq_police) },
79static int cbq_msg_parser(
struct rtnl_tc *tc,
void *data)
81 struct nlattr *tb[TCA_CBQ_MAX + 1];
85 err = tca_parse(tb, TCA_CBQ_MAX, tc, cbq_policy);
89 nla_memcpy(&cbq->cbq_lss, tb[TCA_CBQ_LSSOPT],
sizeof(cbq->cbq_lss));
90 nla_memcpy(&cbq->cbq_rate, tb[TCA_CBQ_RATE],
sizeof(cbq->cbq_rate));
91 nla_memcpy(&cbq->cbq_wrr, tb[TCA_CBQ_WRROPT],
sizeof(cbq->cbq_wrr));
92 nla_memcpy(&cbq->cbq_fopt, tb[TCA_CBQ_FOPT],
sizeof(cbq->cbq_fopt));
93 nla_memcpy(&cbq->cbq_ovl, tb[TCA_CBQ_OVL_STRATEGY],
94 sizeof(cbq->cbq_ovl));
95 nla_memcpy(&cbq->cbq_police, tb[TCA_CBQ_POLICE],
96 sizeof(cbq->cbq_police));
101static void cbq_dump_line(
struct rtnl_tc *tc,
void *data,
114 nl_dump(p,
" rate %.2f%s/s (%.0f%s) prio %u",
115 r, ru, rbit, rubit, cbq->cbq_wrr.priority);
118static void cbq_dump_details(
struct rtnl_tc *tc,
void *data,
131 nl_dump(p,
"avgpkt %u mpu %u cell %u allot %u weight %.0f%s\n",
134 1 << cbq->cbq_rate.cell_log,
135 cbq->cbq_wrr.allot, w, unit);
137 el = cbq->cbq_lss.ewma_log;
138 nl_dump_line(p,
" minidle %uus maxidle %uus offtime "
139 "%uus level %u ewma_log %u\n",
144 cbq->cbq_lss.ewma_log);
146 nl_dump_line(p,
" penalty %uus strategy %s ",
150 nl_dump(p,
"split %s defmap 0x%08x ",
152 cbq->cbq_fopt.defmap);
155 nl_police2str(cbq->cbq_police.police, buf,
sizeof(buf)));
158static void cbq_dump_stats(
struct rtnl_tc *tc,
void *data,
161 struct tc_cbq_xstats *x;
163 if (!(x = tca_xstats(tc)))
166 nl_dump_line(p,
" borrows overact "
167 " avgidle undertime\n");
168 nl_dump_line(p,
" %10u %10u %10u %10u\n",
169 x->borrows, x->overactions, x->avgidle, x->undertime);
172static struct rtnl_tc_ops cbq_qdisc_ops = {
174 .to_type = RTNL_TC_TYPE_QDISC,
176 .to_msg_parser = cbq_msg_parser,
184static struct rtnl_tc_ops cbq_class_ops = {
186 .to_type = RTNL_TC_TYPE_CLASS,
188 .to_msg_parser = cbq_msg_parser,
196static void _nl_init cbq_init(
void)
202static void _nl_exit cbq_exit(
void)
int nla_memcpy(void *dest, const struct nlattr *src, int count)
Copy attribute payload to 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).
int nl_str2ovl_strategy(const char *name)
Convert a string to a CBQ OVL strategy.
char * nl_ovl_strategy2str(int type, char *buf, size_t len)
Convert a CBQ OVL strategy to a character string.
int rtnl_tc_register(struct rtnl_tc_ops *)
Register a traffic control module.
void rtnl_tc_unregister(struct rtnl_tc_ops *)
Unregister a traffic control module.
double nl_cancel_down_bits(unsigned long long l, char **unit)
Cancel down a bit counter.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
double nl_cancel_down_bytes(unsigned long long l, char **unit)
Cancel down a byte counter.
uint32_t nl_ticks2us(uint32_t ticks)
Convert ticks to micro seconds.
@ NL_DUMP_STATS
Dump all attributes including statistics.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.
Attribute validation policy.
uint16_t minlen
Minimal length of payload required.