aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c130
1 files changed, 66 insertions, 64 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index a9a8b866d30a..1c1e6151875e 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -2866,112 +2866,114 @@ static u32 percent(u32 count, u32 total)
2866 */ 2866 */
2867static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) 2867static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
2868{ 2868{
2869 struct print_buf pb; 2869 struct tipc_link *l;
2870 struct tipc_link *l_ptr; 2870 struct tipc_stats *s;
2871 struct tipc_node *node; 2871 struct tipc_node *node;
2872 char *status; 2872 char *status;
2873 u32 profile_total = 0; 2873 u32 profile_total = 0;
2874 int ret;
2874 2875
2875 if (!strcmp(name, tipc_bclink_name)) 2876 if (!strcmp(name, tipc_bclink_name))
2876 return tipc_bclink_stats(buf, buf_size); 2877 return tipc_bclink_stats(buf, buf_size);
2877 2878
2878 tipc_printbuf_init(&pb, buf, buf_size);
2879
2880 read_lock_bh(&tipc_net_lock); 2879 read_lock_bh(&tipc_net_lock);
2881 l_ptr = link_find_link(name, &node); 2880 l = link_find_link(name, &node);
2882 if (!l_ptr) { 2881 if (!l) {
2883 read_unlock_bh(&tipc_net_lock); 2882 read_unlock_bh(&tipc_net_lock);
2884 return 0; 2883 return 0;
2885 } 2884 }
2886 tipc_node_lock(node); 2885 tipc_node_lock(node);
2886 s = &l->stats;
2887 2887
2888 if (tipc_link_is_active(l_ptr)) 2888 if (tipc_link_is_active(l))
2889 status = "ACTIVE"; 2889 status = "ACTIVE";
2890 else if (tipc_link_is_up(l_ptr)) 2890 else if (tipc_link_is_up(l))
2891 status = "STANDBY"; 2891 status = "STANDBY";
2892 else 2892 else
2893 status = "DEFUNCT"; 2893 status = "DEFUNCT";
2894 tipc_printf(&pb, "Link <%s>\n" 2894
2895 " %s MTU:%u Priority:%u Tolerance:%u ms" 2895 ret = tipc_snprintf(buf, buf_size, "Link <%s>\n"
2896 " Window:%u packets\n", 2896 " %s MTU:%u Priority:%u Tolerance:%u ms"
2897 l_ptr->name, status, l_ptr->max_pkt, 2897 " Window:%u packets\n",
2898 l_ptr->priority, l_ptr->tolerance, l_ptr->queue_limit[0]); 2898 l->name, status, l->max_pkt, l->priority,
2899 tipc_printf(&pb, " RX packets:%u fragments:%u/%u bundles:%u/%u\n", 2899 l->tolerance, l->queue_limit[0]);
2900 l_ptr->next_in_no - l_ptr->stats.recv_info, 2900
2901 l_ptr->stats.recv_fragments, 2901 ret += tipc_snprintf(buf + ret, buf_size - ret,
2902 l_ptr->stats.recv_fragmented, 2902 " RX packets:%u fragments:%u/%u bundles:%u/%u\n",
2903 l_ptr->stats.recv_bundles, 2903 l->next_in_no - s->recv_info, s->recv_fragments,
2904 l_ptr->stats.recv_bundled); 2904 s->recv_fragmented, s->recv_bundles,
2905 tipc_printf(&pb, " TX packets:%u fragments:%u/%u bundles:%u/%u\n", 2905 s->recv_bundled);
2906 l_ptr->next_out_no - l_ptr->stats.sent_info, 2906
2907 l_ptr->stats.sent_fragments, 2907 ret += tipc_snprintf(buf + ret, buf_size - ret,
2908 l_ptr->stats.sent_fragmented, 2908 " TX packets:%u fragments:%u/%u bundles:%u/%u\n",
2909 l_ptr->stats.sent_bundles, 2909 l->next_out_no - s->sent_info, s->sent_fragments,
2910 l_ptr->stats.sent_bundled); 2910 s->sent_fragmented, s->sent_bundles,
2911 profile_total = l_ptr->stats.msg_length_counts; 2911 s->sent_bundled);
2912
2913 profile_total = s->msg_length_counts;
2912 if (!profile_total) 2914 if (!profile_total)
2913 profile_total = 1; 2915 profile_total = 1;
2914 tipc_printf(&pb, " TX profile sample:%u packets average:%u octets\n" 2916
2915 " 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% " 2917 ret += tipc_snprintf(buf + ret, buf_size - ret,
2916 "-16384:%u%% -32768:%u%% -66000:%u%%\n", 2918 " TX profile sample:%u packets average:%u octets\n"
2917 l_ptr->stats.msg_length_counts, 2919 " 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% "
2918 l_ptr->stats.msg_lengths_total / profile_total, 2920 "-16384:%u%% -32768:%u%% -66000:%u%%\n",
2919 percent(l_ptr->stats.msg_length_profile[0], profile_total), 2921 s->msg_length_counts,
2920 percent(l_ptr->stats.msg_length_profile[1], profile_total), 2922 s->msg_lengths_total / profile_total,
2921 percent(l_ptr->stats.msg_length_profile[2], profile_total), 2923 percent(s->msg_length_profile[0], profile_total),
2922 percent(l_ptr->stats.msg_length_profile[3], profile_total), 2924 percent(s->msg_length_profile[1], profile_total),
2923 percent(l_ptr->stats.msg_length_profile[4], profile_total), 2925 percent(s->msg_length_profile[2], profile_total),
2924 percent(l_ptr->stats.msg_length_profile[5], profile_total), 2926 percent(s->msg_length_profile[3], profile_total),
2925 percent(l_ptr->stats.msg_length_profile[6], profile_total)); 2927 percent(s->msg_length_profile[4], profile_total),
2926 tipc_printf(&pb, " RX states:%u probes:%u naks:%u defs:%u dups:%u\n", 2928 percent(s->msg_length_profile[5], profile_total),
2927 l_ptr->stats.recv_states, 2929 percent(s->msg_length_profile[6], profile_total));
2928 l_ptr->stats.recv_probes, 2930
2929 l_ptr->stats.recv_nacks, 2931 ret += tipc_snprintf(buf + ret, buf_size - ret,
2930 l_ptr->stats.deferred_recv, 2932 " RX states:%u probes:%u naks:%u defs:%u"
2931 l_ptr->stats.duplicates); 2933 " dups:%u\n", s->recv_states, s->recv_probes,
2932 tipc_printf(&pb, " TX states:%u probes:%u naks:%u acks:%u dups:%u\n", 2934 s->recv_nacks, s->deferred_recv, s->duplicates);
2933 l_ptr->stats.sent_states, 2935
2934 l_ptr->stats.sent_probes, 2936 ret += tipc_snprintf(buf + ret, buf_size - ret,
2935 l_ptr->stats.sent_nacks, 2937 " TX states:%u probes:%u naks:%u acks:%u"
2936 l_ptr->stats.sent_acks, 2938 " dups:%u\n", s->sent_states, s->sent_probes,
2937 l_ptr->stats.retransmitted); 2939 s->sent_nacks, s->sent_acks, s->retransmitted);
2938 tipc_printf(&pb, " Congestion bearer:%u link:%u Send queue max:%u avg:%u\n", 2940
2939 l_ptr->stats.bearer_congs, 2941 ret += tipc_snprintf(buf + ret, buf_size - ret,
2940 l_ptr->stats.link_congs, 2942 " Congestion bearer:%u link:%u Send queue"
2941 l_ptr->stats.max_queue_sz, 2943 " max:%u avg:%u\n", s->bearer_congs, s->link_congs,
2942 l_ptr->stats.queue_sz_counts 2944 s->max_queue_sz, s->queue_sz_counts ?
2943 ? (l_ptr->stats.accu_queue_sz / l_ptr->stats.queue_sz_counts) 2945 (s->accu_queue_sz / s->queue_sz_counts) : 0);
2944 : 0);
2945 2946
2946 tipc_node_unlock(node); 2947 tipc_node_unlock(node);
2947 read_unlock_bh(&tipc_net_lock); 2948 read_unlock_bh(&tipc_net_lock);
2948 return tipc_printbuf_validate(&pb); 2949 return ret;
2949} 2950}
2950 2951
2951#define MAX_LINK_STATS_INFO 2000
2952
2953struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space) 2952struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space)
2954{ 2953{
2955 struct sk_buff *buf; 2954 struct sk_buff *buf;
2956 struct tlv_desc *rep_tlv; 2955 struct tlv_desc *rep_tlv;
2957 int str_len; 2956 int str_len;
2957 int pb_len;
2958 char *pb;
2958 2959
2959 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))
2960 return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); 2961 return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
2961 2962
2962 buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_LINK_STATS_INFO)); 2963 buf = tipc_cfg_reply_alloc(TLV_SPACE(ULTRA_STRING_MAX_LEN));
2963 if (!buf) 2964 if (!buf)
2964 return NULL; 2965 return NULL;
2965 2966
2966 rep_tlv = (struct tlv_desc *)buf->data; 2967 rep_tlv = (struct tlv_desc *)buf->data;
2967 2968 pb = TLV_DATA(rep_tlv);
2969 pb_len = ULTRA_STRING_MAX_LEN;
2968 str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area), 2970 str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area),
2969 (char *)TLV_DATA(rep_tlv), MAX_LINK_STATS_INFO); 2971 pb, pb_len);
2970 if (!str_len) { 2972 if (!str_len) {
2971 kfree_skb(buf); 2973 kfree_skb(buf);
2972 return tipc_cfg_reply_error_string("link not found"); 2974 return tipc_cfg_reply_error_string("link not found");
2973 } 2975 }
2974 2976 str_len += 1; /* for "\0" */
2975 skb_put(buf, TLV_SPACE(str_len)); 2977 skb_put(buf, TLV_SPACE(str_len));
2976 TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); 2978 TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len);
2977 2979