17 #include <linux/module.h>
18 #include <linux/types.h>
19 #include <linux/kernel.h>
69 if (red_is_idling(&q->
vars))
70 red_end_of_idle_period(&q->
vars);
78 if (!red_use_ecn(q) || !INET_ECN_set_ce(skb)) {
88 if (red_use_harddrop(q) || !red_use_ecn(q) ||
89 !INET_ECN_set_ce(skb)) {
90 q->
stats.forced_drop++;
94 q->
stats.forced_mark++;
98 ret = qdisc_enqueue(skb, child);
108 qdisc_drop(skb, sch);
120 qdisc_bstats_update(sch, skb);
123 if (!red_is_idling(&q->
vars))
124 red_start_of_idle_period(&q->
vars);
134 return child->
ops->peek(child);
137 static unsigned int red_drop(
struct Qdisc *sch)
143 if (child->
ops->drop && (len = child->
ops->drop(child)) > 0) {
150 if (!red_is_idling(&q->
vars))
151 red_start_of_idle_period(&q->
vars);
156 static void red_reset(
struct Qdisc *sch)
162 red_restart(&q->
vars);
165 static void red_destroy(
struct Qdisc *sch)
191 err = nla_parse_nested(tb,
TCA_RED_MAX, opt, red_policy);
203 if (ctl->
limit > 0) {
206 return PTR_ERR(child);
218 red_set_parms(&q->
parms,
223 red_set_vars(&q->
vars);
229 if (!q->
qdisc->q.qlen)
230 red_start_of_idle_period(&q->
vars);
232 sch_tree_unlock(sch);
236 static inline void red_adaptative_timer(
unsigned long arg)
240 spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch));
242 spin_lock(root_lock);
243 red_adaptative_algo(&q->
parms, &q->
vars);
245 spin_unlock(root_lock);
248 static int red_init(
struct Qdisc *sch,
struct nlattr *opt)
254 return red_change(sch, opt);
257 static int red_dump(
struct Qdisc *sch,
struct sk_buff *skb)
266 .Wlog = q->
parms.Wlog,
267 .Plog = q->
parms.Plog,
268 .Scell_log = q->
parms.Scell_log,
274 goto nla_put_failure;
276 nla_put_u32(skb, TCA_RED_MAX_P, q->
parms.max_P))
277 goto nla_put_failure;
278 return nla_nest_end(skb, opts);
281 nla_nest_cancel(skb, opts);
289 .early = q->
stats.prob_drop + q->
stats.forced_drop,
290 .pdrop = q->
stats.pdrop,
291 .other = q->
stats.other,
292 .marked = q->
stats.prob_mark + q->
stats.forced_mark,
298 static int red_dump_class(
struct Qdisc *sch,
unsigned long cl,
308 static int red_graft(
struct Qdisc *sch,
unsigned long arg,
struct Qdisc *
new,
321 sch_tree_unlock(sch);
325 static struct Qdisc *red_leaf(
struct Qdisc *sch,
unsigned long arg)
331 static unsigned long red_get(
struct Qdisc *sch,
u32 classid)
336 static void red_put(
struct Qdisc *sch,
unsigned long arg)
344 if (walker->
fn(sch, 1, walker) < 0) {
358 .dump = red_dump_class,
364 .cl_ops = &red_class_ops,
365 .enqueue = red_enqueue,
366 .dequeue = red_dequeue,
371 .destroy = red_destroy,
372 .change = red_change,
374 .dump_stats = red_dump_stats,
378 static int __init red_module_init(
void)
383 static void __exit red_module_exit(
void)