1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2011 Thomas Graf <[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 * @ingroup class
9*4dc78e53SAndroid Build Coastguard Worker * @defgroup qdisc_dsmark Differentiated Services Marker (DSMARK)
10*4dc78e53SAndroid Build Coastguard Worker * @{
11*4dc78e53SAndroid Build Coastguard Worker */
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/qdisc.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/class.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/qdisc/dsmark.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_dsmark_qdisc {
25*4dc78e53SAndroid Build Coastguard Worker uint16_t qdm_indices;
26*4dc78e53SAndroid Build Coastguard Worker uint16_t qdm_default_index;
27*4dc78e53SAndroid Build Coastguard Worker uint32_t qdm_set_tc_index;
28*4dc78e53SAndroid Build Coastguard Worker uint32_t qdm_mask;
29*4dc78e53SAndroid Build Coastguard Worker };
30*4dc78e53SAndroid Build Coastguard Worker
31*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class {
32*4dc78e53SAndroid Build Coastguard Worker uint8_t cdm_bmask;
33*4dc78e53SAndroid Build Coastguard Worker uint8_t cdm_value;
34*4dc78e53SAndroid Build Coastguard Worker uint32_t cdm_mask;
35*4dc78e53SAndroid Build Coastguard Worker };
36*4dc78e53SAndroid Build Coastguard Worker
37*4dc78e53SAndroid Build Coastguard Worker #define SCH_DSMARK_ATTR_INDICES 0x1
38*4dc78e53SAndroid Build Coastguard Worker #define SCH_DSMARK_ATTR_DEFAULT_INDEX 0x2
39*4dc78e53SAndroid Build Coastguard Worker #define SCH_DSMARK_ATTR_SET_TC_INDEX 0x4
40*4dc78e53SAndroid Build Coastguard Worker
41*4dc78e53SAndroid Build Coastguard Worker #define SCH_DSMARK_ATTR_MASK 0x1
42*4dc78e53SAndroid Build Coastguard Worker #define SCH_DSMARK_ATTR_VALUE 0x2
43*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
44*4dc78e53SAndroid Build Coastguard Worker
45*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy dsmark_policy[TCA_DSMARK_MAX+1] = {
46*4dc78e53SAndroid Build Coastguard Worker [TCA_DSMARK_INDICES] = { .type = NLA_U16 },
47*4dc78e53SAndroid Build Coastguard Worker [TCA_DSMARK_DEFAULT_INDEX] = { .type = NLA_U16 },
48*4dc78e53SAndroid Build Coastguard Worker [TCA_DSMARK_SET_TC_INDEX] = { .type = NLA_FLAG },
49*4dc78e53SAndroid Build Coastguard Worker [TCA_DSMARK_VALUE] = { .type = NLA_U8 },
50*4dc78e53SAndroid Build Coastguard Worker [TCA_DSMARK_MASK] = { .type = NLA_U8 },
51*4dc78e53SAndroid Build Coastguard Worker };
52*4dc78e53SAndroid Build Coastguard Worker
dsmark_qdisc_msg_parser(struct rtnl_tc * tc,void * data)53*4dc78e53SAndroid Build Coastguard Worker static int dsmark_qdisc_msg_parser(struct rtnl_tc *tc, void *data)
54*4dc78e53SAndroid Build Coastguard Worker {
55*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark = data;
56*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[TCA_DSMARK_MAX + 1];
57*4dc78e53SAndroid Build Coastguard Worker int err;
58*4dc78e53SAndroid Build Coastguard Worker
59*4dc78e53SAndroid Build Coastguard Worker err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
60*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
61*4dc78e53SAndroid Build Coastguard Worker return err;
62*4dc78e53SAndroid Build Coastguard Worker
63*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_DSMARK_INDICES]) {
64*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_indices = nla_get_u16(tb[TCA_DSMARK_INDICES]);
65*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
66*4dc78e53SAndroid Build Coastguard Worker }
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_DSMARK_DEFAULT_INDEX]) {
69*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_default_index =
70*4dc78e53SAndroid Build Coastguard Worker nla_get_u16(tb[TCA_DSMARK_DEFAULT_INDEX]);
71*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
72*4dc78e53SAndroid Build Coastguard Worker }
73*4dc78e53SAndroid Build Coastguard Worker
74*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_DSMARK_SET_TC_INDEX]) {
75*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_set_tc_index = 1;
76*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
77*4dc78e53SAndroid Build Coastguard Worker }
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Worker return 0;
80*4dc78e53SAndroid Build Coastguard Worker }
81*4dc78e53SAndroid Build Coastguard Worker
dsmark_class_msg_parser(struct rtnl_tc * tc,void * data)82*4dc78e53SAndroid Build Coastguard Worker static int dsmark_class_msg_parser(struct rtnl_tc *tc, void *data)
83*4dc78e53SAndroid Build Coastguard Worker {
84*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark = data;
85*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[TCA_DSMARK_MAX + 1];
86*4dc78e53SAndroid Build Coastguard Worker int err;
87*4dc78e53SAndroid Build Coastguard Worker
88*4dc78e53SAndroid Build Coastguard Worker err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
89*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
90*4dc78e53SAndroid Build Coastguard Worker return err;
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_DSMARK_MASK]) {
93*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_bmask = nla_get_u8(tb[TCA_DSMARK_MASK]);
94*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
95*4dc78e53SAndroid Build Coastguard Worker }
96*4dc78e53SAndroid Build Coastguard Worker
97*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_DSMARK_VALUE]) {
98*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_value = nla_get_u8(tb[TCA_DSMARK_VALUE]);
99*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
100*4dc78e53SAndroid Build Coastguard Worker }
101*4dc78e53SAndroid Build Coastguard Worker
102*4dc78e53SAndroid Build Coastguard Worker return 0;
103*4dc78e53SAndroid Build Coastguard Worker }
104*4dc78e53SAndroid Build Coastguard Worker
dsmark_qdisc_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)105*4dc78e53SAndroid Build Coastguard Worker static void dsmark_qdisc_dump_line(struct rtnl_tc *tc, void *data,
106*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
107*4dc78e53SAndroid Build Coastguard Worker {
108*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark = data;
109*4dc78e53SAndroid Build Coastguard Worker
110*4dc78e53SAndroid Build Coastguard Worker if (dsmark && (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES))
111*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " indices 0x%04x", dsmark->qdm_indices);
112*4dc78e53SAndroid Build Coastguard Worker }
113*4dc78e53SAndroid Build Coastguard Worker
dsmark_qdisc_dump_details(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)114*4dc78e53SAndroid Build Coastguard Worker static void dsmark_qdisc_dump_details(struct rtnl_tc *tc, void *data,
115*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
116*4dc78e53SAndroid Build Coastguard Worker {
117*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark = data;
118*4dc78e53SAndroid Build Coastguard Worker
119*4dc78e53SAndroid Build Coastguard Worker if (!dsmark)
120*4dc78e53SAndroid Build Coastguard Worker return;
121*4dc78e53SAndroid Build Coastguard Worker
122*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
123*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " default index 0x%04x", dsmark->qdm_default_index);
124*4dc78e53SAndroid Build Coastguard Worker
125*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
126*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " set-tc-index");
127*4dc78e53SAndroid Build Coastguard Worker }
128*4dc78e53SAndroid Build Coastguard Worker
dsmark_class_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)129*4dc78e53SAndroid Build Coastguard Worker static void dsmark_class_dump_line(struct rtnl_tc *tc, void *data,
130*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
131*4dc78e53SAndroid Build Coastguard Worker {
132*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark = data;
133*4dc78e53SAndroid Build Coastguard Worker
134*4dc78e53SAndroid Build Coastguard Worker if (!dsmark)
135*4dc78e53SAndroid Build Coastguard Worker return;
136*4dc78e53SAndroid Build Coastguard Worker
137*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
138*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " value 0x%02x", dsmark->cdm_value);
139*4dc78e53SAndroid Build Coastguard Worker
140*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
141*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " mask 0x%02x", dsmark->cdm_bmask);
142*4dc78e53SAndroid Build Coastguard Worker }
143*4dc78e53SAndroid Build Coastguard Worker
dsmark_qdisc_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)144*4dc78e53SAndroid Build Coastguard Worker static int dsmark_qdisc_msg_fill(struct rtnl_tc *tc, void *data,
145*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg)
146*4dc78e53SAndroid Build Coastguard Worker {
147*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark = data;
148*4dc78e53SAndroid Build Coastguard Worker
149*4dc78e53SAndroid Build Coastguard Worker if (!dsmark)
150*4dc78e53SAndroid Build Coastguard Worker return 0;
151*4dc78e53SAndroid Build Coastguard Worker
152*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
153*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U16(msg, TCA_DSMARK_INDICES, dsmark->qdm_indices);
154*4dc78e53SAndroid Build Coastguard Worker
155*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
156*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U16(msg, TCA_DSMARK_DEFAULT_INDEX,
157*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_default_index);
158*4dc78e53SAndroid Build Coastguard Worker
159*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
160*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_FLAG(msg, TCA_DSMARK_SET_TC_INDEX);
161*4dc78e53SAndroid Build Coastguard Worker
162*4dc78e53SAndroid Build Coastguard Worker return 0;
163*4dc78e53SAndroid Build Coastguard Worker
164*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
165*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
166*4dc78e53SAndroid Build Coastguard Worker }
167*4dc78e53SAndroid Build Coastguard Worker
dsmark_class_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)168*4dc78e53SAndroid Build Coastguard Worker static int dsmark_class_msg_fill(struct rtnl_tc *tc, void *data,
169*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg)
170*4dc78e53SAndroid Build Coastguard Worker {
171*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark = data;
172*4dc78e53SAndroid Build Coastguard Worker
173*4dc78e53SAndroid Build Coastguard Worker if (!dsmark)
174*4dc78e53SAndroid Build Coastguard Worker return 0;
175*4dc78e53SAndroid Build Coastguard Worker
176*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
177*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, TCA_DSMARK_MASK, dsmark->cdm_bmask);
178*4dc78e53SAndroid Build Coastguard Worker
179*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
180*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U8(msg, TCA_DSMARK_VALUE, dsmark->cdm_value);
181*4dc78e53SAndroid Build Coastguard Worker
182*4dc78e53SAndroid Build Coastguard Worker return 0;
183*4dc78e53SAndroid Build Coastguard Worker
184*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
185*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
186*4dc78e53SAndroid Build Coastguard Worker }
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker /**
189*4dc78e53SAndroid Build Coastguard Worker * @name Class Attribute Access
190*4dc78e53SAndroid Build Coastguard Worker * @{
191*4dc78e53SAndroid Build Coastguard Worker */
192*4dc78e53SAndroid Build Coastguard Worker
193*4dc78e53SAndroid Build Coastguard Worker /**
194*4dc78e53SAndroid Build Coastguard Worker * Set bitmask of DSMARK class.
195*4dc78e53SAndroid Build Coastguard Worker * @arg class DSMARK class to be modified.
196*4dc78e53SAndroid Build Coastguard Worker * @arg mask New bitmask.
197*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
198*4dc78e53SAndroid Build Coastguard Worker */
rtnl_class_dsmark_set_bitmask(struct rtnl_class * class,uint8_t mask)199*4dc78e53SAndroid Build Coastguard Worker int rtnl_class_dsmark_set_bitmask(struct rtnl_class *class, uint8_t mask)
200*4dc78e53SAndroid Build Coastguard Worker {
201*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark;
202*4dc78e53SAndroid Build Coastguard Worker
203*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(class))))
204*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
205*4dc78e53SAndroid Build Coastguard Worker
206*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_bmask = mask;
207*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
208*4dc78e53SAndroid Build Coastguard Worker
209*4dc78e53SAndroid Build Coastguard Worker return 0;
210*4dc78e53SAndroid Build Coastguard Worker }
211*4dc78e53SAndroid Build Coastguard Worker
212*4dc78e53SAndroid Build Coastguard Worker /**
213*4dc78e53SAndroid Build Coastguard Worker * Get bitmask of DSMARK class.
214*4dc78e53SAndroid Build Coastguard Worker * @arg class DSMARK class.
215*4dc78e53SAndroid Build Coastguard Worker * @return Bitmask or a negative error code.
216*4dc78e53SAndroid Build Coastguard Worker */
rtnl_class_dsmark_get_bitmask(struct rtnl_class * class)217*4dc78e53SAndroid Build Coastguard Worker int rtnl_class_dsmark_get_bitmask(struct rtnl_class *class)
218*4dc78e53SAndroid Build Coastguard Worker {
219*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark;
220*4dc78e53SAndroid Build Coastguard Worker
221*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(class))))
222*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
223*4dc78e53SAndroid Build Coastguard Worker
224*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
225*4dc78e53SAndroid Build Coastguard Worker return dsmark->cdm_bmask;
226*4dc78e53SAndroid Build Coastguard Worker else
227*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
228*4dc78e53SAndroid Build Coastguard Worker }
229*4dc78e53SAndroid Build Coastguard Worker
230*4dc78e53SAndroid Build Coastguard Worker /**
231*4dc78e53SAndroid Build Coastguard Worker * Set value of DSMARK class.
232*4dc78e53SAndroid Build Coastguard Worker * @arg class DSMARK class to be modified.
233*4dc78e53SAndroid Build Coastguard Worker * @arg value New value.
234*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative errror code.
235*4dc78e53SAndroid Build Coastguard Worker */
rtnl_class_dsmark_set_value(struct rtnl_class * class,uint8_t value)236*4dc78e53SAndroid Build Coastguard Worker int rtnl_class_dsmark_set_value(struct rtnl_class *class, uint8_t value)
237*4dc78e53SAndroid Build Coastguard Worker {
238*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark;
239*4dc78e53SAndroid Build Coastguard Worker
240*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(class))))
241*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
242*4dc78e53SAndroid Build Coastguard Worker
243*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_value = value;
244*4dc78e53SAndroid Build Coastguard Worker dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
245*4dc78e53SAndroid Build Coastguard Worker
246*4dc78e53SAndroid Build Coastguard Worker return 0;
247*4dc78e53SAndroid Build Coastguard Worker }
248*4dc78e53SAndroid Build Coastguard Worker
249*4dc78e53SAndroid Build Coastguard Worker /**
250*4dc78e53SAndroid Build Coastguard Worker * Get value of DSMARK class.
251*4dc78e53SAndroid Build Coastguard Worker * @arg class DSMARK class.
252*4dc78e53SAndroid Build Coastguard Worker * @return Value or a negative error code.
253*4dc78e53SAndroid Build Coastguard Worker */
rtnl_class_dsmark_get_value(struct rtnl_class * class)254*4dc78e53SAndroid Build Coastguard Worker int rtnl_class_dsmark_get_value(struct rtnl_class *class)
255*4dc78e53SAndroid Build Coastguard Worker {
256*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_class *dsmark;
257*4dc78e53SAndroid Build Coastguard Worker
258*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(class))))
259*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
260*4dc78e53SAndroid Build Coastguard Worker
261*4dc78e53SAndroid Build Coastguard Worker if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
262*4dc78e53SAndroid Build Coastguard Worker return dsmark->cdm_value;
263*4dc78e53SAndroid Build Coastguard Worker else
264*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
265*4dc78e53SAndroid Build Coastguard Worker }
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker /** @} */
268*4dc78e53SAndroid Build Coastguard Worker
269*4dc78e53SAndroid Build Coastguard Worker /**
270*4dc78e53SAndroid Build Coastguard Worker * @name Qdisc Attribute Access
271*4dc78e53SAndroid Build Coastguard Worker * @{
272*4dc78e53SAndroid Build Coastguard Worker */
273*4dc78e53SAndroid Build Coastguard Worker
274*4dc78e53SAndroid Build Coastguard Worker /**
275*4dc78e53SAndroid Build Coastguard Worker * Set indices of DSMARK qdisc.
276*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc to be modified.
277*4dc78e53SAndroid Build Coastguard Worker * @arg indices New indices.
278*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_set_indices(struct rtnl_qdisc * qdisc,uint16_t indices)279*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_set_indices(struct rtnl_qdisc *qdisc, uint16_t indices)
280*4dc78e53SAndroid Build Coastguard Worker {
281*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
282*4dc78e53SAndroid Build Coastguard Worker
283*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
284*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
285*4dc78e53SAndroid Build Coastguard Worker
286*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_indices = indices;
287*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
288*4dc78e53SAndroid Build Coastguard Worker
289*4dc78e53SAndroid Build Coastguard Worker return 0;
290*4dc78e53SAndroid Build Coastguard Worker }
291*4dc78e53SAndroid Build Coastguard Worker
292*4dc78e53SAndroid Build Coastguard Worker /**
293*4dc78e53SAndroid Build Coastguard Worker * Get indices of DSMARK qdisc.
294*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc.
295*4dc78e53SAndroid Build Coastguard Worker * @return Indices or a negative error code.
296*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_get_indices(struct rtnl_qdisc * qdisc)297*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_get_indices(struct rtnl_qdisc *qdisc)
298*4dc78e53SAndroid Build Coastguard Worker {
299*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
300*4dc78e53SAndroid Build Coastguard Worker
301*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
302*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
303*4dc78e53SAndroid Build Coastguard Worker
304*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
305*4dc78e53SAndroid Build Coastguard Worker return dsmark->qdm_indices;
306*4dc78e53SAndroid Build Coastguard Worker else
307*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
308*4dc78e53SAndroid Build Coastguard Worker }
309*4dc78e53SAndroid Build Coastguard Worker
310*4dc78e53SAndroid Build Coastguard Worker /**
311*4dc78e53SAndroid Build Coastguard Worker * Set default index of DSMARK qdisc.
312*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc to be modified.
313*4dc78e53SAndroid Build Coastguard Worker * @arg default_index New default index.
314*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
315*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_set_default_index(struct rtnl_qdisc * qdisc,uint16_t default_index)316*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_set_default_index(struct rtnl_qdisc *qdisc,
317*4dc78e53SAndroid Build Coastguard Worker uint16_t default_index)
318*4dc78e53SAndroid Build Coastguard Worker {
319*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
320*4dc78e53SAndroid Build Coastguard Worker
321*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
322*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
323*4dc78e53SAndroid Build Coastguard Worker
324*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_default_index = default_index;
325*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
326*4dc78e53SAndroid Build Coastguard Worker
327*4dc78e53SAndroid Build Coastguard Worker return 0;
328*4dc78e53SAndroid Build Coastguard Worker }
329*4dc78e53SAndroid Build Coastguard Worker
330*4dc78e53SAndroid Build Coastguard Worker /**
331*4dc78e53SAndroid Build Coastguard Worker * Get default index of DSMARK qdisc.
332*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc.
333*4dc78e53SAndroid Build Coastguard Worker * @return Default index or a negative error code.
334*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_get_default_index(struct rtnl_qdisc * qdisc)335*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_get_default_index(struct rtnl_qdisc *qdisc)
336*4dc78e53SAndroid Build Coastguard Worker {
337*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
338*4dc78e53SAndroid Build Coastguard Worker
339*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
340*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
341*4dc78e53SAndroid Build Coastguard Worker
342*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
343*4dc78e53SAndroid Build Coastguard Worker return dsmark->qdm_default_index;
344*4dc78e53SAndroid Build Coastguard Worker else
345*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
346*4dc78e53SAndroid Build Coastguard Worker }
347*4dc78e53SAndroid Build Coastguard Worker
348*4dc78e53SAndroid Build Coastguard Worker /**
349*4dc78e53SAndroid Build Coastguard Worker * Set set-tc-index flag of DSMARK qdisc.
350*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc to be modified.
351*4dc78e53SAndroid Build Coastguard Worker * @arg flag Flag indicating whether to enable or disable.
352*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
353*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_set_set_tc_index(struct rtnl_qdisc * qdisc,int flag)354*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_set_set_tc_index(struct rtnl_qdisc *qdisc, int flag)
355*4dc78e53SAndroid Build Coastguard Worker {
356*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
357*4dc78e53SAndroid Build Coastguard Worker
358*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
359*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
360*4dc78e53SAndroid Build Coastguard Worker
361*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_set_tc_index = !!flag;
362*4dc78e53SAndroid Build Coastguard Worker dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
363*4dc78e53SAndroid Build Coastguard Worker
364*4dc78e53SAndroid Build Coastguard Worker return 0;
365*4dc78e53SAndroid Build Coastguard Worker }
366*4dc78e53SAndroid Build Coastguard Worker
367*4dc78e53SAndroid Build Coastguard Worker /**
368*4dc78e53SAndroid Build Coastguard Worker * Get set-tc-index flag of DSMARK qdisc.
369*4dc78e53SAndroid Build Coastguard Worker * @arg qdisc DSMARK qdisc to be modified.
370*4dc78e53SAndroid Build Coastguard Worker * @return 1 or 0 to indicate wehther the flag is enabled or a negative
371*4dc78e53SAndroid Build Coastguard Worker * error code.
372*4dc78e53SAndroid Build Coastguard Worker */
rtnl_qdisc_dsmark_get_set_tc_index(struct rtnl_qdisc * qdisc)373*4dc78e53SAndroid Build Coastguard Worker int rtnl_qdisc_dsmark_get_set_tc_index(struct rtnl_qdisc *qdisc)
374*4dc78e53SAndroid Build Coastguard Worker {
375*4dc78e53SAndroid Build Coastguard Worker struct rtnl_dsmark_qdisc *dsmark;
376*4dc78e53SAndroid Build Coastguard Worker
377*4dc78e53SAndroid Build Coastguard Worker if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc))))
378*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
379*4dc78e53SAndroid Build Coastguard Worker
380*4dc78e53SAndroid Build Coastguard Worker if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
381*4dc78e53SAndroid Build Coastguard Worker return dsmark->qdm_set_tc_index;
382*4dc78e53SAndroid Build Coastguard Worker else
383*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOATTR;
384*4dc78e53SAndroid Build Coastguard Worker }
385*4dc78e53SAndroid Build Coastguard Worker
386*4dc78e53SAndroid Build Coastguard Worker /** @} */
387*4dc78e53SAndroid Build Coastguard Worker
388*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops dsmark_qdisc_ops = {
389*4dc78e53SAndroid Build Coastguard Worker .to_kind = "dsmark",
390*4dc78e53SAndroid Build Coastguard Worker .to_type = RTNL_TC_TYPE_QDISC,
391*4dc78e53SAndroid Build Coastguard Worker .to_size = sizeof(struct rtnl_dsmark_qdisc),
392*4dc78e53SAndroid Build Coastguard Worker .to_msg_parser = dsmark_qdisc_msg_parser,
393*4dc78e53SAndroid Build Coastguard Worker .to_dump = {
394*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = dsmark_qdisc_dump_line,
395*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = dsmark_qdisc_dump_details,
396*4dc78e53SAndroid Build Coastguard Worker },
397*4dc78e53SAndroid Build Coastguard Worker .to_msg_fill = dsmark_qdisc_msg_fill,
398*4dc78e53SAndroid Build Coastguard Worker };
399*4dc78e53SAndroid Build Coastguard Worker
400*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops dsmark_class_ops = {
401*4dc78e53SAndroid Build Coastguard Worker .to_kind = "dsmark",
402*4dc78e53SAndroid Build Coastguard Worker .to_type = RTNL_TC_TYPE_CLASS,
403*4dc78e53SAndroid Build Coastguard Worker .to_size = sizeof(struct rtnl_dsmark_class),
404*4dc78e53SAndroid Build Coastguard Worker .to_msg_parser = dsmark_class_msg_parser,
405*4dc78e53SAndroid Build Coastguard Worker .to_dump[NL_DUMP_LINE] = dsmark_class_dump_line,
406*4dc78e53SAndroid Build Coastguard Worker .to_msg_fill = dsmark_class_msg_fill,
407*4dc78e53SAndroid Build Coastguard Worker };
408*4dc78e53SAndroid Build Coastguard Worker
dsmark_init(void)409*4dc78e53SAndroid Build Coastguard Worker static void _nl_init dsmark_init(void)
410*4dc78e53SAndroid Build Coastguard Worker {
411*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_register(&dsmark_qdisc_ops);
412*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_register(&dsmark_class_ops);
413*4dc78e53SAndroid Build Coastguard Worker }
414*4dc78e53SAndroid Build Coastguard Worker
dsmark_exit(void)415*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit dsmark_exit(void)
416*4dc78e53SAndroid Build Coastguard Worker {
417*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_unregister(&dsmark_qdisc_ops);
418*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_unregister(&dsmark_class_ops);
419*4dc78e53SAndroid Build Coastguard Worker }
420*4dc78e53SAndroid Build Coastguard Worker
421*4dc78e53SAndroid Build Coastguard Worker /** @} */
422