add CONFIG_UHID for bluetooth hid devices
[firefly-linux-kernel-4.4.55.git] / net / bridge / br_stp.c
index 7370d14f634d71427d993dae89cd017067e8fcd1..fcff62251547c476659399999d584b4bb31cf380 100644 (file)
@@ -164,8 +164,7 @@ void br_transmit_config(struct net_bridge_port *p)
        else {
                struct net_bridge_port *root
                        = br_get_port(br, br->root_port);
-               bpdu.message_age = br->max_age
-                       - (root->message_age_timer.expires - jiffies)
+               bpdu.message_age = (jiffies - root->designated_age)
                        + MESSAGE_AGE_INCR;
        }
        bpdu.max_age = br->max_age;
@@ -189,6 +188,7 @@ static inline void br_record_config_information(struct net_bridge_port *p,
        p->designated_cost = bpdu->root_path_cost;
        p->designated_bridge = bpdu->bridge_id;
        p->designated_port = bpdu->port_id;
+       p->designated_age = jiffies + bpdu->message_age;
 
        mod_timer(&p->message_age_timer, jiffies
                  + (p->br->max_age - bpdu->message_age));
@@ -484,3 +484,51 @@ void br_received_tcn_bpdu(struct net_bridge_port *p)
                br_topology_change_acknowledge(p);
        }
 }
+
+/* Change bridge STP parameter */
+int br_set_hello_time(struct net_bridge *br, unsigned long val)
+{
+       unsigned long t = clock_t_to_jiffies(val);
+
+       if (t < BR_MIN_HELLO_TIME || t > BR_MAX_HELLO_TIME)
+               return -ERANGE;
+
+       spin_lock_bh(&br->lock);
+       br->bridge_hello_time = t;
+       if (br_is_root_bridge(br))
+               br->hello_time = br->bridge_hello_time;
+       spin_unlock_bh(&br->lock);
+       return 0;
+}
+
+int br_set_max_age(struct net_bridge *br, unsigned long val)
+{
+       unsigned long t = clock_t_to_jiffies(val);
+
+       if (t < BR_MIN_MAX_AGE || t > BR_MAX_MAX_AGE)
+               return -ERANGE;
+
+       spin_lock_bh(&br->lock);
+       br->bridge_max_age = t;
+       if (br_is_root_bridge(br))
+               br->max_age = br->bridge_max_age;
+       spin_unlock_bh(&br->lock);
+       return 0;
+
+}
+
+int br_set_forward_delay(struct net_bridge *br, unsigned long val)
+{
+       unsigned long t = clock_t_to_jiffies(val);
+
+       if (br->stp_enabled != BR_NO_STP &&
+           (t < BR_MIN_FORWARD_DELAY || t > BR_MAX_FORWARD_DELAY))
+               return -ERANGE;
+
+       spin_lock_bh(&br->lock);
+       br->bridge_forward_delay = t;
+       if (br_is_root_bridge(br))
+               br->forward_delay = br->bridge_forward_delay;
+       spin_unlock_bh(&br->lock);
+       return 0;
+}