Merge master.kernel.org:/home/rmk/linux-2.6-arm
[pandora-kernel.git] / net / bridge / br_if.c
index f3a2e29..7b4ce91 100644 (file)
@@ -152,6 +152,8 @@ static void del_nbp(struct net_bridge_port *p)
        br_stp_disable_port(p);
        spin_unlock_bh(&br->lock);
 
+       br_ifinfo_notify(RTM_DELLINK, p);
+
        br_fdb_delete_by_port(br, p, 1);
 
        list_del_rcu(&p->list);
@@ -203,7 +205,7 @@ static struct net_device *new_bridge_dev(const char *name)
        memcpy(br->group_addr, br_group_address, ETH_ALEN);
 
        br->feature_mask = dev->features;
-       br->stp_enabled = 0;
+       br->stp_enabled = BR_NO_STP;
        br->designated_root = br->bridge_id;
        br->root_path_cost = 0;
        br->root_port = 0;
@@ -366,10 +368,18 @@ void br_features_recompute(struct net_bridge *br)
        list_for_each_entry(p, &br->port_list, list) {
                unsigned long feature = p->dev->features;
 
+               /* if device needs checksumming, downgrade to hw checksumming */
                if (checksum & NETIF_F_NO_CSUM && !(feature & NETIF_F_NO_CSUM))
                        checksum ^= NETIF_F_NO_CSUM | NETIF_F_HW_CSUM;
+
+               /* if device can't do all checksum, downgrade to ipv4/ipv6 */
                if (checksum & NETIF_F_HW_CSUM && !(feature & NETIF_F_HW_CSUM))
-                       checksum ^= NETIF_F_HW_CSUM | NETIF_F_IP_CSUM;
+                       checksum ^= NETIF_F_HW_CSUM
+                               | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+
+               if (checksum & NETIF_F_IPV6_CSUM && !(feature & NETIF_F_IPV6_CSUM))
+                       checksum &= ~NETIF_F_IPV6_CSUM;
+
                if (!(feature & NETIF_F_IP_CSUM))
                        checksum = 0;
 
@@ -434,6 +444,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
                br_stp_enable_port(p);
        spin_unlock_bh(&br->lock);
 
+       br_ifinfo_notify(RTM_NEWLINK, p);
+
        dev_set_mtu(br->dev, br_min_mtu(br));
 
        kobject_uevent(&p->kobj, KOBJ_ADD);
@@ -471,11 +483,9 @@ void __exit br_cleanup_bridges(void)
        struct net_device *dev, *nxt;
 
        rtnl_lock();
-       for (dev = dev_base; dev; dev = nxt) {
-               nxt = dev->next;
+       for_each_netdev_safe(dev, nxt)
                if (dev->priv_flags & IFF_EBRIDGE)
                        del_br(dev->priv);
-       }
        rtnl_unlock();
 
 }