|
@@ -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,8 +99,10 @@ 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);
|
|
@@ -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,
|
|
{
|
|
{
|
|
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;
|
|
}
|
|
}
|