diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 2d106ef4fa4c..27b4bb0cca6c 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -112,6 +112,7 @@ struct tipc_node *tipc_node_create(u32 addr) | |||
| 112 | break; | 112 | break; |
| 113 | } | 113 | } |
| 114 | list_add_tail(&n_ptr->list, &temp_node->list); | 114 | list_add_tail(&n_ptr->list, &temp_node->list); |
| 115 | n_ptr->block_setup = WAIT_PEER_DOWN; | ||
| 115 | 116 | ||
| 116 | tipc_num_nodes++; | 117 | tipc_num_nodes++; |
| 117 | 118 | ||
| @@ -312,7 +313,7 @@ static void node_established_contact(struct tipc_node *n_ptr) | |||
| 312 | } | 313 | } |
| 313 | } | 314 | } |
| 314 | 315 | ||
| 315 | static void node_cleanup_finished(unsigned long node_addr) | 316 | static void node_name_purge_complete(unsigned long node_addr) |
| 316 | { | 317 | { |
| 317 | struct tipc_node *n_ptr; | 318 | struct tipc_node *n_ptr; |
| 318 | 319 | ||
| @@ -320,7 +321,7 @@ static void node_cleanup_finished(unsigned long node_addr) | |||
| 320 | n_ptr = tipc_node_find(node_addr); | 321 | n_ptr = tipc_node_find(node_addr); |
| 321 | if (n_ptr) { | 322 | if (n_ptr) { |
| 322 | tipc_node_lock(n_ptr); | 323 | tipc_node_lock(n_ptr); |
| 323 | n_ptr->cleanup_required = 0; | 324 | n_ptr->block_setup &= ~WAIT_NAMES_GONE; |
| 324 | tipc_node_unlock(n_ptr); | 325 | tipc_node_unlock(n_ptr); |
| 325 | } | 326 | } |
| 326 | read_unlock_bh(&tipc_net_lock); | 327 | read_unlock_bh(&tipc_net_lock); |
| @@ -331,28 +332,32 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
| 331 | char addr_string[16]; | 332 | char addr_string[16]; |
| 332 | u32 i; | 333 | u32 i; |
| 333 | 334 | ||
| 334 | /* Clean up broadcast reception remains */ | 335 | info("Lost contact with %s\n", |
| 335 | n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0; | 336 | tipc_addr_string_fill(addr_string, n_ptr->addr)); |
| 336 | while (n_ptr->bclink.deferred_head) { | 337 | |
| 337 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | 338 | /* Flush broadcast link info associated with lost node */ |
| 338 | n_ptr->bclink.deferred_head = buf->next; | ||
| 339 | buf_discard(buf); | ||
| 340 | } | ||
| 341 | if (n_ptr->bclink.defragm) { | ||
| 342 | buf_discard(n_ptr->bclink.defragm); | ||
| 343 | n_ptr->bclink.defragm = NULL; | ||
| 344 | } | ||
| 345 | 339 | ||
| 346 | if (n_ptr->bclink.supported) { | 340 | if (n_ptr->bclink.supported) { |
| 341 | n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0; | ||
| 342 | while (n_ptr->bclink.deferred_head) { | ||
| 343 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | ||
| 344 | n_ptr->bclink.deferred_head = buf->next; | ||
| 345 | buf_discard(buf); | ||
| 346 | } | ||
| 347 | |||
| 348 | if (n_ptr->bclink.defragm) { | ||
| 349 | buf_discard(n_ptr->bclink.defragm); | ||
| 350 | n_ptr->bclink.defragm = NULL; | ||
| 351 | } | ||
| 352 | |||
| 353 | tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr); | ||
| 347 | tipc_bclink_acknowledge(n_ptr, | 354 | tipc_bclink_acknowledge(n_ptr, |
| 348 | mod(n_ptr->bclink.acked + 10000)); | 355 | mod(n_ptr->bclink.acked + 10000)); |
| 349 | tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr); | ||
| 350 | if (n_ptr->addr < tipc_own_addr) | 356 | if (n_ptr->addr < tipc_own_addr) |
| 351 | tipc_own_tag--; | 357 | tipc_own_tag--; |
| 352 | } | ||
| 353 | 358 | ||
| 354 | info("Lost contact with %s\n", | 359 | n_ptr->bclink.supported = 0; |
| 355 | tipc_addr_string_fill(addr_string, n_ptr->addr)); | 360 | } |
| 356 | 361 | ||
| 357 | /* Abort link changeover */ | 362 | /* Abort link changeover */ |
| 358 | for (i = 0; i < MAX_BEARERS; i++) { | 363 | for (i = 0; i < MAX_BEARERS; i++) { |
| @@ -367,10 +372,10 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
| 367 | /* Notify subscribers */ | 372 | /* Notify subscribers */ |
| 368 | tipc_nodesub_notify(n_ptr); | 373 | tipc_nodesub_notify(n_ptr); |
| 369 | 374 | ||
| 370 | /* Prevent re-contact with node until all cleanup is done */ | 375 | /* Prevent re-contact with node until cleanup is done */ |
| 371 | 376 | ||
| 372 | n_ptr->cleanup_required = 1; | 377 | n_ptr->block_setup = WAIT_PEER_DOWN | WAIT_NAMES_GONE; |
| 373 | tipc_k_signal((Handler)node_cleanup_finished, n_ptr->addr); | 378 | tipc_k_signal((Handler)node_name_purge_complete, n_ptr->addr); |
| 374 | } | 379 | } |
| 375 | 380 | ||
| 376 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) | 381 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) |
