aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_atm.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2007-07-15 03:01:49 -0400
committerDavid S. Miller <davem@davemloft.net>2007-07-15 03:01:49 -0400
commit9210080445b0c51a73b488750a26eb17177d8684 (patch)
tree96f339cde62a77c58f88b4a5fe6c9b1deca29b15 /net/sched/sch_atm.c
parentb0188d4dbe5f4285372dd033acf7c92a97006629 (diff)
[NET_SCHED]: sch_atm: act_api support
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>
Diffstat (limited to 'net/sched/sch_atm.c')
-rw-r--r--net/sched/sch_atm.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c
index 9b458c403fa0..ccee10dae66d 100644
--- a/net/sched/sch_atm.c
+++ b/net/sched/sch_atm.c
@@ -411,11 +411,21 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
411 if (flow->vcc) 411 if (flow->vcc)
412 ATM_SKB(skb)->atm_options = flow->vcc->atm_options; 412 ATM_SKB(skb)->atm_options = flow->vcc->atm_options;
413 /*@@@ looks good ... but it's not supposed to work :-) */ 413 /*@@@ looks good ... but it's not supposed to work :-) */
414#ifdef CONFIG_NET_CLS_POLICE 414#ifdef CONFIG_NET_CLS_ACT
415 switch (result) {
416 case TC_ACT_QUEUED:
417 case TC_ACT_STOLEN:
418 kfree_skb(skb);
419 return NET_XMIT_SUCCESS;
420 case TC_ACT_SHOT:
421 kfree_skb(skb);
422 goto drop;
423 }
424#elif defined(CONFIG_NET_CLS_POLICE)
415 switch (result) { 425 switch (result) {
416 case TC_POLICE_SHOT: 426 case TC_POLICE_SHOT:
417 kfree_skb(skb); 427 kfree_skb(skb);
418 break; 428 goto drop;
419 case TC_POLICE_RECLASSIFY: 429 case TC_POLICE_RECLASSIFY:
420 if (flow->excess) 430 if (flow->excess)
421 flow = flow->excess; 431 flow = flow->excess;
@@ -431,11 +441,8 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
431 } 441 }
432#endif 442#endif
433 } 443 }
434 if ( 444 if ((ret = flow->q->enqueue(skb, flow->q)) != 0) {
435#ifdef CONFIG_NET_CLS_POLICE 445drop: __maybe_unused
436 result == TC_POLICE_SHOT ||
437#endif
438 (ret = flow->q->enqueue(skb, flow->q)) != 0) {
439 sch->qstats.drops++; 446 sch->qstats.drops++;
440 if (flow) 447 if (flow)
441 flow->qstats.drops++; 448 flow->qstats.drops++;