23#include "nl-default.h"
25#include <netlink/netlink.h>
26#include <netlink/utils.h>
27#include <netlink/route/qdisc.h>
28#include <netlink/route/qdisc/prio.h>
35 uint8_t qp_priomap[TC_PRIO_MAX + 1];
39#define SCH_PRIO_ATTR_BANDS 1
40#define SCH_PRIO_ATTR_PRIOMAP 2
43static int prio_msg_parser(
struct rtnl_tc *tc,
void *data)
45 struct rtnl_prio *prio = data;
46 struct tc_prio_qopt *opt;
48 if (tc->tc_opts->d_size <
sizeof(*opt))
51 opt = (
struct tc_prio_qopt *) tc->tc_opts->d_data;
52 prio->qp_bands = opt->bands;
53 memcpy(prio->qp_priomap, opt->priomap,
sizeof(prio->qp_priomap));
54 prio->qp_mask = (SCH_PRIO_ATTR_BANDS | SCH_PRIO_ATTR_PRIOMAP);
59static void prio_dump_line(
struct rtnl_tc *tc,
void *data,
62 struct rtnl_prio *prio = data;
65 nl_dump(p,
" bands %u", prio->qp_bands);
68static void prio_dump_details(
struct rtnl_tc *tc,
void *data,
71 struct rtnl_prio *prio = data;
79 for (i = 0; i <= TC_PRIO_MAX; i++)
80 nl_dump(p,
"%u%s", prio->qp_priomap[i],
81 i < TC_PRIO_MAX ?
" " :
"");
86 hp = (((TC_PRIO_MAX/2) + 1) & ~1);
88 for (i = 0; i < hp; i++) {
93 if (hp+i <= TC_PRIO_MAX) {
96 prio->qp_priomap[hp+i]);
105static int prio_msg_fill(
struct rtnl_tc *tc,
void *data,
struct nl_msg *msg)
107 struct rtnl_prio *prio = data;
108 struct tc_prio_qopt opts;
110 if (!prio || !(prio->qp_mask & SCH_PRIO_ATTR_PRIOMAP))
113 opts.bands = prio->qp_bands;
114 memcpy(opts.priomap, prio->qp_priomap,
sizeof(opts.priomap));
116 return nlmsg_append(msg, &opts,
sizeof(opts), NL_DONTPAD);
132 struct rtnl_prio *prio;
137 prio->qp_bands = bands;
138 prio->qp_mask |= SCH_PRIO_ATTR_BANDS;
148 struct rtnl_prio *prio;
153 if (prio->qp_mask & SCH_PRIO_ATTR_BANDS)
154 return prio->qp_bands;
169 struct rtnl_prio *prio;
175 if (!(prio->qp_mask & SCH_PRIO_ATTR_BANDS))
176 return -NLE_MISSING_ATTR;
178 if ((len /
sizeof(uint8_t)) > (TC_PRIO_MAX+1))
181 for (i = 0; i <= TC_PRIO_MAX; i++) {
182 if (priomap[i] > prio->qp_bands)
186 memcpy(prio->qp_priomap, priomap, len);
187 prio->qp_mask |= SCH_PRIO_ATTR_PRIOMAP;
200 struct rtnl_prio *prio;
205 if (prio->qp_mask & SCH_PRIO_ATTR_PRIOMAP)
206 return prio->qp_priomap;
218static const struct trans_tbl prios[] = {
219 __ADD(TC_PRIO_BESTEFFORT,besteffort),
220 __ADD(TC_PRIO_FILLER,filler),
221 __ADD(TC_PRIO_BULK,bulk),
222 __ADD(TC_PRIO_INTERACTIVE_BULK,interactive_bulk),
223 __ADD(TC_PRIO_INTERACTIVE,interactive),
224 __ADD(TC_PRIO_CONTROL,control),
240 return __type2str(prio, buf, size, prios, ARRAY_SIZE(prios));
254 return __str2type(name, prios, ARRAY_SIZE(prios));
259static struct rtnl_tc_ops prio_ops = {
261 .to_type = RTNL_TC_TYPE_QDISC,
262 .to_size =
sizeof(
struct rtnl_prio),
263 .to_msg_parser = prio_msg_parser,
268 .to_msg_fill = prio_msg_fill,
271static struct rtnl_tc_ops pfifo_fast_ops = {
272 .to_kind =
"pfifo_fast",
273 .to_type = RTNL_TC_TYPE_QDISC,
274 .to_size =
sizeof(
struct rtnl_prio),
275 .to_msg_parser = prio_msg_parser,
280 .to_msg_fill = prio_msg_fill,
283static void _nl_init prio_init(
void)
289static void _nl_exit prio_exit(
void)
int nlmsg_append(struct nl_msg *n, void *data, size_t len, int pad)
Append data to tail of a netlink message.
int rtnl_qdisc_prio_get_bands(struct rtnl_qdisc *qdisc)
Get number of bands of PRIO qdisc.
int rtnl_str2prio(const char *name)
Convert character string to priority.
int rtnl_qdisc_prio_set_priomap(struct rtnl_qdisc *qdisc, uint8_t priomap[], int len)
Set priomap of the PRIO qdisc.
uint8_t * rtnl_qdisc_prio_get_priomap(struct rtnl_qdisc *qdisc)
Get priomap of a PRIO qdisc.
char * rtnl_prio2str(int prio, char *buf, size_t size)
Convert priority to character string.
void rtnl_qdisc_prio_set_bands(struct rtnl_qdisc *qdisc, int bands)
Set number of bands of PRIO qdisc.
#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.
void nl_new_line(struct nl_dump_params *params)
Handle a new line while dumping.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.