Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Spanning tree protocol; generic parts
0004  *  Linux ethernet bridge
0005  *
0006  *  Authors:
0007  *  Lennert Buytenhek       <buytenh@gnu.org>
0008  */
0009 #include <linux/kernel.h>
0010 #include <linux/rculist.h>
0011 #include <net/switchdev.h>
0012 
0013 #include "br_private.h"
0014 #include "br_private_stp.h"
0015 
0016 /* since time values in bpdu are in jiffies and then scaled (1/256)
0017  * before sending, make sure that is at least one STP tick.
0018  */
0019 #define MESSAGE_AGE_INCR    ((HZ / 256) + 1)
0020 
0021 static const char *const br_port_state_names[] = {
0022     [BR_STATE_DISABLED] = "disabled",
0023     [BR_STATE_LISTENING] = "listening",
0024     [BR_STATE_LEARNING] = "learning",
0025     [BR_STATE_FORWARDING] = "forwarding",
0026     [BR_STATE_BLOCKING] = "blocking",
0027 };
0028 
0029 void br_set_state(struct net_bridge_port *p, unsigned int state)
0030 {
0031     struct switchdev_attr attr = {
0032         .orig_dev = p->dev,
0033         .id = SWITCHDEV_ATTR_ID_PORT_STP_STATE,
0034         .flags = SWITCHDEV_F_DEFER,
0035         .u.stp_state = state,
0036     };
0037     int err;
0038 
0039     /* Don't change the state of the ports if they are driven by a different
0040      * protocol.
0041      */
0042     if (p->flags & BR_MRP_AWARE)
0043         return;
0044 
0045     p->state = state;
0046     if (br_opt_get(p->br, BROPT_MST_ENABLED)) {
0047         err = br_mst_set_state(p, 0, state, NULL);
0048         if (err)
0049             br_warn(p->br, "error setting MST state on port %u(%s)\n",
0050                 p->port_no, netdev_name(p->dev));
0051     }
0052     err = switchdev_port_attr_set(p->dev, &attr, NULL);
0053     if (err && err != -EOPNOTSUPP)
0054         br_warn(p->br, "error setting offload STP state on port %u(%s)\n",
0055                 (unsigned int) p->port_no, p->dev->name);
0056     else
0057         br_info(p->br, "port %u(%s) entered %s state\n",
0058                 (unsigned int) p->port_no, p->dev->name,
0059                 br_port_state_names[p->state]);
0060 
0061     if (p->br->stp_enabled == BR_KERNEL_STP) {
0062         switch (p->state) {
0063         case BR_STATE_BLOCKING:
0064             p->stp_xstats.transition_blk++;
0065             break;
0066         case BR_STATE_FORWARDING:
0067             p->stp_xstats.transition_fwd++;
0068             break;
0069         }
0070     }
0071 }
0072 
0073 u8 br_port_get_stp_state(const struct net_device *dev)
0074 {
0075     struct net_bridge_port *p;
0076 
0077     ASSERT_RTNL();
0078 
0079     p = br_port_get_rtnl(dev);
0080     if (!p)
0081         return BR_STATE_DISABLED;
0082 
0083     return p->state;
0084 }
0085 EXPORT_SYMBOL_GPL(br_port_get_stp_state);
0086 
0087 /* called under bridge lock */
0088 struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
0089 {
0090     struct net_bridge_port *p;
0091 
0092     list_for_each_entry_rcu(p, &br->port_list, list,
0093                 lockdep_is_held(&br->lock)) {
0094         if (p->port_no == port_no)
0095             return p;
0096     }
0097 
0098     return NULL;
0099 }
0100 
0101 /* called under bridge lock */
0102 static int br_should_become_root_port(const struct net_bridge_port *p,
0103                       u16 root_port)
0104 {
0105     struct net_bridge *br;
0106     struct net_bridge_port *rp;
0107     int t;
0108 
0109     br = p->br;
0110     if (p->state == BR_STATE_DISABLED ||
0111         br_is_designated_port(p))
0112         return 0;
0113 
0114     if (memcmp(&br->bridge_id, &p->designated_root, 8) <= 0)
0115         return 0;
0116 
0117     if (!root_port)
0118         return 1;
0119 
0120     rp = br_get_port(br, root_port);
0121 
0122     t = memcmp(&p->designated_root, &rp->designated_root, 8);
0123     if (t < 0)
0124         return 1;
0125     else if (t > 0)
0126         return 0;
0127 
0128     if (p->designated_cost + p->path_cost <
0129         rp->designated_cost + rp->path_cost)
0130         return 1;
0131     else if (p->designated_cost + p->path_cost >
0132          rp->designated_cost + rp->path_cost)
0133         return 0;
0134 
0135     t = memcmp(&p->designated_bridge, &rp->designated_bridge, 8);
0136     if (t < 0)
0137         return 1;
0138     else if (t > 0)
0139         return 0;
0140 
0141     if (p->designated_port < rp->designated_port)
0142         return 1;
0143     else if (p->designated_port > rp->designated_port)
0144         return 0;
0145 
0146     if (p->port_id < rp->port_id)
0147         return 1;
0148 
0149     return 0;
0150 }
0151 
0152 static void br_root_port_block(const struct net_bridge *br,
0153                    struct net_bridge_port *p)
0154 {
0155 
0156     br_notice(br, "port %u(%s) tried to become root port (blocked)",
0157           (unsigned int) p->port_no, p->dev->name);
0158 
0159     br_set_state(p, BR_STATE_LISTENING);
0160     br_ifinfo_notify(RTM_NEWLINK, NULL, p);
0161 
0162     if (br->forward_delay > 0)
0163         mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay);
0164 }
0165 
0166 /* called under bridge lock */
0167 static void br_root_selection(struct net_bridge *br)
0168 {
0169     struct net_bridge_port *p;
0170     u16 root_port = 0;
0171 
0172     list_for_each_entry(p, &br->port_list, list) {
0173         if (!br_should_become_root_port(p, root_port))
0174             continue;
0175 
0176         if (p->flags & BR_ROOT_BLOCK)
0177             br_root_port_block(br, p);
0178         else
0179             root_port = p->port_no;
0180     }
0181 
0182     br->root_port = root_port;
0183 
0184     if (!root_port) {
0185         br->designated_root = br->bridge_id;
0186         br->root_path_cost = 0;
0187     } else {
0188         p = br_get_port(br, root_port);
0189         br->designated_root = p->designated_root;
0190         br->root_path_cost = p->designated_cost + p->path_cost;
0191     }
0192 }
0193 
0194 /* called under bridge lock */
0195 void br_become_root_bridge(struct net_bridge *br)
0196 {
0197     br->max_age = br->bridge_max_age;
0198     br->hello_time = br->bridge_hello_time;
0199     br->forward_delay = br->bridge_forward_delay;
0200     br_topology_change_detection(br);
0201     del_timer(&br->tcn_timer);
0202 
0203     if (br->dev->flags & IFF_UP) {
0204         br_config_bpdu_generation(br);
0205         mod_timer(&br->hello_timer, jiffies + br->hello_time);
0206     }
0207 }
0208 
0209 /* called under bridge lock */
0210 void br_transmit_config(struct net_bridge_port *p)
0211 {
0212     struct br_config_bpdu bpdu;
0213     struct net_bridge *br;
0214 
0215     if (timer_pending(&p->hold_timer)) {
0216         p->config_pending = 1;
0217         return;
0218     }
0219 
0220     br = p->br;
0221 
0222     bpdu.topology_change = br->topology_change;
0223     bpdu.topology_change_ack = p->topology_change_ack;
0224     bpdu.root = br->designated_root;
0225     bpdu.root_path_cost = br->root_path_cost;
0226     bpdu.bridge_id = br->bridge_id;
0227     bpdu.port_id = p->port_id;
0228     if (br_is_root_bridge(br))
0229         bpdu.message_age = 0;
0230     else {
0231         struct net_bridge_port *root
0232             = br_get_port(br, br->root_port);
0233         bpdu.message_age = (jiffies - root->designated_age)
0234             + MESSAGE_AGE_INCR;
0235     }
0236     bpdu.max_age = br->max_age;
0237     bpdu.hello_time = br->hello_time;
0238     bpdu.forward_delay = br->forward_delay;
0239 
0240     if (bpdu.message_age < br->max_age) {
0241         br_send_config_bpdu(p, &bpdu);
0242         p->topology_change_ack = 0;
0243         p->config_pending = 0;
0244         if (p->br->stp_enabled == BR_KERNEL_STP)
0245             mod_timer(&p->hold_timer,
0246                   round_jiffies(jiffies + BR_HOLD_TIME));
0247     }
0248 }
0249 
0250 /* called under bridge lock */
0251 static void br_record_config_information(struct net_bridge_port *p,
0252                      const struct br_config_bpdu *bpdu)
0253 {
0254     p->designated_root = bpdu->root;
0255     p->designated_cost = bpdu->root_path_cost;
0256     p->designated_bridge = bpdu->bridge_id;
0257     p->designated_port = bpdu->port_id;
0258     p->designated_age = jiffies - bpdu->message_age;
0259 
0260     mod_timer(&p->message_age_timer, jiffies
0261           + (bpdu->max_age - bpdu->message_age));
0262 }
0263 
0264 /* called under bridge lock */
0265 static void br_record_config_timeout_values(struct net_bridge *br,
0266                         const struct br_config_bpdu *bpdu)
0267 {
0268     br->max_age = bpdu->max_age;
0269     br->hello_time = bpdu->hello_time;
0270     br->forward_delay = bpdu->forward_delay;
0271     __br_set_topology_change(br, bpdu->topology_change);
0272 }
0273 
0274 /* called under bridge lock */
0275 void br_transmit_tcn(struct net_bridge *br)
0276 {
0277     struct net_bridge_port *p;
0278 
0279     p = br_get_port(br, br->root_port);
0280     if (p)
0281         br_send_tcn_bpdu(p);
0282     else
0283         br_notice(br, "root port %u not found for topology notice\n",
0284               br->root_port);
0285 }
0286 
0287 /* called under bridge lock */
0288 static int br_should_become_designated_port(const struct net_bridge_port *p)
0289 {
0290     struct net_bridge *br;
0291     int t;
0292 
0293     br = p->br;
0294     if (br_is_designated_port(p))
0295         return 1;
0296 
0297     if (memcmp(&p->designated_root, &br->designated_root, 8))
0298         return 1;
0299 
0300     if (br->root_path_cost < p->designated_cost)
0301         return 1;
0302     else if (br->root_path_cost > p->designated_cost)
0303         return 0;
0304 
0305     t = memcmp(&br->bridge_id, &p->designated_bridge, 8);
0306     if (t < 0)
0307         return 1;
0308     else if (t > 0)
0309         return 0;
0310 
0311     if (p->port_id < p->designated_port)
0312         return 1;
0313 
0314     return 0;
0315 }
0316 
0317 /* called under bridge lock */
0318 static void br_designated_port_selection(struct net_bridge *br)
0319 {
0320     struct net_bridge_port *p;
0321 
0322     list_for_each_entry(p, &br->port_list, list) {
0323         if (p->state != BR_STATE_DISABLED &&
0324             br_should_become_designated_port(p))
0325             br_become_designated_port(p);
0326 
0327     }
0328 }
0329 
0330 /* called under bridge lock */
0331 static int br_supersedes_port_info(const struct net_bridge_port *p,
0332                    const struct br_config_bpdu *bpdu)
0333 {
0334     int t;
0335 
0336     t = memcmp(&bpdu->root, &p->designated_root, 8);
0337     if (t < 0)
0338         return 1;
0339     else if (t > 0)
0340         return 0;
0341 
0342     if (bpdu->root_path_cost < p->designated_cost)
0343         return 1;
0344     else if (bpdu->root_path_cost > p->designated_cost)
0345         return 0;
0346 
0347     t = memcmp(&bpdu->bridge_id, &p->designated_bridge, 8);
0348     if (t < 0)
0349         return 1;
0350     else if (t > 0)
0351         return 0;
0352 
0353     if (memcmp(&bpdu->bridge_id, &p->br->bridge_id, 8))
0354         return 1;
0355 
0356     if (bpdu->port_id <= p->designated_port)
0357         return 1;
0358 
0359     return 0;
0360 }
0361 
0362 /* called under bridge lock */
0363 static void br_topology_change_acknowledged(struct net_bridge *br)
0364 {
0365     br->topology_change_detected = 0;
0366     del_timer(&br->tcn_timer);
0367 }
0368 
0369 /* called under bridge lock */
0370 void br_topology_change_detection(struct net_bridge *br)
0371 {
0372     int isroot = br_is_root_bridge(br);
0373 
0374     if (br->stp_enabled != BR_KERNEL_STP)
0375         return;
0376 
0377     br_info(br, "topology change detected, %s\n",
0378         isroot ? "propagating" : "sending tcn bpdu");
0379 
0380     if (isroot) {
0381         __br_set_topology_change(br, 1);
0382         mod_timer(&br->topology_change_timer, jiffies
0383               + br->bridge_forward_delay + br->bridge_max_age);
0384     } else if (!br->topology_change_detected) {
0385         br_transmit_tcn(br);
0386         mod_timer(&br->tcn_timer, jiffies + br->bridge_hello_time);
0387     }
0388 
0389     br->topology_change_detected = 1;
0390 }
0391 
0392 /* called under bridge lock */
0393 void br_config_bpdu_generation(struct net_bridge *br)
0394 {
0395     struct net_bridge_port *p;
0396 
0397     list_for_each_entry(p, &br->port_list, list) {
0398         if (p->state != BR_STATE_DISABLED &&
0399             br_is_designated_port(p))
0400             br_transmit_config(p);
0401     }
0402 }
0403 
0404 /* called under bridge lock */
0405 static void br_reply(struct net_bridge_port *p)
0406 {
0407     br_transmit_config(p);
0408 }
0409 
0410 /* called under bridge lock */
0411 void br_configuration_update(struct net_bridge *br)
0412 {
0413     br_root_selection(br);
0414     br_designated_port_selection(br);
0415 }
0416 
0417 /* called under bridge lock */
0418 void br_become_designated_port(struct net_bridge_port *p)
0419 {
0420     struct net_bridge *br;
0421 
0422     br = p->br;
0423     p->designated_root = br->designated_root;
0424     p->designated_cost = br->root_path_cost;
0425     p->designated_bridge = br->bridge_id;
0426     p->designated_port = p->port_id;
0427 }
0428 
0429 
0430 /* called under bridge lock */
0431 static void br_make_blocking(struct net_bridge_port *p)
0432 {
0433     if (p->state != BR_STATE_DISABLED &&
0434         p->state != BR_STATE_BLOCKING) {
0435         if (p->state == BR_STATE_FORWARDING ||
0436             p->state == BR_STATE_LEARNING)
0437             br_topology_change_detection(p->br);
0438 
0439         br_set_state(p, BR_STATE_BLOCKING);
0440         br_ifinfo_notify(RTM_NEWLINK, NULL, p);
0441 
0442         del_timer(&p->forward_delay_timer);
0443     }
0444 }
0445 
0446 /* called under bridge lock */
0447 static void br_make_forwarding(struct net_bridge_port *p)
0448 {
0449     struct net_bridge *br = p->br;
0450 
0451     if (p->state != BR_STATE_BLOCKING)
0452         return;
0453 
0454     if (br->stp_enabled == BR_NO_STP || br->forward_delay == 0) {
0455         br_set_state(p, BR_STATE_FORWARDING);
0456         br_topology_change_detection(br);
0457         del_timer(&p->forward_delay_timer);
0458     } else if (br->stp_enabled == BR_KERNEL_STP)
0459         br_set_state(p, BR_STATE_LISTENING);
0460     else
0461         br_set_state(p, BR_STATE_LEARNING);
0462 
0463     br_ifinfo_notify(RTM_NEWLINK, NULL, p);
0464 
0465     if (br->forward_delay != 0)
0466         mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay);
0467 }
0468 
0469 /* called under bridge lock */
0470 void br_port_state_selection(struct net_bridge *br)
0471 {
0472     struct net_bridge_port *p;
0473     unsigned int liveports = 0;
0474 
0475     list_for_each_entry(p, &br->port_list, list) {
0476         if (p->state == BR_STATE_DISABLED)
0477             continue;
0478 
0479         /* Don't change port states if userspace is handling STP */
0480         if (br->stp_enabled != BR_USER_STP) {
0481             if (p->port_no == br->root_port) {
0482                 p->config_pending = 0;
0483                 p->topology_change_ack = 0;
0484                 br_make_forwarding(p);
0485             } else if (br_is_designated_port(p)) {
0486                 del_timer(&p->message_age_timer);
0487                 br_make_forwarding(p);
0488             } else {
0489                 p->config_pending = 0;
0490                 p->topology_change_ack = 0;
0491                 br_make_blocking(p);
0492             }
0493         }
0494 
0495         if (p->state != BR_STATE_BLOCKING)
0496             br_multicast_enable_port(p);
0497         /* Multicast is not disabled for the port when it goes in
0498          * blocking state because the timers will expire and stop by
0499          * themselves without sending more queries.
0500          */
0501         if (p->state == BR_STATE_FORWARDING)
0502             ++liveports;
0503     }
0504 
0505     if (liveports == 0)
0506         netif_carrier_off(br->dev);
0507     else
0508         netif_carrier_on(br->dev);
0509 }
0510 
0511 /* called under bridge lock */
0512 static void br_topology_change_acknowledge(struct net_bridge_port *p)
0513 {
0514     p->topology_change_ack = 1;
0515     br_transmit_config(p);
0516 }
0517 
0518 /* called under bridge lock */
0519 void br_received_config_bpdu(struct net_bridge_port *p,
0520                  const struct br_config_bpdu *bpdu)
0521 {
0522     struct net_bridge *br;
0523     int was_root;
0524 
0525     p->stp_xstats.rx_bpdu++;
0526 
0527     br = p->br;
0528     was_root = br_is_root_bridge(br);
0529 
0530     if (br_supersedes_port_info(p, bpdu)) {
0531         br_record_config_information(p, bpdu);
0532         br_configuration_update(br);
0533         br_port_state_selection(br);
0534 
0535         if (!br_is_root_bridge(br) && was_root) {
0536             del_timer(&br->hello_timer);
0537             if (br->topology_change_detected) {
0538                 del_timer(&br->topology_change_timer);
0539                 br_transmit_tcn(br);
0540 
0541                 mod_timer(&br->tcn_timer,
0542                       jiffies + br->bridge_hello_time);
0543             }
0544         }
0545 
0546         if (p->port_no == br->root_port) {
0547             br_record_config_timeout_values(br, bpdu);
0548             br_config_bpdu_generation(br);
0549             if (bpdu->topology_change_ack)
0550                 br_topology_change_acknowledged(br);
0551         }
0552     } else if (br_is_designated_port(p)) {
0553         br_reply(p);
0554     }
0555 }
0556 
0557 /* called under bridge lock */
0558 void br_received_tcn_bpdu(struct net_bridge_port *p)
0559 {
0560     p->stp_xstats.rx_tcn++;
0561 
0562     if (br_is_designated_port(p)) {
0563         br_info(p->br, "port %u(%s) received tcn bpdu\n",
0564             (unsigned int) p->port_no, p->dev->name);
0565 
0566         br_topology_change_detection(p->br);
0567         br_topology_change_acknowledge(p);
0568     }
0569 }
0570 
0571 /* Change bridge STP parameter */
0572 int br_set_hello_time(struct net_bridge *br, unsigned long val)
0573 {
0574     unsigned long t = clock_t_to_jiffies(val);
0575 
0576     if (t < BR_MIN_HELLO_TIME || t > BR_MAX_HELLO_TIME)
0577         return -ERANGE;
0578 
0579     spin_lock_bh(&br->lock);
0580     br->bridge_hello_time = t;
0581     if (br_is_root_bridge(br))
0582         br->hello_time = br->bridge_hello_time;
0583     spin_unlock_bh(&br->lock);
0584     return 0;
0585 }
0586 
0587 int br_set_max_age(struct net_bridge *br, unsigned long val)
0588 {
0589     unsigned long t = clock_t_to_jiffies(val);
0590 
0591     if (t < BR_MIN_MAX_AGE || t > BR_MAX_MAX_AGE)
0592         return -ERANGE;
0593 
0594     spin_lock_bh(&br->lock);
0595     br->bridge_max_age = t;
0596     if (br_is_root_bridge(br))
0597         br->max_age = br->bridge_max_age;
0598     spin_unlock_bh(&br->lock);
0599     return 0;
0600 
0601 }
0602 
0603 /* called under bridge lock */
0604 int __set_ageing_time(struct net_device *dev, unsigned long t)
0605 {
0606     struct switchdev_attr attr = {
0607         .orig_dev = dev,
0608         .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
0609         .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP | SWITCHDEV_F_DEFER,
0610         .u.ageing_time = jiffies_to_clock_t(t),
0611     };
0612     int err;
0613 
0614     err = switchdev_port_attr_set(dev, &attr, NULL);
0615     if (err && err != -EOPNOTSUPP)
0616         return err;
0617 
0618     return 0;
0619 }
0620 
0621 /* Set time interval that dynamic forwarding entries live
0622  * For pure software bridge, allow values outside the 802.1
0623  * standard specification for special cases:
0624  *  0 - entry never ages (all permanent)
0625  *  1 - entry disappears (no persistence)
0626  *
0627  * Offloaded switch entries maybe more restrictive
0628  */
0629 int br_set_ageing_time(struct net_bridge *br, clock_t ageing_time)
0630 {
0631     unsigned long t = clock_t_to_jiffies(ageing_time);
0632     int err;
0633 
0634     err = __set_ageing_time(br->dev, t);
0635     if (err)
0636         return err;
0637 
0638     spin_lock_bh(&br->lock);
0639     br->bridge_ageing_time = t;
0640     br->ageing_time = t;
0641     spin_unlock_bh(&br->lock);
0642 
0643     mod_delayed_work(system_long_wq, &br->gc_work, 0);
0644 
0645     return 0;
0646 }
0647 
0648 clock_t br_get_ageing_time(const struct net_device *br_dev)
0649 {
0650     const struct net_bridge *br;
0651 
0652     if (!netif_is_bridge_master(br_dev))
0653         return 0;
0654 
0655     br = netdev_priv(br_dev);
0656 
0657     return jiffies_to_clock_t(br->ageing_time);
0658 }
0659 EXPORT_SYMBOL_GPL(br_get_ageing_time);
0660 
0661 /* called under bridge lock */
0662 void __br_set_topology_change(struct net_bridge *br, unsigned char val)
0663 {
0664     unsigned long t;
0665     int err;
0666 
0667     if (br->stp_enabled == BR_KERNEL_STP && br->topology_change != val) {
0668         /* On topology change, set the bridge ageing time to twice the
0669          * forward delay. Otherwise, restore its default ageing time.
0670          */
0671 
0672         if (val) {
0673             t = 2 * br->forward_delay;
0674             br_debug(br, "decreasing ageing time to %lu\n", t);
0675         } else {
0676             t = br->bridge_ageing_time;
0677             br_debug(br, "restoring ageing time to %lu\n", t);
0678         }
0679 
0680         err = __set_ageing_time(br->dev, t);
0681         if (err)
0682             br_warn(br, "error offloading ageing time\n");
0683         else
0684             br->ageing_time = t;
0685     }
0686 
0687     br->topology_change = val;
0688 }
0689 
0690 void __br_set_forward_delay(struct net_bridge *br, unsigned long t)
0691 {
0692     br->bridge_forward_delay = t;
0693     if (br_is_root_bridge(br))
0694         br->forward_delay = br->bridge_forward_delay;
0695 }
0696 
0697 int br_set_forward_delay(struct net_bridge *br, unsigned long val)
0698 {
0699     unsigned long t = clock_t_to_jiffies(val);
0700     int err = -ERANGE;
0701 
0702     spin_lock_bh(&br->lock);
0703     if (br->stp_enabled != BR_NO_STP &&
0704         (t < BR_MIN_FORWARD_DELAY || t > BR_MAX_FORWARD_DELAY))
0705         goto unlock;
0706 
0707     __br_set_forward_delay(br, t);
0708     err = 0;
0709 
0710 unlock:
0711     spin_unlock_bh(&br->lock);
0712     return err;
0713 }