diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/link.c | 3 | ||||
-rw-r--r-- | net/tipc/node.c | 12 |
2 files changed, 12 insertions, 3 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 7058c86f5e48..75db07c78a69 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -1330,6 +1330,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1330 | u16 peers_snd_nxt = msg_next_sent(hdr); | 1330 | u16 peers_snd_nxt = msg_next_sent(hdr); |
1331 | u16 peers_tol = msg_link_tolerance(hdr); | 1331 | u16 peers_tol = msg_link_tolerance(hdr); |
1332 | u16 peers_prio = msg_linkprio(hdr); | 1332 | u16 peers_prio = msg_linkprio(hdr); |
1333 | u16 rcv_nxt = l->rcv_nxt; | ||
1333 | char *if_name; | 1334 | char *if_name; |
1334 | int rc = 0; | 1335 | int rc = 0; |
1335 | 1336 | ||
@@ -1393,7 +1394,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1393 | break; | 1394 | break; |
1394 | 1395 | ||
1395 | /* Send NACK if peer has sent pkts we haven't received yet */ | 1396 | /* Send NACK if peer has sent pkts we haven't received yet */ |
1396 | if (more(peers_snd_nxt, l->rcv_nxt)) | 1397 | if (more(peers_snd_nxt, rcv_nxt) && !tipc_link_is_synching(l)) |
1397 | rcvgap = peers_snd_nxt - l->rcv_nxt; | 1398 | rcvgap = peers_snd_nxt - l->rcv_nxt; |
1398 | if (rcvgap || (msg_probe(hdr))) | 1399 | if (rcvgap || (msg_probe(hdr))) |
1399 | tipc_link_build_proto_msg(l, STATE_MSG, 0, rcvgap, | 1400 | tipc_link_build_proto_msg(l, STATE_MSG, 0, rcvgap, |
diff --git a/net/tipc/node.c b/net/tipc/node.c index 937cc6192bcf..703875fd6cde 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -1079,7 +1079,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, | |||
1079 | u16 exp_pkts = msg_msgcnt(hdr); | 1079 | u16 exp_pkts = msg_msgcnt(hdr); |
1080 | u16 rcv_nxt, syncpt, dlv_nxt; | 1080 | u16 rcv_nxt, syncpt, dlv_nxt; |
1081 | int state = n->state; | 1081 | int state = n->state; |
1082 | struct tipc_link *l, *pl = NULL; | 1082 | struct tipc_link *l, *tnl, *pl = NULL; |
1083 | struct tipc_media_addr *maddr; | 1083 | struct tipc_media_addr *maddr; |
1084 | int i, pb_id; | 1084 | int i, pb_id; |
1085 | 1085 | ||
@@ -1164,12 +1164,20 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, | |||
1164 | 1164 | ||
1165 | /* Open tunnel link when parallel link reaches synch point */ | 1165 | /* Open tunnel link when parallel link reaches synch point */ |
1166 | if ((n->state == NODE_SYNCHING) && tipc_link_is_synching(l)) { | 1166 | if ((n->state == NODE_SYNCHING) && tipc_link_is_synching(l)) { |
1167 | if (tipc_link_is_synching(l)) { | ||
1168 | tnl = l; | ||
1169 | } else { | ||
1170 | tnl = pl; | ||
1171 | pl = l; | ||
1172 | } | ||
1167 | dlv_nxt = pl->rcv_nxt - mod(skb_queue_len(pl->inputq)); | 1173 | dlv_nxt = pl->rcv_nxt - mod(skb_queue_len(pl->inputq)); |
1168 | if (more(dlv_nxt, n->sync_point)) { | 1174 | if (more(dlv_nxt, n->sync_point)) { |
1169 | tipc_link_fsm_evt(l, LINK_SYNCH_END_EVT); | 1175 | tipc_link_fsm_evt(tnl, LINK_SYNCH_END_EVT); |
1170 | tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); | 1176 | tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); |
1171 | return true; | 1177 | return true; |
1172 | } | 1178 | } |
1179 | if (l == pl) | ||
1180 | return true; | ||
1173 | if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG)) | 1181 | if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG)) |
1174 | return true; | 1182 | return true; |
1175 | if (usr == LINK_PROTOCOL) | 1183 | if (usr == LINK_PROTOCOL) |