Commit a7c31693 authored by Alexander Aring's avatar Alexander Aring Committed by David S. Miller

net: sch: sch_drr: add extack support

This patch adds extack support for the drr qdisc implementation by
adding NL_SET_ERR_MSG in validation of user input.
Also it serves to illustrate a use case of how the infrastructure ops
api changes are to be used by individual qdiscs.

Cc: David Ahern <dsahern@gmail.com>
Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarAlexander Aring <aring@mojatatu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 710fb396
...@@ -74,17 +74,21 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid, ...@@ -74,17 +74,21 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
u32 quantum; u32 quantum;
int err; int err;
if (!opt) if (!opt) {
NL_SET_ERR_MSG(extack, "DRR options are required for this operation");
return -EINVAL; return -EINVAL;
}
err = nla_parse_nested(tb, TCA_DRR_MAX, opt, drr_policy, NULL); err = nla_parse_nested(tb, TCA_DRR_MAX, opt, drr_policy, extack);
if (err < 0) if (err < 0)
return err; return err;
if (tb[TCA_DRR_QUANTUM]) { if (tb[TCA_DRR_QUANTUM]) {
quantum = nla_get_u32(tb[TCA_DRR_QUANTUM]); quantum = nla_get_u32(tb[TCA_DRR_QUANTUM]);
if (quantum == 0) if (quantum == 0) {
NL_SET_ERR_MSG(extack, "Specified DRR quantum cannot be zero");
return -EINVAL; return -EINVAL;
}
} else } else
quantum = psched_mtu(qdisc_dev(sch)); quantum = psched_mtu(qdisc_dev(sch));
...@@ -95,9 +99,11 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid, ...@@ -95,9 +99,11 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
NULL, NULL,
qdisc_root_sleeping_running(sch), qdisc_root_sleeping_running(sch),
tca[TCA_RATE]); tca[TCA_RATE]);
if (err) if (err) {
NL_SET_ERR_MSG(extack, "Failed to replace estimator");
return err; return err;
} }
}
sch_tree_lock(sch); sch_tree_lock(sch);
if (tb[TCA_DRR_QUANTUM]) if (tb[TCA_DRR_QUANTUM])
...@@ -127,6 +133,7 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid, ...@@ -127,6 +133,7 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
qdisc_root_sleeping_running(sch), qdisc_root_sleeping_running(sch),
tca[TCA_RATE]); tca[TCA_RATE]);
if (err) { if (err) {
NL_SET_ERR_MSG(extack, "Failed to replace estimator");
qdisc_destroy(cl->qdisc); qdisc_destroy(cl->qdisc);
kfree(cl); kfree(cl);
return err; return err;
...@@ -179,8 +186,10 @@ static struct tcf_block *drr_tcf_block(struct Qdisc *sch, unsigned long cl, ...@@ -179,8 +186,10 @@ static struct tcf_block *drr_tcf_block(struct Qdisc *sch, unsigned long cl,
{ {
struct drr_sched *q = qdisc_priv(sch); struct drr_sched *q = qdisc_priv(sch);
if (cl) if (cl) {
NL_SET_ERR_MSG(extack, "DRR classid must be zero");
return NULL; return NULL;
}
return q->block; return q->block;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment