diff options
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 668dab529021..55c44d867d4b 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -357,9 +357,11 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l, | |||
357 | rcv_l->bc_peer_is_up = true; | 357 | rcv_l->bc_peer_is_up = true; |
358 | rcv_l->state = LINK_ESTABLISHED; | 358 | rcv_l->state = LINK_ESTABLISHED; |
359 | tipc_link_bc_ack_rcv(rcv_l, ack, xmitq); | 359 | tipc_link_bc_ack_rcv(rcv_l, ack, xmitq); |
360 | trace_tipc_link_reset(rcv_l, TIPC_DUMP_ALL, "bclink removed!"); | ||
360 | tipc_link_reset(rcv_l); | 361 | tipc_link_reset(rcv_l); |
361 | rcv_l->state = LINK_RESET; | 362 | rcv_l->state = LINK_RESET; |
362 | if (!snd_l->ackers) { | 363 | if (!snd_l->ackers) { |
364 | trace_tipc_link_reset(snd_l, TIPC_DUMP_ALL, "zero ackers!"); | ||
363 | tipc_link_reset(snd_l); | 365 | tipc_link_reset(snd_l); |
364 | snd_l->state = LINK_RESET; | 366 | snd_l->state = LINK_RESET; |
365 | __skb_queue_purge(xmitq); | 367 | __skb_queue_purge(xmitq); |
@@ -523,6 +525,7 @@ bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer, | |||
523 | 525 | ||
524 | l = *link; | 526 | l = *link; |
525 | strcpy(l->name, tipc_bclink_name); | 527 | strcpy(l->name, tipc_bclink_name); |
528 | trace_tipc_link_reset(l, TIPC_DUMP_ALL, "bclink created!"); | ||
526 | tipc_link_reset(l); | 529 | tipc_link_reset(l); |
527 | l->state = LINK_RESET; | 530 | l->state = LINK_RESET; |
528 | l->ackers = 0; | 531 | l->ackers = 0; |
@@ -547,6 +550,7 @@ bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer, | |||
547 | int tipc_link_fsm_evt(struct tipc_link *l, int evt) | 550 | int tipc_link_fsm_evt(struct tipc_link *l, int evt) |
548 | { | 551 | { |
549 | int rc = 0; | 552 | int rc = 0; |
553 | int old_state = l->state; | ||
550 | 554 | ||
551 | switch (l->state) { | 555 | switch (l->state) { |
552 | case LINK_RESETTING: | 556 | case LINK_RESETTING: |
@@ -693,10 +697,12 @@ int tipc_link_fsm_evt(struct tipc_link *l, int evt) | |||
693 | default: | 697 | default: |
694 | pr_err("Unknown FSM state %x in %s\n", l->state, l->name); | 698 | pr_err("Unknown FSM state %x in %s\n", l->state, l->name); |
695 | } | 699 | } |
700 | trace_tipc_link_fsm(l->name, old_state, l->state, evt); | ||
696 | return rc; | 701 | return rc; |
697 | illegal_evt: | 702 | illegal_evt: |
698 | pr_err("Illegal FSM event %x in state %x on link %s\n", | 703 | pr_err("Illegal FSM event %x in state %x on link %s\n", |
699 | evt, l->state, l->name); | 704 | evt, l->state, l->name); |
705 | trace_tipc_link_fsm(l->name, old_state, l->state, evt); | ||
700 | return rc; | 706 | return rc; |
701 | } | 707 | } |
702 | 708 | ||
@@ -741,6 +747,18 @@ static void link_profile_stats(struct tipc_link *l) | |||
741 | l->stats.msg_length_profile[6]++; | 747 | l->stats.msg_length_profile[6]++; |
742 | } | 748 | } |
743 | 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 | |||
744 | /* tipc_link_timeout - perform periodic task as instructed from node timeout | 762 | /* tipc_link_timeout - perform periodic task as instructed from node timeout |
745 | */ | 763 | */ |
746 | int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) | 764 | int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) |
@@ -754,6 +772,8 @@ int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) | |||
754 | u16 bc_acked = l->bc_rcvlink->acked; | 772 | u16 bc_acked = l->bc_rcvlink->acked; |
755 | struct tipc_mon_state *mstate = &l->mon_state; | 773 | struct tipc_mon_state *mstate = &l->mon_state; |
756 | 774 | ||
775 | trace_tipc_link_timeout(l, TIPC_DUMP_NONE, " "); | ||
776 | trace_tipc_link_too_silent(l, TIPC_DUMP_ALL, " "); | ||
757 | switch (l->state) { | 777 | switch (l->state) { |
758 | case LINK_ESTABLISHED: | 778 | case LINK_ESTABLISHED: |
759 | case LINK_SYNCHING: | 779 | case LINK_SYNCHING: |
@@ -816,6 +836,7 @@ static int link_schedule_user(struct tipc_link *l, struct tipc_msg *hdr) | |||
816 | TIPC_SKB_CB(skb)->chain_imp = msg_importance(hdr); | 836 | TIPC_SKB_CB(skb)->chain_imp = msg_importance(hdr); |
817 | skb_queue_tail(&l->wakeupq, skb); | 837 | skb_queue_tail(&l->wakeupq, skb); |
818 | l->stats.link_congs++; | 838 | l->stats.link_congs++; |
839 | trace_tipc_link_conges(l, TIPC_DUMP_ALL, "wakeup scheduled!"); | ||
819 | return -ELINKCONG; | 840 | return -ELINKCONG; |
820 | } | 841 | } |
821 | 842 | ||
@@ -1037,6 +1058,7 @@ static int tipc_link_retrans(struct tipc_link *l, struct tipc_link *r, | |||
1037 | if (less(to, from)) | 1058 | if (less(to, from)) |
1038 | return 0; | 1059 | return 0; |
1039 | 1060 | ||
1061 | trace_tipc_link_retrans(r, from, to, &l->transmq); | ||
1040 | /* Detect repeated retransmit failures on same packet */ | 1062 | /* Detect repeated retransmit failures on same packet */ |
1041 | if (r->prev_from != from) { | 1063 | if (r->prev_from != from) { |
1042 | r->prev_from = from; | 1064 | r->prev_from = from; |
@@ -1044,6 +1066,9 @@ static int tipc_link_retrans(struct tipc_link *l, struct tipc_link *r, | |||
1044 | r->stale_cnt = 0; | 1066 | r->stale_cnt = 0; |
1045 | } else if (++r->stale_cnt > 99 && time_after(jiffies, r->stale_limit)) { | 1067 | } else if (++r->stale_cnt > 99 && time_after(jiffies, r->stale_limit)) { |
1046 | link_retransmit_failure(l, skb); | 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!"); | ||
1047 | if (link_is_bc_sndlink(l)) | 1072 | if (link_is_bc_sndlink(l)) |
1048 | return TIPC_LINK_DOWN_EVT; | 1073 | return TIPC_LINK_DOWN_EVT; |
1049 | return tipc_link_fsm_evt(l, LINK_FAILURE_EVT); | 1074 | return tipc_link_fsm_evt(l, LINK_FAILURE_EVT); |
@@ -1403,6 +1428,7 @@ static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, | |||
1403 | l->stats.sent_nacks++; | 1428 | l->stats.sent_nacks++; |
1404 | skb->priority = TC_PRIO_CONTROL; | 1429 | skb->priority = TC_PRIO_CONTROL; |
1405 | __skb_queue_tail(xmitq, skb); | 1430 | __skb_queue_tail(xmitq, skb); |
1431 | trace_tipc_proto_build(skb, false, l->name); | ||
1406 | } | 1432 | } |
1407 | 1433 | ||
1408 | void tipc_link_create_dummy_tnl_msg(struct tipc_link *l, | 1434 | void tipc_link_create_dummy_tnl_msg(struct tipc_link *l, |
@@ -1566,6 +1592,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1566 | char *if_name; | 1592 | char *if_name; |
1567 | int rc = 0; | 1593 | int rc = 0; |
1568 | 1594 | ||
1595 | trace_tipc_proto_rcv(skb, false, l->name); | ||
1569 | if (tipc_link_is_blocked(l) || !xmitq) | 1596 | if (tipc_link_is_blocked(l) || !xmitq) |
1570 | goto exit; | 1597 | goto exit; |
1571 | 1598 | ||
@@ -1576,8 +1603,11 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1576 | hdr = buf_msg(skb); | 1603 | hdr = buf_msg(skb); |
1577 | data = msg_data(hdr); | 1604 | data = msg_data(hdr); |
1578 | 1605 | ||
1579 | 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)!"); | ||
1580 | goto exit; | 1609 | goto exit; |
1610 | } | ||
1581 | 1611 | ||
1582 | switch (mtyp) { | 1612 | switch (mtyp) { |
1583 | case RESET_MSG: | 1613 | case RESET_MSG: |
@@ -1820,6 +1850,7 @@ void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked, | |||
1820 | if (!more(acked, l->acked)) | 1850 | if (!more(acked, l->acked)) |
1821 | return; | 1851 | return; |
1822 | 1852 | ||
1853 | trace_tipc_link_bc_ack(l, l->acked, acked, &snd_l->transmq); | ||
1823 | /* Skip over packets peer has already acked */ | 1854 | /* Skip over packets peer has already acked */ |
1824 | skb_queue_walk(&snd_l->transmq, skb) { | 1855 | skb_queue_walk(&snd_l->transmq, skb) { |
1825 | if (more(buf_seqno(skb), l->acked)) | 1856 | if (more(buf_seqno(skb), l->acked)) |