[NET_SCHED]: sch_htb: use generic estimator
[safe/jmp/linux-2.6] / net / sched / sch_htb.c
1 /*
2  * net/sched/sch_htb.c  Hierarchical token bucket, feed tree version
3  *
4  *              This program is free software; you can redistribute it and/or
5  *              modify it under the terms of the GNU General Public License
6  *              as published by the Free Software Foundation; either version
7  *              2 of the License, or (at your option) any later version.
8  *
9  * Authors:     Martin Devera, <devik@cdi.cz>
10  *
11  * Credits (in time order) for older HTB versions:
12  *              Stef Coene <stef.coene@docum.org>
13  *                      HTB support at LARTC mailing list
14  *              Ondrej Kraus, <krauso@barr.cz>
15  *                      found missing INIT_QDISC(htb)
16  *              Vladimir Smelhaus, Aamer Akhter, Bert Hubert
17  *                      helped a lot to locate nasty class stall bug
18  *              Andi Kleen, Jamal Hadi, Bert Hubert
19  *                      code review and helpful comments on shaping
20  *              Tomasz Wrona, <tw@eter.tym.pl>
21  *                      created test case so that I was able to fix nasty bug
22  *              Wilfried Weissmann
23  *                      spotted bug in dequeue code and helped with fix
24  *              Jiri Fojtasek
25  *                      fixed requeue routine
26  *              and many others. thanks.
27  *
28  * $Id: sch_htb.c,v 1.25 2003/12/07 11:08:25 devik Exp devik $
29  */
30 #include <linux/module.h>
31 #include <asm/uaccess.h>
32 #include <asm/system.h>
33 #include <linux/bitops.h>
34 #include <linux/types.h>
35 #include <linux/kernel.h>
36 #include <linux/string.h>
37 #include <linux/mm.h>
38 #include <linux/socket.h>
39 #include <linux/sockios.h>
40 #include <linux/in.h>
41 #include <linux/errno.h>
42 #include <linux/interrupt.h>
43 #include <linux/if_ether.h>
44 #include <linux/inet.h>
45 #include <linux/netdevice.h>
46 #include <linux/etherdevice.h>
47 #include <linux/notifier.h>
48 #include <net/ip.h>
49 #include <net/route.h>
50 #include <linux/skbuff.h>
51 #include <linux/list.h>
52 #include <linux/compiler.h>
53 #include <net/netlink.h>
54 #include <net/sock.h>
55 #include <net/pkt_sched.h>
56 #include <linux/rbtree.h>
57
58 /* HTB algorithm.
59     Author: devik@cdi.cz
60     ========================================================================
61     HTB is like TBF with multiple classes. It is also similar to CBQ because
62     it allows to assign priority to each class in hierarchy.
63     In fact it is another implementation of Floyd's formal sharing.
64
65     Levels:
66     Each class is assigned level. Leaf has ALWAYS level 0 and root
67     classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level
68     one less than their parent.
69 */
70
71 #define HTB_HSIZE 16            /* classid hash size */
72 #define HTB_HYSTERESIS 1        /* whether to use mode hysteresis for speedup */
73 #define HTB_VER 0x30011         /* major must be matched with number suplied by TC as version */
74
75 #if HTB_VER >> 16 != TC_HTB_PROTOVER
76 #error "Mismatched sch_htb.c and pkt_sch.h"
77 #endif
78
79 /* used internaly to keep status of single class */
80 enum htb_cmode {
81         HTB_CANT_SEND,          /* class can't send and can't borrow */
82         HTB_MAY_BORROW,         /* class can't send but may borrow */
83         HTB_CAN_SEND            /* class can send */
84 };
85
86 /* interior & leaf nodes; props specific to leaves are marked L: */
87 struct htb_class {
88         /* general class parameters */
89         u32 classid;
90         struct gnet_stats_basic bstats;
91         struct gnet_stats_queue qstats;
92         struct gnet_stats_rate_est rate_est;
93         struct tc_htb_xstats xstats;    /* our special stats */
94         int refcnt;             /* usage count of this class */
95
96         /* topology */
97         int level;              /* our level (see above) */
98         struct htb_class *parent;       /* parent class */
99         struct hlist_node hlist;        /* classid hash list item */
100         struct list_head sibling;       /* sibling list item */
101         struct list_head children;      /* children list */
102
103         union {
104                 struct htb_class_leaf {
105                         struct Qdisc *q;
106                         int prio;
107                         int aprio;
108                         int quantum;
109                         int deficit[TC_HTB_MAXDEPTH];
110                         struct list_head drop_list;
111                 } leaf;
112                 struct htb_class_inner {
113                         struct rb_root feed[TC_HTB_NUMPRIO];    /* feed trees */
114                         struct rb_node *ptr[TC_HTB_NUMPRIO];    /* current class ptr */
115                         /* When class changes from state 1->2 and disconnects from
116                            parent's feed then we lost ptr value and start from the
117                            first child again. Here we store classid of the
118                            last valid ptr (used when ptr is NULL). */
119                         u32 last_ptr_id[TC_HTB_NUMPRIO];
120                 } inner;
121         } un;
122         struct rb_node node[TC_HTB_NUMPRIO];    /* node for self or feed tree */
123         struct rb_node pq_node; /* node for event queue */
124         psched_time_t pq_key;
125
126         int prio_activity;      /* for which prios are we active */
127         enum htb_cmode cmode;   /* current mode of the class */
128
129         /* class attached filters */
130         struct tcf_proto *filter_list;
131         int filter_cnt;
132
133         int warned;             /* only one warning about non work conserving .. */
134
135         /* token bucket parameters */
136         struct qdisc_rate_table *rate;  /* rate table of the class itself */
137         struct qdisc_rate_table *ceil;  /* ceiling rate (limits borrows too) */
138         long buffer, cbuffer;   /* token bucket depth/rate */
139         psched_tdiff_t mbuffer; /* max wait time */
140         long tokens, ctokens;   /* current number of tokens */
141         psched_time_t t_c;      /* checkpoint time */
142
143         int prio;               /* For parent to leaf return possible here */
144         int quantum;            /* we do backup. Finally full replacement  */
145                                 /* of un.leaf originals should be done. */
146 };
147
148 /* TODO: maybe compute rate when size is too large .. or drop ? */
149 static inline long L2T(struct htb_class *cl, struct qdisc_rate_table *rate,
150                            int size)
151 {
152         int slot = size >> rate->rate.cell_log;
153         if (slot > 255) {
154                 cl->xstats.giants++;
155                 slot = 255;
156         }
157         return rate->data[slot];
158 }
159
160 struct htb_sched {
161         struct list_head root;  /* root classes list */
162         struct hlist_head hash[HTB_HSIZE];      /* hashed by classid */
163         struct list_head drops[TC_HTB_NUMPRIO];/* active leaves (for drops) */
164
165         /* self list - roots of self generating tree */
166         struct rb_root row[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
167         int row_mask[TC_HTB_MAXDEPTH];
168         struct rb_node *ptr[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
169         u32 last_ptr_id[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
170
171         /* self wait list - roots of wait PQs per row */
172         struct rb_root wait_pq[TC_HTB_MAXDEPTH];
173
174         /* time of nearest event per level (row) */
175         psched_time_t near_ev_cache[TC_HTB_MAXDEPTH];
176
177         /* whether we hit non-work conserving class during this dequeue; we use */
178         int nwc_hit;            /* this to disable mindelay complaint in dequeue */
179
180         int defcls;             /* class where unclassified flows go to */
181
182         /* filters for qdisc itself */
183         struct tcf_proto *filter_list;
184         int filter_cnt;
185
186         int rate2quantum;       /* quant = rate / rate2quantum */
187         psched_time_t now;      /* cached dequeue time */
188         struct qdisc_watchdog watchdog;
189
190         /* non shaped skbs; let them go directly thru */
191         struct sk_buff_head direct_queue;
192         int direct_qlen;        /* max qlen of above */
193
194         long direct_pkts;
195 };
196
197 /* compute hash of size HTB_HSIZE for given handle */
198 static inline int htb_hash(u32 h)
199 {
200 #if HTB_HSIZE != 16
201 #error "Declare new hash for your HTB_HSIZE"
202 #endif
203         h ^= h >> 8;            /* stolen from cbq_hash */
204         h ^= h >> 4;
205         return h & 0xf;
206 }
207
208 /* find class in global hash table using given handle */
209 static inline struct htb_class *htb_find(u32 handle, struct Qdisc *sch)
210 {
211         struct htb_sched *q = qdisc_priv(sch);
212         struct hlist_node *p;
213         struct htb_class *cl;
214
215         if (TC_H_MAJ(handle) != sch->handle)
216                 return NULL;
217
218         hlist_for_each_entry(cl, p, q->hash + htb_hash(handle), hlist) {
219                 if (cl->classid == handle)
220                         return cl;
221         }
222         return NULL;
223 }
224
225 /**
226  * htb_classify - classify a packet into class
227  *
228  * It returns NULL if the packet should be dropped or -1 if the packet
229  * should be passed directly thru. In all other cases leaf class is returned.
230  * We allow direct class selection by classid in priority. The we examine
231  * filters in qdisc and in inner nodes (if higher filter points to the inner
232  * node). If we end up with classid MAJOR:0 we enqueue the skb into special
233  * internal fifo (direct). These packets then go directly thru. If we still
234  * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessfull
235  * then finish and return direct queue.
236  */
237 #define HTB_DIRECT (struct htb_class*)-1
238 static inline u32 htb_classid(struct htb_class *cl)
239 {
240         return (cl && cl != HTB_DIRECT) ? cl->classid : TC_H_UNSPEC;
241 }
242
243 static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
244                                       int *qerr)
245 {
246         struct htb_sched *q = qdisc_priv(sch);
247         struct htb_class *cl;
248         struct tcf_result res;
249         struct tcf_proto *tcf;
250         int result;
251
252         /* allow to select class by setting skb->priority to valid classid;
253            note that nfmark can be used too by attaching filter fw with no
254            rules in it */
255         if (skb->priority == sch->handle)
256                 return HTB_DIRECT;      /* X:0 (direct flow) selected */
257         if ((cl = htb_find(skb->priority, sch)) != NULL && cl->level == 0)
258                 return cl;
259
260         *qerr = NET_XMIT_BYPASS;
261         tcf = q->filter_list;
262         while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) {
263 #ifdef CONFIG_NET_CLS_ACT
264                 switch (result) {
265                 case TC_ACT_QUEUED:
266                 case TC_ACT_STOLEN:
267                         *qerr = NET_XMIT_SUCCESS;
268                 case TC_ACT_SHOT:
269                         return NULL;
270                 }
271 #elif defined(CONFIG_NET_CLS_POLICE)
272                 if (result == TC_POLICE_SHOT)
273                         return HTB_DIRECT;
274 #endif
275                 if ((cl = (void *)res.class) == NULL) {
276                         if (res.classid == sch->handle)
277                                 return HTB_DIRECT;      /* X:0 (direct flow) */
278                         if ((cl = htb_find(res.classid, sch)) == NULL)
279                                 break;  /* filter selected invalid classid */
280                 }
281                 if (!cl->level)
282                         return cl;      /* we hit leaf; return it */
283
284                 /* we have got inner class; apply inner filter chain */
285                 tcf = cl->filter_list;
286         }
287         /* classification failed; try to use default class */
288         cl = htb_find(TC_H_MAKE(TC_H_MAJ(sch->handle), q->defcls), sch);
289         if (!cl || cl->level)
290                 return HTB_DIRECT;      /* bad default .. this is safe bet */
291         return cl;
292 }
293
294 /**
295  * htb_add_to_id_tree - adds class to the round robin list
296  *
297  * Routine adds class to the list (actually tree) sorted by classid.
298  * Make sure that class is not already on such list for given prio.
299  */
300 static void htb_add_to_id_tree(struct rb_root *root,
301                                struct htb_class *cl, int prio)
302 {
303         struct rb_node **p = &root->rb_node, *parent = NULL;
304
305         while (*p) {
306                 struct htb_class *c;
307                 parent = *p;
308                 c = rb_entry(parent, struct htb_class, node[prio]);
309
310                 if (cl->classid > c->classid)
311                         p = &parent->rb_right;
312                 else
313                         p = &parent->rb_left;
314         }
315         rb_link_node(&cl->node[prio], parent, p);
316         rb_insert_color(&cl->node[prio], root);
317 }
318
319 /**
320  * htb_add_to_wait_tree - adds class to the event queue with delay
321  *
322  * The class is added to priority event queue to indicate that class will
323  * change its mode in cl->pq_key microseconds. Make sure that class is not
324  * already in the queue.
325  */
326 static void htb_add_to_wait_tree(struct htb_sched *q,
327                                  struct htb_class *cl, long delay)
328 {
329         struct rb_node **p = &q->wait_pq[cl->level].rb_node, *parent = NULL;
330
331         cl->pq_key = q->now + delay;
332         if (cl->pq_key == q->now)
333                 cl->pq_key++;
334
335         /* update the nearest event cache */
336         if (q->near_ev_cache[cl->level] > cl->pq_key)
337                 q->near_ev_cache[cl->level] = cl->pq_key;
338
339         while (*p) {
340                 struct htb_class *c;
341                 parent = *p;
342                 c = rb_entry(parent, struct htb_class, pq_node);
343                 if (cl->pq_key >= c->pq_key)
344                         p = &parent->rb_right;
345                 else
346                         p = &parent->rb_left;
347         }
348         rb_link_node(&cl->pq_node, parent, p);
349         rb_insert_color(&cl->pq_node, &q->wait_pq[cl->level]);
350 }
351
352 /**
353  * htb_next_rb_node - finds next node in binary tree
354  *
355  * When we are past last key we return NULL.
356  * Average complexity is 2 steps per call.
357  */
358 static inline void htb_next_rb_node(struct rb_node **n)
359 {
360         *n = rb_next(*n);
361 }
362
363 /**
364  * htb_add_class_to_row - add class to its row
365  *
366  * The class is added to row at priorities marked in mask.
367  * It does nothing if mask == 0.
368  */
369 static inline void htb_add_class_to_row(struct htb_sched *q,
370                                         struct htb_class *cl, int mask)
371 {
372         q->row_mask[cl->level] |= mask;
373         while (mask) {
374                 int prio = ffz(~mask);
375                 mask &= ~(1 << prio);
376                 htb_add_to_id_tree(q->row[cl->level] + prio, cl, prio);
377         }
378 }
379
380 /* If this triggers, it is a bug in this code, but it need not be fatal */
381 static void htb_safe_rb_erase(struct rb_node *rb, struct rb_root *root)
382 {
383         if (RB_EMPTY_NODE(rb)) {
384                 WARN_ON(1);
385         } else {
386                 rb_erase(rb, root);
387                 RB_CLEAR_NODE(rb);
388         }
389 }
390
391
392 /**
393  * htb_remove_class_from_row - removes class from its row
394  *
395  * The class is removed from row at priorities marked in mask.
396  * It does nothing if mask == 0.
397  */
398 static inline void htb_remove_class_from_row(struct htb_sched *q,
399                                                  struct htb_class *cl, int mask)
400 {
401         int m = 0;
402
403         while (mask) {
404                 int prio = ffz(~mask);
405
406                 mask &= ~(1 << prio);
407                 if (q->ptr[cl->level][prio] == cl->node + prio)
408                         htb_next_rb_node(q->ptr[cl->level] + prio);
409
410                 htb_safe_rb_erase(cl->node + prio, q->row[cl->level] + prio);
411                 if (!q->row[cl->level][prio].rb_node)
412                         m |= 1 << prio;
413         }
414         q->row_mask[cl->level] &= ~m;
415 }
416
417 /**
418  * htb_activate_prios - creates active classe's feed chain
419  *
420  * The class is connected to ancestors and/or appropriate rows
421  * for priorities it is participating on. cl->cmode must be new
422  * (activated) mode. It does nothing if cl->prio_activity == 0.
423  */
424 static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl)
425 {
426         struct htb_class *p = cl->parent;
427         long m, mask = cl->prio_activity;
428
429         while (cl->cmode == HTB_MAY_BORROW && p && mask) {
430                 m = mask;
431                 while (m) {
432                         int prio = ffz(~m);
433                         m &= ~(1 << prio);
434
435                         if (p->un.inner.feed[prio].rb_node)
436                                 /* parent already has its feed in use so that
437                                    reset bit in mask as parent is already ok */
438                                 mask &= ~(1 << prio);
439
440                         htb_add_to_id_tree(p->un.inner.feed + prio, cl, prio);
441                 }
442                 p->prio_activity |= mask;
443                 cl = p;
444                 p = cl->parent;
445
446         }
447         if (cl->cmode == HTB_CAN_SEND && mask)
448                 htb_add_class_to_row(q, cl, mask);
449 }
450
451 /**
452  * htb_deactivate_prios - remove class from feed chain
453  *
454  * cl->cmode must represent old mode (before deactivation). It does
455  * nothing if cl->prio_activity == 0. Class is removed from all feed
456  * chains and rows.
457  */
458 static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl)
459 {
460         struct htb_class *p = cl->parent;
461         long m, mask = cl->prio_activity;
462
463         while (cl->cmode == HTB_MAY_BORROW && p && mask) {
464                 m = mask;
465                 mask = 0;
466                 while (m) {
467                         int prio = ffz(~m);
468                         m &= ~(1 << prio);
469
470                         if (p->un.inner.ptr[prio] == cl->node + prio) {
471                                 /* we are removing child which is pointed to from
472                                    parent feed - forget the pointer but remember
473                                    classid */
474                                 p->un.inner.last_ptr_id[prio] = cl->classid;
475                                 p->un.inner.ptr[prio] = NULL;
476                         }
477
478                         htb_safe_rb_erase(cl->node + prio, p->un.inner.feed + prio);
479
480                         if (!p->un.inner.feed[prio].rb_node)
481                                 mask |= 1 << prio;
482                 }
483
484                 p->prio_activity &= ~mask;
485                 cl = p;
486                 p = cl->parent;
487
488         }
489         if (cl->cmode == HTB_CAN_SEND && mask)
490                 htb_remove_class_from_row(q, cl, mask);
491 }
492
493 #if HTB_HYSTERESIS
494 static inline long htb_lowater(const struct htb_class *cl)
495 {
496         return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0;
497 }
498 static inline long htb_hiwater(const struct htb_class *cl)
499 {
500         return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0;
501 }
502 #else
503 #define htb_lowater(cl) (0)
504 #define htb_hiwater(cl) (0)
505 #endif
506
507 /**
508  * htb_class_mode - computes and returns current class mode
509  *
510  * It computes cl's mode at time cl->t_c+diff and returns it. If mode
511  * is not HTB_CAN_SEND then cl->pq_key is updated to time difference
512  * from now to time when cl will change its state.
513  * Also it is worth to note that class mode doesn't change simply
514  * at cl->{c,}tokens == 0 but there can rather be hysteresis of
515  * 0 .. -cl->{c,}buffer range. It is meant to limit number of
516  * mode transitions per time unit. The speed gain is about 1/6.
517  */
518 static inline enum htb_cmode
519 htb_class_mode(struct htb_class *cl, long *diff)
520 {
521         long toks;
522
523         if ((toks = (cl->ctokens + *diff)) < htb_lowater(cl)) {
524                 *diff = -toks;
525                 return HTB_CANT_SEND;
526         }
527
528         if ((toks = (cl->tokens + *diff)) >= htb_hiwater(cl))
529                 return HTB_CAN_SEND;
530
531         *diff = -toks;
532         return HTB_MAY_BORROW;
533 }
534
535 /**
536  * htb_change_class_mode - changes classe's mode
537  *
538  * This should be the only way how to change classe's mode under normal
539  * cirsumstances. Routine will update feed lists linkage, change mode
540  * and add class to the wait event queue if appropriate. New mode should
541  * be different from old one and cl->pq_key has to be valid if changing
542  * to mode other than HTB_CAN_SEND (see htb_add_to_wait_tree).
543  */
544 static void
545 htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, long *diff)
546 {
547         enum htb_cmode new_mode = htb_class_mode(cl, diff);
548
549         if (new_mode == cl->cmode)
550                 return;
551
552         if (cl->prio_activity) {        /* not necessary: speed optimization */
553                 if (cl->cmode != HTB_CANT_SEND)
554                         htb_deactivate_prios(q, cl);
555                 cl->cmode = new_mode;
556                 if (new_mode != HTB_CANT_SEND)
557                         htb_activate_prios(q, cl);
558         } else
559                 cl->cmode = new_mode;
560 }
561
562 /**
563  * htb_activate - inserts leaf cl into appropriate active feeds
564  *
565  * Routine learns (new) priority of leaf and activates feed chain
566  * for the prio. It can be called on already active leaf safely.
567  * It also adds leaf into droplist.
568  */
569 static inline void htb_activate(struct htb_sched *q, struct htb_class *cl)
570 {
571         BUG_TRAP(!cl->level && cl->un.leaf.q && cl->un.leaf.q->q.qlen);
572
573         if (!cl->prio_activity) {
574                 cl->prio_activity = 1 << (cl->un.leaf.aprio = cl->un.leaf.prio);
575                 htb_activate_prios(q, cl);
576                 list_add_tail(&cl->un.leaf.drop_list,
577                               q->drops + cl->un.leaf.aprio);
578         }
579 }
580
581 /**
582  * htb_deactivate - remove leaf cl from active feeds
583  *
584  * Make sure that leaf is active. In the other words it can't be called
585  * with non-active leaf. It also removes class from the drop list.
586  */
587 static inline void htb_deactivate(struct htb_sched *q, struct htb_class *cl)
588 {
589         BUG_TRAP(cl->prio_activity);
590
591         htb_deactivate_prios(q, cl);
592         cl->prio_activity = 0;
593         list_del_init(&cl->un.leaf.drop_list);
594 }
595
596 static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
597 {
598         int ret;
599         struct htb_sched *q = qdisc_priv(sch);
600         struct htb_class *cl = htb_classify(skb, sch, &ret);
601
602         if (cl == HTB_DIRECT) {
603                 /* enqueue to helper queue */
604                 if (q->direct_queue.qlen < q->direct_qlen) {
605                         __skb_queue_tail(&q->direct_queue, skb);
606                         q->direct_pkts++;
607                 } else {
608                         kfree_skb(skb);
609                         sch->qstats.drops++;
610                         return NET_XMIT_DROP;
611                 }
612 #ifdef CONFIG_NET_CLS_ACT
613         } else if (!cl) {
614                 if (ret == NET_XMIT_BYPASS)
615                         sch->qstats.drops++;
616                 kfree_skb(skb);
617                 return ret;
618 #endif
619         } else if (cl->un.leaf.q->enqueue(skb, cl->un.leaf.q) !=
620                    NET_XMIT_SUCCESS) {
621                 sch->qstats.drops++;
622                 cl->qstats.drops++;
623                 return NET_XMIT_DROP;
624         } else {
625                 cl->bstats.packets++;
626                 cl->bstats.bytes += skb->len;
627                 htb_activate(q, cl);
628         }
629
630         sch->q.qlen++;
631         sch->bstats.packets++;
632         sch->bstats.bytes += skb->len;
633         return NET_XMIT_SUCCESS;
634 }
635
636 /* TODO: requeuing packet charges it to policers again !! */
637 static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch)
638 {
639         struct htb_sched *q = qdisc_priv(sch);
640         int ret = NET_XMIT_SUCCESS;
641         struct htb_class *cl = htb_classify(skb, sch, &ret);
642         struct sk_buff *tskb;
643
644         if (cl == HTB_DIRECT || !cl) {
645                 /* enqueue to helper queue */
646                 if (q->direct_queue.qlen < q->direct_qlen && cl) {
647                         __skb_queue_head(&q->direct_queue, skb);
648                 } else {
649                         __skb_queue_head(&q->direct_queue, skb);
650                         tskb = __skb_dequeue_tail(&q->direct_queue);
651                         kfree_skb(tskb);
652                         sch->qstats.drops++;
653                         return NET_XMIT_CN;
654                 }
655         } else if (cl->un.leaf.q->ops->requeue(skb, cl->un.leaf.q) !=
656                    NET_XMIT_SUCCESS) {
657                 sch->qstats.drops++;
658                 cl->qstats.drops++;
659                 return NET_XMIT_DROP;
660         } else
661                 htb_activate(q, cl);
662
663         sch->q.qlen++;
664         sch->qstats.requeues++;
665         return NET_XMIT_SUCCESS;
666 }
667
668 /**
669  * htb_charge_class - charges amount "bytes" to leaf and ancestors
670  *
671  * Routine assumes that packet "bytes" long was dequeued from leaf cl
672  * borrowing from "level". It accounts bytes to ceil leaky bucket for
673  * leaf and all ancestors and to rate bucket for ancestors at levels
674  * "level" and higher. It also handles possible change of mode resulting
675  * from the update. Note that mode can also increase here (MAY_BORROW to
676  * CAN_SEND) because we can use more precise clock that event queue here.
677  * In such case we remove class from event queue first.
678  */
679 static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
680                              int level, int bytes)
681 {
682         long toks, diff;
683         enum htb_cmode old_mode;
684
685 #define HTB_ACCNT(T,B,R) toks = diff + cl->T; \
686         if (toks > cl->B) toks = cl->B; \
687         toks -= L2T(cl, cl->R, bytes); \
688         if (toks <= -cl->mbuffer) toks = 1-cl->mbuffer; \
689         cl->T = toks
690
691         while (cl) {
692                 diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
693                 if (cl->level >= level) {
694                         if (cl->level == level)
695                                 cl->xstats.lends++;
696                         HTB_ACCNT(tokens, buffer, rate);
697                 } else {
698                         cl->xstats.borrows++;
699                         cl->tokens += diff;     /* we moved t_c; update tokens */
700                 }
701                 HTB_ACCNT(ctokens, cbuffer, ceil);
702                 cl->t_c = q->now;
703
704                 old_mode = cl->cmode;
705                 diff = 0;
706                 htb_change_class_mode(q, cl, &diff);
707                 if (old_mode != cl->cmode) {
708                         if (old_mode != HTB_CAN_SEND)
709                                 htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
710                         if (cl->cmode != HTB_CAN_SEND)
711                                 htb_add_to_wait_tree(q, cl, diff);
712                 }
713
714                 /* update byte stats except for leaves which are already updated */
715                 if (cl->level) {
716                         cl->bstats.bytes += bytes;
717                         cl->bstats.packets++;
718                 }
719                 cl = cl->parent;
720         }
721 }
722
723 /**
724  * htb_do_events - make mode changes to classes at the level
725  *
726  * Scans event queue for pending events and applies them. Returns time of
727  * next pending event (0 for no event in pq).
728  * Note: Applied are events whose have cl->pq_key <= q->now.
729  */
730 static psched_time_t htb_do_events(struct htb_sched *q, int level)
731 {
732         int i;
733
734         for (i = 0; i < 500; i++) {
735                 struct htb_class *cl;
736                 long diff;
737                 struct rb_node *p = rb_first(&q->wait_pq[level]);
738
739                 if (!p)
740                         return 0;
741
742                 cl = rb_entry(p, struct htb_class, pq_node);
743                 if (cl->pq_key > q->now)
744                         return cl->pq_key;
745
746                 htb_safe_rb_erase(p, q->wait_pq + level);
747                 diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
748                 htb_change_class_mode(q, cl, &diff);
749                 if (cl->cmode != HTB_CAN_SEND)
750                         htb_add_to_wait_tree(q, cl, diff);
751         }
752         if (net_ratelimit())
753                 printk(KERN_WARNING "htb: too many events !\n");
754         return q->now + PSCHED_TICKS_PER_SEC / 10;
755 }
756
757 /* Returns class->node+prio from id-tree where classe's id is >= id. NULL
758    is no such one exists. */
759 static struct rb_node *htb_id_find_next_upper(int prio, struct rb_node *n,
760                                               u32 id)
761 {
762         struct rb_node *r = NULL;
763         while (n) {
764                 struct htb_class *cl =
765                     rb_entry(n, struct htb_class, node[prio]);
766                 if (id == cl->classid)
767                         return n;
768
769                 if (id > cl->classid) {
770                         n = n->rb_right;
771                 } else {
772                         r = n;
773                         n = n->rb_left;
774                 }
775         }
776         return r;
777 }
778
779 /**
780  * htb_lookup_leaf - returns next leaf class in DRR order
781  *
782  * Find leaf where current feed pointers points to.
783  */
784 static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
785                                          struct rb_node **pptr, u32 * pid)
786 {
787         int i;
788         struct {
789                 struct rb_node *root;
790                 struct rb_node **pptr;
791                 u32 *pid;
792         } stk[TC_HTB_MAXDEPTH], *sp = stk;
793
794         BUG_TRAP(tree->rb_node);
795         sp->root = tree->rb_node;
796         sp->pptr = pptr;
797         sp->pid = pid;
798
799         for (i = 0; i < 65535; i++) {
800                 if (!*sp->pptr && *sp->pid) {
801                         /* ptr was invalidated but id is valid - try to recover
802                            the original or next ptr */
803                         *sp->pptr =
804                             htb_id_find_next_upper(prio, sp->root, *sp->pid);
805                 }
806                 *sp->pid = 0;   /* ptr is valid now so that remove this hint as it
807                                    can become out of date quickly */
808                 if (!*sp->pptr) {       /* we are at right end; rewind & go up */
809                         *sp->pptr = sp->root;
810                         while ((*sp->pptr)->rb_left)
811                                 *sp->pptr = (*sp->pptr)->rb_left;
812                         if (sp > stk) {
813                                 sp--;
814                                 BUG_TRAP(*sp->pptr);
815                                 if (!*sp->pptr)
816                                         return NULL;
817                                 htb_next_rb_node(sp->pptr);
818                         }
819                 } else {
820                         struct htb_class *cl;
821                         cl = rb_entry(*sp->pptr, struct htb_class, node[prio]);
822                         if (!cl->level)
823                                 return cl;
824                         (++sp)->root = cl->un.inner.feed[prio].rb_node;
825                         sp->pptr = cl->un.inner.ptr + prio;
826                         sp->pid = cl->un.inner.last_ptr_id + prio;
827                 }
828         }
829         BUG_TRAP(0);
830         return NULL;
831 }
832
833 /* dequeues packet at given priority and level; call only if
834    you are sure that there is active class at prio/level */
835 static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, int prio,
836                                         int level)
837 {
838         struct sk_buff *skb = NULL;
839         struct htb_class *cl, *start;
840         /* look initial class up in the row */
841         start = cl = htb_lookup_leaf(q->row[level] + prio, prio,
842                                      q->ptr[level] + prio,
843                                      q->last_ptr_id[level] + prio);
844
845         do {
846 next:
847                 BUG_TRAP(cl);
848                 if (!cl)
849                         return NULL;
850
851                 /* class can be empty - it is unlikely but can be true if leaf
852                    qdisc drops packets in enqueue routine or if someone used
853                    graft operation on the leaf since last dequeue;
854                    simply deactivate and skip such class */
855                 if (unlikely(cl->un.leaf.q->q.qlen == 0)) {
856                         struct htb_class *next;
857                         htb_deactivate(q, cl);
858
859                         /* row/level might become empty */
860                         if ((q->row_mask[level] & (1 << prio)) == 0)
861                                 return NULL;
862
863                         next = htb_lookup_leaf(q->row[level] + prio,
864                                                prio, q->ptr[level] + prio,
865                                                q->last_ptr_id[level] + prio);
866
867                         if (cl == start)        /* fix start if we just deleted it */
868                                 start = next;
869                         cl = next;
870                         goto next;
871                 }
872
873                 skb = cl->un.leaf.q->dequeue(cl->un.leaf.q);
874                 if (likely(skb != NULL))
875                         break;
876                 if (!cl->warned) {
877                         printk(KERN_WARNING
878                                "htb: class %X isn't work conserving ?!\n",
879                                cl->classid);
880                         cl->warned = 1;
881                 }
882                 q->nwc_hit++;
883                 htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
884                                   ptr[0]) + prio);
885                 cl = htb_lookup_leaf(q->row[level] + prio, prio,
886                                      q->ptr[level] + prio,
887                                      q->last_ptr_id[level] + prio);
888
889         } while (cl != start);
890
891         if (likely(skb != NULL)) {
892                 if ((cl->un.leaf.deficit[level] -= skb->len) < 0) {
893                         cl->un.leaf.deficit[level] += cl->un.leaf.quantum;
894                         htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
895                                           ptr[0]) + prio);
896                 }
897                 /* this used to be after charge_class but this constelation
898                    gives us slightly better performance */
899                 if (!cl->un.leaf.q->q.qlen)
900                         htb_deactivate(q, cl);
901                 htb_charge_class(q, cl, level, skb->len);
902         }
903         return skb;
904 }
905
906 static struct sk_buff *htb_dequeue(struct Qdisc *sch)
907 {
908         struct sk_buff *skb = NULL;
909         struct htb_sched *q = qdisc_priv(sch);
910         int level;
911         psched_time_t next_event;
912
913         /* try to dequeue direct packets as high prio (!) to minimize cpu work */
914         skb = __skb_dequeue(&q->direct_queue);
915         if (skb != NULL) {
916                 sch->flags &= ~TCQ_F_THROTTLED;
917                 sch->q.qlen--;
918                 return skb;
919         }
920
921         if (!sch->q.qlen)
922                 goto fin;
923         q->now = psched_get_time();
924
925         next_event = q->now + 5 * PSCHED_TICKS_PER_SEC;
926         q->nwc_hit = 0;
927         for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
928                 /* common case optimization - skip event handler quickly */
929                 int m;
930                 psched_time_t event;
931
932                 if (q->now >= q->near_ev_cache[level]) {
933                         event = htb_do_events(q, level);
934                         if (!event)
935                                 event = q->now + PSCHED_TICKS_PER_SEC;
936                         q->near_ev_cache[level] = event;
937                 } else
938                         event = q->near_ev_cache[level];
939
940                 if (event && next_event > event)
941                         next_event = event;
942
943                 m = ~q->row_mask[level];
944                 while (m != (int)(-1)) {
945                         int prio = ffz(m);
946                         m |= 1 << prio;
947                         skb = htb_dequeue_tree(q, prio, level);
948                         if (likely(skb != NULL)) {
949                                 sch->q.qlen--;
950                                 sch->flags &= ~TCQ_F_THROTTLED;
951                                 goto fin;
952                         }
953                 }
954         }
955         sch->qstats.overlimits++;
956         qdisc_watchdog_schedule(&q->watchdog, next_event);
957 fin:
958         return skb;
959 }
960
961 /* try to drop from each class (by prio) until one succeed */
962 static unsigned int htb_drop(struct Qdisc *sch)
963 {
964         struct htb_sched *q = qdisc_priv(sch);
965         int prio;
966
967         for (prio = TC_HTB_NUMPRIO - 1; prio >= 0; prio--) {
968                 struct list_head *p;
969                 list_for_each(p, q->drops + prio) {
970                         struct htb_class *cl = list_entry(p, struct htb_class,
971                                                           un.leaf.drop_list);
972                         unsigned int len;
973                         if (cl->un.leaf.q->ops->drop &&
974                             (len = cl->un.leaf.q->ops->drop(cl->un.leaf.q))) {
975                                 sch->q.qlen--;
976                                 if (!cl->un.leaf.q->q.qlen)
977                                         htb_deactivate(q, cl);
978                                 return len;
979                         }
980                 }
981         }
982         return 0;
983 }
984
985 /* reset all classes */
986 /* always caled under BH & queue lock */
987 static void htb_reset(struct Qdisc *sch)
988 {
989         struct htb_sched *q = qdisc_priv(sch);
990         int i;
991
992         for (i = 0; i < HTB_HSIZE; i++) {
993                 struct hlist_node *p;
994                 struct htb_class *cl;
995
996                 hlist_for_each_entry(cl, p, q->hash + i, hlist) {
997                         if (cl->level)
998                                 memset(&cl->un.inner, 0, sizeof(cl->un.inner));
999                         else {
1000                                 if (cl->un.leaf.q)
1001                                         qdisc_reset(cl->un.leaf.q);
1002                                 INIT_LIST_HEAD(&cl->un.leaf.drop_list);
1003                         }
1004                         cl->prio_activity = 0;
1005                         cl->cmode = HTB_CAN_SEND;
1006
1007                 }
1008         }
1009         qdisc_watchdog_cancel(&q->watchdog);
1010         __skb_queue_purge(&q->direct_queue);
1011         sch->q.qlen = 0;
1012         memset(q->row, 0, sizeof(q->row));
1013         memset(q->row_mask, 0, sizeof(q->row_mask));
1014         memset(q->wait_pq, 0, sizeof(q->wait_pq));
1015         memset(q->ptr, 0, sizeof(q->ptr));
1016         for (i = 0; i < TC_HTB_NUMPRIO; i++)
1017                 INIT_LIST_HEAD(q->drops + i);
1018 }
1019
1020 static int htb_init(struct Qdisc *sch, struct rtattr *opt)
1021 {
1022         struct htb_sched *q = qdisc_priv(sch);
1023         struct rtattr *tb[TCA_HTB_INIT];
1024         struct tc_htb_glob *gopt;
1025         int i;
1026         if (!opt || rtattr_parse_nested(tb, TCA_HTB_INIT, opt) ||
1027             tb[TCA_HTB_INIT - 1] == NULL ||
1028             RTA_PAYLOAD(tb[TCA_HTB_INIT - 1]) < sizeof(*gopt)) {
1029                 printk(KERN_ERR "HTB: hey probably you have bad tc tool ?\n");
1030                 return -EINVAL;
1031         }
1032         gopt = RTA_DATA(tb[TCA_HTB_INIT - 1]);
1033         if (gopt->version != HTB_VER >> 16) {
1034                 printk(KERN_ERR
1035                        "HTB: need tc/htb version %d (minor is %d), you have %d\n",
1036                        HTB_VER >> 16, HTB_VER & 0xffff, gopt->version);
1037                 return -EINVAL;
1038         }
1039
1040         INIT_LIST_HEAD(&q->root);
1041         for (i = 0; i < HTB_HSIZE; i++)
1042                 INIT_HLIST_HEAD(q->hash + i);
1043         for (i = 0; i < TC_HTB_NUMPRIO; i++)
1044                 INIT_LIST_HEAD(q->drops + i);
1045
1046         qdisc_watchdog_init(&q->watchdog, sch);
1047         skb_queue_head_init(&q->direct_queue);
1048
1049         q->direct_qlen = sch->dev->tx_queue_len;
1050         if (q->direct_qlen < 2) /* some devices have zero tx_queue_len */
1051                 q->direct_qlen = 2;
1052
1053         if ((q->rate2quantum = gopt->rate2quantum) < 1)
1054                 q->rate2quantum = 1;
1055         q->defcls = gopt->defcls;
1056
1057         return 0;
1058 }
1059
1060 static int htb_dump(struct Qdisc *sch, struct sk_buff *skb)
1061 {
1062         struct htb_sched *q = qdisc_priv(sch);
1063         unsigned char *b = skb_tail_pointer(skb);
1064         struct rtattr *rta;
1065         struct tc_htb_glob gopt;
1066         spin_lock_bh(&sch->dev->queue_lock);
1067         gopt.direct_pkts = q->direct_pkts;
1068
1069         gopt.version = HTB_VER;
1070         gopt.rate2quantum = q->rate2quantum;
1071         gopt.defcls = q->defcls;
1072         gopt.debug = 0;
1073         rta = (struct rtattr *)b;
1074         RTA_PUT(skb, TCA_OPTIONS, 0, NULL);
1075         RTA_PUT(skb, TCA_HTB_INIT, sizeof(gopt), &gopt);
1076         rta->rta_len = skb_tail_pointer(skb) - b;
1077         spin_unlock_bh(&sch->dev->queue_lock);
1078         return skb->len;
1079 rtattr_failure:
1080         spin_unlock_bh(&sch->dev->queue_lock);
1081         nlmsg_trim(skb, skb_tail_pointer(skb));
1082         return -1;
1083 }
1084
1085 static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
1086                           struct sk_buff *skb, struct tcmsg *tcm)
1087 {
1088         struct htb_class *cl = (struct htb_class *)arg;
1089         unsigned char *b = skb_tail_pointer(skb);
1090         struct rtattr *rta;
1091         struct tc_htb_opt opt;
1092
1093         spin_lock_bh(&sch->dev->queue_lock);
1094         tcm->tcm_parent = cl->parent ? cl->parent->classid : TC_H_ROOT;
1095         tcm->tcm_handle = cl->classid;
1096         if (!cl->level && cl->un.leaf.q)
1097                 tcm->tcm_info = cl->un.leaf.q->handle;
1098
1099         rta = (struct rtattr *)b;
1100         RTA_PUT(skb, TCA_OPTIONS, 0, NULL);
1101
1102         memset(&opt, 0, sizeof(opt));
1103
1104         opt.rate = cl->rate->rate;
1105         opt.buffer = cl->buffer;
1106         opt.ceil = cl->ceil->rate;
1107         opt.cbuffer = cl->cbuffer;
1108         opt.quantum = cl->un.leaf.quantum;
1109         opt.prio = cl->un.leaf.prio;
1110         opt.level = cl->level;
1111         RTA_PUT(skb, TCA_HTB_PARMS, sizeof(opt), &opt);
1112         rta->rta_len = skb_tail_pointer(skb) - b;
1113         spin_unlock_bh(&sch->dev->queue_lock);
1114         return skb->len;
1115 rtattr_failure:
1116         spin_unlock_bh(&sch->dev->queue_lock);
1117         nlmsg_trim(skb, b);
1118         return -1;
1119 }
1120
1121 static int
1122 htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d)
1123 {
1124         struct htb_class *cl = (struct htb_class *)arg;
1125
1126         if (!cl->level && cl->un.leaf.q)
1127                 cl->qstats.qlen = cl->un.leaf.q->q.qlen;
1128         cl->xstats.tokens = cl->tokens;
1129         cl->xstats.ctokens = cl->ctokens;
1130
1131         if (gnet_stats_copy_basic(d, &cl->bstats) < 0 ||
1132             gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
1133             gnet_stats_copy_queue(d, &cl->qstats) < 0)
1134                 return -1;
1135
1136         return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
1137 }
1138
1139 static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
1140                      struct Qdisc **old)
1141 {
1142         struct htb_class *cl = (struct htb_class *)arg;
1143
1144         if (cl && !cl->level) {
1145                 if (new == NULL &&
1146                     (new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops,
1147                                              cl->classid))
1148                     == NULL)
1149                         return -ENOBUFS;
1150                 sch_tree_lock(sch);
1151                 if ((*old = xchg(&cl->un.leaf.q, new)) != NULL) {
1152                         qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
1153                         qdisc_reset(*old);
1154                 }
1155                 sch_tree_unlock(sch);
1156                 return 0;
1157         }
1158         return -ENOENT;
1159 }
1160
1161 static struct Qdisc *htb_leaf(struct Qdisc *sch, unsigned long arg)
1162 {
1163         struct htb_class *cl = (struct htb_class *)arg;
1164         return (cl && !cl->level) ? cl->un.leaf.q : NULL;
1165 }
1166
1167 static void htb_qlen_notify(struct Qdisc *sch, unsigned long arg)
1168 {
1169         struct htb_class *cl = (struct htb_class *)arg;
1170
1171         if (cl->un.leaf.q->q.qlen == 0)
1172                 htb_deactivate(qdisc_priv(sch), cl);
1173 }
1174
1175 static unsigned long htb_get(struct Qdisc *sch, u32 classid)
1176 {
1177         struct htb_class *cl = htb_find(classid, sch);
1178         if (cl)
1179                 cl->refcnt++;
1180         return (unsigned long)cl;
1181 }
1182
1183 static inline int htb_parent_last_child(struct htb_class *cl)
1184 {
1185         if (!cl->parent)
1186                 /* the root class */
1187                 return 0;
1188
1189         if (!(cl->parent->children.next == &cl->sibling &&
1190                 cl->parent->children.prev == &cl->sibling))
1191                 /* not the last child */
1192                 return 0;
1193
1194         return 1;
1195 }
1196
1197 static void htb_parent_to_leaf(struct htb_class *cl, struct Qdisc *new_q)
1198 {
1199         struct htb_class *parent = cl->parent;
1200
1201         BUG_TRAP(!cl->level && cl->un.leaf.q && !cl->prio_activity);
1202
1203         parent->level = 0;
1204         memset(&parent->un.inner, 0, sizeof(parent->un.inner));
1205         INIT_LIST_HEAD(&parent->un.leaf.drop_list);
1206         parent->un.leaf.q = new_q ? new_q : &noop_qdisc;
1207         parent->un.leaf.quantum = parent->quantum;
1208         parent->un.leaf.prio = parent->prio;
1209         parent->tokens = parent->buffer;
1210         parent->ctokens = parent->cbuffer;
1211         parent->t_c = psched_get_time();
1212         parent->cmode = HTB_CAN_SEND;
1213 }
1214
1215 static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
1216 {
1217         struct htb_sched *q = qdisc_priv(sch);
1218
1219         if (!cl->level) {
1220                 BUG_TRAP(cl->un.leaf.q);
1221                 qdisc_destroy(cl->un.leaf.q);
1222         }
1223         gen_kill_estimator(&cl->bstats, &cl->rate_est);
1224         qdisc_put_rtab(cl->rate);
1225         qdisc_put_rtab(cl->ceil);
1226
1227         tcf_destroy_chain(cl->filter_list);
1228
1229         while (!list_empty(&cl->children))
1230                 htb_destroy_class(sch, list_entry(cl->children.next,
1231                                                   struct htb_class, sibling));
1232
1233         /* note: this delete may happen twice (see htb_delete) */
1234         hlist_del_init(&cl->hlist);
1235         list_del(&cl->sibling);
1236
1237         if (cl->prio_activity)
1238                 htb_deactivate(q, cl);
1239
1240         if (cl->cmode != HTB_CAN_SEND)
1241                 htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
1242
1243         kfree(cl);
1244 }
1245
1246 /* always caled under BH & queue lock */
1247 static void htb_destroy(struct Qdisc *sch)
1248 {
1249         struct htb_sched *q = qdisc_priv(sch);
1250
1251         qdisc_watchdog_cancel(&q->watchdog);
1252         /* This line used to be after htb_destroy_class call below
1253            and surprisingly it worked in 2.4. But it must precede it
1254            because filter need its target class alive to be able to call
1255            unbind_filter on it (without Oops). */
1256         tcf_destroy_chain(q->filter_list);
1257
1258         while (!list_empty(&q->root))
1259                 htb_destroy_class(sch, list_entry(q->root.next,
1260                                                   struct htb_class, sibling));
1261
1262         __skb_queue_purge(&q->direct_queue);
1263 }
1264
1265 static int htb_delete(struct Qdisc *sch, unsigned long arg)
1266 {
1267         struct htb_sched *q = qdisc_priv(sch);
1268         struct htb_class *cl = (struct htb_class *)arg;
1269         unsigned int qlen;
1270         struct Qdisc *new_q = NULL;
1271         int last_child = 0;
1272
1273         // TODO: why don't allow to delete subtree ? references ? does
1274         // tc subsys quarantee us that in htb_destroy it holds no class
1275         // refs so that we can remove children safely there ?
1276         if (!list_empty(&cl->children) || cl->filter_cnt)
1277                 return -EBUSY;
1278
1279         if (!cl->level && htb_parent_last_child(cl)) {
1280                 new_q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops,
1281                                                 cl->parent->classid);
1282                 last_child = 1;
1283         }
1284
1285         sch_tree_lock(sch);
1286
1287         if (!cl->level) {
1288                 qlen = cl->un.leaf.q->q.qlen;
1289                 qdisc_reset(cl->un.leaf.q);
1290                 qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen);
1291         }
1292
1293         /* delete from hash and active; remainder in destroy_class */
1294         hlist_del_init(&cl->hlist);
1295
1296         if (cl->prio_activity)
1297                 htb_deactivate(q, cl);
1298
1299         if (last_child)
1300                 htb_parent_to_leaf(cl, new_q);
1301
1302         if (--cl->refcnt == 0)
1303                 htb_destroy_class(sch, cl);
1304
1305         sch_tree_unlock(sch);
1306         return 0;
1307 }
1308
1309 static void htb_put(struct Qdisc *sch, unsigned long arg)
1310 {
1311         struct htb_class *cl = (struct htb_class *)arg;
1312
1313         if (--cl->refcnt == 0)
1314                 htb_destroy_class(sch, cl);
1315 }
1316
1317 static int htb_change_class(struct Qdisc *sch, u32 classid,
1318                             u32 parentid, struct rtattr **tca,
1319                             unsigned long *arg)
1320 {
1321         int err = -EINVAL;
1322         struct htb_sched *q = qdisc_priv(sch);
1323         struct htb_class *cl = (struct htb_class *)*arg, *parent;
1324         struct rtattr *opt = tca[TCA_OPTIONS - 1];
1325         struct qdisc_rate_table *rtab = NULL, *ctab = NULL;
1326         struct rtattr *tb[TCA_HTB_RTAB];
1327         struct tc_htb_opt *hopt;
1328
1329         /* extract all subattrs from opt attr */
1330         if (!opt || rtattr_parse_nested(tb, TCA_HTB_RTAB, opt) ||
1331             tb[TCA_HTB_PARMS - 1] == NULL ||
1332             RTA_PAYLOAD(tb[TCA_HTB_PARMS - 1]) < sizeof(*hopt))
1333                 goto failure;
1334
1335         parent = parentid == TC_H_ROOT ? NULL : htb_find(parentid, sch);
1336
1337         hopt = RTA_DATA(tb[TCA_HTB_PARMS - 1]);
1338
1339         rtab = qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB - 1]);
1340         ctab = qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB - 1]);
1341         if (!rtab || !ctab)
1342                 goto failure;
1343
1344         if (!cl) {              /* new class */
1345                 struct Qdisc *new_q;
1346                 int prio;
1347                 struct {
1348                         struct rtattr           rta;
1349                         struct gnet_estimator   opt;
1350                 } est = {
1351                         .rta = {
1352                                 .rta_len        = RTA_LENGTH(sizeof(est.opt)),
1353                                 .rta_type       = TCA_RATE,
1354                         },
1355                         .opt = {
1356                                 /* 4s interval, 16s averaging constant */
1357                                 .interval       = 2,
1358                                 .ewma_log       = 2,
1359                         },
1360                 };
1361
1362                 /* check for valid classid */
1363                 if (!classid || TC_H_MAJ(classid ^ sch->handle)
1364                     || htb_find(classid, sch))
1365                         goto failure;
1366
1367                 /* check maximal depth */
1368                 if (parent && parent->parent && parent->parent->level < 2) {
1369                         printk(KERN_ERR "htb: tree is too deep\n");
1370                         goto failure;
1371                 }
1372                 err = -ENOBUFS;
1373                 if ((cl = kzalloc(sizeof(*cl), GFP_KERNEL)) == NULL)
1374                         goto failure;
1375
1376                 gen_new_estimator(&cl->bstats, &cl->rate_est,
1377                                   &sch->dev->queue_lock,
1378                                   tca[TCA_RATE-1] ? : &est.rta);
1379                 cl->refcnt = 1;
1380                 INIT_LIST_HEAD(&cl->sibling);
1381                 INIT_HLIST_NODE(&cl->hlist);
1382                 INIT_LIST_HEAD(&cl->children);
1383                 INIT_LIST_HEAD(&cl->un.leaf.drop_list);
1384                 RB_CLEAR_NODE(&cl->pq_node);
1385
1386                 for (prio = 0; prio < TC_HTB_NUMPRIO; prio++)
1387                         RB_CLEAR_NODE(&cl->node[prio]);
1388
1389                 /* create leaf qdisc early because it uses kmalloc(GFP_KERNEL)
1390                    so that can't be used inside of sch_tree_lock
1391                    -- thanks to Karlis Peisenieks */
1392                 new_q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops, classid);
1393                 sch_tree_lock(sch);
1394                 if (parent && !parent->level) {
1395                         unsigned int qlen = parent->un.leaf.q->q.qlen;
1396
1397                         /* turn parent into inner node */
1398                         qdisc_reset(parent->un.leaf.q);
1399                         qdisc_tree_decrease_qlen(parent->un.leaf.q, qlen);
1400                         qdisc_destroy(parent->un.leaf.q);
1401                         if (parent->prio_activity)
1402                                 htb_deactivate(q, parent);
1403
1404                         /* remove from evt list because of level change */
1405                         if (parent->cmode != HTB_CAN_SEND) {
1406                                 htb_safe_rb_erase(&parent->pq_node, q->wait_pq);
1407                                 parent->cmode = HTB_CAN_SEND;
1408                         }
1409                         parent->level = (parent->parent ? parent->parent->level
1410                                          : TC_HTB_MAXDEPTH) - 1;
1411                         memset(&parent->un.inner, 0, sizeof(parent->un.inner));
1412                 }
1413                 /* leaf (we) needs elementary qdisc */
1414                 cl->un.leaf.q = new_q ? new_q : &noop_qdisc;
1415
1416                 cl->classid = classid;
1417                 cl->parent = parent;
1418
1419                 /* set class to be in HTB_CAN_SEND state */
1420                 cl->tokens = hopt->buffer;
1421                 cl->ctokens = hopt->cbuffer;
1422                 cl->mbuffer = 60 * PSCHED_TICKS_PER_SEC;        /* 1min */
1423                 cl->t_c = psched_get_time();
1424                 cl->cmode = HTB_CAN_SEND;
1425
1426                 /* attach to the hash list and parent's family */
1427                 hlist_add_head(&cl->hlist, q->hash + htb_hash(classid));
1428                 list_add_tail(&cl->sibling,
1429                               parent ? &parent->children : &q->root);
1430         } else {
1431                 if (tca[TCA_RATE-1])
1432                         gen_replace_estimator(&cl->bstats, &cl->rate_est,
1433                                               &sch->dev->queue_lock,
1434                                               tca[TCA_RATE-1]);
1435                 sch_tree_lock(sch);
1436         }
1437
1438         /* it used to be a nasty bug here, we have to check that node
1439            is really leaf before changing cl->un.leaf ! */
1440         if (!cl->level) {
1441                 cl->un.leaf.quantum = rtab->rate.rate / q->rate2quantum;
1442                 if (!hopt->quantum && cl->un.leaf.quantum < 1000) {
1443                         printk(KERN_WARNING
1444                                "HTB: quantum of class %X is small. Consider r2q change.\n",
1445                                cl->classid);
1446                         cl->un.leaf.quantum = 1000;
1447                 }
1448                 if (!hopt->quantum && cl->un.leaf.quantum > 200000) {
1449                         printk(KERN_WARNING
1450                                "HTB: quantum of class %X is big. Consider r2q change.\n",
1451                                cl->classid);
1452                         cl->un.leaf.quantum = 200000;
1453                 }
1454                 if (hopt->quantum)
1455                         cl->un.leaf.quantum = hopt->quantum;
1456                 if ((cl->un.leaf.prio = hopt->prio) >= TC_HTB_NUMPRIO)
1457                         cl->un.leaf.prio = TC_HTB_NUMPRIO - 1;
1458
1459                 /* backup for htb_parent_to_leaf */
1460                 cl->quantum = cl->un.leaf.quantum;
1461                 cl->prio = cl->un.leaf.prio;
1462         }
1463
1464         cl->buffer = hopt->buffer;
1465         cl->cbuffer = hopt->cbuffer;
1466         if (cl->rate)
1467                 qdisc_put_rtab(cl->rate);
1468         cl->rate = rtab;
1469         if (cl->ceil)
1470                 qdisc_put_rtab(cl->ceil);
1471         cl->ceil = ctab;
1472         sch_tree_unlock(sch);
1473
1474         *arg = (unsigned long)cl;
1475         return 0;
1476
1477 failure:
1478         if (rtab)
1479                 qdisc_put_rtab(rtab);
1480         if (ctab)
1481                 qdisc_put_rtab(ctab);
1482         return err;
1483 }
1484
1485 static struct tcf_proto **htb_find_tcf(struct Qdisc *sch, unsigned long arg)
1486 {
1487         struct htb_sched *q = qdisc_priv(sch);
1488         struct htb_class *cl = (struct htb_class *)arg;
1489         struct tcf_proto **fl = cl ? &cl->filter_list : &q->filter_list;
1490
1491         return fl;
1492 }
1493
1494 static unsigned long htb_bind_filter(struct Qdisc *sch, unsigned long parent,
1495                                      u32 classid)
1496 {
1497         struct htb_sched *q = qdisc_priv(sch);
1498         struct htb_class *cl = htb_find(classid, sch);
1499
1500         /*if (cl && !cl->level) return 0;
1501            The line above used to be there to prevent attaching filters to
1502            leaves. But at least tc_index filter uses this just to get class
1503            for other reasons so that we have to allow for it.
1504            ----
1505            19.6.2002 As Werner explained it is ok - bind filter is just
1506            another way to "lock" the class - unlike "get" this lock can
1507            be broken by class during destroy IIUC.
1508          */
1509         if (cl)
1510                 cl->filter_cnt++;
1511         else
1512                 q->filter_cnt++;
1513         return (unsigned long)cl;
1514 }
1515
1516 static void htb_unbind_filter(struct Qdisc *sch, unsigned long arg)
1517 {
1518         struct htb_sched *q = qdisc_priv(sch);
1519         struct htb_class *cl = (struct htb_class *)arg;
1520
1521         if (cl)
1522                 cl->filter_cnt--;
1523         else
1524                 q->filter_cnt--;
1525 }
1526
1527 static void htb_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1528 {
1529         struct htb_sched *q = qdisc_priv(sch);
1530         int i;
1531
1532         if (arg->stop)
1533                 return;
1534
1535         for (i = 0; i < HTB_HSIZE; i++) {
1536                 struct hlist_node *p;
1537                 struct htb_class *cl;
1538
1539                 hlist_for_each_entry(cl, p, q->hash + i, hlist) {
1540                         if (arg->count < arg->skip) {
1541                                 arg->count++;
1542                                 continue;
1543                         }
1544                         if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
1545                                 arg->stop = 1;
1546                                 return;
1547                         }
1548                         arg->count++;
1549                 }
1550         }
1551 }
1552
1553 static struct Qdisc_class_ops htb_class_ops = {
1554         .graft          =       htb_graft,
1555         .leaf           =       htb_leaf,
1556         .qlen_notify    =       htb_qlen_notify,
1557         .get            =       htb_get,
1558         .put            =       htb_put,
1559         .change         =       htb_change_class,
1560         .delete         =       htb_delete,
1561         .walk           =       htb_walk,
1562         .tcf_chain      =       htb_find_tcf,
1563         .bind_tcf       =       htb_bind_filter,
1564         .unbind_tcf     =       htb_unbind_filter,
1565         .dump           =       htb_dump_class,
1566         .dump_stats     =       htb_dump_class_stats,
1567 };
1568
1569 static struct Qdisc_ops htb_qdisc_ops = {
1570         .next           =       NULL,
1571         .cl_ops         =       &htb_class_ops,
1572         .id             =       "htb",
1573         .priv_size      =       sizeof(struct htb_sched),
1574         .enqueue        =       htb_enqueue,
1575         .dequeue        =       htb_dequeue,
1576         .requeue        =       htb_requeue,
1577         .drop           =       htb_drop,
1578         .init           =       htb_init,
1579         .reset          =       htb_reset,
1580         .destroy        =       htb_destroy,
1581         .change         =       NULL /* htb_change */,
1582         .dump           =       htb_dump,
1583         .owner          =       THIS_MODULE,
1584 };
1585
1586 static int __init htb_module_init(void)
1587 {
1588         return register_qdisc(&htb_qdisc_ops);
1589 }
1590 static void __exit htb_module_exit(void)
1591 {
1592         unregister_qdisc(&htb_qdisc_ops);
1593 }
1594
1595 module_init(htb_module_init)
1596 module_exit(htb_module_exit)
1597 MODULE_LICENSE("GPL");