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.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 9e265eb89726..668dab529021 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -43,6 +43,7 @@
43#include "discover.h" 43#include "discover.h"
44#include "netlink.h" 44#include "netlink.h"
45#include "monitor.h" 45#include "monitor.h"
46#include "trace.h"
46 47
47#include <linux/pkt_sched.h> 48#include <linux/pkt_sched.h>
48 49
@@ -2222,3 +2223,122 @@ void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit)
2222{ 2223{
2223 l->abort_limit = limit; 2224 l->abort_limit = limit;
2224} 2225}
2226
2227char *tipc_link_name_ext(struct tipc_link *l, char *buf)
2228{
2229 if (!l)
2230 scnprintf(buf, TIPC_MAX_LINK_NAME, "null");
2231 else if (link_is_bc_sndlink(l))
2232 scnprintf(buf, TIPC_MAX_LINK_NAME, "broadcast-sender");
2233 else if (link_is_bc_rcvlink(l))
2234 scnprintf(buf, TIPC_MAX_LINK_NAME,
2235 "broadcast-receiver, peer %x", l->addr);
2236 else
2237 memcpy(buf, l->name, TIPC_MAX_LINK_NAME);
2238
2239 return buf;
2240}
2241
2242/**
2243 * tipc_link_dump - dump TIPC link data
2244 * @l: tipc link to be dumped
2245 * @dqueues: bitmask to decide if any link queue to be dumped?
2246 * - TIPC_DUMP_NONE: don't dump link queues
2247 * - TIPC_DUMP_TRANSMQ: dump link transmq queue
2248 * - TIPC_DUMP_BACKLOGQ: dump link backlog queue
2249 * - TIPC_DUMP_DEFERDQ: dump link deferd queue
2250 * - TIPC_DUMP_INPUTQ: dump link input queue
2251 * - TIPC_DUMP_WAKEUP: dump link wakeup queue
2252 * - TIPC_DUMP_ALL: dump all the link queues above
2253 * @buf: returned buffer of dump data in format
2254 */
2255int tipc_link_dump(struct tipc_link *l, u16 dqueues, char *buf)
2256{
2257 int i = 0;
2258 size_t sz = (dqueues) ? LINK_LMAX : LINK_LMIN;
2259 struct sk_buff_head *list;
2260 struct sk_buff *hskb, *tskb;
2261 u32 len;
2262
2263 if (!l) {
2264 i += scnprintf(buf, sz, "link data: (null)\n");
2265 return i;
2266 }
2267
2268 i += scnprintf(buf, sz, "link data: %x", l->addr);
2269 i += scnprintf(buf + i, sz - i, " %x", l->state);
2270 i += scnprintf(buf + i, sz - i, " %u", l->in_session);
2271 i += scnprintf(buf + i, sz - i, " %u", l->session);
2272 i += scnprintf(buf + i, sz - i, " %u", l->peer_session);
2273 i += scnprintf(buf + i, sz - i, " %u", l->snd_nxt);
2274 i += scnprintf(buf + i, sz - i, " %u", l->rcv_nxt);
2275 i += scnprintf(buf + i, sz - i, " %u", l->snd_nxt_state);
2276 i += scnprintf(buf + i, sz - i, " %u", l->rcv_nxt_state);
2277 i += scnprintf(buf + i, sz - i, " %x", l->peer_caps);
2278 i += scnprintf(buf + i, sz - i, " %u", l->silent_intv_cnt);
2279 i += scnprintf(buf + i, sz - i, " %u", l->rst_cnt);
2280 i += scnprintf(buf + i, sz - i, " %u", l->prev_from);
2281 i += scnprintf(buf + i, sz - i, " %u", l->stale_cnt);
2282 i += scnprintf(buf + i, sz - i, " %u", l->acked);
2283
2284 list = &l->transmq;
2285 len = skb_queue_len(list);
2286 hskb = skb_peek(list);
2287 tskb = skb_peek_tail(list);
2288 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2289 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2290 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2291
2292 list = &l->deferdq;
2293 len = skb_queue_len(list);
2294 hskb = skb_peek(list);
2295 tskb = skb_peek_tail(list);
2296 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2297 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2298 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2299
2300 list = &l->backlogq;
2301 len = skb_queue_len(list);
2302 hskb = skb_peek(list);
2303 tskb = skb_peek_tail(list);
2304 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2305 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2306 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2307
2308 list = l->inputq;
2309 len = skb_queue_len(list);
2310 hskb = skb_peek(list);
2311 tskb = skb_peek_tail(list);
2312 i += scnprintf(buf + i, sz - i, " | %u %u %u\n", len,
2313 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2314 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2315
2316 if (dqueues & TIPC_DUMP_TRANSMQ) {
2317 i += scnprintf(buf + i, sz - i, "transmq: ");
2318 i += tipc_list_dump(&l->transmq, false, buf + i);
2319 }
2320 if (dqueues & TIPC_DUMP_BACKLOGQ) {
2321 i += scnprintf(buf + i, sz - i,
2322 "backlogq: <%u %u %u %u %u>, ",
2323 l->backlog[TIPC_LOW_IMPORTANCE].len,
2324 l->backlog[TIPC_MEDIUM_IMPORTANCE].len,
2325 l->backlog[TIPC_HIGH_IMPORTANCE].len,
2326 l->backlog[TIPC_CRITICAL_IMPORTANCE].len,
2327 l->backlog[TIPC_SYSTEM_IMPORTANCE].len);
2328 i += tipc_list_dump(&l->backlogq, false, buf + i);
2329 }
2330 if (dqueues & TIPC_DUMP_DEFERDQ) {
2331 i += scnprintf(buf + i, sz - i, "deferdq: ");
2332 i += tipc_list_dump(&l->deferdq, false, buf + i);
2333 }
2334 if (dqueues & TIPC_DUMP_INPUTQ) {
2335 i += scnprintf(buf + i, sz - i, "inputq: ");
2336 i += tipc_list_dump(l->inputq, false, buf + i);
2337 }
2338 if (dqueues & TIPC_DUMP_WAKEUP) {
2339 i += scnprintf(buf + i, sz - i, "wakeup: ");
2340 i += tipc_list_dump(&l->wakeupq, false, buf + i);
2341 }
2342
2343 return i;
2344}