[NET_SCHED]: sch_atm: act_api support
Patrick McHardy [Sun, 15 Jul 2007 07:01:49 +0000 (00:01 -0700)]
Handle act_api classification results.

The ATM scheduler behaves slightly different than other schedulers
in that it only handles policer results for successful classifications,
this behaviour is retained for the act_api case.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

net/sched/sch_atm.c

index 9b458c4..ccee10d 100644 (file)
@@ -411,11 +411,21 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                if (flow->vcc)
                        ATM_SKB(skb)->atm_options = flow->vcc->atm_options;
                /*@@@ looks good ... but it's not supposed to work :-) */
-#ifdef CONFIG_NET_CLS_POLICE
+#ifdef CONFIG_NET_CLS_ACT
+               switch (result) {
+               case TC_ACT_QUEUED:
+               case TC_ACT_STOLEN:
+                       kfree_skb(skb);
+                       return NET_XMIT_SUCCESS;
+               case TC_ACT_SHOT:
+                       kfree_skb(skb);
+                       goto drop;
+               }
+#elif defined(CONFIG_NET_CLS_POLICE)
                switch (result) {
                case TC_POLICE_SHOT:
                        kfree_skb(skb);
-                       break;
+                       goto drop;
                case TC_POLICE_RECLASSIFY:
                        if (flow->excess)
                                flow = flow->excess;
@@ -431,11 +441,8 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                }
 #endif
        }
-       if (
-#ifdef CONFIG_NET_CLS_POLICE
-                  result == TC_POLICE_SHOT ||
-#endif
-                  (ret = flow->q->enqueue(skb, flow->q)) != 0) {
+       if ((ret = flow->q->enqueue(skb, flow->q)) != 0) {
+drop: __maybe_unused
                sch->qstats.drops++;
                if (flow)
                        flow->qstats.drops++;