diff options
Diffstat (limited to 'net/bridge/br_input.c')
-rw-r--r-- | net/bridge/br_input.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 255c00f60ce7..30b88777c3df 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
@@ -5,8 +5,6 @@ | |||
5 | * Authors: | 5 | * Authors: |
6 | * Lennert Buytenhek <buytenh@gnu.org> | 6 | * Lennert Buytenhek <buytenh@gnu.org> |
7 | * | 7 | * |
8 | * $Id: br_input.c,v 1.10 2001/12/24 04:50:20 davem Exp $ | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
12 | * as published by the Free Software Foundation; either version | 10 | * as published by the Free Software Foundation; either version |
@@ -24,13 +22,13 @@ const u8 br_group_address[ETH_ALEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; | |||
24 | 22 | ||
25 | static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) | 23 | static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) |
26 | { | 24 | { |
27 | struct net_device *indev; | 25 | struct net_device *indev, *brdev = br->dev; |
28 | 26 | ||
29 | br->statistics.rx_packets++; | 27 | brdev->stats.rx_packets++; |
30 | br->statistics.rx_bytes += skb->len; | 28 | brdev->stats.rx_bytes += skb->len; |
31 | 29 | ||
32 | indev = skb->dev; | 30 | indev = skb->dev; |
33 | skb->dev = br->dev; | 31 | skb->dev = brdev; |
34 | 32 | ||
35 | NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL, | 33 | NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL, |
36 | netif_receive_skb); | 34 | netif_receive_skb); |
@@ -64,7 +62,7 @@ int br_handle_frame_finish(struct sk_buff *skb) | |||
64 | dst = NULL; | 62 | dst = NULL; |
65 | 63 | ||
66 | if (is_multicast_ether_addr(dest)) { | 64 | if (is_multicast_ether_addr(dest)) { |
67 | br->statistics.multicast++; | 65 | br->dev->stats.multicast++; |
68 | skb2 = skb; | 66 | skb2 = skb; |
69 | } else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) { | 67 | } else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) { |
70 | skb2 = skb; | 68 | skb2 = skb; |
@@ -136,14 +134,11 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) | |||
136 | if (skb->protocol == htons(ETH_P_PAUSE)) | 134 | if (skb->protocol == htons(ETH_P_PAUSE)) |
137 | goto drop; | 135 | goto drop; |
138 | 136 | ||
139 | /* Process STP BPDU's through normal netif_receive_skb() path */ | 137 | if (NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev, |
140 | if (p->br->stp_enabled != BR_NO_STP) { | 138 | NULL, br_handle_local_finish)) |
141 | if (NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev, | 139 | return NULL; /* frame consumed by filter */ |
142 | NULL, br_handle_local_finish)) | 140 | else |
143 | return NULL; | 141 | return skb; /* continue processing */ |
144 | else | ||
145 | return skb; | ||
146 | } | ||
147 | } | 142 | } |
148 | 143 | ||
149 | switch (p->state) { | 144 | switch (p->state) { |