aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge/br_stp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/bridge/br_stp.c')
-rw-r--r--net/bridge/br_stp.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c
index b3cca126b103..9cb7044d0801 100644
--- a/net/bridge/br_stp.c
+++ b/net/bridge/br_stp.c
@@ -30,13 +30,6 @@ static const char *const br_port_state_names[] = {
30 [BR_STATE_BLOCKING] = "blocking", 30 [BR_STATE_BLOCKING] = "blocking",
31}; 31};
32 32
33void br_log_state(const struct net_bridge_port *p)
34{
35 br_info(p->br, "port %u(%s) entered %s state\n",
36 (unsigned int) p->port_no, p->dev->name,
37 br_port_state_names[p->state]);
38}
39
40void br_set_state(struct net_bridge_port *p, unsigned int state) 33void br_set_state(struct net_bridge_port *p, unsigned int state)
41{ 34{
42 struct switchdev_attr attr = { 35 struct switchdev_attr attr = {
@@ -52,6 +45,10 @@ void br_set_state(struct net_bridge_port *p, unsigned int state)
52 if (err && err != -EOPNOTSUPP) 45 if (err && err != -EOPNOTSUPP)
53 br_warn(p->br, "error setting offload STP state on port %u(%s)\n", 46 br_warn(p->br, "error setting offload STP state on port %u(%s)\n",
54 (unsigned int) p->port_no, p->dev->name); 47 (unsigned int) p->port_no, p->dev->name);
48 else
49 br_info(p->br, "port %u(%s) entered %s state\n",
50 (unsigned int) p->port_no, p->dev->name,
51 br_port_state_names[p->state]);
55} 52}
56 53
57/* called under bridge lock */ 54/* called under bridge lock */
@@ -126,7 +123,6 @@ static void br_root_port_block(const struct net_bridge *br,
126 (unsigned int) p->port_no, p->dev->name); 123 (unsigned int) p->port_no, p->dev->name);
127 124
128 br_set_state(p, BR_STATE_LISTENING); 125 br_set_state(p, BR_STATE_LISTENING);
129 br_log_state(p);
130 br_ifinfo_notify(RTM_NEWLINK, p); 126 br_ifinfo_notify(RTM_NEWLINK, p);
131 127
132 if (br->forward_delay > 0) 128 if (br->forward_delay > 0)
@@ -407,7 +403,6 @@ static void br_make_blocking(struct net_bridge_port *p)
407 br_topology_change_detection(p->br); 403 br_topology_change_detection(p->br);
408 404
409 br_set_state(p, BR_STATE_BLOCKING); 405 br_set_state(p, BR_STATE_BLOCKING);
410 br_log_state(p);
411 br_ifinfo_notify(RTM_NEWLINK, p); 406 br_ifinfo_notify(RTM_NEWLINK, p);
412 407
413 del_timer(&p->forward_delay_timer); 408 del_timer(&p->forward_delay_timer);
@@ -431,7 +426,6 @@ static void br_make_forwarding(struct net_bridge_port *p)
431 else 426 else
432 br_set_state(p, BR_STATE_LEARNING); 427 br_set_state(p, BR_STATE_LEARNING);
433 428
434 br_log_state(p);
435 br_ifinfo_notify(RTM_NEWLINK, p); 429 br_ifinfo_notify(RTM_NEWLINK, p);
436 430
437 if (br->forward_delay != 0) 431 if (br->forward_delay != 0)
@@ -568,6 +562,14 @@ int br_set_max_age(struct net_bridge *br, unsigned long val)
568 562
569} 563}
570 564
565/* Set time interval that dynamic forwarding entries live
566 * For pure software bridge, allow values outside the 802.1
567 * standard specification for special cases:
568 * 0 - entry never ages (all permanant)
569 * 1 - entry disappears (no persistance)
570 *
571 * Offloaded switch entries maybe more restrictive
572 */
571int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) 573int br_set_ageing_time(struct net_bridge *br, u32 ageing_time)
572{ 574{
573 struct switchdev_attr attr = { 575 struct switchdev_attr attr = {
@@ -579,11 +581,8 @@ int br_set_ageing_time(struct net_bridge *br, u32 ageing_time)
579 unsigned long t = clock_t_to_jiffies(ageing_time); 581 unsigned long t = clock_t_to_jiffies(ageing_time);
580 int err; 582 int err;
581 583
582 if (t < BR_MIN_AGEING_TIME || t > BR_MAX_AGEING_TIME)
583 return -ERANGE;
584
585 err = switchdev_port_attr_set(br->dev, &attr); 584 err = switchdev_port_attr_set(br->dev, &attr);
586 if (err) 585 if (err && err != -EOPNOTSUPP)
587 return err; 586 return err;
588 587
589 br->ageing_time = t; 588 br->ageing_time = t;