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 | |
| 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>
| -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++; |
