19 #include <netlink-private/netlink.h>
20 #include <netlink-private/tc.h>
21 #include <netlink/netlink.h>
22 #include <netlink/utils.h>
23 #include <netlink/route/qdisc.h>
24 #include <netlink-private/route/tc-api.h>
25 #include <netlink/route/class.h>
26 #include <netlink/route/qdisc/dsmark.h>
29 #define SCH_DSMARK_ATTR_INDICES 0x1
30 #define SCH_DSMARK_ATTR_DEFAULT_INDEX 0x2
31 #define SCH_DSMARK_ATTR_SET_TC_INDEX 0x4
33 #define SCH_DSMARK_ATTR_MASK 0x1
34 #define SCH_DSMARK_ATTR_VALUE 0x2
37 static struct nla_policy dsmark_policy[TCA_DSMARK_MAX+1] = {
39 [TCA_DSMARK_DEFAULT_INDEX] = { .type =
NLA_U16 },
40 [TCA_DSMARK_SET_TC_INDEX] = { .type =
NLA_FLAG },
41 [TCA_DSMARK_VALUE] = { .type =
NLA_U8 },
42 [TCA_DSMARK_MASK] = { .type =
NLA_U8 },
45 static int dsmark_qdisc_msg_parser(
struct rtnl_tc *tc,
void *data)
47 struct rtnl_dsmark_qdisc *dsmark = data;
48 struct nlattr *tb[TCA_DSMARK_MAX + 1];
51 err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
55 if (tb[TCA_DSMARK_INDICES]) {
56 dsmark->qdm_indices =
nla_get_u16(tb[TCA_DSMARK_INDICES]);
57 dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
60 if (tb[TCA_DSMARK_DEFAULT_INDEX]) {
61 dsmark->qdm_default_index =
63 dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
66 if (tb[TCA_DSMARK_SET_TC_INDEX]) {
67 dsmark->qdm_set_tc_index = 1;
68 dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
74 static int dsmark_class_msg_parser(
struct rtnl_tc *tc,
void *data)
76 struct rtnl_dsmark_class *dsmark = data;
77 struct nlattr *tb[TCA_DSMARK_MAX + 1];
80 err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
84 if (tb[TCA_DSMARK_MASK]) {
85 dsmark->cdm_bmask =
nla_get_u8(tb[TCA_DSMARK_MASK]);
86 dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
89 if (tb[TCA_DSMARK_VALUE]) {
90 dsmark->cdm_value =
nla_get_u8(tb[TCA_DSMARK_VALUE]);
91 dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
97 static void dsmark_qdisc_dump_line(
struct rtnl_tc *tc,
void *data,
100 struct rtnl_dsmark_qdisc *dsmark = data;
102 if (dsmark && (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES))
103 nl_dump(p,
" indices 0x%04x", dsmark->qdm_indices);
106 static void dsmark_qdisc_dump_details(
struct rtnl_tc *tc,
void *data,
109 struct rtnl_dsmark_qdisc *dsmark = data;
114 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
115 nl_dump(p,
" default index 0x%04x", dsmark->qdm_default_index);
117 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
121 static void dsmark_class_dump_line(
struct rtnl_tc *tc,
void *data,
124 struct rtnl_dsmark_class *dsmark = data;
129 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
130 nl_dump(p,
" value 0x%02x", dsmark->cdm_value);
132 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
133 nl_dump(p,
" mask 0x%02x", dsmark->cdm_bmask);
136 static int dsmark_qdisc_msg_fill(
struct rtnl_tc *tc,
void *data,
139 struct rtnl_dsmark_qdisc *dsmark = data;
144 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
145 NLA_PUT_U16(msg, TCA_DSMARK_INDICES, dsmark->qdm_indices);
147 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
149 dsmark->qdm_default_index);
151 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
160 static int dsmark_class_msg_fill(
struct rtnl_tc *tc,
void *data,
163 struct rtnl_dsmark_class *dsmark = data;
168 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
169 NLA_PUT_U8(msg, TCA_DSMARK_MASK, dsmark->cdm_bmask);
171 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
172 NLA_PUT_U8(msg, TCA_DSMARK_VALUE, dsmark->cdm_value);
193 struct rtnl_dsmark_class *dsmark;
198 dsmark->cdm_bmask = mask;
199 dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
211 struct rtnl_dsmark_class *dsmark;
216 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
217 return dsmark->cdm_bmask;
230 struct rtnl_dsmark_class *dsmark;
235 dsmark->cdm_value = value;
236 dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
248 struct rtnl_dsmark_class *dsmark;
253 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
254 return dsmark->cdm_value;
273 struct rtnl_dsmark_qdisc *dsmark;
278 dsmark->qdm_indices = indices;
279 dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
291 struct rtnl_dsmark_qdisc *dsmark;
296 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
297 return dsmark->qdm_indices;
309 uint16_t default_index)
311 struct rtnl_dsmark_qdisc *dsmark;
316 dsmark->qdm_default_index = default_index;
317 dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
329 struct rtnl_dsmark_qdisc *dsmark;
334 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
335 return dsmark->qdm_default_index;
348 struct rtnl_dsmark_qdisc *dsmark;
353 dsmark->qdm_set_tc_index = !!flag;
354 dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
367 struct rtnl_dsmark_qdisc *dsmark;
372 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
373 return dsmark->qdm_set_tc_index;
380 static struct rtnl_tc_ops dsmark_qdisc_ops = {
382 .to_type = RTNL_TC_TYPE_QDISC,
383 .to_size =
sizeof(
struct rtnl_dsmark_qdisc),
384 .to_msg_parser = dsmark_qdisc_msg_parser,
389 .to_msg_fill = dsmark_qdisc_msg_fill,
392 static struct rtnl_tc_ops dsmark_class_ops = {
394 .to_type = RTNL_TC_TYPE_CLASS,
395 .to_size =
sizeof(
struct rtnl_dsmark_class),
396 .to_msg_parser = dsmark_class_msg_parser,
398 .to_msg_fill = dsmark_class_msg_fill,
401 static void __init dsmark_init(
void)
407 static void __exit dsmark_exit(
void)