0001
0002
0003
0004
0005
0006
0007
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
0017
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
0040
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
0405 static void br_reply(struct net_bridge_port *p)
0406 {
0407 br_transmit_config(p);
0408 }
0409
0410
0411 void br_configuration_update(struct net_bridge *br)
0412 {
0413 br_root_selection(br);
0414 br_designated_port_selection(br);
0415 }
0416
0417
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
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
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
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
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
0498
0499
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
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
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
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
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
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
0622
0623
0624
0625
0626
0627
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
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
0669
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 }