diff options
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 120 |
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 | |||
2227 | char *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 | */ | ||
2255 | int 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 | } | ||