linux/net/tipc
Jon Maloy c64f7a6a1f tipc: introduce message to synchronize broadcast link
Upon establishing a first link between two nodes, there is
currently a risk that the two endpoints will disagree on exactly
which sequence number reception and acknowleding of broadcast
packets should start.

The following scenarios may happen:

1: Node A sends an ACTIVATE message to B, telling it to start acking
   packets from sequence number N.
2: Node A sends out broadcast N, but does not expect an acknowledge
   from B, since B is not yet in its broadcast receiver's list.
3: Node A receives ACK for N from all nodes except B, and releases
   packet N.
4: Node B receives the ACTIVATE, activates its link endpoint, and
   stores the value N as sequence number of first expected packet.
5: Node B sends a NAME_DISTR message to A.
6: Node A receives the NAME_DISTR message, and activates its endpoint.
   At this moment B is added to A's broadcast receiver's set.
   Node A also sets sequence number 0 as the first broadcast packet
   to be received from B.
7: Node A sends broadcast N+1.
8: B receives N+1, determines there is a gap in the sequence, since
   it is expecting N, and sends a NACK for N back to A.
9: Node A has already released N, so no retransmission is possible.
   The broadcast link in direction A->B is stale.

In addition to, or instead of, 7-9 above, the following may happen:

10: Node B sends broadcast M > 0 to A.
11: Node A receives M, falsely decides there must be a gap, since
    it is expecting packet 0, and asks for retransmission of packets
    [0,M-1].
12: Node B has already released these packets, so the broadcast
    link is stale in direction B->A.

We solve this problem by introducing a new unicast message type,
BCAST_PROTOCOL/STATE, to convey the sequence number of the next
sent broadcast packet to the other endpoint, at exactly the moment
that endpoint is added to the own node's broadcast receivers list,
and before any other unicast messages are permitted to be sent.

Furthermore, we don't allow any node to start receiving and
processing broadcast packets until this new synchronization
message has been received.

To maintain backwards compatibility, we still open up for
broadcast reception if we receive a NAME_DISTR message without
any preceding broadcast sync message. In this case, we must
assume that the other end has an older code version, and will
never send out the new synchronization message. Hence, for mixed
old and new nodes, the issue arising in 7-12 of the above may
happen with the same probability as before.

Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
2012-11-22 14:33:21 -05:00
..
addr.c tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
addr.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
bcast.c tipc: rename supported flag to recv_permitted 2012-11-22 07:50:51 -05:00
bcast.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
bearer.c tipc: remove the bearer congestion mechanism 2012-11-21 20:07:25 -05:00
bearer.h tipc: remove the bearer congestion mechanism 2012-11-21 20:07:25 -05:00
config.c tipc: eliminate configuration for maximum number of name publications 2012-08-20 02:26:31 -07:00
config.h tipc: Optimize re-initialization of configuration service 2012-04-26 17:19:07 -04:00
core.c tipc: eliminate configuration for maximum number of name publications 2012-08-20 02:26:31 -07:00
core.h tipc: eliminate configuration for maximum number of name publications 2012-08-20 02:26:31 -07:00
discover.c tipc: remove the bearer congestion mechanism 2012-11-21 20:07:25 -05:00
discover.h tipc: rename struct link* to struct tipc_link* 2011-12-29 21:53:30 -05:00
eth_media.c tipc: fix lockdep warning during bearer initialization 2012-08-20 02:26:30 -07:00
handler.c tipc: do not use tasklet_disable before tasklet_kill 2012-11-03 15:10:14 -04:00
Kconfig tipc: remove print_buf and deprecated log buffer code 2012-07-13 19:34:43 -04:00
link.c tipc: introduce message to synchronize broadcast link 2012-11-22 14:33:21 -05:00
link.h tipc: remove the bearer congestion mechanism 2012-11-21 20:07:25 -05:00
log.c tipc: remove print_buf and deprecated log buffer code 2012-07-13 19:34:43 -04:00
Makefile tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
msg.c tipc: remove TIPC packet debugging functions and macros 2012-07-13 19:25:16 -04:00
msg.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
name_distr.c tipc: use standard printk shortcut macros (pr_err etc.) 2012-07-13 19:24:44 -04:00
name_distr.h [NET] TIPC: Fix whitespace errors. 2007-02-10 23:20:15 -08:00
name_table.c net/tipc/name_table.c: Remove unecessary semicolon 2012-09-18 16:08:19 -04:00
name_table.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
net.c tipc: change tipc_net_start routine return value type 2012-08-20 02:26:30 -07:00
net.h tipc: change tipc_net_start routine return value type 2012-08-20 02:26:30 -07:00
netlink.c netlink: Rename pid to portid to avoid confusion 2012-09-10 15:30:41 -04:00
node_subscr.c tipc: use standard printk shortcut macros (pr_err etc.) 2012-07-13 19:24:44 -04:00
node_subscr.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00
node.c tipc: introduce message to synchronize broadcast link 2012-11-22 14:33:21 -05:00
node.h tipc: rename supported flag to recv_permitted 2012-11-22 07:50:51 -05:00
port.c tipc: phase out most of the struct print_buf usage 2012-07-13 19:33:28 -04:00
port.h net: Fix (nearly-)kernel-doc comments for various functions 2012-07-10 23:13:45 -07:00
ref.c tipc: use standard printk shortcut macros (pr_err etc.) 2012-07-13 19:24:44 -04:00
ref.h tipc: cleanup function namespace 2010-10-16 11:13:24 -07:00
socket.c tipc: wake up all waiting threads at socket shutdown 2012-11-21 20:06:29 -05:00
subscr.c tipc: eliminate configuration for maximum number of name subscriptions 2012-08-20 02:26:31 -07:00
subscr.h tipc: compress out gratuitous extra carriage returns 2012-04-30 15:53:56 -04:00