]> git.baikalelectronics.ru Git - kernel.git/commit
tipc: fix broadcast link synchronization problem
authorJon Paul Maloy <jon.maloy@ericsson.com>
Thu, 27 Oct 2016 22:51:55 +0000 (18:51 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 29 Oct 2016 21:21:09 +0000 (17:21 -0400)
commit72369c42697eee24714cf15224edecdc95bb2d36
tree7e7d6b57da043b23bde4b7e72a5cfeaa8294dd39
parentfe2130ceffaececcb46c8bba20d1ed0df0814530
tipc: fix broadcast link synchronization problem

In commit 790a53b23e88 ("tipc: extend broadcast link initialization
criteria") we tried to fix a problem with the initial synchronization
of broadcast link acknowledge values. Unfortunately that solution is
not sufficient to solve the issue.

We have seen it happen that LINK_PROTOCOL/STATE packets with a valid
non-zero unicast acknowledge number may bypass BCAST_PROTOCOL
initialization, NAME_DISTRIBUTOR and other STATE packets with invalid
broadcast acknowledge numbers, leading to premature opening of the
broadcast link. When the bypassed packets finally arrive, they are
inadvertently accepted, and the already correctly initialized
acknowledge number in the broadcast receive link is overwritten by
the invalid (zero) value of the said packets. After this the broadcast
link goes stale.

We now fix this by marking the packets where we know the acknowledge
value is or may be invalid, and then ignoring the acks from those.

To this purpose, we claim an unused bit in the header to indicate that
the value is invalid. We set the bit to 1 in the initial BCAST_PROTOCOL
synchronization packet and all initial ("bulk") NAME_DISTRIBUTOR
packets, plus those LINK_PROTOCOL packets sent out before the broadcast
links are fully synchronized.

This minor protocol update is fully backwards compatible.

Reported-by: John Thompson <thompa.atl@gmail.com>
Tested-by: John Thompson <thompa.atl@gmail.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/bcast.c
net/tipc/bcast.h
net/tipc/link.c
net/tipc/msg.h
net/tipc/name_distr.c
net/tipc/node.c