1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2013 Cong Wang <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup qdisc
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup qdisc_fq_codel Fair Queue CoDel
9*4dc78e53SAndroid Build Coastguard Worker * @brief
10*4dc78e53SAndroid Build Coastguard Worker *
11*4dc78e53SAndroid Build Coastguard Worker * @{
12*4dc78e53SAndroid Build Coastguard Worker */
13*4dc78e53SAndroid Build Coastguard Worker
14*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/qdisc.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/qdisc/fq_codel.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker #include "tc-api.h"
22*4dc78e53SAndroid Build Coastguard Worker
23*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
24*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel {
25*4dc78e53SAndroid Build Coastguard Worker int fq_limit;
26*4dc78e53SAndroid Build Coastguard Worker uint32_t fq_target;
27*4dc78e53SAndroid Build Coastguard Worker uint32_t fq_interval;
28*4dc78e53SAndroid Build Coastguard Worker int fq_flows;
29*4dc78e53SAndroid Build Coastguard Worker uint32_t fq_quantum;
30*4dc78e53SAndroid Build Coastguard Worker int fq_ecn;
31*4dc78e53SAndroid Build Coastguard Worker uint32_t fq_mask;
32*4dc78e53SAndroid Build Coastguard Worker };
33*4dc78e53SAndroid Build Coastguard Worker
34*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_TARGET 0x1
35*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_LIMIT 0x2
36*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_INTERVAL 0x4
37*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_FLOWS 0x8
38*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_QUANTUM 0x10
39*4dc78e53SAndroid Build Coastguard Worker #define SCH_FQ_CODEL_ATTR_ECN 0x20
40*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
41*4dc78e53SAndroid Build Coastguard Worker
42*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy fq_codel_policy[TCA_FQ_CODEL_MAX + 1] = {
43*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_TARGET] = { .type = NLA_U32 },
44*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_LIMIT] = { .type = NLA_U32 },
45*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_INTERVAL] = { .type = NLA_U32 },
46*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_ECN] = { .type = NLA_U32 },
47*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_FLOWS] = { .type = NLA_U32 },
48*4dc78e53SAndroid Build Coastguard Worker [TCA_FQ_CODEL_QUANTUM] = { .type = NLA_U32 },
49*4dc78e53SAndroid Build Coastguard Worker };
50*4dc78e53SAndroid Build Coastguard Worker
fq_codel_msg_parser(struct rtnl_tc * tc,void * data)51*4dc78e53SAndroid Build Coastguard Worker static int fq_codel_msg_parser(struct rtnl_tc *tc, void *data)
52*4dc78e53SAndroid Build Coastguard Worker {
53*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel = data;
54*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[TCA_FQ_CODEL_MAX + 1];
55*4dc78e53SAndroid Build Coastguard Worker int err;
56*4dc78e53SAndroid Build Coastguard Worker
57*4dc78e53SAndroid Build Coastguard Worker err = tca_parse(tb, TCA_FQ_CODEL_MAX, tc, fq_codel_policy);
58*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
59*4dc78e53SAndroid Build Coastguard Worker return err;
60*4dc78e53SAndroid Build Coastguard Worker
61*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_TARGET]) {
62*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_target = nla_get_u32(tb[TCA_FQ_CODEL_TARGET]);
63*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_TARGET;
64*4dc78e53SAndroid Build Coastguard Worker }
65*4dc78e53SAndroid Build Coastguard Worker
66*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_INTERVAL]) {
67*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_interval = nla_get_u32(tb[TCA_FQ_CODEL_INTERVAL]);
68*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_INTERVAL;
69*4dc78e53SAndroid Build Coastguard Worker }
70*4dc78e53SAndroid Build Coastguard Worker
71*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_LIMIT]) {
72*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_limit = nla_get_u32(tb[TCA_FQ_CODEL_LIMIT]);
73*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_LIMIT;
74*4dc78e53SAndroid Build Coastguard Worker }
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_QUANTUM]) {
77*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_quantum = nla_get_u32(tb[TCA_FQ_CODEL_QUANTUM]);
78*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_QUANTUM;
79*4dc78e53SAndroid Build Coastguard Worker }
80*4dc78e53SAndroid Build Coastguard Worker
81*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_FLOWS]) {
82*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_flows = nla_get_u32(tb[TCA_FQ_CODEL_FLOWS]);
83*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_FLOWS;
84*4dc78e53SAndroid Build Coastguard Worker }
85*4dc78e53SAndroid Build Coastguard Worker
86*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_FQ_CODEL_ECN]) {
87*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_ecn = nla_get_u32(tb[TCA_FQ_CODEL_ECN]);
88*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_ECN;
89*4dc78e53SAndroid Build Coastguard Worker }
90*4dc78e53SAndroid Build Coastguard Worker
91*4dc78e53SAndroid Build Coastguard Worker return 0;
92*4dc78e53SAndroid Build Coastguard Worker }
93*4dc78e53SAndroid Build Coastguard Worker
fq_codel_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)94*4dc78e53SAndroid Build Coastguard Worker static void fq_codel_dump_line(struct rtnl_tc *tc, void *data,
95*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
96*4dc78e53SAndroid Build Coastguard Worker {
97*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel = data;
98*4dc78e53SAndroid Build Coastguard Worker
99*4dc78e53SAndroid Build Coastguard Worker if (!fq_codel)
100*4dc78e53SAndroid Build Coastguard Worker return;
101*4dc78e53SAndroid Build Coastguard Worker
102*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_LIMIT)
103*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " limit %u packets", fq_codel->fq_limit);
104*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_TARGET)
105*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " target %u", fq_codel->fq_target);
106*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_INTERVAL)
107*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " interval %u", fq_codel->fq_interval);
108*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_ECN)
109*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " ecn %u", fq_codel->fq_ecn);
110*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_FLOWS)
111*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " flows %u", fq_codel->fq_flows);
112*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_QUANTUM)
113*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " quantum %u", fq_codel->fq_quantum);
114*4dc78e53SAndroid Build Coastguard Worker }
115*4dc78e53SAndroid Build Coastguard Worker
fq_codel_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)116*4dc78e53SAndroid Build Coastguard Worker static int fq_codel_msg_fill(struct rtnl_tc *tc, void *data, struct nl_msg *msg)
117*4dc78e53SAndroid Build Coastguard Worker {
118*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel = data;
119*4dc78e53SAndroid Build Coastguard Worker
120*4dc78e53SAndroid Build Coastguard Worker if (!fq_codel)
121*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
122*4dc78e53SAndroid Build Coastguard Worker
123*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_LIMIT)
124*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_LIMIT, fq_codel->fq_limit);
125*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_INTERVAL)
126*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_INTERVAL, fq_codel->fq_interval);
127*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_TARGET)
128*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_TARGET, fq_codel->fq_target);
129*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_QUANTUM)
130*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_QUANTUM, fq_codel->fq_quantum);
131*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_FLOWS)
132*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_FLOWS, fq_codel->fq_flows);
133*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_ECN)
134*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_FQ_CODEL_ECN, fq_codel->fq_ecn);
135*4dc78e53SAndroid Build Coastguard Worker return 0;
136*4dc78e53SAndroid Build Coastguard Worker
137*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
138*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
139*4dc78e53SAndroid Build Coastguard Worker
140*4dc78e53SAndroid Build Coastguard Worker }
141*4dc78e53SAndroid Build Coastguard Worker
142*4dc78e53SAndroid Build Coastguard Worker /**
143*4dc78e53SAndroid Build Coastguard Worker * @name Attribute Modification
144*4dc78e53SAndroid Build Coastguard Worker * @{
145*4dc78e53SAndroid Build Coastguard Worker */
146*4dc78e53SAndroid Build Coastguard Worker
147*4dc78e53SAndroid Build Coastguard Worker /**
148*4dc78e53SAndroid Build Coastguard Worker * Set limit of fq_codel qdisc.
149*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
150*4dc78e53SAndroid Build Coastguard Worker * @arg limit New limit.
151*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
152*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_limit(struct rtnl_qdisc * qdisc,int limit)153*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_limit(struct rtnl_qdisc *qdisc, int limit)
154*4dc78e53SAndroid Build Coastguard Worker {
155*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
156*4dc78e53SAndroid Build Coastguard Worker
157*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
158*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
159*4dc78e53SAndroid Build Coastguard Worker
160*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_limit = limit;
161*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_LIMIT;
162*4dc78e53SAndroid Build Coastguard Worker
163*4dc78e53SAndroid Build Coastguard Worker return 0;
164*4dc78e53SAndroid Build Coastguard Worker }
165*4dc78e53SAndroid Build Coastguard Worker
166*4dc78e53SAndroid Build Coastguard Worker /**
167*4dc78e53SAndroid Build Coastguard Worker * Get limit of a fq_codel qdisc.
168*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
169*4dc78e53SAndroid Build Coastguard Worker * @return Numeric limit or a negative error code.
170*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_limit(struct rtnl_qdisc * qdisc)171*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_get_limit(struct rtnl_qdisc *qdisc)
172*4dc78e53SAndroid Build Coastguard Worker {
173*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
174*4dc78e53SAndroid Build Coastguard Worker
175*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
176*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
177*4dc78e53SAndroid Build Coastguard Worker
178*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_LIMIT)
179*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_limit;
180*4dc78e53SAndroid Build Coastguard Worker else
181*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
182*4dc78e53SAndroid Build Coastguard Worker }
183*4dc78e53SAndroid Build Coastguard Worker
184*4dc78e53SAndroid Build Coastguard Worker /**
185*4dc78e53SAndroid Build Coastguard Worker * Set target of fq_codel qdisc.
186*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
187*4dc78e53SAndroid Build Coastguard Worker * @arg target New target.
188*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
189*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_target(struct rtnl_qdisc * qdisc,uint32_t target)190*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_target(struct rtnl_qdisc *qdisc, uint32_t target)
191*4dc78e53SAndroid Build Coastguard Worker {
192*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
193*4dc78e53SAndroid Build Coastguard Worker
194*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
195*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
196*4dc78e53SAndroid Build Coastguard Worker
197*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_target = target;
198*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_TARGET;
199*4dc78e53SAndroid Build Coastguard Worker
200*4dc78e53SAndroid Build Coastguard Worker return 0;
201*4dc78e53SAndroid Build Coastguard Worker }
202*4dc78e53SAndroid Build Coastguard Worker
203*4dc78e53SAndroid Build Coastguard Worker /**
204*4dc78e53SAndroid Build Coastguard Worker * Get target of a fq_codel qdisc.
205*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
206*4dc78e53SAndroid Build Coastguard Worker * @return Numeric target or zero.
207*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_target(struct rtnl_qdisc * qdisc)208*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_qdisc_fq_codel_get_target(struct rtnl_qdisc *qdisc)
209*4dc78e53SAndroid Build Coastguard Worker {
210*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
211*4dc78e53SAndroid Build Coastguard Worker
212*4dc78e53SAndroid Build Coastguard Worker if ((fq_codel = rtnl_tc_data(TC_CAST(qdisc))) &&
213*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_TARGET)
214*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_target;
215*4dc78e53SAndroid Build Coastguard Worker else
216*4dc78e53SAndroid Build Coastguard Worker return 0;
217*4dc78e53SAndroid Build Coastguard Worker }
218*4dc78e53SAndroid Build Coastguard Worker
219*4dc78e53SAndroid Build Coastguard Worker /**
220*4dc78e53SAndroid Build Coastguard Worker * Set interval of fq_codel qdisc.
221*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
222*4dc78e53SAndroid Build Coastguard Worker * @arg interval New interval.
223*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
224*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_interval(struct rtnl_qdisc * qdisc,uint32_t interval)225*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_interval(struct rtnl_qdisc *qdisc, uint32_t interval)
226*4dc78e53SAndroid Build Coastguard Worker {
227*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
228*4dc78e53SAndroid Build Coastguard Worker
229*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
230*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
231*4dc78e53SAndroid Build Coastguard Worker
232*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_interval = interval;
233*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_INTERVAL;
234*4dc78e53SAndroid Build Coastguard Worker
235*4dc78e53SAndroid Build Coastguard Worker return 0;
236*4dc78e53SAndroid Build Coastguard Worker }
237*4dc78e53SAndroid Build Coastguard Worker
238*4dc78e53SAndroid Build Coastguard Worker /**
239*4dc78e53SAndroid Build Coastguard Worker * Get target of a fq_codel qdisc.
240*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
241*4dc78e53SAndroid Build Coastguard Worker * @return Numeric interval or zero.
242*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_interval(struct rtnl_qdisc * qdisc)243*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_qdisc_fq_codel_get_interval(struct rtnl_qdisc *qdisc)
244*4dc78e53SAndroid Build Coastguard Worker {
245*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
246*4dc78e53SAndroid Build Coastguard Worker
247*4dc78e53SAndroid Build Coastguard Worker if ((fq_codel = rtnl_tc_data(TC_CAST(qdisc))) &&
248*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_INTERVAL)
249*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_interval;
250*4dc78e53SAndroid Build Coastguard Worker else
251*4dc78e53SAndroid Build Coastguard Worker return 0;
252*4dc78e53SAndroid Build Coastguard Worker }
253*4dc78e53SAndroid Build Coastguard Worker
254*4dc78e53SAndroid Build Coastguard Worker /**
255*4dc78e53SAndroid Build Coastguard Worker * Set quantum of fq_codel qdisc.
256*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
257*4dc78e53SAndroid Build Coastguard Worker * @arg quantum New quantum.
258*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
259*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_quantum(struct rtnl_qdisc * qdisc,uint32_t quantum)260*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_quantum(struct rtnl_qdisc *qdisc, uint32_t quantum)
261*4dc78e53SAndroid Build Coastguard Worker {
262*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
263*4dc78e53SAndroid Build Coastguard Worker
264*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
265*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_quantum = quantum;
268*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_QUANTUM;
269*4dc78e53SAndroid Build Coastguard Worker
270*4dc78e53SAndroid Build Coastguard Worker return 0;
271*4dc78e53SAndroid Build Coastguard Worker }
272*4dc78e53SAndroid Build Coastguard Worker
273*4dc78e53SAndroid Build Coastguard Worker /**
274*4dc78e53SAndroid Build Coastguard Worker * Get quantum of a fq_codel qdisc.
275*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
276*4dc78e53SAndroid Build Coastguard Worker * @return Numeric quantum or zero.
277*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_quantum(struct rtnl_qdisc * qdisc)278*4dc78e53SAndroid Build Coastguard Worker uint32_t rtnl_qdisc_fq_codel_get_quantum(struct rtnl_qdisc *qdisc)
279*4dc78e53SAndroid Build Coastguard Worker {
280*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard Worker if ((fq_codel = rtnl_tc_data(TC_CAST(qdisc))) &&
283*4dc78e53SAndroid Build Coastguard Worker (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_QUANTUM))
284*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_quantum;
285*4dc78e53SAndroid Build Coastguard Worker else
286*4dc78e53SAndroid Build Coastguard Worker return 0;
287*4dc78e53SAndroid Build Coastguard Worker }
288*4dc78e53SAndroid Build Coastguard Worker
289*4dc78e53SAndroid Build Coastguard Worker /**
290*4dc78e53SAndroid Build Coastguard Worker * Set flows of fq_codel qdisc.
291*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
292*4dc78e53SAndroid Build Coastguard Worker * @arg flows New flows value.
293*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
294*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_flows(struct rtnl_qdisc * qdisc,int flows)295*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_flows(struct rtnl_qdisc *qdisc, int flows)
296*4dc78e53SAndroid Build Coastguard Worker {
297*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
300*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
301*4dc78e53SAndroid Build Coastguard Worker
302*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_flows = flows;
303*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_FLOWS;
304*4dc78e53SAndroid Build Coastguard Worker
305*4dc78e53SAndroid Build Coastguard Worker return 0;
306*4dc78e53SAndroid Build Coastguard Worker }
307*4dc78e53SAndroid Build Coastguard Worker
308*4dc78e53SAndroid Build Coastguard Worker /**
309*4dc78e53SAndroid Build Coastguard Worker * Get flows of a fq_codel qdisc.
310*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
311*4dc78e53SAndroid Build Coastguard Worker * @return Numeric flows or a negative error code.
312*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_flows(struct rtnl_qdisc * qdisc)313*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_get_flows(struct rtnl_qdisc *qdisc)
314*4dc78e53SAndroid Build Coastguard Worker {
315*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
316*4dc78e53SAndroid Build Coastguard Worker
317*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
318*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
319*4dc78e53SAndroid Build Coastguard Worker
320*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_FLOWS)
321*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_flows;
322*4dc78e53SAndroid Build Coastguard Worker else
323*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
324*4dc78e53SAndroid Build Coastguard Worker }
325*4dc78e53SAndroid Build Coastguard Worker /**
326*4dc78e53SAndroid Build Coastguard Worker * Set ecn of fq_codel qdisc.
327*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc to be modified.
328*4dc78e53SAndroid Build Coastguard Worker * @arg ecn New ecn value.
329*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
330*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_set_ecn(struct rtnl_qdisc * qdisc,int ecn)331*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_set_ecn(struct rtnl_qdisc *qdisc, int ecn)
332*4dc78e53SAndroid Build Coastguard Worker {
333*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
334*4dc78e53SAndroid Build Coastguard Worker
335*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
336*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
337*4dc78e53SAndroid Build Coastguard Worker
338*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_ecn = ecn;
339*4dc78e53SAndroid Build Coastguard Worker fq_codel->fq_mask |= SCH_FQ_CODEL_ATTR_ECN;
340*4dc78e53SAndroid Build Coastguard Worker
341*4dc78e53SAndroid Build Coastguard Worker return 0;
342*4dc78e53SAndroid Build Coastguard Worker }
343*4dc78e53SAndroid Build Coastguard Worker
344*4dc78e53SAndroid Build Coastguard Worker /**
345*4dc78e53SAndroid Build Coastguard Worker * Get ecn of a fq_codel qdisc.
346*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc fq_codel qdisc.
347*4dc78e53SAndroid Build Coastguard Worker * @return Numeric ecn or a negative error code.
348*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_fq_codel_get_ecn(struct rtnl_qdisc * qdisc)349*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_fq_codel_get_ecn(struct rtnl_qdisc *qdisc)
350*4dc78e53SAndroid Build Coastguard Worker {
351*4dc78e53SAndroid Build Coastguard Worker struct rtnl_fq_codel *fq_codel;
352*4dc78e53SAndroid Build Coastguard Worker
353*4dc78e53SAndroid Build Coastguard Worker if (!(fq_codel = rtnl_tc_data(TC_CAST(qdisc))))
354*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
355*4dc78e53SAndroid Build Coastguard Worker
356*4dc78e53SAndroid Build Coastguard Worker if (fq_codel->fq_mask & SCH_FQ_CODEL_ATTR_ECN)
357*4dc78e53SAndroid Build Coastguard Worker return fq_codel->fq_ecn;
358*4dc78e53SAndroid Build Coastguard Worker else
359*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
360*4dc78e53SAndroid Build Coastguard Worker }
361*4dc78e53SAndroid Build Coastguard Worker /** @} */
362*4dc78e53SAndroid Build Coastguard Worker
363*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops fq_codel_ops = {
364*4dc78e53SAndroid Build Coastguard Worker .to_kind = "fq_codel",
365*4dc78e53SAndroid Build Coastguard Worker .to_type = RTNL_TC_TYPE_QDISC,
366*4dc78e53SAndroid Build Coastguard Worker .to_size = sizeof(struct rtnl_fq_codel),
367*4dc78e53SAndroid Build Coastguard Worker .to_msg_parser = fq_codel_msg_parser,
368*4dc78e53SAndroid Build Coastguard Worker .to_dump[NL_DUMP_LINE] = fq_codel_dump_line,
369*4dc78e53SAndroid Build Coastguard Worker .to_msg_fill = fq_codel_msg_fill,
370*4dc78e53SAndroid Build Coastguard Worker };
371*4dc78e53SAndroid Build Coastguard Worker
fq_codel_init(void)372*4dc78e53SAndroid Build Coastguard Worker static void _nl_init fq_codel_init(void)
373*4dc78e53SAndroid Build Coastguard Worker {
374*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_register(&fq_codel_ops);
375*4dc78e53SAndroid Build Coastguard Worker }
376*4dc78e53SAndroid Build Coastguard Worker
fq_codel_exit(void)377*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit fq_codel_exit(void)
378*4dc78e53SAndroid Build Coastguard Worker {
379*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_unregister(&fq_codel_ops);
380*4dc78e53SAndroid Build Coastguard Worker }
381*4dc78e53SAndroid Build Coastguard Worker
382*4dc78e53SAndroid Build Coastguard Worker /** @} */
383