13#include "nl-default.h"
15#include <netlink/netlink.h>
16#include <netlink/utils.h>
17#include <netlink/route/qdisc.h>
18#include <netlink/route/class.h>
19#include <netlink/route/qdisc/dsmark.h>
24struct rtnl_dsmark_qdisc {
26 uint16_t qdm_default_index;
27 uint32_t qdm_set_tc_index;
31struct rtnl_dsmark_class {
37#define SCH_DSMARK_ATTR_INDICES 0x1
38#define SCH_DSMARK_ATTR_DEFAULT_INDEX 0x2
39#define SCH_DSMARK_ATTR_SET_TC_INDEX 0x4
41#define SCH_DSMARK_ATTR_MASK 0x1
42#define SCH_DSMARK_ATTR_VALUE 0x2
53static int dsmark_qdisc_msg_parser(
struct rtnl_tc *tc,
void *data)
55 struct rtnl_dsmark_qdisc *dsmark = data;
56 struct nlattr *tb[TCA_DSMARK_MAX + 1];
59 err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
63 if (tb[TCA_DSMARK_INDICES]) {
64 dsmark->qdm_indices =
nla_get_u16(tb[TCA_DSMARK_INDICES]);
65 dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
68 if (tb[TCA_DSMARK_DEFAULT_INDEX]) {
69 dsmark->qdm_default_index =
71 dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
74 if (tb[TCA_DSMARK_SET_TC_INDEX]) {
75 dsmark->qdm_set_tc_index = 1;
76 dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
82static int dsmark_class_msg_parser(
struct rtnl_tc *tc,
void *data)
84 struct rtnl_dsmark_class *dsmark = data;
85 struct nlattr *tb[TCA_DSMARK_MAX + 1];
88 err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy);
92 if (tb[TCA_DSMARK_MASK]) {
93 dsmark->cdm_bmask =
nla_get_u8(tb[TCA_DSMARK_MASK]);
94 dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
97 if (tb[TCA_DSMARK_VALUE]) {
98 dsmark->cdm_value =
nla_get_u8(tb[TCA_DSMARK_VALUE]);
99 dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
105static void dsmark_qdisc_dump_line(
struct rtnl_tc *tc,
void *data,
108 struct rtnl_dsmark_qdisc *dsmark = data;
110 if (dsmark && (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES))
111 nl_dump(p,
" indices 0x%04x", dsmark->qdm_indices);
114static void dsmark_qdisc_dump_details(
struct rtnl_tc *tc,
void *data,
117 struct rtnl_dsmark_qdisc *dsmark = data;
122 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
123 nl_dump(p,
" default index 0x%04x", dsmark->qdm_default_index);
125 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
129static void dsmark_class_dump_line(
struct rtnl_tc *tc,
void *data,
132 struct rtnl_dsmark_class *dsmark = data;
137 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
138 nl_dump(p,
" value 0x%02x", dsmark->cdm_value);
140 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
141 nl_dump(p,
" mask 0x%02x", dsmark->cdm_bmask);
144static int dsmark_qdisc_msg_fill(
struct rtnl_tc *tc,
void *data,
147 struct rtnl_dsmark_qdisc *dsmark = data;
152 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
153 NLA_PUT_U16(msg, TCA_DSMARK_INDICES, dsmark->qdm_indices);
155 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
157 dsmark->qdm_default_index);
159 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
168static int dsmark_class_msg_fill(
struct rtnl_tc *tc,
void *data,
171 struct rtnl_dsmark_class *dsmark = data;
176 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
177 NLA_PUT_U8(msg, TCA_DSMARK_MASK, dsmark->cdm_bmask);
179 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
180 NLA_PUT_U8(msg, TCA_DSMARK_VALUE, dsmark->cdm_value);
201 struct rtnl_dsmark_class *dsmark;
206 dsmark->cdm_bmask = mask;
207 dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK;
219 struct rtnl_dsmark_class *dsmark;
224 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK)
225 return dsmark->cdm_bmask;
238 struct rtnl_dsmark_class *dsmark;
243 dsmark->cdm_value = value;
244 dsmark->cdm_mask |= SCH_DSMARK_ATTR_VALUE;
256 struct rtnl_dsmark_class *dsmark;
261 if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE)
262 return dsmark->cdm_value;
281 struct rtnl_dsmark_qdisc *dsmark;
286 dsmark->qdm_indices = indices;
287 dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES;
299 struct rtnl_dsmark_qdisc *dsmark;
304 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)
305 return dsmark->qdm_indices;
317 uint16_t default_index)
319 struct rtnl_dsmark_qdisc *dsmark;
324 dsmark->qdm_default_index = default_index;
325 dsmark->qdm_mask |= SCH_DSMARK_ATTR_DEFAULT_INDEX;
337 struct rtnl_dsmark_qdisc *dsmark;
342 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX)
343 return dsmark->qdm_default_index;
356 struct rtnl_dsmark_qdisc *dsmark;
361 dsmark->qdm_set_tc_index = !!flag;
362 dsmark->qdm_mask |= SCH_DSMARK_ATTR_SET_TC_INDEX;
375 struct rtnl_dsmark_qdisc *dsmark;
380 if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX)
381 return dsmark->qdm_set_tc_index;
388static struct rtnl_tc_ops dsmark_qdisc_ops = {
390 .to_type = RTNL_TC_TYPE_QDISC,
391 .to_size =
sizeof(
struct rtnl_dsmark_qdisc),
392 .to_msg_parser = dsmark_qdisc_msg_parser,
397 .to_msg_fill = dsmark_qdisc_msg_fill,
400static struct rtnl_tc_ops dsmark_class_ops = {
402 .to_type = RTNL_TC_TYPE_CLASS,
403 .to_size =
sizeof(
struct rtnl_dsmark_class),
404 .to_msg_parser = dsmark_class_msg_parser,
406 .to_msg_fill = dsmark_class_msg_fill,
409static void _nl_init dsmark_init(
void)
415static void _nl_exit dsmark_exit(
void)
uint16_t nla_get_u16(const struct nlattr *nla)
Return payload of 16 bit integer attribute.
#define NLA_PUT_FLAG(msg, attrtype)
Add flag attribute to netlink message.
#define NLA_PUT_U16(msg, attrtype, value)
Add 16 bit integer attribute to netlink message.
#define NLA_PUT_U8(msg, attrtype, value)
Add 8 bit integer attribute to netlink message.
uint8_t nla_get_u8(const struct nlattr *nla)
Return value of 8 bit integer attribute.
int rtnl_qdisc_dsmark_set_indices(struct rtnl_qdisc *qdisc, uint16_t indices)
Set indices of DSMARK qdisc.
int rtnl_class_dsmark_set_value(struct rtnl_class *class, uint8_t value)
Set value of DSMARK class.
int rtnl_class_dsmark_set_bitmask(struct rtnl_class *class, uint8_t mask)
Set bitmask of DSMARK class.
int rtnl_qdisc_dsmark_get_default_index(struct rtnl_qdisc *qdisc)
Get default index of DSMARK qdisc.
int rtnl_qdisc_dsmark_set_set_tc_index(struct rtnl_qdisc *qdisc, int flag)
Set set-tc-index flag of DSMARK qdisc.
int rtnl_class_dsmark_get_value(struct rtnl_class *class)
Get value of DSMARK class.
int rtnl_qdisc_dsmark_get_set_tc_index(struct rtnl_qdisc *qdisc)
Get set-tc-index flag of DSMARK qdisc.
int rtnl_qdisc_dsmark_get_indices(struct rtnl_qdisc *qdisc)
Get indices of DSMARK qdisc.
int rtnl_qdisc_dsmark_set_default_index(struct rtnl_qdisc *qdisc, uint16_t default_index)
Set default index of DSMARK qdisc.
int rtnl_class_dsmark_get_bitmask(struct rtnl_class *class)
Get bitmask of DSMARK class.
#define TC_CAST(ptr)
Macro to cast qdisc/class/classifier to tc object.
void * rtnl_tc_data(struct rtnl_tc *)
Return pointer to private data of traffic control object.
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.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.
Attribute validation policy.
uint16_t type
Type of attribute or NLA_UNSPEC.