diff options
Diffstat (limited to 'net/bridge/br_stp.c')
-rw-r--r-- | net/bridge/br_stp.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index bb4383e84de..ad0a3f7cf6c 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
@@ -109,7 +109,6 @@ static void br_root_selection(struct net_bridge *br) | |||
109 | list_for_each_entry(p, &br->port_list, list) { | 109 | list_for_each_entry(p, &br->port_list, list) { |
110 | if (br_should_become_root_port(p, root_port)) | 110 | if (br_should_become_root_port(p, root_port)) |
111 | root_port = p->port_no; | 111 | root_port = p->port_no; |
112 | |||
113 | } | 112 | } |
114 | 113 | ||
115 | br->root_port = root_port; | 114 | br->root_port = root_port; |
@@ -145,7 +144,6 @@ void br_transmit_config(struct net_bridge_port *p) | |||
145 | struct br_config_bpdu bpdu; | 144 | struct br_config_bpdu bpdu; |
146 | struct net_bridge *br; | 145 | struct net_bridge *br; |
147 | 146 | ||
148 | |||
149 | if (timer_pending(&p->hold_timer)) { | 147 | if (timer_pending(&p->hold_timer)) { |
150 | p->config_pending = 1; | 148 | p->config_pending = 1; |
151 | return; | 149 | return; |
@@ -164,8 +162,7 @@ void br_transmit_config(struct net_bridge_port *p) | |||
164 | else { | 162 | else { |
165 | struct net_bridge_port *root | 163 | struct net_bridge_port *root |
166 | = br_get_port(br, br->root_port); | 164 | = br_get_port(br, br->root_port); |
167 | bpdu.message_age = br->max_age | 165 | bpdu.message_age = (jiffies - root->designated_age) |
168 | - (root->message_age_timer.expires - jiffies) | ||
169 | + MESSAGE_AGE_INCR; | 166 | + MESSAGE_AGE_INCR; |
170 | } | 167 | } |
171 | bpdu.max_age = br->max_age; | 168 | bpdu.max_age = br->max_age; |
@@ -182,20 +179,21 @@ void br_transmit_config(struct net_bridge_port *p) | |||
182 | } | 179 | } |
183 | 180 | ||
184 | /* called under bridge lock */ | 181 | /* called under bridge lock */ |
185 | static inline void br_record_config_information(struct net_bridge_port *p, | 182 | static void br_record_config_information(struct net_bridge_port *p, |
186 | const struct br_config_bpdu *bpdu) | 183 | const struct br_config_bpdu *bpdu) |
187 | { | 184 | { |
188 | p->designated_root = bpdu->root; | 185 | p->designated_root = bpdu->root; |
189 | p->designated_cost = bpdu->root_path_cost; | 186 | p->designated_cost = bpdu->root_path_cost; |
190 | p->designated_bridge = bpdu->bridge_id; | 187 | p->designated_bridge = bpdu->bridge_id; |
191 | p->designated_port = bpdu->port_id; | 188 | p->designated_port = bpdu->port_id; |
189 | p->designated_age = jiffies + bpdu->message_age; | ||
192 | 190 | ||
193 | mod_timer(&p->message_age_timer, jiffies | 191 | mod_timer(&p->message_age_timer, jiffies |
194 | + (p->br->max_age - bpdu->message_age)); | 192 | + (p->br->max_age - bpdu->message_age)); |
195 | } | 193 | } |
196 | 194 | ||
197 | /* called under bridge lock */ | 195 | /* called under bridge lock */ |
198 | static inline void br_record_config_timeout_values(struct net_bridge *br, | 196 | static void br_record_config_timeout_values(struct net_bridge *br, |
199 | const struct br_config_bpdu *bpdu) | 197 | const struct br_config_bpdu *bpdu) |
200 | { | 198 | { |
201 | br->max_age = bpdu->max_age; | 199 | br->max_age = bpdu->max_age; |
@@ -254,7 +252,8 @@ static void br_designated_port_selection(struct net_bridge *br) | |||
254 | } | 252 | } |
255 | 253 | ||
256 | /* called under bridge lock */ | 254 | /* called under bridge lock */ |
257 | static int br_supersedes_port_info(struct net_bridge_port *p, struct br_config_bpdu *bpdu) | 255 | static int br_supersedes_port_info(const struct net_bridge_port *p, |
256 | const struct br_config_bpdu *bpdu) | ||
258 | { | 257 | { |
259 | int t; | 258 | int t; |
260 | 259 | ||
@@ -285,7 +284,7 @@ static int br_supersedes_port_info(struct net_bridge_port *p, struct br_config_b | |||
285 | } | 284 | } |
286 | 285 | ||
287 | /* called under bridge lock */ | 286 | /* called under bridge lock */ |
288 | static inline void br_topology_change_acknowledged(struct net_bridge *br) | 287 | static void br_topology_change_acknowledged(struct net_bridge *br) |
289 | { | 288 | { |
290 | br->topology_change_detected = 0; | 289 | br->topology_change_detected = 0; |
291 | del_timer(&br->tcn_timer); | 290 | del_timer(&br->tcn_timer); |
@@ -327,7 +326,7 @@ void br_config_bpdu_generation(struct net_bridge *br) | |||
327 | } | 326 | } |
328 | 327 | ||
329 | /* called under bridge lock */ | 328 | /* called under bridge lock */ |
330 | static inline void br_reply(struct net_bridge_port *p) | 329 | static void br_reply(struct net_bridge_port *p) |
331 | { | 330 | { |
332 | br_transmit_config(p); | 331 | br_transmit_config(p); |
333 | } | 332 | } |
@@ -363,6 +362,8 @@ static void br_make_blocking(struct net_bridge_port *p) | |||
363 | 362 | ||
364 | p->state = BR_STATE_BLOCKING; | 363 | p->state = BR_STATE_BLOCKING; |
365 | br_log_state(p); | 364 | br_log_state(p); |
365 | br_ifinfo_notify(RTM_NEWLINK, p); | ||
366 | |||
366 | del_timer(&p->forward_delay_timer); | 367 | del_timer(&p->forward_delay_timer); |
367 | } | 368 | } |
368 | } | 369 | } |
@@ -379,15 +380,14 @@ static void br_make_forwarding(struct net_bridge_port *p) | |||
379 | p->state = BR_STATE_FORWARDING; | 380 | p->state = BR_STATE_FORWARDING; |
380 | br_topology_change_detection(br); | 381 | br_topology_change_detection(br); |
381 | del_timer(&p->forward_delay_timer); | 382 | del_timer(&p->forward_delay_timer); |
382 | } | 383 | } else if (br->stp_enabled == BR_KERNEL_STP) |
383 | else if (br->stp_enabled == BR_KERNEL_STP) | ||
384 | p->state = BR_STATE_LISTENING; | 384 | p->state = BR_STATE_LISTENING; |
385 | else | 385 | else |
386 | p->state = BR_STATE_LEARNING; | 386 | p->state = BR_STATE_LEARNING; |
387 | 387 | ||
388 | br_multicast_enable_port(p); | 388 | br_multicast_enable_port(p); |
389 | |||
390 | br_log_state(p); | 389 | br_log_state(p); |
390 | br_ifinfo_notify(RTM_NEWLINK, p); | ||
391 | 391 | ||
392 | if (br->forward_delay != 0) | 392 | if (br->forward_delay != 0) |
393 | mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay); | 393 | mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay); |
@@ -431,14 +431,15 @@ void br_port_state_selection(struct net_bridge *br) | |||
431 | } | 431 | } |
432 | 432 | ||
433 | /* called under bridge lock */ | 433 | /* called under bridge lock */ |
434 | static inline void br_topology_change_acknowledge(struct net_bridge_port *p) | 434 | static void br_topology_change_acknowledge(struct net_bridge_port *p) |
435 | { | 435 | { |
436 | p->topology_change_ack = 1; | 436 | p->topology_change_ack = 1; |
437 | br_transmit_config(p); | 437 | br_transmit_config(p); |
438 | } | 438 | } |
439 | 439 | ||
440 | /* called under bridge lock */ | 440 | /* called under bridge lock */ |
441 | void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *bpdu) | 441 | void br_received_config_bpdu(struct net_bridge_port *p, |
442 | const struct br_config_bpdu *bpdu) | ||
442 | { | 443 | { |
443 | struct net_bridge *br; | 444 | struct net_bridge *br; |
444 | int was_root; | 445 | int was_root; |