Hi Jon, I will give this patch a test and get back in touch. I am on vacation for a few days and so will be in touch next week.
Thanks, JT On Thu, Sep 8, 2016 at 12:28 AM, Jon Maloy <jon.ma...@ericsson.com> wrote: > Hi John, > I am unable to reproduce the scenario you are describing, but from your > debug data it looks clear enough: a STATE packet with ack value !=0 has > bypassed the first in-sequence packets, which still have an invalid > pre-synch ack value. > > If that diagnosis is right, this patch should solve the problem. Please > test this and give feedback. > > BR > ///jon > > > > -----Original Message----- > > From: Jon Maloy [mailto:jon.ma...@ericsson.com] > > Sent: Wednesday, 07 September, 2016 08:18 > > To: tipc-discussion@lists.sourceforge.net; Parthasarathy Bhuvaragan > > <parthasarathy.bhuvara...@ericsson.com>; Ying Xue > > <ying....@windriver.com>; Richard Alpe <richard.a...@ericsson.com>; Jon > > Maloy <jon.ma...@ericsson.com> > > Cc: ma...@donjonn.com; gbala...@gmail.com > > Subject: [PATCH net 1/1] tipc: fix broadcast link synchronization problem > > > > In commit 2d18ac4ba745 ("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 problem. > > > > We have seen it happen that a LINK_PROTOCOL/STATE message with a valid > > non-zero unicast acknowledge number may bypass BCAST_PROTOCOL > > initialization and NAME_DISRIBUTOR packets with invalid broadcast > > acknowledge numbers, leading to premature opening of the broadcast link. > > When this happens, the already correctly initialized acknowledge number > > of the broadcast receive link will be overwritten by the invalid (zero) > > value of the said packets, and the broadcast link risks going stale. > > > > We now fix this by ignoring acknowledges that we know potentially may > > be invalid. Identifying such acknowledges is easy, since their broadcast > > acknowledge value always is zero, and since this can only happen to > > BCAST_PROTOCOL and NAME_DISTRIBUTOR messages. > > > > Reported-by: John Thompson <thompa....@gmail.com> > > Signed-off-by: Jon Maloy <jon.ma...@ericsson.com> > > --- > > net/tipc/bcast.c | 7 ++++++- > > net/tipc/bcast.h | 3 ++- > > net/tipc/node.c | 2 +- > > 3 files changed, 9 insertions(+), 3 deletions(-) > > > > diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c > > index ae469b3..27ffa37 100644 > > --- a/net/tipc/bcast.c > > +++ b/net/tipc/bcast.c > > @@ -247,11 +247,16 @@ int tipc_bcast_rcv(struct net *net, struct > tipc_link *l, > > struct sk_buff *skb) > > * > > * RCU is locked, no other locks set > > */ > > -void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 acked) > > +void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, > > + int usr, u16 acked) > > { > > struct sk_buff_head *inputq = &tipc_bc_base(net)->inputq; > > struct sk_buff_head xmitq; > > > > + /* Ignore acks potentially sent before bcast synch point was > received */ > > + if (!acked && ((usr == BCAST_PROTOCOL) || (usr == > > NAME_DISTRIBUTOR))) > > + return; > > + > > __skb_queue_head_init(&xmitq); > > > > tipc_bcast_lock(net); > > diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h > > index d5e79b3..0529cb5 100644 > > --- a/net/tipc/bcast.h > > +++ b/net/tipc/bcast.h > > @@ -55,7 +55,8 @@ void tipc_bcast_dec_bearer_dst_cnt(struct net *net, > int > > bearer_id); > > int tipc_bcast_get_mtu(struct net *net); > > int tipc_bcast_xmit(struct net *net, struct sk_buff_head *list); > > int tipc_bcast_rcv(struct net *net, struct tipc_link *l, struct sk_buff > *skb); > > -void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 > acked); > > +void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, > > + int usr, u16 acked); > > void tipc_bcast_sync_rcv(struct net *net, struct tipc_link *l, > > struct tipc_msg *hdr); > > int tipc_nl_add_bc_link(struct net *net, struct tipc_nl_msg *msg); > > diff --git a/net/tipc/node.c b/net/tipc/node.c > > index 2197419..42f98af 100644 > > --- a/net/tipc/node.c > > +++ b/net/tipc/node.c > > @@ -1507,7 +1507,7 @@ void tipc_rcv(struct net *net, struct sk_buff > *skb, struct > > tipc_bearer *b) > > if (unlikely(usr == LINK_PROTOCOL)) > > tipc_bcast_sync_rcv(net, n->bc_entry.link, hdr); > > else if (unlikely(tipc_link_acked(n->bc_entry.link) != bc_ack)) > > - tipc_bcast_ack_rcv(net, n->bc_entry.link, bc_ack); > > + tipc_bcast_ack_rcv(net, n->bc_entry.link, usr, bc_ack); > > > > /* Receive packet directly if conditions permit */ > > tipc_node_read_lock(n); > > -- > > 2.7.4 > > > ------------------------------------------------------------ > ------------------ > _______________________________________________ > tipc-discussion mailing list > tipc-discussion@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/tipc-discussion > ------------------------------------------------------------------------------ _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion