diff options
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 326 |
1 files changed, 144 insertions, 182 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 7a614f43549d..1c1e6151875e 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -41,6 +41,12 @@ | |||
41 | #include "discover.h" | 41 | #include "discover.h" |
42 | #include "config.h" | 42 | #include "config.h" |
43 | 43 | ||
44 | /* | ||
45 | * Error message prefixes | ||
46 | */ | ||
47 | static const char *link_co_err = "Link changeover error, "; | ||
48 | static const char *link_rst_msg = "Resetting link "; | ||
49 | static const char *link_unk_evt = "Unknown link event "; | ||
44 | 50 | ||
45 | /* | 51 | /* |
46 | * Out-of-range value for link session numbers | 52 | * Out-of-range value for link session numbers |
@@ -153,8 +159,8 @@ int tipc_link_is_active(struct tipc_link *l_ptr) | |||
153 | 159 | ||
154 | /** | 160 | /** |
155 | * link_name_validate - validate & (optionally) deconstruct tipc_link name | 161 | * link_name_validate - validate & (optionally) deconstruct tipc_link name |
156 | * @name - ptr to link name string | 162 | * @name: ptr to link name string |
157 | * @name_parts - ptr to area for link name components (or NULL if not needed) | 163 | * @name_parts: ptr to area for link name components (or NULL if not needed) |
158 | * | 164 | * |
159 | * Returns 1 if link name is valid, otherwise 0. | 165 | * Returns 1 if link name is valid, otherwise 0. |
160 | */ | 166 | */ |
@@ -300,20 +306,20 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, | |||
300 | 306 | ||
301 | if (n_ptr->link_cnt >= 2) { | 307 | if (n_ptr->link_cnt >= 2) { |
302 | tipc_addr_string_fill(addr_string, n_ptr->addr); | 308 | tipc_addr_string_fill(addr_string, n_ptr->addr); |
303 | err("Attempt to establish third link to %s\n", addr_string); | 309 | pr_err("Attempt to establish third link to %s\n", addr_string); |
304 | return NULL; | 310 | return NULL; |
305 | } | 311 | } |
306 | 312 | ||
307 | if (n_ptr->links[b_ptr->identity]) { | 313 | if (n_ptr->links[b_ptr->identity]) { |
308 | tipc_addr_string_fill(addr_string, n_ptr->addr); | 314 | tipc_addr_string_fill(addr_string, n_ptr->addr); |
309 | err("Attempt to establish second link on <%s> to %s\n", | 315 | pr_err("Attempt to establish second link on <%s> to %s\n", |
310 | b_ptr->name, addr_string); | 316 | b_ptr->name, addr_string); |
311 | return NULL; | 317 | return NULL; |
312 | } | 318 | } |
313 | 319 | ||
314 | l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); | 320 | l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); |
315 | if (!l_ptr) { | 321 | if (!l_ptr) { |
316 | warn("Link creation failed, no memory\n"); | 322 | pr_warn("Link creation failed, no memory\n"); |
317 | return NULL; | 323 | return NULL; |
318 | } | 324 | } |
319 | 325 | ||
@@ -371,7 +377,7 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, | |||
371 | void tipc_link_delete(struct tipc_link *l_ptr) | 377 | void tipc_link_delete(struct tipc_link *l_ptr) |
372 | { | 378 | { |
373 | if (!l_ptr) { | 379 | if (!l_ptr) { |
374 | err("Attempt to delete non-existent link\n"); | 380 | pr_err("Attempt to delete non-existent link\n"); |
375 | return; | 381 | return; |
376 | } | 382 | } |
377 | 383 | ||
@@ -632,8 +638,8 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
632 | link_set_timer(l_ptr, cont_intv / 4); | 638 | link_set_timer(l_ptr, cont_intv / 4); |
633 | break; | 639 | break; |
634 | case RESET_MSG: | 640 | case RESET_MSG: |
635 | info("Resetting link <%s>, requested by peer\n", | 641 | pr_info("%s<%s>, requested by peer\n", link_rst_msg, |
636 | l_ptr->name); | 642 | l_ptr->name); |
637 | tipc_link_reset(l_ptr); | 643 | tipc_link_reset(l_ptr); |
638 | l_ptr->state = RESET_RESET; | 644 | l_ptr->state = RESET_RESET; |
639 | l_ptr->fsm_msg_cnt = 0; | 645 | l_ptr->fsm_msg_cnt = 0; |
@@ -642,7 +648,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
642 | link_set_timer(l_ptr, cont_intv); | 648 | link_set_timer(l_ptr, cont_intv); |
643 | break; | 649 | break; |
644 | default: | 650 | default: |
645 | err("Unknown link event %u in WW state\n", event); | 651 | pr_err("%s%u in WW state\n", link_unk_evt, event); |
646 | } | 652 | } |
647 | break; | 653 | break; |
648 | case WORKING_UNKNOWN: | 654 | case WORKING_UNKNOWN: |
@@ -654,8 +660,8 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
654 | link_set_timer(l_ptr, cont_intv); | 660 | link_set_timer(l_ptr, cont_intv); |
655 | break; | 661 | break; |
656 | case RESET_MSG: | 662 | case RESET_MSG: |
657 | info("Resetting link <%s>, requested by peer " | 663 | pr_info("%s<%s>, requested by peer while probing\n", |
658 | "while probing\n", l_ptr->name); | 664 | link_rst_msg, l_ptr->name); |
659 | tipc_link_reset(l_ptr); | 665 | tipc_link_reset(l_ptr); |
660 | l_ptr->state = RESET_RESET; | 666 | l_ptr->state = RESET_RESET; |
661 | l_ptr->fsm_msg_cnt = 0; | 667 | l_ptr->fsm_msg_cnt = 0; |
@@ -680,8 +686,8 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
680 | l_ptr->fsm_msg_cnt++; | 686 | l_ptr->fsm_msg_cnt++; |
681 | link_set_timer(l_ptr, cont_intv / 4); | 687 | link_set_timer(l_ptr, cont_intv / 4); |
682 | } else { /* Link has failed */ | 688 | } else { /* Link has failed */ |
683 | warn("Resetting link <%s>, peer not responding\n", | 689 | pr_warn("%s<%s>, peer not responding\n", |
684 | l_ptr->name); | 690 | link_rst_msg, l_ptr->name); |
685 | tipc_link_reset(l_ptr); | 691 | tipc_link_reset(l_ptr); |
686 | l_ptr->state = RESET_UNKNOWN; | 692 | l_ptr->state = RESET_UNKNOWN; |
687 | l_ptr->fsm_msg_cnt = 0; | 693 | l_ptr->fsm_msg_cnt = 0; |
@@ -692,7 +698,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
692 | } | 698 | } |
693 | break; | 699 | break; |
694 | default: | 700 | default: |
695 | err("Unknown link event %u in WU state\n", event); | 701 | pr_err("%s%u in WU state\n", link_unk_evt, event); |
696 | } | 702 | } |
697 | break; | 703 | break; |
698 | case RESET_UNKNOWN: | 704 | case RESET_UNKNOWN: |
@@ -726,7 +732,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
726 | link_set_timer(l_ptr, cont_intv); | 732 | link_set_timer(l_ptr, cont_intv); |
727 | break; | 733 | break; |
728 | default: | 734 | default: |
729 | err("Unknown link event %u in RU state\n", event); | 735 | pr_err("%s%u in RU state\n", link_unk_evt, event); |
730 | } | 736 | } |
731 | break; | 737 | break; |
732 | case RESET_RESET: | 738 | case RESET_RESET: |
@@ -751,11 +757,11 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event) | |||
751 | link_set_timer(l_ptr, cont_intv); | 757 | link_set_timer(l_ptr, cont_intv); |
752 | break; | 758 | break; |
753 | default: | 759 | default: |
754 | err("Unknown link event %u in RR state\n", event); | 760 | pr_err("%s%u in RR state\n", link_unk_evt, event); |
755 | } | 761 | } |
756 | break; | 762 | break; |
757 | default: | 763 | default: |
758 | err("Unknown link state %u/%u\n", l_ptr->state, event); | 764 | pr_err("Unknown link state %u/%u\n", l_ptr->state, event); |
759 | } | 765 | } |
760 | } | 766 | } |
761 | 767 | ||
@@ -856,7 +862,8 @@ int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf) | |||
856 | } | 862 | } |
857 | kfree_skb(buf); | 863 | kfree_skb(buf); |
858 | if (imp > CONN_MANAGER) { | 864 | if (imp > CONN_MANAGER) { |
859 | warn("Resetting link <%s>, send queue full", l_ptr->name); | 865 | pr_warn("%s<%s>, send queue full", link_rst_msg, |
866 | l_ptr->name); | ||
860 | tipc_link_reset(l_ptr); | 867 | tipc_link_reset(l_ptr); |
861 | } | 868 | } |
862 | return dsz; | 869 | return dsz; |
@@ -944,7 +951,7 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) | |||
944 | return res; | 951 | return res; |
945 | } | 952 | } |
946 | 953 | ||
947 | /* | 954 | /** |
948 | * tipc_link_send_names - send name table entries to new neighbor | 955 | * tipc_link_send_names - send name table entries to new neighbor |
949 | * | 956 | * |
950 | * Send routine for bulk delivery of name table messages when contact | 957 | * Send routine for bulk delivery of name table messages when contact |
@@ -1409,8 +1416,8 @@ static void link_reset_all(unsigned long addr) | |||
1409 | 1416 | ||
1410 | tipc_node_lock(n_ptr); | 1417 | tipc_node_lock(n_ptr); |
1411 | 1418 | ||
1412 | warn("Resetting all links to %s\n", | 1419 | pr_warn("Resetting all links to %s\n", |
1413 | tipc_addr_string_fill(addr_string, n_ptr->addr)); | 1420 | tipc_addr_string_fill(addr_string, n_ptr->addr)); |
1414 | 1421 | ||
1415 | for (i = 0; i < MAX_BEARERS; i++) { | 1422 | for (i = 0; i < MAX_BEARERS; i++) { |
1416 | if (n_ptr->links[i]) { | 1423 | if (n_ptr->links[i]) { |
@@ -1428,7 +1435,7 @@ static void link_retransmit_failure(struct tipc_link *l_ptr, | |||
1428 | { | 1435 | { |
1429 | struct tipc_msg *msg = buf_msg(buf); | 1436 | struct tipc_msg *msg = buf_msg(buf); |
1430 | 1437 | ||
1431 | warn("Retransmission failure on link <%s>\n", l_ptr->name); | 1438 | pr_warn("Retransmission failure on link <%s>\n", l_ptr->name); |
1432 | 1439 | ||
1433 | if (l_ptr->addr) { | 1440 | if (l_ptr->addr) { |
1434 | /* Handle failure on standard link */ | 1441 | /* Handle failure on standard link */ |
@@ -1440,21 +1447,23 @@ static void link_retransmit_failure(struct tipc_link *l_ptr, | |||
1440 | struct tipc_node *n_ptr; | 1447 | struct tipc_node *n_ptr; |
1441 | char addr_string[16]; | 1448 | char addr_string[16]; |
1442 | 1449 | ||
1443 | info("Msg seq number: %u, ", msg_seqno(msg)); | 1450 | pr_info("Msg seq number: %u, ", msg_seqno(msg)); |
1444 | info("Outstanding acks: %lu\n", | 1451 | pr_cont("Outstanding acks: %lu\n", |
1445 | (unsigned long) TIPC_SKB_CB(buf)->handle); | 1452 | (unsigned long) TIPC_SKB_CB(buf)->handle); |
1446 | 1453 | ||
1447 | n_ptr = tipc_bclink_retransmit_to(); | 1454 | n_ptr = tipc_bclink_retransmit_to(); |
1448 | tipc_node_lock(n_ptr); | 1455 | tipc_node_lock(n_ptr); |
1449 | 1456 | ||
1450 | tipc_addr_string_fill(addr_string, n_ptr->addr); | 1457 | tipc_addr_string_fill(addr_string, n_ptr->addr); |
1451 | info("Broadcast link info for %s\n", addr_string); | 1458 | pr_info("Broadcast link info for %s\n", addr_string); |
1452 | info("Supportable: %d, ", n_ptr->bclink.supportable); | 1459 | pr_info("Supportable: %d, Supported: %d, Acked: %u\n", |
1453 | info("Supported: %d, ", n_ptr->bclink.supported); | 1460 | n_ptr->bclink.supportable, |
1454 | info("Acked: %u\n", n_ptr->bclink.acked); | 1461 | n_ptr->bclink.supported, |
1455 | info("Last in: %u, ", n_ptr->bclink.last_in); | 1462 | n_ptr->bclink.acked); |
1456 | info("Oos state: %u, ", n_ptr->bclink.oos_state); | 1463 | pr_info("Last in: %u, Oos state: %u, Last sent: %u\n", |
1457 | info("Last sent: %u\n", n_ptr->bclink.last_sent); | 1464 | n_ptr->bclink.last_in, |
1465 | n_ptr->bclink.oos_state, | ||
1466 | n_ptr->bclink.last_sent); | ||
1458 | 1467 | ||
1459 | tipc_k_signal((Handler)link_reset_all, (unsigned long)n_ptr->addr); | 1468 | tipc_k_signal((Handler)link_reset_all, (unsigned long)n_ptr->addr); |
1460 | 1469 | ||
@@ -1479,8 +1488,8 @@ void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *buf, | |||
1479 | l_ptr->retransm_queue_head = msg_seqno(msg); | 1488 | l_ptr->retransm_queue_head = msg_seqno(msg); |
1480 | l_ptr->retransm_queue_size = retransmits; | 1489 | l_ptr->retransm_queue_size = retransmits; |
1481 | } else { | 1490 | } else { |
1482 | err("Unexpected retransmit on link %s (qsize=%d)\n", | 1491 | pr_err("Unexpected retransmit on link %s (qsize=%d)\n", |
1483 | l_ptr->name, l_ptr->retransm_queue_size); | 1492 | l_ptr->name, l_ptr->retransm_queue_size); |
1484 | } | 1493 | } |
1485 | return; | 1494 | return; |
1486 | } else { | 1495 | } else { |
@@ -1787,7 +1796,7 @@ cont: | |||
1787 | read_unlock_bh(&tipc_net_lock); | 1796 | read_unlock_bh(&tipc_net_lock); |
1788 | } | 1797 | } |
1789 | 1798 | ||
1790 | /* | 1799 | /** |
1791 | * tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue | 1800 | * tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue |
1792 | * | 1801 | * |
1793 | * Returns increase in queue length (i.e. 0 or 1) | 1802 | * Returns increase in queue length (i.e. 0 or 1) |
@@ -2074,8 +2083,9 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf) | |||
2074 | 2083 | ||
2075 | if (msg_linkprio(msg) && | 2084 | if (msg_linkprio(msg) && |
2076 | (msg_linkprio(msg) != l_ptr->priority)) { | 2085 | (msg_linkprio(msg) != l_ptr->priority)) { |
2077 | warn("Resetting link <%s>, priority change %u->%u\n", | 2086 | pr_warn("%s<%s>, priority change %u->%u\n", |
2078 | l_ptr->name, l_ptr->priority, msg_linkprio(msg)); | 2087 | link_rst_msg, l_ptr->name, l_ptr->priority, |
2088 | msg_linkprio(msg)); | ||
2079 | l_ptr->priority = msg_linkprio(msg); | 2089 | l_ptr->priority = msg_linkprio(msg); |
2080 | tipc_link_reset(l_ptr); /* Enforce change to take effect */ | 2090 | tipc_link_reset(l_ptr); /* Enforce change to take effect */ |
2081 | break; | 2091 | break; |
@@ -2139,15 +2149,13 @@ static void tipc_link_tunnel(struct tipc_link *l_ptr, | |||
2139 | 2149 | ||
2140 | tunnel = l_ptr->owner->active_links[selector & 1]; | 2150 | tunnel = l_ptr->owner->active_links[selector & 1]; |
2141 | if (!tipc_link_is_up(tunnel)) { | 2151 | if (!tipc_link_is_up(tunnel)) { |
2142 | warn("Link changeover error, " | 2152 | pr_warn("%stunnel link no longer available\n", link_co_err); |
2143 | "tunnel link no longer available\n"); | ||
2144 | return; | 2153 | return; |
2145 | } | 2154 | } |
2146 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); | 2155 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); |
2147 | buf = tipc_buf_acquire(length + INT_H_SIZE); | 2156 | buf = tipc_buf_acquire(length + INT_H_SIZE); |
2148 | if (!buf) { | 2157 | if (!buf) { |
2149 | warn("Link changeover error, " | 2158 | pr_warn("%sunable to send tunnel msg\n", link_co_err); |
2150 | "unable to send tunnel msg\n"); | ||
2151 | return; | 2159 | return; |
2152 | } | 2160 | } |
2153 | skb_copy_to_linear_data(buf, tunnel_hdr, INT_H_SIZE); | 2161 | skb_copy_to_linear_data(buf, tunnel_hdr, INT_H_SIZE); |
@@ -2173,8 +2181,7 @@ void tipc_link_changeover(struct tipc_link *l_ptr) | |||
2173 | return; | 2181 | return; |
2174 | 2182 | ||
2175 | if (!l_ptr->owner->permit_changeover) { | 2183 | if (!l_ptr->owner->permit_changeover) { |
2176 | warn("Link changeover error, " | 2184 | pr_warn("%speer did not permit changeover\n", link_co_err); |
2177 | "peer did not permit changeover\n"); | ||
2178 | return; | 2185 | return; |
2179 | } | 2186 | } |
2180 | 2187 | ||
@@ -2192,8 +2199,8 @@ void tipc_link_changeover(struct tipc_link *l_ptr) | |||
2192 | msg_set_size(&tunnel_hdr, INT_H_SIZE); | 2199 | msg_set_size(&tunnel_hdr, INT_H_SIZE); |
2193 | tipc_link_send_buf(tunnel, buf); | 2200 | tipc_link_send_buf(tunnel, buf); |
2194 | } else { | 2201 | } else { |
2195 | warn("Link changeover error, " | 2202 | pr_warn("%sunable to send changeover msg\n", |
2196 | "unable to send changeover msg\n"); | 2203 | link_co_err); |
2197 | } | 2204 | } |
2198 | return; | 2205 | return; |
2199 | } | 2206 | } |
@@ -2246,8 +2253,8 @@ void tipc_link_send_duplicate(struct tipc_link *l_ptr, struct tipc_link *tunnel) | |||
2246 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); | 2253 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); |
2247 | outbuf = tipc_buf_acquire(length + INT_H_SIZE); | 2254 | outbuf = tipc_buf_acquire(length + INT_H_SIZE); |
2248 | if (outbuf == NULL) { | 2255 | if (outbuf == NULL) { |
2249 | warn("Link changeover error, " | 2256 | pr_warn("%sunable to send duplicate msg\n", |
2250 | "unable to send duplicate msg\n"); | 2257 | link_co_err); |
2251 | return; | 2258 | return; |
2252 | } | 2259 | } |
2253 | skb_copy_to_linear_data(outbuf, &tunnel_hdr, INT_H_SIZE); | 2260 | skb_copy_to_linear_data(outbuf, &tunnel_hdr, INT_H_SIZE); |
@@ -2298,8 +2305,8 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
2298 | if (!dest_link) | 2305 | if (!dest_link) |
2299 | goto exit; | 2306 | goto exit; |
2300 | if (dest_link == *l_ptr) { | 2307 | if (dest_link == *l_ptr) { |
2301 | err("Unexpected changeover message on link <%s>\n", | 2308 | pr_err("Unexpected changeover message on link <%s>\n", |
2302 | (*l_ptr)->name); | 2309 | (*l_ptr)->name); |
2303 | goto exit; | 2310 | goto exit; |
2304 | } | 2311 | } |
2305 | *l_ptr = dest_link; | 2312 | *l_ptr = dest_link; |
@@ -2310,7 +2317,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
2310 | goto exit; | 2317 | goto exit; |
2311 | *buf = buf_extract(tunnel_buf, INT_H_SIZE); | 2318 | *buf = buf_extract(tunnel_buf, INT_H_SIZE); |
2312 | if (*buf == NULL) { | 2319 | if (*buf == NULL) { |
2313 | warn("Link changeover error, duplicate msg dropped\n"); | 2320 | pr_warn("%sduplicate msg dropped\n", link_co_err); |
2314 | goto exit; | 2321 | goto exit; |
2315 | } | 2322 | } |
2316 | kfree_skb(tunnel_buf); | 2323 | kfree_skb(tunnel_buf); |
@@ -2319,8 +2326,8 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
2319 | 2326 | ||
2320 | /* First original message ?: */ | 2327 | /* First original message ?: */ |
2321 | if (tipc_link_is_up(dest_link)) { | 2328 | if (tipc_link_is_up(dest_link)) { |
2322 | info("Resetting link <%s>, changeover initiated by peer\n", | 2329 | pr_info("%s<%s>, changeover initiated by peer\n", link_rst_msg, |
2323 | dest_link->name); | 2330 | dest_link->name); |
2324 | tipc_link_reset(dest_link); | 2331 | tipc_link_reset(dest_link); |
2325 | dest_link->exp_msg_count = msg_count; | 2332 | dest_link->exp_msg_count = msg_count; |
2326 | if (!msg_count) | 2333 | if (!msg_count) |
@@ -2333,8 +2340,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
2333 | 2340 | ||
2334 | /* Receive original message */ | 2341 | /* Receive original message */ |
2335 | if (dest_link->exp_msg_count == 0) { | 2342 | if (dest_link->exp_msg_count == 0) { |
2336 | warn("Link switchover error, " | 2343 | pr_warn("%sgot too many tunnelled messages\n", link_co_err); |
2337 | "got too many tunnelled messages\n"); | ||
2338 | goto exit; | 2344 | goto exit; |
2339 | } | 2345 | } |
2340 | dest_link->exp_msg_count--; | 2346 | dest_link->exp_msg_count--; |
@@ -2346,7 +2352,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
2346 | kfree_skb(tunnel_buf); | 2352 | kfree_skb(tunnel_buf); |
2347 | return 1; | 2353 | return 1; |
2348 | } else { | 2354 | } else { |
2349 | warn("Link changeover error, original msg dropped\n"); | 2355 | pr_warn("%soriginal msg dropped\n", link_co_err); |
2350 | } | 2356 | } |
2351 | } | 2357 | } |
2352 | exit: | 2358 | exit: |
@@ -2367,7 +2373,7 @@ void tipc_link_recv_bundle(struct sk_buff *buf) | |||
2367 | while (msgcount--) { | 2373 | while (msgcount--) { |
2368 | obuf = buf_extract(buf, pos); | 2374 | obuf = buf_extract(buf, pos); |
2369 | if (obuf == NULL) { | 2375 | if (obuf == NULL) { |
2370 | warn("Link unable to unbundle message(s)\n"); | 2376 | pr_warn("Link unable to unbundle message(s)\n"); |
2371 | break; | 2377 | break; |
2372 | } | 2378 | } |
2373 | pos += align(msg_size(buf_msg(obuf))); | 2379 | pos += align(msg_size(buf_msg(obuf))); |
@@ -2538,7 +2544,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
2538 | set_fragm_size(pbuf, fragm_sz); | 2544 | set_fragm_size(pbuf, fragm_sz); |
2539 | set_expected_frags(pbuf, exp_fragm_cnt - 1); | 2545 | set_expected_frags(pbuf, exp_fragm_cnt - 1); |
2540 | } else { | 2546 | } else { |
2541 | dbg("Link unable to reassemble fragmented message\n"); | 2547 | pr_debug("Link unable to reassemble fragmented message\n"); |
2542 | kfree_skb(fbuf); | 2548 | kfree_skb(fbuf); |
2543 | return -1; | 2549 | return -1; |
2544 | } | 2550 | } |
@@ -2635,8 +2641,8 @@ void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window) | |||
2635 | 2641 | ||
2636 | /** | 2642 | /** |
2637 | * link_find_link - locate link by name | 2643 | * link_find_link - locate link by name |
2638 | * @name - ptr to link name string | 2644 | * @name: ptr to link name string |
2639 | * @node - ptr to area to be filled with ptr to associated node | 2645 | * @node: ptr to area to be filled with ptr to associated node |
2640 | * | 2646 | * |
2641 | * Caller must hold 'tipc_net_lock' to ensure node and bearer are not deleted; | 2647 | * Caller must hold 'tipc_net_lock' to ensure node and bearer are not deleted; |
2642 | * this also prevents link deletion. | 2648 | * this also prevents link deletion. |
@@ -2671,8 +2677,8 @@ static struct tipc_link *link_find_link(const char *name, | |||
2671 | /** | 2677 | /** |
2672 | * link_value_is_valid -- validate proposed link tolerance/priority/window | 2678 | * link_value_is_valid -- validate proposed link tolerance/priority/window |
2673 | * | 2679 | * |
2674 | * @cmd - value type (TIPC_CMD_SET_LINK_*) | 2680 | * @cmd: value type (TIPC_CMD_SET_LINK_*) |
2675 | * @new_value - the new value | 2681 | * @new_value: the new value |
2676 | * | 2682 | * |
2677 | * Returns 1 if value is within range, 0 if not. | 2683 | * Returns 1 if value is within range, 0 if not. |
2678 | */ | 2684 | */ |
@@ -2693,9 +2699,9 @@ static int link_value_is_valid(u16 cmd, u32 new_value) | |||
2693 | 2699 | ||
2694 | /** | 2700 | /** |
2695 | * link_cmd_set_value - change priority/tolerance/window for link/bearer/media | 2701 | * link_cmd_set_value - change priority/tolerance/window for link/bearer/media |
2696 | * @name - ptr to link, bearer, or media name | 2702 | * @name: ptr to link, bearer, or media name |
2697 | * @new_value - new value of link, bearer, or media setting | 2703 | * @new_value: new value of link, bearer, or media setting |
2698 | * @cmd - which link, bearer, or media attribute to set (TIPC_CMD_SET_LINK_*) | 2704 | * @cmd: which link, bearer, or media attribute to set (TIPC_CMD_SET_LINK_*) |
2699 | * | 2705 | * |
2700 | * Caller must hold 'tipc_net_lock' to ensure link/bearer/media is not deleted. | 2706 | * Caller must hold 'tipc_net_lock' to ensure link/bearer/media is not deleted. |
2701 | * | 2707 | * |
@@ -2860,112 +2866,114 @@ static u32 percent(u32 count, u32 total) | |||
2860 | */ | 2866 | */ |
2861 | static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) | 2867 | static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) |
2862 | { | 2868 | { |
2863 | struct print_buf pb; | 2869 | struct tipc_link *l; |
2864 | struct tipc_link *l_ptr; | 2870 | struct tipc_stats *s; |
2865 | struct tipc_node *node; | 2871 | struct tipc_node *node; |
2866 | char *status; | 2872 | char *status; |
2867 | u32 profile_total = 0; | 2873 | u32 profile_total = 0; |
2874 | int ret; | ||
2868 | 2875 | ||
2869 | if (!strcmp(name, tipc_bclink_name)) | 2876 | if (!strcmp(name, tipc_bclink_name)) |
2870 | return tipc_bclink_stats(buf, buf_size); | 2877 | return tipc_bclink_stats(buf, buf_size); |
2871 | 2878 | ||
2872 | tipc_printbuf_init(&pb, buf, buf_size); | ||
2873 | |||
2874 | read_lock_bh(&tipc_net_lock); | 2879 | read_lock_bh(&tipc_net_lock); |
2875 | l_ptr = link_find_link(name, &node); | 2880 | l = link_find_link(name, &node); |
2876 | if (!l_ptr) { | 2881 | if (!l) { |
2877 | read_unlock_bh(&tipc_net_lock); | 2882 | read_unlock_bh(&tipc_net_lock); |
2878 | return 0; | 2883 | return 0; |
2879 | } | 2884 | } |
2880 | tipc_node_lock(node); | 2885 | tipc_node_lock(node); |
2886 | s = &l->stats; | ||
2881 | 2887 | ||
2882 | if (tipc_link_is_active(l_ptr)) | 2888 | if (tipc_link_is_active(l)) |
2883 | status = "ACTIVE"; | 2889 | status = "ACTIVE"; |
2884 | else if (tipc_link_is_up(l_ptr)) | 2890 | else if (tipc_link_is_up(l)) |
2885 | status = "STANDBY"; | 2891 | status = "STANDBY"; |
2886 | else | 2892 | else |
2887 | status = "DEFUNCT"; | 2893 | status = "DEFUNCT"; |
2888 | tipc_printf(&pb, "Link <%s>\n" | 2894 | |
2889 | " %s MTU:%u Priority:%u Tolerance:%u ms" | 2895 | ret = tipc_snprintf(buf, buf_size, "Link <%s>\n" |
2890 | " Window:%u packets\n", | 2896 | " %s MTU:%u Priority:%u Tolerance:%u ms" |
2891 | l_ptr->name, status, l_ptr->max_pkt, | 2897 | " Window:%u packets\n", |
2892 | l_ptr->priority, l_ptr->tolerance, l_ptr->queue_limit[0]); | 2898 | l->name, status, l->max_pkt, l->priority, |
2893 | tipc_printf(&pb, " RX packets:%u fragments:%u/%u bundles:%u/%u\n", | 2899 | l->tolerance, l->queue_limit[0]); |
2894 | l_ptr->next_in_no - l_ptr->stats.recv_info, | 2900 | |
2895 | l_ptr->stats.recv_fragments, | 2901 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2896 | l_ptr->stats.recv_fragmented, | 2902 | " RX packets:%u fragments:%u/%u bundles:%u/%u\n", |
2897 | l_ptr->stats.recv_bundles, | 2903 | l->next_in_no - s->recv_info, s->recv_fragments, |
2898 | l_ptr->stats.recv_bundled); | 2904 | s->recv_fragmented, s->recv_bundles, |
2899 | tipc_printf(&pb, " TX packets:%u fragments:%u/%u bundles:%u/%u\n", | 2905 | s->recv_bundled); |
2900 | l_ptr->next_out_no - l_ptr->stats.sent_info, | 2906 | |
2901 | l_ptr->stats.sent_fragments, | 2907 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2902 | l_ptr->stats.sent_fragmented, | 2908 | " TX packets:%u fragments:%u/%u bundles:%u/%u\n", |
2903 | l_ptr->stats.sent_bundles, | 2909 | l->next_out_no - s->sent_info, s->sent_fragments, |
2904 | l_ptr->stats.sent_bundled); | 2910 | s->sent_fragmented, s->sent_bundles, |
2905 | profile_total = l_ptr->stats.msg_length_counts; | 2911 | s->sent_bundled); |
2912 | |||
2913 | profile_total = s->msg_length_counts; | ||
2906 | if (!profile_total) | 2914 | if (!profile_total) |
2907 | profile_total = 1; | 2915 | profile_total = 1; |
2908 | tipc_printf(&pb, " TX profile sample:%u packets average:%u octets\n" | 2916 | |
2909 | " 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% " | 2917 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2910 | "-16384:%u%% -32768:%u%% -66000:%u%%\n", | 2918 | " TX profile sample:%u packets average:%u octets\n" |
2911 | l_ptr->stats.msg_length_counts, | 2919 | " 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% " |
2912 | l_ptr->stats.msg_lengths_total / profile_total, | 2920 | "-16384:%u%% -32768:%u%% -66000:%u%%\n", |
2913 | percent(l_ptr->stats.msg_length_profile[0], profile_total), | 2921 | s->msg_length_counts, |
2914 | percent(l_ptr->stats.msg_length_profile[1], profile_total), | 2922 | s->msg_lengths_total / profile_total, |
2915 | percent(l_ptr->stats.msg_length_profile[2], profile_total), | 2923 | percent(s->msg_length_profile[0], profile_total), |
2916 | percent(l_ptr->stats.msg_length_profile[3], profile_total), | 2924 | percent(s->msg_length_profile[1], profile_total), |
2917 | percent(l_ptr->stats.msg_length_profile[4], profile_total), | 2925 | percent(s->msg_length_profile[2], profile_total), |
2918 | percent(l_ptr->stats.msg_length_profile[5], profile_total), | 2926 | percent(s->msg_length_profile[3], profile_total), |
2919 | percent(l_ptr->stats.msg_length_profile[6], profile_total)); | 2927 | percent(s->msg_length_profile[4], profile_total), |
2920 | tipc_printf(&pb, " RX states:%u probes:%u naks:%u defs:%u dups:%u\n", | 2928 | percent(s->msg_length_profile[5], profile_total), |
2921 | l_ptr->stats.recv_states, | 2929 | percent(s->msg_length_profile[6], profile_total)); |
2922 | l_ptr->stats.recv_probes, | 2930 | |
2923 | l_ptr->stats.recv_nacks, | 2931 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2924 | l_ptr->stats.deferred_recv, | 2932 | " RX states:%u probes:%u naks:%u defs:%u" |
2925 | l_ptr->stats.duplicates); | 2933 | " dups:%u\n", s->recv_states, s->recv_probes, |
2926 | tipc_printf(&pb, " TX states:%u probes:%u naks:%u acks:%u dups:%u\n", | 2934 | s->recv_nacks, s->deferred_recv, s->duplicates); |
2927 | l_ptr->stats.sent_states, | 2935 | |
2928 | l_ptr->stats.sent_probes, | 2936 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2929 | l_ptr->stats.sent_nacks, | 2937 | " TX states:%u probes:%u naks:%u acks:%u" |
2930 | l_ptr->stats.sent_acks, | 2938 | " dups:%u\n", s->sent_states, s->sent_probes, |
2931 | l_ptr->stats.retransmitted); | 2939 | s->sent_nacks, s->sent_acks, s->retransmitted); |
2932 | tipc_printf(&pb, " Congestion bearer:%u link:%u Send queue max:%u avg:%u\n", | 2940 | |
2933 | l_ptr->stats.bearer_congs, | 2941 | ret += tipc_snprintf(buf + ret, buf_size - ret, |
2934 | l_ptr->stats.link_congs, | 2942 | " Congestion bearer:%u link:%u Send queue" |
2935 | l_ptr->stats.max_queue_sz, | 2943 | " max:%u avg:%u\n", s->bearer_congs, s->link_congs, |
2936 | l_ptr->stats.queue_sz_counts | 2944 | s->max_queue_sz, s->queue_sz_counts ? |
2937 | ? (l_ptr->stats.accu_queue_sz / l_ptr->stats.queue_sz_counts) | 2945 | (s->accu_queue_sz / s->queue_sz_counts) : 0); |
2938 | : 0); | ||
2939 | 2946 | ||
2940 | tipc_node_unlock(node); | 2947 | tipc_node_unlock(node); |
2941 | read_unlock_bh(&tipc_net_lock); | 2948 | read_unlock_bh(&tipc_net_lock); |
2942 | return tipc_printbuf_validate(&pb); | 2949 | return ret; |
2943 | } | 2950 | } |
2944 | 2951 | ||
2945 | #define MAX_LINK_STATS_INFO 2000 | ||
2946 | |||
2947 | struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space) | 2952 | struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space) |
2948 | { | 2953 | { |
2949 | struct sk_buff *buf; | 2954 | struct sk_buff *buf; |
2950 | struct tlv_desc *rep_tlv; | 2955 | struct tlv_desc *rep_tlv; |
2951 | int str_len; | 2956 | int str_len; |
2957 | int pb_len; | ||
2958 | char *pb; | ||
2952 | 2959 | ||
2953 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) | 2960 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) |
2954 | return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); | 2961 | return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); |
2955 | 2962 | ||
2956 | buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_LINK_STATS_INFO)); | 2963 | buf = tipc_cfg_reply_alloc(TLV_SPACE(ULTRA_STRING_MAX_LEN)); |
2957 | if (!buf) | 2964 | if (!buf) |
2958 | return NULL; | 2965 | return NULL; |
2959 | 2966 | ||
2960 | rep_tlv = (struct tlv_desc *)buf->data; | 2967 | rep_tlv = (struct tlv_desc *)buf->data; |
2961 | 2968 | pb = TLV_DATA(rep_tlv); | |
2969 | pb_len = ULTRA_STRING_MAX_LEN; | ||
2962 | str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area), | 2970 | str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area), |
2963 | (char *)TLV_DATA(rep_tlv), MAX_LINK_STATS_INFO); | 2971 | pb, pb_len); |
2964 | if (!str_len) { | 2972 | if (!str_len) { |
2965 | kfree_skb(buf); | 2973 | kfree_skb(buf); |
2966 | return tipc_cfg_reply_error_string("link not found"); | 2974 | return tipc_cfg_reply_error_string("link not found"); |
2967 | } | 2975 | } |
2968 | 2976 | str_len += 1; /* for "\0" */ | |
2969 | skb_put(buf, TLV_SPACE(str_len)); | 2977 | skb_put(buf, TLV_SPACE(str_len)); |
2970 | TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); | 2978 | TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); |
2971 | 2979 | ||
@@ -3003,62 +3011,16 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | |||
3003 | 3011 | ||
3004 | static void link_print(struct tipc_link *l_ptr, const char *str) | 3012 | static void link_print(struct tipc_link *l_ptr, const char *str) |
3005 | { | 3013 | { |
3006 | char print_area[256]; | 3014 | pr_info("%s Link %x<%s>:", str, l_ptr->addr, l_ptr->b_ptr->name); |
3007 | struct print_buf pb; | ||
3008 | struct print_buf *buf = &pb; | ||
3009 | |||
3010 | tipc_printbuf_init(buf, print_area, sizeof(print_area)); | ||
3011 | |||
3012 | tipc_printf(buf, str); | ||
3013 | tipc_printf(buf, "Link %x<%s>:", | ||
3014 | l_ptr->addr, l_ptr->b_ptr->name); | ||
3015 | |||
3016 | #ifdef CONFIG_TIPC_DEBUG | ||
3017 | if (link_reset_reset(l_ptr) || link_reset_unknown(l_ptr)) | ||
3018 | goto print_state; | ||
3019 | |||
3020 | tipc_printf(buf, ": NXO(%u):", mod(l_ptr->next_out_no)); | ||
3021 | tipc_printf(buf, "NXI(%u):", mod(l_ptr->next_in_no)); | ||
3022 | tipc_printf(buf, "SQUE"); | ||
3023 | if (l_ptr->first_out) { | ||
3024 | tipc_printf(buf, "[%u..", buf_seqno(l_ptr->first_out)); | ||
3025 | if (l_ptr->next_out) | ||
3026 | tipc_printf(buf, "%u..", buf_seqno(l_ptr->next_out)); | ||
3027 | tipc_printf(buf, "%u]", buf_seqno(l_ptr->last_out)); | ||
3028 | if ((mod(buf_seqno(l_ptr->last_out) - | ||
3029 | buf_seqno(l_ptr->first_out)) | ||
3030 | != (l_ptr->out_queue_size - 1)) || | ||
3031 | (l_ptr->last_out->next != NULL)) { | ||
3032 | tipc_printf(buf, "\nSend queue inconsistency\n"); | ||
3033 | tipc_printf(buf, "first_out= %p ", l_ptr->first_out); | ||
3034 | tipc_printf(buf, "next_out= %p ", l_ptr->next_out); | ||
3035 | tipc_printf(buf, "last_out= %p ", l_ptr->last_out); | ||
3036 | } | ||
3037 | } else | ||
3038 | tipc_printf(buf, "[]"); | ||
3039 | tipc_printf(buf, "SQSIZ(%u)", l_ptr->out_queue_size); | ||
3040 | if (l_ptr->oldest_deferred_in) { | ||
3041 | u32 o = buf_seqno(l_ptr->oldest_deferred_in); | ||
3042 | u32 n = buf_seqno(l_ptr->newest_deferred_in); | ||
3043 | tipc_printf(buf, ":RQUE[%u..%u]", o, n); | ||
3044 | if (l_ptr->deferred_inqueue_sz != mod((n + 1) - o)) { | ||
3045 | tipc_printf(buf, ":RQSIZ(%u)", | ||
3046 | l_ptr->deferred_inqueue_sz); | ||
3047 | } | ||
3048 | } | ||
3049 | print_state: | ||
3050 | #endif | ||
3051 | 3015 | ||
3052 | if (link_working_unknown(l_ptr)) | 3016 | if (link_working_unknown(l_ptr)) |
3053 | tipc_printf(buf, ":WU"); | 3017 | pr_cont(":WU\n"); |
3054 | else if (link_reset_reset(l_ptr)) | 3018 | else if (link_reset_reset(l_ptr)) |
3055 | tipc_printf(buf, ":RR"); | 3019 | pr_cont(":RR\n"); |
3056 | else if (link_reset_unknown(l_ptr)) | 3020 | else if (link_reset_unknown(l_ptr)) |
3057 | tipc_printf(buf, ":RU"); | 3021 | pr_cont(":RU\n"); |
3058 | else if (link_working_working(l_ptr)) | 3022 | else if (link_working_working(l_ptr)) |
3059 | tipc_printf(buf, ":WW"); | 3023 | pr_cont(":WW\n"); |
3060 | tipc_printf(buf, "\n"); | 3024 | else |
3061 | 3025 | pr_cont("\n"); | |
3062 | tipc_printbuf_validate(buf); | ||
3063 | info("%s", print_area); | ||
3064 | } | 3026 | } |