This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / sched / sch_prio.c
index 6961f08..f8eafc5 100644 (file)
@@ -47,103 +47,60 @@ struct prio_sched_data
 };
 
 
-struct Qdisc *prio_classify(struct sk_buff *skb, struct Qdisc *sch,int *r)
+static __inline__ unsigned prio_classify(struct sk_buff *skb, struct Qdisc *sch)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
-       u32 band = skb->priority;
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        struct tcf_result res;
+       u32 band;
 
+       band = skb->priority;
        if (TC_H_MAJ(skb->priority) != sch->handle) {
-#ifdef CONFIG_NET_CLS_ACT
-               int result = 0, terminal = 0;
-               result = tc_classify(skb, q->filter_list, &res);
-
-               switch (result) {
-                       case TC_ACT_SHOT:
-                               *r = NET_XMIT_DROP;
-                               terminal = 1;
-                               break;
-                       case TC_ACT_STOLEN:
-                       case TC_ACT_QUEUED:
-                               terminal = 1;
-                               break;
-                       case TC_ACT_RECLASSIFY:
-                       case TC_ACT_OK:
-                       case TC_ACT_UNSPEC:
-                       default:
-                       break;
-               };
-               if (terminal) {
-                       kfree_skb(skb);
-                       return NULL;
-               } 
-
-               if (!q->filter_list ) {
-#else
                if (!q->filter_list || tc_classify(skb, q->filter_list, &res)) {
-#endif
                        if (TC_H_MAJ(band))
                                band = 0;
-                       return q->queues[q->prio2band[band&TC_PRIO_MAX]];
+                       return q->prio2band[band&TC_PRIO_MAX];
                }
                band = res.classid;
        }
        band = TC_H_MIN(band) - 1;
-       if (band > q->bands)
-               return q->queues[q->prio2band[0]];
-
-       return q->queues[band];
+       return band < q->bands ? band : q->prio2band[0];
 }
 
 static int
 prio_enqueue(struct sk_buff *skb, struct Qdisc* sch)
 {
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        struct Qdisc *qdisc;
-       int ret = NET_XMIT_SUCCESS;
+       int ret;
 
-       qdisc = prio_classify(skb, sch, &ret);
+       qdisc = q->queues[prio_classify(skb, sch)];
 
-       if (NULL == qdisc)
-               goto dropped;
-
-       if ((ret = qdisc->enqueue(skb, qdisc)) == NET_XMIT_SUCCESS) {
+       if ((ret = qdisc->enqueue(skb, qdisc)) == 0) {
                sch->stats.bytes += skb->len;
                sch->stats.packets++;
                sch->q.qlen++;
-               return NET_XMIT_SUCCESS;
-       }
-
-dropped:
-#ifdef CONFIG_NET_CLS_ACT
-       if (NET_XMIT_DROP == ret) {
-#endif
-               sch->stats.drops++;
-#ifdef CONFIG_NET_CLS_ACT
-       } else {
-               sch->stats.overlimits++; /* abuse, but noone uses it */
+               return 0;
        }
-#endif
-       return ret; 
+       sch->stats.drops++;
+       return ret;
 }
 
 
 static int
 prio_requeue(struct sk_buff *skb, struct Qdisc* sch)
 {
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        struct Qdisc *qdisc;
-       int ret = NET_XMIT_DROP;
+       int ret;
 
-       qdisc = prio_classify(skb, sch, &ret);
-       if (qdisc == NULL)
-               goto dropped;
+       qdisc = q->queues[prio_classify(skb, sch)];
 
        if ((ret = qdisc->ops->requeue(skb, qdisc)) == 0) {
                sch->q.qlen++;
                return 0;
        }
-dropped:
        sch->stats.drops++;
-       return NET_XMIT_DROP;
+       return ret;
 }
 
 
@@ -151,7 +108,7 @@ static struct sk_buff *
 prio_dequeue(struct Qdisc* sch)
 {
        struct sk_buff *skb;
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        int prio;
        struct Qdisc *qdisc;
 
@@ -169,7 +126,7 @@ prio_dequeue(struct Qdisc* sch)
 
 static unsigned int prio_drop(struct Qdisc* sch)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        int prio;
        unsigned int len;
        struct Qdisc *qdisc;
@@ -189,7 +146,7 @@ static void
 prio_reset(struct Qdisc* sch)
 {
        int prio;
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
 
        for (prio=0; prio<q->bands; prio++)
                qdisc_reset(q->queues[prio]);
@@ -200,7 +157,7 @@ static void
 prio_destroy(struct Qdisc* sch)
 {
        int prio;
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        struct tcf_proto *tp;
 
        while ((tp = q->filter_list) != NULL) {
@@ -208,13 +165,15 @@ prio_destroy(struct Qdisc* sch)
                tcf_destroy(tp);
        }
 
-       for (prio=0; prio<q->bands; prio++)
+       for (prio=0; prio<q->bands; prio++) {
                qdisc_destroy(q->queues[prio]);
+               q->queues[prio] = &noop_qdisc;
+       }
 }
 
 static int prio_tune(struct Qdisc *sch, struct rtattr *opt)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        struct tc_prio_qopt *qopt = RTA_DATA(opt);
        int i;
 
@@ -259,7 +218,7 @@ static int prio_tune(struct Qdisc *sch, struct rtattr *opt)
 
 static int prio_init(struct Qdisc *sch, struct rtattr *opt)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        int i;
 
        for (i=0; i<TCQ_PRIO_BANDS; i++)
@@ -278,7 +237,7 @@ static int prio_init(struct Qdisc *sch, struct rtattr *opt)
 
 static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        unsigned char    *b = skb->tail;
        struct tc_prio_qopt opt;
 
@@ -295,7 +254,7 @@ rtattr_failure:
 static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
                      struct Qdisc **old)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        unsigned long band = arg - 1;
 
        if (band >= q->bands)
@@ -317,7 +276,7 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
 static struct Qdisc *
 prio_leaf(struct Qdisc *sch, unsigned long arg)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        unsigned long band = arg - 1;
 
        if (band >= q->bands)
@@ -328,7 +287,7 @@ prio_leaf(struct Qdisc *sch, unsigned long arg)
 
 static unsigned long prio_get(struct Qdisc *sch, u32 classid)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        unsigned long band = TC_H_MIN(classid);
 
        if (band - 1 >= q->bands)
@@ -350,7 +309,7 @@ static void prio_put(struct Qdisc *q, unsigned long cl)
 static int prio_change(struct Qdisc *sch, u32 handle, u32 parent, struct rtattr **tca, unsigned long *arg)
 {
        unsigned long cl = *arg;
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
 
        if (cl - 1 > q->bands)
                return -ENOENT;
@@ -359,7 +318,7 @@ static int prio_change(struct Qdisc *sch, u32 handle, u32 parent, struct rtattr
 
 static int prio_delete(struct Qdisc *sch, unsigned long cl)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        if (cl - 1 > q->bands)
                return -ENOENT;
        return 0;
@@ -369,7 +328,7 @@ static int prio_delete(struct Qdisc *sch, unsigned long cl)
 static int prio_dump_class(struct Qdisc *sch, unsigned long cl, struct sk_buff *skb,
                           struct tcmsg *tcm)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
 
        if (cl - 1 > q->bands)
                return -ENOENT;
@@ -381,7 +340,7 @@ static int prio_dump_class(struct Qdisc *sch, unsigned long cl, struct sk_buff *
 
 static void prio_walk(struct Qdisc *sch, struct qdisc_walker *arg)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
        int prio;
 
        if (arg->stop)
@@ -402,7 +361,7 @@ static void prio_walk(struct Qdisc *sch, struct qdisc_walker *arg)
 
 static struct tcf_proto ** prio_find_tcf(struct Qdisc *sch, unsigned long cl)
 {
-       struct prio_sched_data *q = qdisc_priv(sch);
+       struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
 
        if (cl)
                return NULL;