diff options
Diffstat (limited to 'net/tipc/link.c')
| -rw-r--r-- | net/tipc/link.c | 188 |
1 files changed, 52 insertions, 136 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index a3616b99529b..b31992ccd5d3 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
| @@ -99,23 +99,6 @@ struct link_name { | |||
| 99 | char if_peer[TIPC_MAX_IF_NAME]; | 99 | char if_peer[TIPC_MAX_IF_NAME]; |
| 100 | }; | 100 | }; |
| 101 | 101 | ||
| 102 | #if 0 | ||
| 103 | |||
| 104 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ | ||
| 105 | |||
| 106 | /** | ||
| 107 | * struct link_event - link up/down event notification | ||
| 108 | */ | ||
| 109 | |||
| 110 | struct link_event { | ||
| 111 | u32 addr; | ||
| 112 | int up; | ||
| 113 | void (*fcn)(u32, char *, int); | ||
| 114 | char name[TIPC_MAX_LINK_NAME]; | ||
| 115 | }; | ||
| 116 | |||
| 117 | #endif | ||
| 118 | |||
| 119 | static void link_handle_out_of_seq_msg(struct link *l_ptr, | 102 | static void link_handle_out_of_seq_msg(struct link *l_ptr, |
| 120 | struct sk_buff *buf); | 103 | struct sk_buff *buf); |
| 121 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); | 104 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); |
| @@ -129,6 +112,9 @@ static void link_state_event(struct link *l_ptr, u32 event); | |||
| 129 | static void link_reset_statistics(struct link *l_ptr); | 112 | static void link_reset_statistics(struct link *l_ptr); |
| 130 | static void link_print(struct link *l_ptr, struct print_buf *buf, | 113 | static void link_print(struct link *l_ptr, struct print_buf *buf, |
| 131 | const char *str); | 114 | const char *str); |
| 115 | static void link_start(struct link *l_ptr); | ||
| 116 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf); | ||
| 117 | |||
| 132 | 118 | ||
| 133 | /* | 119 | /* |
| 134 | * Debugging code used by link routines only | 120 | * Debugging code used by link routines only |
| @@ -239,13 +225,13 @@ int tipc_link_is_up(struct link *l_ptr) | |||
| 239 | { | 225 | { |
| 240 | if (!l_ptr) | 226 | if (!l_ptr) |
| 241 | return 0; | 227 | return 0; |
| 242 | return (link_working_working(l_ptr) || link_working_unknown(l_ptr)); | 228 | return link_working_working(l_ptr) || link_working_unknown(l_ptr); |
| 243 | } | 229 | } |
| 244 | 230 | ||
| 245 | int tipc_link_is_active(struct link *l_ptr) | 231 | int tipc_link_is_active(struct link *l_ptr) |
| 246 | { | 232 | { |
| 247 | return ((l_ptr->owner->active_links[0] == l_ptr) || | 233 | return (l_ptr->owner->active_links[0] == l_ptr) || |
| 248 | (l_ptr->owner->active_links[1] == l_ptr)); | 234 | (l_ptr->owner->active_links[1] == l_ptr); |
| 249 | } | 235 | } |
| 250 | 236 | ||
| 251 | /** | 237 | /** |
| @@ -459,7 +445,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer, | |||
| 459 | 445 | ||
| 460 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); | 446 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); |
| 461 | list_add_tail(&l_ptr->link_list, &b_ptr->links); | 447 | list_add_tail(&l_ptr->link_list, &b_ptr->links); |
| 462 | tipc_k_signal((Handler)tipc_link_start, (unsigned long)l_ptr); | 448 | tipc_k_signal((Handler)link_start, (unsigned long)l_ptr); |
| 463 | 449 | ||
| 464 | dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n", | 450 | dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n", |
| 465 | l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit); | 451 | l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit); |
| @@ -499,9 +485,9 @@ void tipc_link_delete(struct link *l_ptr) | |||
| 499 | kfree(l_ptr); | 485 | kfree(l_ptr); |
| 500 | } | 486 | } |
| 501 | 487 | ||
| 502 | void tipc_link_start(struct link *l_ptr) | 488 | static void link_start(struct link *l_ptr) |
| 503 | { | 489 | { |
| 504 | dbg("tipc_link_start %x\n", l_ptr); | 490 | dbg("link_start %x\n", l_ptr); |
| 505 | link_state_event(l_ptr, STARTING_EVT); | 491 | link_state_event(l_ptr, STARTING_EVT); |
| 506 | } | 492 | } |
| 507 | 493 | ||
| @@ -634,39 +620,9 @@ void tipc_link_stop(struct link *l_ptr) | |||
| 634 | l_ptr->proto_msg_queue = NULL; | 620 | l_ptr->proto_msg_queue = NULL; |
| 635 | } | 621 | } |
| 636 | 622 | ||
| 637 | #if 0 | ||
| 638 | |||
| 639 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ | 623 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ |
| 640 | |||
| 641 | static void link_recv_event(struct link_event *ev) | ||
| 642 | { | ||
| 643 | ev->fcn(ev->addr, ev->name, ev->up); | ||
| 644 | kfree(ev); | ||
| 645 | } | ||
| 646 | |||
| 647 | static void link_send_event(void (*fcn)(u32 a, char *n, int up), | ||
| 648 | struct link *l_ptr, int up) | ||
| 649 | { | ||
| 650 | struct link_event *ev; | ||
| 651 | |||
| 652 | ev = kmalloc(sizeof(*ev), GFP_ATOMIC); | ||
| 653 | if (!ev) { | ||
| 654 | warn("Link event allocation failure\n"); | ||
| 655 | return; | ||
| 656 | } | ||
| 657 | ev->addr = l_ptr->addr; | ||
| 658 | ev->up = up; | ||
| 659 | ev->fcn = fcn; | ||
| 660 | memcpy(ev->name, l_ptr->name, TIPC_MAX_LINK_NAME); | ||
| 661 | tipc_k_signal((Handler)link_recv_event, (unsigned long)ev); | ||
| 662 | } | ||
| 663 | |||
| 664 | #else | ||
| 665 | |||
| 666 | #define link_send_event(fcn, l_ptr, up) do { } while (0) | 624 | #define link_send_event(fcn, l_ptr, up) do { } while (0) |
| 667 | 625 | ||
| 668 | #endif | ||
| 669 | |||
| 670 | void tipc_link_reset(struct link *l_ptr) | 626 | void tipc_link_reset(struct link *l_ptr) |
| 671 | { | 627 | { |
| 672 | struct sk_buff *buf; | 628 | struct sk_buff *buf; |
| @@ -690,10 +646,7 @@ void tipc_link_reset(struct link *l_ptr) | |||
| 690 | 646 | ||
| 691 | tipc_node_link_down(l_ptr->owner, l_ptr); | 647 | tipc_node_link_down(l_ptr->owner, l_ptr); |
| 692 | tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); | 648 | tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); |
| 693 | #if 0 | 649 | |
| 694 | tipc_printf(TIPC_CONS, "\nReset link <%s>\n", l_ptr->name); | ||
| 695 | dbg_link_dump(); | ||
| 696 | #endif | ||
| 697 | if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && | 650 | if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && |
| 698 | l_ptr->owner->permit_changeover) { | 651 | l_ptr->owner->permit_changeover) { |
| 699 | l_ptr->reset_checkpoint = checkpoint; | 652 | l_ptr->reset_checkpoint = checkpoint; |
| @@ -1050,7 +1003,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
| 1050 | /* Fragmentation needed ? */ | 1003 | /* Fragmentation needed ? */ |
| 1051 | 1004 | ||
| 1052 | if (size > max_packet) | 1005 | if (size > max_packet) |
| 1053 | return tipc_link_send_long_buf(l_ptr, buf); | 1006 | return link_send_long_buf(l_ptr, buf); |
| 1054 | 1007 | ||
| 1055 | /* Packet can be queued or sent: */ | 1008 | /* Packet can be queued or sent: */ |
| 1056 | 1009 | ||
| @@ -1086,7 +1039,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
| 1086 | /* Try creating a new bundle */ | 1039 | /* Try creating a new bundle */ |
| 1087 | 1040 | ||
| 1088 | if (size <= max_packet * 2 / 3) { | 1041 | if (size <= max_packet * 2 / 3) { |
| 1089 | struct sk_buff *bundler = buf_acquire(max_packet); | 1042 | struct sk_buff *bundler = tipc_buf_acquire(max_packet); |
| 1090 | struct tipc_msg bundler_hdr; | 1043 | struct tipc_msg bundler_hdr; |
| 1091 | 1044 | ||
| 1092 | if (bundler) { | 1045 | if (bundler) { |
| @@ -1362,7 +1315,7 @@ again: | |||
| 1362 | 1315 | ||
| 1363 | /* Prepare header of first fragment: */ | 1316 | /* Prepare header of first fragment: */ |
| 1364 | 1317 | ||
| 1365 | buf_chain = buf = buf_acquire(max_pkt); | 1318 | buf_chain = buf = tipc_buf_acquire(max_pkt); |
| 1366 | if (!buf) | 1319 | if (!buf) |
| 1367 | return -ENOMEM; | 1320 | return -ENOMEM; |
| 1368 | buf->next = NULL; | 1321 | buf->next = NULL; |
| @@ -1419,7 +1372,7 @@ error: | |||
| 1419 | msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); | 1372 | msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); |
| 1420 | msg_set_fragm_no(&fragm_hdr, ++fragm_no); | 1373 | msg_set_fragm_no(&fragm_hdr, ++fragm_no); |
| 1421 | prev = buf; | 1374 | prev = buf; |
| 1422 | buf = buf_acquire(fragm_sz + INT_H_SIZE); | 1375 | buf = tipc_buf_acquire(fragm_sz + INT_H_SIZE); |
| 1423 | if (!buf) | 1376 | if (!buf) |
| 1424 | goto error; | 1377 | goto error; |
| 1425 | 1378 | ||
| @@ -1802,6 +1755,15 @@ static int link_recv_buf_validate(struct sk_buff *buf) | |||
| 1802 | return pskb_may_pull(buf, hdr_size); | 1755 | return pskb_may_pull(buf, hdr_size); |
| 1803 | } | 1756 | } |
| 1804 | 1757 | ||
| 1758 | /** | ||
| 1759 | * tipc_recv_msg - process TIPC messages arriving from off-node | ||
| 1760 | * @head: pointer to message buffer chain | ||
| 1761 | * @tb_ptr: pointer to bearer message arrived on | ||
| 1762 | * | ||
| 1763 | * Invoked with no locks held. Bearer pointer must point to a valid bearer | ||
| 1764 | * structure (i.e. cannot be NULL), but bearer can be inactive. | ||
| 1765 | */ | ||
| 1766 | |||
| 1805 | void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | 1767 | void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) |
| 1806 | { | 1768 | { |
| 1807 | read_lock_bh(&tipc_net_lock); | 1769 | read_lock_bh(&tipc_net_lock); |
| @@ -1819,6 +1781,11 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||
| 1819 | 1781 | ||
| 1820 | head = head->next; | 1782 | head = head->next; |
| 1821 | 1783 | ||
| 1784 | /* Ensure bearer is still enabled */ | ||
| 1785 | |||
| 1786 | if (unlikely(!b_ptr->active)) | ||
| 1787 | goto cont; | ||
| 1788 | |||
| 1822 | /* Ensure message is well-formed */ | 1789 | /* Ensure message is well-formed */ |
| 1823 | 1790 | ||
| 1824 | if (unlikely(!link_recv_buf_validate(buf))) | 1791 | if (unlikely(!link_recv_buf_validate(buf))) |
| @@ -1855,13 +1822,22 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||
| 1855 | goto cont; | 1822 | goto cont; |
| 1856 | } | 1823 | } |
| 1857 | 1824 | ||
| 1858 | /* Locate unicast link endpoint that should handle message */ | 1825 | /* Locate neighboring node that sent message */ |
| 1859 | 1826 | ||
| 1860 | n_ptr = tipc_node_find(msg_prevnode(msg)); | 1827 | n_ptr = tipc_node_find(msg_prevnode(msg)); |
| 1861 | if (unlikely(!n_ptr)) | 1828 | if (unlikely(!n_ptr)) |
| 1862 | goto cont; | 1829 | goto cont; |
| 1863 | tipc_node_lock(n_ptr); | 1830 | tipc_node_lock(n_ptr); |
| 1864 | 1831 | ||
| 1832 | /* Don't talk to neighbor during cleanup after last session */ | ||
| 1833 | |||
| 1834 | if (n_ptr->cleanup_required) { | ||
| 1835 | tipc_node_unlock(n_ptr); | ||
| 1836 | goto cont; | ||
| 1837 | } | ||
| 1838 | |||
| 1839 | /* Locate unicast link endpoint that should handle message */ | ||
| 1840 | |||
| 1865 | l_ptr = n_ptr->links[b_ptr->identity]; | 1841 | l_ptr = n_ptr->links[b_ptr->identity]; |
| 1866 | if (unlikely(!l_ptr)) { | 1842 | if (unlikely(!l_ptr)) { |
| 1867 | tipc_node_unlock(n_ptr); | 1843 | tipc_node_unlock(n_ptr); |
| @@ -2172,7 +2148,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
| 2172 | if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { | 2148 | if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { |
| 2173 | if (!l_ptr->proto_msg_queue) { | 2149 | if (!l_ptr->proto_msg_queue) { |
| 2174 | l_ptr->proto_msg_queue = | 2150 | l_ptr->proto_msg_queue = |
| 2175 | buf_acquire(sizeof(l_ptr->proto_msg)); | 2151 | tipc_buf_acquire(sizeof(l_ptr->proto_msg)); |
| 2176 | } | 2152 | } |
| 2177 | buf = l_ptr->proto_msg_queue; | 2153 | buf = l_ptr->proto_msg_queue; |
| 2178 | if (!buf) | 2154 | if (!buf) |
| @@ -2186,7 +2162,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
| 2186 | 2162 | ||
| 2187 | msg_dbg(msg, ">>"); | 2163 | msg_dbg(msg, ">>"); |
| 2188 | 2164 | ||
| 2189 | buf = buf_acquire(msg_size); | 2165 | buf = tipc_buf_acquire(msg_size); |
| 2190 | if (!buf) | 2166 | if (!buf) |
| 2191 | return; | 2167 | return; |
| 2192 | 2168 | ||
| @@ -2345,10 +2321,10 @@ exit: | |||
| 2345 | * tipc_link_tunnel(): Send one message via a link belonging to | 2321 | * tipc_link_tunnel(): Send one message via a link belonging to |
| 2346 | * another bearer. Owner node is locked. | 2322 | * another bearer. Owner node is locked. |
| 2347 | */ | 2323 | */ |
| 2348 | void tipc_link_tunnel(struct link *l_ptr, | 2324 | static void tipc_link_tunnel(struct link *l_ptr, |
| 2349 | struct tipc_msg *tunnel_hdr, | 2325 | struct tipc_msg *tunnel_hdr, |
| 2350 | struct tipc_msg *msg, | 2326 | struct tipc_msg *msg, |
| 2351 | u32 selector) | 2327 | u32 selector) |
| 2352 | { | 2328 | { |
| 2353 | struct link *tunnel; | 2329 | struct link *tunnel; |
| 2354 | struct sk_buff *buf; | 2330 | struct sk_buff *buf; |
| @@ -2361,7 +2337,7 @@ void tipc_link_tunnel(struct link *l_ptr, | |||
| 2361 | return; | 2337 | return; |
| 2362 | } | 2338 | } |
| 2363 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); | 2339 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); |
| 2364 | buf = buf_acquire(length + INT_H_SIZE); | 2340 | buf = tipc_buf_acquire(length + INT_H_SIZE); |
| 2365 | if (!buf) { | 2341 | if (!buf) { |
| 2366 | warn("Link changeover error, " | 2342 | warn("Link changeover error, " |
| 2367 | "unable to send tunnel msg\n"); | 2343 | "unable to send tunnel msg\n"); |
| @@ -2407,7 +2383,7 @@ void tipc_link_changeover(struct link *l_ptr) | |||
| 2407 | if (!l_ptr->first_out) { | 2383 | if (!l_ptr->first_out) { |
| 2408 | struct sk_buff *buf; | 2384 | struct sk_buff *buf; |
| 2409 | 2385 | ||
| 2410 | buf = buf_acquire(INT_H_SIZE); | 2386 | buf = tipc_buf_acquire(INT_H_SIZE); |
| 2411 | if (buf) { | 2387 | if (buf) { |
| 2412 | skb_copy_to_linear_data(buf, &tunnel_hdr, INT_H_SIZE); | 2388 | skb_copy_to_linear_data(buf, &tunnel_hdr, INT_H_SIZE); |
| 2413 | msg_set_size(&tunnel_hdr, INT_H_SIZE); | 2389 | msg_set_size(&tunnel_hdr, INT_H_SIZE); |
| @@ -2468,7 +2444,7 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel) | |||
| 2468 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); /* Update */ | 2444 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); /* Update */ |
| 2469 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); | 2445 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); |
| 2470 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); | 2446 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); |
| 2471 | outbuf = buf_acquire(length + INT_H_SIZE); | 2447 | outbuf = tipc_buf_acquire(length + INT_H_SIZE); |
| 2472 | if (outbuf == NULL) { | 2448 | if (outbuf == NULL) { |
| 2473 | warn("Link changeover error, " | 2449 | warn("Link changeover error, " |
| 2474 | "unable to send duplicate msg\n"); | 2450 | "unable to send duplicate msg\n"); |
| @@ -2504,7 +2480,7 @@ static struct sk_buff *buf_extract(struct sk_buff *skb, u32 from_pos) | |||
| 2504 | u32 size = msg_size(msg); | 2480 | u32 size = msg_size(msg); |
| 2505 | struct sk_buff *eb; | 2481 | struct sk_buff *eb; |
| 2506 | 2482 | ||
| 2507 | eb = buf_acquire(size); | 2483 | eb = tipc_buf_acquire(size); |
| 2508 | if (eb) | 2484 | if (eb) |
| 2509 | skb_copy_to_linear_data(eb, msg, size); | 2485 | skb_copy_to_linear_data(eb, msg, size); |
| 2510 | return eb; | 2486 | return eb; |
| @@ -2632,11 +2608,11 @@ void tipc_link_recv_bundle(struct sk_buff *buf) | |||
| 2632 | 2608 | ||
| 2633 | 2609 | ||
| 2634 | /* | 2610 | /* |
| 2635 | * tipc_link_send_long_buf: Entry for buffers needing fragmentation. | 2611 | * link_send_long_buf: Entry for buffers needing fragmentation. |
| 2636 | * The buffer is complete, inclusive total message length. | 2612 | * The buffer is complete, inclusive total message length. |
| 2637 | * Returns user data length. | 2613 | * Returns user data length. |
| 2638 | */ | 2614 | */ |
| 2639 | int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) | 2615 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) |
| 2640 | { | 2616 | { |
| 2641 | struct tipc_msg *inmsg = buf_msg(buf); | 2617 | struct tipc_msg *inmsg = buf_msg(buf); |
| 2642 | struct tipc_msg fragm_hdr; | 2618 | struct tipc_msg fragm_hdr; |
| @@ -2675,7 +2651,7 @@ int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) | |||
| 2675 | fragm_sz = rest; | 2651 | fragm_sz = rest; |
| 2676 | msg_set_type(&fragm_hdr, LAST_FRAGMENT); | 2652 | msg_set_type(&fragm_hdr, LAST_FRAGMENT); |
| 2677 | } | 2653 | } |
| 2678 | fragm = buf_acquire(fragm_sz + INT_H_SIZE); | 2654 | fragm = tipc_buf_acquire(fragm_sz + INT_H_SIZE); |
| 2679 | if (fragm == NULL) { | 2655 | if (fragm == NULL) { |
| 2680 | warn("Link unable to fragment message\n"); | 2656 | warn("Link unable to fragment message\n"); |
| 2681 | dsz = -ENOMEM; | 2657 | dsz = -ENOMEM; |
| @@ -2780,7 +2756,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
| 2780 | buf_discard(fbuf); | 2756 | buf_discard(fbuf); |
| 2781 | return 0; | 2757 | return 0; |
| 2782 | } | 2758 | } |
| 2783 | pbuf = buf_acquire(msg_size(imsg)); | 2759 | pbuf = tipc_buf_acquire(msg_size(imsg)); |
| 2784 | if (pbuf != NULL) { | 2760 | if (pbuf != NULL) { |
| 2785 | pbuf->next = *pending; | 2761 | pbuf->next = *pending; |
| 2786 | *pending = pbuf; | 2762 | *pending = pbuf; |
| @@ -3174,44 +3150,6 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s | |||
| 3174 | return buf; | 3150 | return buf; |
| 3175 | } | 3151 | } |
| 3176 | 3152 | ||
| 3177 | #if 0 | ||
| 3178 | int link_control(const char *name, u32 op, u32 val) | ||
| 3179 | { | ||
| 3180 | int res = -EINVAL; | ||
| 3181 | struct link *l_ptr; | ||
| 3182 | u32 bearer_id; | ||
| 3183 | struct tipc_node * node; | ||
| 3184 | u32 a; | ||
| 3185 | |||
| 3186 | a = link_name2addr(name, &bearer_id); | ||
| 3187 | read_lock_bh(&tipc_net_lock); | ||
| 3188 | node = tipc_node_find(a); | ||
| 3189 | if (node) { | ||
| 3190 | tipc_node_lock(node); | ||
| 3191 | l_ptr = node->links[bearer_id]; | ||
| 3192 | if (l_ptr) { | ||
| 3193 | if (op == TIPC_REMOVE_LINK) { | ||
| 3194 | struct bearer *b_ptr = l_ptr->b_ptr; | ||
| 3195 | spin_lock_bh(&b_ptr->publ.lock); | ||
| 3196 | tipc_link_delete(l_ptr); | ||
| 3197 | spin_unlock_bh(&b_ptr->publ.lock); | ||
| 3198 | } | ||
| 3199 | if (op == TIPC_CMD_BLOCK_LINK) { | ||
| 3200 | tipc_link_reset(l_ptr); | ||
| 3201 | l_ptr->blocked = 1; | ||
| 3202 | } | ||
| 3203 | if (op == TIPC_CMD_UNBLOCK_LINK) { | ||
| 3204 | l_ptr->blocked = 0; | ||
| 3205 | } | ||
| 3206 | res = 0; | ||
| 3207 | } | ||
| 3208 | tipc_node_unlock(node); | ||
| 3209 | } | ||
| 3210 | read_unlock_bh(&tipc_net_lock); | ||
| 3211 | return res; | ||
| 3212 | } | ||
| 3213 | #endif | ||
| 3214 | |||
| 3215 | /** | 3153 | /** |
| 3216 | * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination | 3154 | * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination |
| 3217 | * @dest: network address of destination node | 3155 | * @dest: network address of destination node |
| @@ -3242,28 +3180,6 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | |||
| 3242 | return res; | 3180 | return res; |
| 3243 | } | 3181 | } |
| 3244 | 3182 | ||
| 3245 | #if 0 | ||
| 3246 | static void link_dump_rec_queue(struct link *l_ptr) | ||
| 3247 | { | ||
| 3248 | struct sk_buff *crs; | ||
| 3249 | |||
| 3250 | if (!l_ptr->oldest_deferred_in) { | ||
| 3251 | info("Reception queue empty\n"); | ||
| 3252 | return; | ||
| 3253 | } | ||
| 3254 | info("Contents of Reception queue:\n"); | ||
| 3255 | crs = l_ptr->oldest_deferred_in; | ||
| 3256 | while (crs) { | ||
| 3257 | if (crs->data == (void *)0x0000a3a3) { | ||
| 3258 | info("buffer %x invalid\n", crs); | ||
| 3259 | return; | ||
| 3260 | } | ||
| 3261 | msg_dbg(buf_msg(crs), "In rec queue:\n"); | ||
| 3262 | crs = crs->next; | ||
| 3263 | } | ||
| 3264 | } | ||
| 3265 | #endif | ||
| 3266 | |||
| 3267 | static void link_dump_send_queue(struct link *l_ptr) | 3183 | static void link_dump_send_queue(struct link *l_ptr) |
| 3268 | { | 3184 | { |
| 3269 | if (l_ptr->next_out) { | 3185 | if (l_ptr->next_out) { |
