br->bridge_max_age = br->max_age = 20 * HZ;
        br->bridge_hello_time = br->hello_time = 2 * HZ;
        br->bridge_forward_delay = br->forward_delay = 15 * HZ;
-       br->ageing_time = BR_DEFAULT_AGEING_TIME;
+       br->bridge_ageing_time = br->ageing_time = BR_DEFAULT_AGEING_TIME;
        dev->max_mtu = ETH_MAX_MTU;
 
        br_netfilter_rtable_init(br);
 
        unsigned long                   max_age;
        unsigned long                   hello_time;
        unsigned long                   forward_delay;
-       unsigned long                   bridge_max_age;
        unsigned long                   ageing_time;
+       unsigned long                   bridge_max_age;
        unsigned long                   bridge_hello_time;
        unsigned long                   bridge_forward_delay;
+       unsigned long                   bridge_ageing_time;
 
        u8                              group_addr[ETH_ALEN];
        bool                            group_addr_set;
 
        if (err)
                return err;
 
+       spin_lock_bh(&br->lock);
+       br->bridge_ageing_time = t;
        br->ageing_time = t;
+       spin_unlock_bh(&br->lock);
+
        mod_timer(&br->gc_timer, jiffies);
 
        return 0;
 /* called under bridge lock */
 void __br_set_topology_change(struct net_bridge *br, unsigned char val)
 {
+       unsigned long t;
+       int err;
+
+       if (br->stp_enabled == BR_KERNEL_STP && br->topology_change != val) {
+               /* On topology change, set the bridge ageing time to twice the
+                * forward delay. Otherwise, restore its default ageing time.
+                */
+
+               if (val) {
+                       t = 2 * br->forward_delay;
+                       br_debug(br, "decreasing ageing time to %lu\n", t);
+               } else {
+                       t = br->bridge_ageing_time;
+                       br_debug(br, "restoring ageing time to %lu\n", t);
+               }
+
+               err = __set_ageing_time(br->dev, t);
+               if (err)
+                       br_warn(br, "error offloading ageing time\n");
+               else
+                       br->ageing_time = t;
+       }
+
        br->topology_change = val;
 }