diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:15 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:59 -0400 |
| commit | 07f9479a40cc778bc1462ada11f95b01360ae4ff (patch) | |
| tree | 0676cf38df3844004bb3ebfd99dfa67a4a8998f5 /net/bridge | |
| parent | 9d5e6bdb3013acfb311ab407eeca0b6a6a3dedbf (diff) | |
| parent | cd2e49e90f1cae7726c9a2c54488d881d7f1cd1c (diff) | |
Merge branch 'master' into for-next
Fast-forwarded to current state of Linus' tree as there are patches to be
applied for files that didn't exist on the old branch.
Diffstat (limited to 'net/bridge')
| -rw-r--r-- | net/bridge/br_fdb.c | 2 | ||||
| -rw-r--r-- | net/bridge/br_if.c | 6 | ||||
| -rw-r--r-- | net/bridge/br_ioctl.c | 2 | ||||
| -rw-r--r-- | net/bridge/br_multicast.c | 4 | ||||
| -rw-r--r-- | net/bridge/br_netfilter.c | 9 | ||||
| -rw-r--r-- | net/bridge/br_private.h | 2 | ||||
| -rw-r--r-- | net/bridge/br_stp_if.c | 11 |
7 files changed, 22 insertions, 14 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 88485cc74dc3..cc4d3c5ab1c6 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
| @@ -169,7 +169,7 @@ void br_fdb_flush(struct net_bridge *br) | |||
| 169 | spin_unlock_bh(&br->hash_lock); | 169 | spin_unlock_bh(&br->hash_lock); |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | /* Flush all entries refering to a specific port. | 172 | /* Flush all entries referring to a specific port. |
| 173 | * if do_all is set also flush static entries | 173 | * if do_all is set also flush static entries |
| 174 | */ | 174 | */ |
| 175 | void br_fdb_delete_by_port(struct net_bridge *br, | 175 | void br_fdb_delete_by_port(struct net_bridge *br, |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index dce8f0009a12..718b60366dfe 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
| @@ -389,6 +389,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
| 389 | { | 389 | { |
| 390 | struct net_bridge_port *p; | 390 | struct net_bridge_port *p; |
| 391 | int err = 0; | 391 | int err = 0; |
| 392 | bool changed_addr; | ||
| 392 | 393 | ||
| 393 | /* Don't allow bridging non-ethernet like devices */ | 394 | /* Don't allow bridging non-ethernet like devices */ |
| 394 | if ((dev->flags & IFF_LOOPBACK) || | 395 | if ((dev->flags & IFF_LOOPBACK) || |
| @@ -446,7 +447,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
| 446 | list_add_rcu(&p->list, &br->port_list); | 447 | list_add_rcu(&p->list, &br->port_list); |
| 447 | 448 | ||
| 448 | spin_lock_bh(&br->lock); | 449 | spin_lock_bh(&br->lock); |
| 449 | br_stp_recalculate_bridge_id(br); | 450 | changed_addr = br_stp_recalculate_bridge_id(br); |
| 450 | br_features_recompute(br); | 451 | br_features_recompute(br); |
| 451 | 452 | ||
| 452 | if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) && | 453 | if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) && |
| @@ -456,6 +457,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
| 456 | 457 | ||
| 457 | br_ifinfo_notify(RTM_NEWLINK, p); | 458 | br_ifinfo_notify(RTM_NEWLINK, p); |
| 458 | 459 | ||
| 460 | if (changed_addr) | ||
| 461 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | ||
| 462 | |||
| 459 | dev_set_mtu(br->dev, br_min_mtu(br)); | 463 | dev_set_mtu(br->dev, br_min_mtu(br)); |
| 460 | 464 | ||
| 461 | kobject_uevent(&p->kobj, KOBJ_ADD); | 465 | kobject_uevent(&p->kobj, KOBJ_ADD); |
diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c index cb43312b846e..3d9fca0e3370 100644 --- a/net/bridge/br_ioctl.c +++ b/net/bridge/br_ioctl.c | |||
| @@ -106,7 +106,7 @@ static int add_del_if(struct net_bridge *br, int ifindex, int isadd) | |||
| 106 | /* | 106 | /* |
| 107 | * Legacy ioctl's through SIOCDEVPRIVATE | 107 | * Legacy ioctl's through SIOCDEVPRIVATE |
| 108 | * This interface is deprecated because it was too difficult to | 108 | * This interface is deprecated because it was too difficult to |
| 109 | * to do the translation for 32/64bit ioctl compatability. | 109 | * to do the translation for 32/64bit ioctl compatibility. |
| 110 | */ | 110 | */ |
| 111 | static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 111 | static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
| 112 | { | 112 | { |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 030a002ff8ee..59660c909a7c 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
| @@ -445,9 +445,9 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, | |||
| 445 | ip6h->payload_len = htons(8 + sizeof(*mldq)); | 445 | ip6h->payload_len = htons(8 + sizeof(*mldq)); |
| 446 | ip6h->nexthdr = IPPROTO_HOPOPTS; | 446 | ip6h->nexthdr = IPPROTO_HOPOPTS; |
| 447 | ip6h->hop_limit = 1; | 447 | ip6h->hop_limit = 1; |
| 448 | ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1)); | ||
| 448 | ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, | 449 | ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, |
| 449 | &ip6h->saddr); | 450 | &ip6h->saddr); |
| 450 | ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1)); | ||
| 451 | ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); | 451 | ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); |
| 452 | 452 | ||
| 453 | hopopt = (u8 *)(ip6h + 1); | 453 | hopopt = (u8 *)(ip6h + 1); |
| @@ -1475,7 +1475,7 @@ static int br_multicast_ipv6_rcv(struct net_bridge *br, | |||
| 1475 | ip6h->payload_len == 0) | 1475 | ip6h->payload_len == 0) |
| 1476 | return 0; | 1476 | return 0; |
| 1477 | 1477 | ||
| 1478 | len = ntohs(ip6h->payload_len); | 1478 | len = ntohs(ip6h->payload_len) + sizeof(*ip6h); |
| 1479 | if (skb->len < len) | 1479 | if (skb->len < len) |
| 1480 | return -EINVAL; | 1480 | return -EINVAL; |
| 1481 | 1481 | ||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index f97af5590ba1..f3bc322c5891 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -249,11 +249,9 @@ static int br_parse_ip_options(struct sk_buff *skb) | |||
| 249 | goto drop; | 249 | goto drop; |
| 250 | } | 250 | } |
| 251 | 251 | ||
| 252 | /* Zero out the CB buffer if no options present */ | 252 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
| 253 | if (iph->ihl == 5) { | 253 | if (iph->ihl == 5) |
| 254 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); | ||
| 255 | return 0; | 254 | return 0; |
| 256 | } | ||
| 257 | 255 | ||
| 258 | opt->optlen = iph->ihl*4 - sizeof(struct iphdr); | 256 | opt->optlen = iph->ihl*4 - sizeof(struct iphdr); |
| 259 | if (ip_options_compile(dev_net(dev), opt, skb)) | 257 | if (ip_options_compile(dev_net(dev), opt, skb)) |
| @@ -739,6 +737,9 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb, | |||
| 739 | nf_bridge->mask |= BRNF_PKT_TYPE; | 737 | nf_bridge->mask |= BRNF_PKT_TYPE; |
| 740 | } | 738 | } |
| 741 | 739 | ||
| 740 | if (br_parse_ip_options(skb)) | ||
| 741 | return NF_DROP; | ||
| 742 | |||
| 742 | /* The physdev module checks on this */ | 743 | /* The physdev module checks on this */ |
| 743 | nf_bridge->mask |= BRNF_BRIDGED; | 744 | nf_bridge->mask |= BRNF_BRIDGED; |
| 744 | nf_bridge->physoutdev = skb->dev; | 745 | nf_bridge->physoutdev = skb->dev; |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 19e2f46ed086..387013d33745 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
| @@ -497,7 +497,7 @@ extern void br_stp_disable_bridge(struct net_bridge *br); | |||
| 497 | extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val); | 497 | extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val); |
| 498 | extern void br_stp_enable_port(struct net_bridge_port *p); | 498 | extern void br_stp_enable_port(struct net_bridge_port *p); |
| 499 | extern void br_stp_disable_port(struct net_bridge_port *p); | 499 | extern void br_stp_disable_port(struct net_bridge_port *p); |
| 500 | extern void br_stp_recalculate_bridge_id(struct net_bridge *br); | 500 | extern bool br_stp_recalculate_bridge_id(struct net_bridge *br); |
| 501 | extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a); | 501 | extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a); |
| 502 | extern void br_stp_set_bridge_priority(struct net_bridge *br, | 502 | extern void br_stp_set_bridge_priority(struct net_bridge *br, |
| 503 | u16 newprio); | 503 | u16 newprio); |
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 79372d4a4055..9b61d09de9b9 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c | |||
| @@ -204,7 +204,7 @@ void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *addr) | |||
| 204 | static const unsigned short br_mac_zero_aligned[ETH_ALEN >> 1]; | 204 | static const unsigned short br_mac_zero_aligned[ETH_ALEN >> 1]; |
| 205 | 205 | ||
| 206 | /* called under bridge lock */ | 206 | /* called under bridge lock */ |
| 207 | void br_stp_recalculate_bridge_id(struct net_bridge *br) | 207 | bool br_stp_recalculate_bridge_id(struct net_bridge *br) |
| 208 | { | 208 | { |
| 209 | const unsigned char *br_mac_zero = | 209 | const unsigned char *br_mac_zero = |
| 210 | (const unsigned char *)br_mac_zero_aligned; | 210 | (const unsigned char *)br_mac_zero_aligned; |
| @@ -213,7 +213,7 @@ void br_stp_recalculate_bridge_id(struct net_bridge *br) | |||
| 213 | 213 | ||
| 214 | /* user has chosen a value so keep it */ | 214 | /* user has chosen a value so keep it */ |
| 215 | if (br->flags & BR_SET_MAC_ADDR) | 215 | if (br->flags & BR_SET_MAC_ADDR) |
| 216 | return; | 216 | return false; |
| 217 | 217 | ||
| 218 | list_for_each_entry(p, &br->port_list, list) { | 218 | list_for_each_entry(p, &br->port_list, list) { |
| 219 | if (addr == br_mac_zero || | 219 | if (addr == br_mac_zero || |
| @@ -222,8 +222,11 @@ void br_stp_recalculate_bridge_id(struct net_bridge *br) | |||
| 222 | 222 | ||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | if (compare_ether_addr(br->bridge_id.addr, addr)) | 225 | if (compare_ether_addr(br->bridge_id.addr, addr) == 0) |
| 226 | br_stp_change_bridge_id(br, addr); | 226 | return false; /* no change */ |
| 227 | |||
| 228 | br_stp_change_bridge_id(br, addr); | ||
| 229 | return true; | ||
| 227 | } | 230 | } |
| 228 | 231 | ||
| 229 | /* called under bridge lock */ | 232 | /* called under bridge lock */ |
