|
@@ -6,7 +6,7 @@
|
|
|
*
|
|
|
* Implemented on linux by :
|
|
|
* Copyright (C) 2012 Michael D. Taht <dave.taht@bufferbloat.net>
|
|
|
- * Copyright (C) 2012 Eric Dumazet <edumazet@google.com>
|
|
|
+ * Copyright (C) 2012,2015 Eric Dumazet <edumazet@google.com>
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
* modification, are permitted provided that the following conditions
|
|
@@ -109,6 +109,7 @@ static const struct nla_policy codel_policy[TCA_CODEL_MAX + 1] = {
|
|
|
[TCA_CODEL_LIMIT] = { .type = NLA_U32 },
|
|
|
[TCA_CODEL_INTERVAL] = { .type = NLA_U32 },
|
|
|
[TCA_CODEL_ECN] = { .type = NLA_U32 },
|
|
|
+ [TCA_CODEL_CE_THRESHOLD]= { .type = NLA_U32 },
|
|
|
};
|
|
|
|
|
|
static int codel_change(struct Qdisc *sch, struct nlattr *opt)
|
|
@@ -133,6 +134,12 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
q->params.target = ((u64)target * NSEC_PER_USEC) >> CODEL_SHIFT;
|
|
|
}
|
|
|
|
|
|
+ if (tb[TCA_CODEL_CE_THRESHOLD]) {
|
|
|
+ u64 val = nla_get_u32(tb[TCA_CODEL_CE_THRESHOLD]);
|
|
|
+
|
|
|
+ q->params.ce_threshold = (val * NSEC_PER_USEC) >> CODEL_SHIFT;
|
|
|
+ }
|
|
|
+
|
|
|
if (tb[TCA_CODEL_INTERVAL]) {
|
|
|
u32 interval = nla_get_u32(tb[TCA_CODEL_INTERVAL]);
|
|
|
|
|
@@ -201,7 +208,10 @@ static int codel_dump(struct Qdisc *sch, struct sk_buff *skb)
|
|
|
nla_put_u32(skb, TCA_CODEL_ECN,
|
|
|
q->params.ecn))
|
|
|
goto nla_put_failure;
|
|
|
-
|
|
|
+ if (q->params.ce_threshold != CODEL_DISABLED_THRESHOLD &&
|
|
|
+ nla_put_u32(skb, TCA_CODEL_CE_THRESHOLD,
|
|
|
+ codel_time_to_us(q->params.ce_threshold)))
|
|
|
+ goto nla_put_failure;
|
|
|
return nla_nest_end(skb, opts);
|
|
|
|
|
|
nla_put_failure:
|
|
@@ -220,6 +230,7 @@ static int codel_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
|
|
|
.ldelay = codel_time_to_us(q->vars.ldelay),
|
|
|
.dropping = q->vars.dropping,
|
|
|
.ecn_mark = q->stats.ecn_mark,
|
|
|
+ .ce_mark = q->stats.ce_mark,
|
|
|
};
|
|
|
|
|
|
if (q->vars.dropping) {
|