diff options
author | Patrick McHardy <kaber@trash.net> | 2007-07-15 03:01:49 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-07-15 03:01:49 -0400 |
commit | 9210080445b0c51a73b488750a26eb17177d8684 (patch) | |
tree | 96f339cde62a77c58f88b4a5fe6c9b1deca29b15 /net/sched | |
parent | b0188d4dbe5f4285372dd033acf7c92a97006629 (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')
-rw-r--r-- | net/sched/sch_atm.c | 21 |
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 | 445 | drop: __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++; |