diff options
author | Jon Maloy <jon.maloy@ericsson.com> | 2017-12-20 05:03:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-20 14:56:48 -0500 |
commit | bb25c3855a12cc58e33cd7ee9b69943790fe35f7 (patch) | |
tree | 3844bdbeeebe378da5804ed7642dcbf427674ed3 /net/tipc | |
parent | 1c8e77fb361a4a116a41ac1d9819eb79d068735d (diff) |
tipc: remove joining group member from congested list
When we receive a JOIN message from a peer member, the message may
contain an advertised window value ADV_IDLE that permits removing the
member in question from the tipc_group::congested list. However, since
the removal has been made conditional on that the advertised window is
*not* ADV_IDLE, we miss this case. This has the effect that a sender
sometimes may enter a state of permanent, false, broadcast congestion.
We fix this by unconditinally removing the member from the congested
list before calling tipc_member_update(), which might potentially sort
it into the list again.
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/group.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/tipc/group.c b/net/tipc/group.c index bbc004eaa31a..7ebbdeb2a90e 100644 --- a/net/tipc/group.c +++ b/net/tipc/group.c | |||
@@ -689,10 +689,8 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup, | |||
689 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); | 689 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); |
690 | __skb_queue_tail(inputq, m->event_msg); | 690 | __skb_queue_tail(inputq, m->event_msg); |
691 | } | 691 | } |
692 | if (m->window < ADV_IDLE) | 692 | list_del_init(&m->congested); |
693 | tipc_group_update_member(m, 0); | 693 | tipc_group_update_member(m, 0); |
694 | else | ||
695 | list_del_init(&m->congested); | ||
696 | return; | 694 | return; |
697 | case GRP_LEAVE_MSG: | 695 | case GRP_LEAVE_MSG: |
698 | if (!m) | 696 | if (!m) |