43
43
#include "discover.h"
44
44
#include "netlink.h"
45
45
#include "monitor.h"
46
+ #include "trace.h"
46
47
47
48
#include <linux/pkt_sched.h>
48
49
@@ -356,9 +357,11 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l,
356
357
rcv_l -> bc_peer_is_up = true;
357
358
rcv_l -> state = LINK_ESTABLISHED ;
358
359
tipc_link_bc_ack_rcv (rcv_l , ack , xmitq );
360
+ trace_tipc_link_reset (rcv_l , TIPC_DUMP_ALL , "bclink removed!" );
359
361
tipc_link_reset (rcv_l );
360
362
rcv_l -> state = LINK_RESET ;
361
363
if (!snd_l -> ackers ) {
364
+ trace_tipc_link_reset (snd_l , TIPC_DUMP_ALL , "zero ackers!" );
362
365
tipc_link_reset (snd_l );
363
366
snd_l -> state = LINK_RESET ;
364
367
__skb_queue_purge (xmitq );
@@ -522,6 +525,7 @@ bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer,
522
525
523
526
l = * link ;
524
527
strcpy (l -> name , tipc_bclink_name );
528
+ trace_tipc_link_reset (l , TIPC_DUMP_ALL , "bclink created!" );
525
529
tipc_link_reset (l );
526
530
l -> state = LINK_RESET ;
527
531
l -> ackers = 0 ;
@@ -546,6 +550,7 @@ bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer,
546
550
int tipc_link_fsm_evt (struct tipc_link * l , int evt )
547
551
{
548
552
int rc = 0 ;
553
+ int old_state = l -> state ;
549
554
550
555
switch (l -> state ) {
551
556
case LINK_RESETTING :
@@ -692,10 +697,12 @@ int tipc_link_fsm_evt(struct tipc_link *l, int evt)
692
697
default :
693
698
pr_err ("Unknown FSM state %x in %s\n" , l -> state , l -> name );
694
699
}
700
+ trace_tipc_link_fsm (l -> name , old_state , l -> state , evt );
695
701
return rc ;
696
702
illegal_evt :
697
703
pr_err ("Illegal FSM event %x in state %x on link %s\n" ,
698
704
evt , l -> state , l -> name );
705
+ trace_tipc_link_fsm (l -> name , old_state , l -> state , evt );
699
706
return rc ;
700
707
}
701
708
@@ -740,6 +747,18 @@ static void link_profile_stats(struct tipc_link *l)
740
747
l -> stats .msg_length_profile [6 ]++ ;
741
748
}
742
749
750
+ /**
751
+ * tipc_link_too_silent - check if link is "too silent"
752
+ * @l: tipc link to be checked
753
+ *
754
+ * Returns true if the link 'silent_intv_cnt' is about to reach the
755
+ * 'abort_limit' value, otherwise false
756
+ */
757
+ bool tipc_link_too_silent (struct tipc_link * l )
758
+ {
759
+ return (l -> silent_intv_cnt + 2 > l -> abort_limit );
760
+ }
761
+
743
762
/* tipc_link_timeout - perform periodic task as instructed from node timeout
744
763
*/
745
764
int tipc_link_timeout (struct tipc_link * l , struct sk_buff_head * xmitq )
@@ -753,6 +772,8 @@ int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq)
753
772
u16 bc_acked = l -> bc_rcvlink -> acked ;
754
773
struct tipc_mon_state * mstate = & l -> mon_state ;
755
774
775
+ trace_tipc_link_timeout (l , TIPC_DUMP_NONE , " " );
776
+ trace_tipc_link_too_silent (l , TIPC_DUMP_ALL , " " );
756
777
switch (l -> state ) {
757
778
case LINK_ESTABLISHED :
758
779
case LINK_SYNCHING :
@@ -815,6 +836,7 @@ static int link_schedule_user(struct tipc_link *l, struct tipc_msg *hdr)
815
836
TIPC_SKB_CB (skb )-> chain_imp = msg_importance (hdr );
816
837
skb_queue_tail (& l -> wakeupq , skb );
817
838
l -> stats .link_congs ++ ;
839
+ trace_tipc_link_conges (l , TIPC_DUMP_ALL , "wakeup scheduled!" );
818
840
return - ELINKCONG ;
819
841
}
820
842
@@ -1036,13 +1058,17 @@ static int tipc_link_retrans(struct tipc_link *l, struct tipc_link *r,
1036
1058
if (less (to , from ))
1037
1059
return 0 ;
1038
1060
1061
+ trace_tipc_link_retrans (r , from , to , & l -> transmq );
1039
1062
/* Detect repeated retransmit failures on same packet */
1040
1063
if (r -> prev_from != from ) {
1041
1064
r -> prev_from = from ;
1042
1065
r -> stale_limit = jiffies + msecs_to_jiffies (r -> tolerance );
1043
1066
r -> stale_cnt = 0 ;
1044
1067
} else if (++ r -> stale_cnt > 99 && time_after (jiffies , r -> stale_limit )) {
1045
1068
link_retransmit_failure (l , skb );
1069
+ trace_tipc_list_dump (& l -> transmq , true, "retrans failure!" );
1070
+ trace_tipc_link_dump (l , TIPC_DUMP_NONE , "retrans failure!" );
1071
+ trace_tipc_link_dump (r , TIPC_DUMP_NONE , "retrans failure!" );
1046
1072
if (link_is_bc_sndlink (l ))
1047
1073
return TIPC_LINK_DOWN_EVT ;
1048
1074
return tipc_link_fsm_evt (l , LINK_FAILURE_EVT );
@@ -1402,6 +1428,7 @@ static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe,
1402
1428
l -> stats .sent_nacks ++ ;
1403
1429
skb -> priority = TC_PRIO_CONTROL ;
1404
1430
__skb_queue_tail (xmitq , skb );
1431
+ trace_tipc_proto_build (skb , false, l -> name );
1405
1432
}
1406
1433
1407
1434
void tipc_link_create_dummy_tnl_msg (struct tipc_link * l ,
@@ -1565,6 +1592,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
1565
1592
char * if_name ;
1566
1593
int rc = 0 ;
1567
1594
1595
+ trace_tipc_proto_rcv (skb , false, l -> name );
1568
1596
if (tipc_link_is_blocked (l ) || !xmitq )
1569
1597
goto exit ;
1570
1598
@@ -1575,8 +1603,11 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
1575
1603
hdr = buf_msg (skb );
1576
1604
data = msg_data (hdr );
1577
1605
1578
- if (!tipc_link_validate_msg (l , hdr ))
1606
+ if (!tipc_link_validate_msg (l , hdr )) {
1607
+ trace_tipc_skb_dump (skb , false, "PROTO invalid (1)!" );
1608
+ trace_tipc_link_dump (l , TIPC_DUMP_NONE , "PROTO invalid (1)!" );
1579
1609
goto exit ;
1610
+ }
1580
1611
1581
1612
switch (mtyp ) {
1582
1613
case RESET_MSG :
@@ -1819,6 +1850,7 @@ void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked,
1819
1850
if (!more (acked , l -> acked ))
1820
1851
return ;
1821
1852
1853
+ trace_tipc_link_bc_ack (l , l -> acked , acked , & snd_l -> transmq );
1822
1854
/* Skip over packets peer has already acked */
1823
1855
skb_queue_walk (& snd_l -> transmq , skb ) {
1824
1856
if (more (buf_seqno (skb ), l -> acked ))
@@ -2222,3 +2254,122 @@ void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit)
2222
2254
{
2223
2255
l -> abort_limit = limit ;
2224
2256
}
2257
+
2258
+ char * tipc_link_name_ext (struct tipc_link * l , char * buf )
2259
+ {
2260
+ if (!l )
2261
+ scnprintf (buf , TIPC_MAX_LINK_NAME , "null" );
2262
+ else if (link_is_bc_sndlink (l ))
2263
+ scnprintf (buf , TIPC_MAX_LINK_NAME , "broadcast-sender" );
2264
+ else if (link_is_bc_rcvlink (l ))
2265
+ scnprintf (buf , TIPC_MAX_LINK_NAME ,
2266
+ "broadcast-receiver, peer %x" , l -> addr );
2267
+ else
2268
+ memcpy (buf , l -> name , TIPC_MAX_LINK_NAME );
2269
+
2270
+ return buf ;
2271
+ }
2272
+
2273
+ /**
2274
+ * tipc_link_dump - dump TIPC link data
2275
+ * @l: tipc link to be dumped
2276
+ * @dqueues: bitmask to decide if any link queue to be dumped?
2277
+ * - TIPC_DUMP_NONE: don't dump link queues
2278
+ * - TIPC_DUMP_TRANSMQ: dump link transmq queue
2279
+ * - TIPC_DUMP_BACKLOGQ: dump link backlog queue
2280
+ * - TIPC_DUMP_DEFERDQ: dump link deferd queue
2281
+ * - TIPC_DUMP_INPUTQ: dump link input queue
2282
+ * - TIPC_DUMP_WAKEUP: dump link wakeup queue
2283
+ * - TIPC_DUMP_ALL: dump all the link queues above
2284
+ * @buf: returned buffer of dump data in format
2285
+ */
2286
+ int tipc_link_dump (struct tipc_link * l , u16 dqueues , char * buf )
2287
+ {
2288
+ int i = 0 ;
2289
+ size_t sz = (dqueues ) ? LINK_LMAX : LINK_LMIN ;
2290
+ struct sk_buff_head * list ;
2291
+ struct sk_buff * hskb , * tskb ;
2292
+ u32 len ;
2293
+
2294
+ if (!l ) {
2295
+ i += scnprintf (buf , sz , "link data: (null)\n" );
2296
+ return i ;
2297
+ }
2298
+
2299
+ i += scnprintf (buf , sz , "link data: %x" , l -> addr );
2300
+ i += scnprintf (buf + i , sz - i , " %x" , l -> state );
2301
+ i += scnprintf (buf + i , sz - i , " %u" , l -> in_session );
2302
+ i += scnprintf (buf + i , sz - i , " %u" , l -> session );
2303
+ i += scnprintf (buf + i , sz - i , " %u" , l -> peer_session );
2304
+ i += scnprintf (buf + i , sz - i , " %u" , l -> snd_nxt );
2305
+ i += scnprintf (buf + i , sz - i , " %u" , l -> rcv_nxt );
2306
+ i += scnprintf (buf + i , sz - i , " %u" , l -> snd_nxt_state );
2307
+ i += scnprintf (buf + i , sz - i , " %u" , l -> rcv_nxt_state );
2308
+ i += scnprintf (buf + i , sz - i , " %x" , l -> peer_caps );
2309
+ i += scnprintf (buf + i , sz - i , " %u" , l -> silent_intv_cnt );
2310
+ i += scnprintf (buf + i , sz - i , " %u" , l -> rst_cnt );
2311
+ i += scnprintf (buf + i , sz - i , " %u" , l -> prev_from );
2312
+ i += scnprintf (buf + i , sz - i , " %u" , l -> stale_cnt );
2313
+ i += scnprintf (buf + i , sz - i , " %u" , l -> acked );
2314
+
2315
+ list = & l -> transmq ;
2316
+ len = skb_queue_len (list );
2317
+ hskb = skb_peek (list );
2318
+ tskb = skb_peek_tail (list );
2319
+ i += scnprintf (buf + i , sz - i , " | %u %u %u" , len ,
2320
+ (hskb ) ? msg_seqno (buf_msg (hskb )) : 0 ,
2321
+ (tskb ) ? msg_seqno (buf_msg (tskb )) : 0 );
2322
+
2323
+ list = & l -> deferdq ;
2324
+ len = skb_queue_len (list );
2325
+ hskb = skb_peek (list );
2326
+ tskb = skb_peek_tail (list );
2327
+ i += scnprintf (buf + i , sz - i , " | %u %u %u" , len ,
2328
+ (hskb ) ? msg_seqno (buf_msg (hskb )) : 0 ,
2329
+ (tskb ) ? msg_seqno (buf_msg (tskb )) : 0 );
2330
+
2331
+ list = & l -> backlogq ;
2332
+ len = skb_queue_len (list );
2333
+ hskb = skb_peek (list );
2334
+ tskb = skb_peek_tail (list );
2335
+ i += scnprintf (buf + i , sz - i , " | %u %u %u" , len ,
2336
+ (hskb ) ? msg_seqno (buf_msg (hskb )) : 0 ,
2337
+ (tskb ) ? msg_seqno (buf_msg (tskb )) : 0 );
2338
+
2339
+ list = l -> inputq ;
2340
+ len = skb_queue_len (list );
2341
+ hskb = skb_peek (list );
2342
+ tskb = skb_peek_tail (list );
2343
+ i += scnprintf (buf + i , sz - i , " | %u %u %u\n" , len ,
2344
+ (hskb ) ? msg_seqno (buf_msg (hskb )) : 0 ,
2345
+ (tskb ) ? msg_seqno (buf_msg (tskb )) : 0 );
2346
+
2347
+ if (dqueues & TIPC_DUMP_TRANSMQ ) {
2348
+ i += scnprintf (buf + i , sz - i , "transmq: " );
2349
+ i += tipc_list_dump (& l -> transmq , false, buf + i );
2350
+ }
2351
+ if (dqueues & TIPC_DUMP_BACKLOGQ ) {
2352
+ i += scnprintf (buf + i , sz - i ,
2353
+ "backlogq: <%u %u %u %u %u>, " ,
2354
+ l -> backlog [TIPC_LOW_IMPORTANCE ].len ,
2355
+ l -> backlog [TIPC_MEDIUM_IMPORTANCE ].len ,
2356
+ l -> backlog [TIPC_HIGH_IMPORTANCE ].len ,
2357
+ l -> backlog [TIPC_CRITICAL_IMPORTANCE ].len ,
2358
+ l -> backlog [TIPC_SYSTEM_IMPORTANCE ].len );
2359
+ i += tipc_list_dump (& l -> backlogq , false, buf + i );
2360
+ }
2361
+ if (dqueues & TIPC_DUMP_DEFERDQ ) {
2362
+ i += scnprintf (buf + i , sz - i , "deferdq: " );
2363
+ i += tipc_list_dump (& l -> deferdq , false, buf + i );
2364
+ }
2365
+ if (dqueues & TIPC_DUMP_INPUTQ ) {
2366
+ i += scnprintf (buf + i , sz - i , "inputq: " );
2367
+ i += tipc_list_dump (l -> inputq , false, buf + i );
2368
+ }
2369
+ if (dqueues & TIPC_DUMP_WAKEUP ) {
2370
+ i += scnprintf (buf + i , sz - i , "wakeup: " );
2371
+ i += tipc_list_dump (& l -> wakeupq , false, buf + i );
2372
+ }
2373
+
2374
+ return i ;
2375
+ }
0 commit comments