Skip to content

Commit efe7905

Browse files
Hamish Martindavem330
authored andcommitted
tipc: only process unicast on intended node
We have observed complete lock up of broadcast-link transmission due to unacknowledged packets never being removed from the 'transmq' queue. This is traced to nodes having their ack field set beyond the sequence number of packets that have actually been transmitted to them. Consider an example where node 1 has sent 10 packets to node 2 on a link and node 3 has sent 20 packets to node 2 on another link. We see examples of an ack from node 2 destined for node 3 being treated as an ack from node 2 at node 1. This leads to the ack on the node 1 to node 2 link being increased to 20 even though we have only sent 10 packets. When node 1 does get around to sending further packets, none of the packets with sequence numbers less than 21 are actually removed from the transmq. To resolve this we reinstate some code lost in commit d999297 ("tipc: reduce locking scope during packet reception") which ensures that only messages destined for the receiving node are processed by that node. This prevents the sequence numbers from getting out of sync and resolves the packet leakage, thereby resolving the broadcast-link transmission lock-ups we observed. While we are aware that this change only patches over a root problem that we still haven't identified, this is a sanity test that it is always legitimate to do. It will remain in the code even after we identify and fix the real problem. Reviewed-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Reviewed-by: John Thompson <john.thompson@alliedtelesis.co.nz> Signed-off-by: Hamish Martin <hamish.martin@alliedtelesis.co.nz> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 0b86a2a commit efe7905

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

net/tipc/node.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,7 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
14441444
int bearer_id = b->identity;
14451445
struct tipc_link_entry *le;
14461446
u16 bc_ack = msg_bcast_ack(hdr);
1447+
u32 self = tipc_own_addr(net);
14471448
int rc = 0;
14481449

14491450
__skb_queue_head_init(&xmitq);
@@ -1460,6 +1461,10 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
14601461
return tipc_node_bc_rcv(net, skb, bearer_id);
14611462
}
14621463

1464+
/* Discard unicast link messages destined for another node */
1465+
if (unlikely(!msg_short(hdr) && (msg_destnode(hdr) != self)))
1466+
goto discard;
1467+
14631468
/* Locate neighboring node that sent packet */
14641469
n = tipc_node_find(net, msg_prevnode(hdr));
14651470
if (unlikely(!n))

0 commit comments

Comments
 (0)