diff options
Diffstat (limited to 'net/bridge')
-rw-r--r-- | net/bridge/br_fdb.c | 5 | ||||
-rw-r--r-- | net/bridge/br_if.c | 16 | ||||
-rw-r--r-- | net/bridge/br_input.c | 3 |
3 files changed, 14 insertions, 10 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 69b70977f000..eb57502bb264 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -384,6 +384,11 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, | |||
384 | if (hold_time(br) == 0) | 384 | if (hold_time(br) == 0) |
385 | return; | 385 | return; |
386 | 386 | ||
387 | /* ignore packets unless we are using this port */ | ||
388 | if (!(source->state == BR_STATE_LEARNING || | ||
389 | source->state == BR_STATE_FORWARDING)) | ||
390 | return; | ||
391 | |||
387 | fdb = fdb_find(head, addr); | 392 | fdb = fdb_find(head, addr); |
388 | if (likely(fdb)) { | 393 | if (likely(fdb)) { |
389 | /* attempt to update an entry for a local interface */ | 394 | /* attempt to update an entry for a local interface */ |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 749f0e8f541d..9272f12f664c 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -33,17 +33,17 @@ | |||
33 | */ | 33 | */ |
34 | static int port_cost(struct net_device *dev) | 34 | static int port_cost(struct net_device *dev) |
35 | { | 35 | { |
36 | if (dev->ethtool_ops->get_settings) { | 36 | if (dev->ethtool_ops && dev->ethtool_ops->get_settings) { |
37 | struct ethtool_cmd ecmd = { ETHTOOL_GSET }; | 37 | struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET, }; |
38 | int err = dev->ethtool_ops->get_settings(dev, &ecmd); | 38 | |
39 | if (!err) { | 39 | if (!dev->ethtool_ops->get_settings(dev, &ecmd)) { |
40 | switch(ecmd.speed) { | 40 | switch(ecmd.speed) { |
41 | case SPEED_100: | ||
42 | return 19; | ||
43 | case SPEED_1000: | ||
44 | return 4; | ||
45 | case SPEED_10000: | 41 | case SPEED_10000: |
46 | return 2; | 42 | return 2; |
43 | case SPEED_1000: | ||
44 | return 4; | ||
45 | case SPEED_100: | ||
46 | return 19; | ||
47 | case SPEED_10: | 47 | case SPEED_10: |
48 | return 100; | 48 | return 100; |
49 | } | 49 | } |
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 5c18595b7616..6f468fc3357a 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
@@ -101,9 +101,8 @@ static int br_handle_local_finish(struct sk_buff *skb) | |||
101 | { | 101 | { |
102 | struct net_bridge_port *p = rcu_dereference(skb->dev->br_port); | 102 | struct net_bridge_port *p = rcu_dereference(skb->dev->br_port); |
103 | 103 | ||
104 | if (p && p->state != BR_STATE_DISABLED) | 104 | if (p) |
105 | br_fdb_update(p->br, p, eth_hdr(skb)->h_source); | 105 | br_fdb_update(p->br, p, eth_hdr(skb)->h_source); |
106 | |||
107 | return 0; /* process further */ | 106 | return 0; /* process further */ |
108 | } | 107 | } |
109 | 108 | ||