|
@@ -34,7 +34,7 @@ struct gred_sched;
|
|
|
|
|
|
struct gred_sched_data {
|
|
|
u32 limit; /* HARD maximal queue length */
|
|
|
- u32 DP; /* the drop pramaters */
|
|
|
+ u32 DP; /* the drop parameters */
|
|
|
u32 bytesin; /* bytes seen on virtualQ so far*/
|
|
|
u32 packetsin; /* packets seen on virtualQ so far*/
|
|
|
u32 backlog; /* bytes on the virtualQ */
|
|
@@ -379,7 +379,8 @@ static inline int gred_change_table_def(struct Qdisc *sch, struct nlattr *dps)
|
|
|
}
|
|
|
|
|
|
static inline int gred_change_vq(struct Qdisc *sch, int dp,
|
|
|
- struct tc_gred_qopt *ctl, int prio, u8 *stab)
|
|
|
+ struct tc_gred_qopt *ctl, int prio,
|
|
|
+ u8 *stab, u32 max_P)
|
|
|
{
|
|
|
struct gred_sched *table = qdisc_priv(sch);
|
|
|
struct gred_sched_data *q;
|
|
@@ -400,7 +401,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
|
|
|
|
|
|
red_set_parms(&q->parms,
|
|
|
ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Plog,
|
|
|
- ctl->Scell_log, stab);
|
|
|
+ ctl->Scell_log, stab, max_P);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -409,6 +410,7 @@ static const struct nla_policy gred_policy[TCA_GRED_MAX + 1] = {
|
|
|
[TCA_GRED_PARMS] = { .len = sizeof(struct tc_gred_qopt) },
|
|
|
[TCA_GRED_STAB] = { .len = 256 },
|
|
|
[TCA_GRED_DPS] = { .len = sizeof(struct tc_gred_sopt) },
|
|
|
+ [TCA_GRED_MAX_P] = { .type = NLA_U32 },
|
|
|
};
|
|
|
|
|
|
static int gred_change(struct Qdisc *sch, struct nlattr *opt)
|
|
@@ -418,6 +420,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
struct nlattr *tb[TCA_GRED_MAX + 1];
|
|
|
int err, prio = GRED_DEF_PRIO;
|
|
|
u8 *stab;
|
|
|
+ u32 max_P;
|
|
|
|
|
|
if (opt == NULL)
|
|
|
return -EINVAL;
|
|
@@ -433,6 +436,8 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
tb[TCA_GRED_STAB] == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ max_P = tb[TCA_GRED_MAX_P] ? nla_get_u32(tb[TCA_GRED_MAX_P]) : 0;
|
|
|
+
|
|
|
err = -EINVAL;
|
|
|
ctl = nla_data(tb[TCA_GRED_PARMS]);
|
|
|
stab = nla_data(tb[TCA_GRED_STAB]);
|
|
@@ -457,7 +462,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
|
|
|
sch_tree_lock(sch);
|
|
|
|
|
|
- err = gred_change_vq(sch, ctl->DP, ctl, prio, stab);
|
|
|
+ err = gred_change_vq(sch, ctl->DP, ctl, prio, stab, max_P);
|
|
|
if (err < 0)
|
|
|
goto errout_locked;
|
|
|
|
|
@@ -498,6 +503,7 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
|
|
|
struct gred_sched *table = qdisc_priv(sch);
|
|
|
struct nlattr *parms, *opts = NULL;
|
|
|
int i;
|
|
|
+ u32 max_p[MAX_DPs];
|
|
|
struct tc_gred_sopt sopt = {
|
|
|
.DPs = table->DPs,
|
|
|
.def_DP = table->def,
|
|
@@ -509,6 +515,14 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
|
|
|
if (opts == NULL)
|
|
|
goto nla_put_failure;
|
|
|
NLA_PUT(skb, TCA_GRED_DPS, sizeof(sopt), &sopt);
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_DPs; i++) {
|
|
|
+ struct gred_sched_data *q = table->tab[i];
|
|
|
+
|
|
|
+ max_p[i] = q ? q->parms.max_P : 0;
|
|
|
+ }
|
|
|
+ NLA_PUT(skb, TCA_GRED_MAX_P, sizeof(max_p), max_p);
|
|
|
+
|
|
|
parms = nla_nest_start(skb, TCA_GRED_PARMS);
|
|
|
if (parms == NULL)
|
|
|
goto nla_put_failure;
|