diff options
author | David S. Miller <davem@davemloft.net> | 2016-07-23 19:31:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-24 00:53:32 -0400 |
commit | de0ba9a0d8909996f9e293d311c2cc459fa77d67 (patch) | |
tree | 199214afc477824bf431d11d08834ff7555c994b /net/tipc | |
parent | d95a93a9b71677a43f967a1b7986decab84b7765 (diff) | |
parent | 107df03203bb66de56e2caec3bde6d22b55480c5 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Just several instances of overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/bearer.c | 15 | ||||
-rw-r--r-- | net/tipc/bearer.h | 1 | ||||
-rw-r--r-- | net/tipc/link.c | 9 | ||||
-rw-r--r-- | net/tipc/node.c | 15 |
4 files changed, 35 insertions, 5 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 8584cc48654c..4131d5a86f55 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -335,6 +335,21 @@ static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b) | |||
335 | return 0; | 335 | return 0; |
336 | } | 336 | } |
337 | 337 | ||
338 | /* tipc_bearer_reset_all - reset all links on all bearers | ||
339 | */ | ||
340 | void tipc_bearer_reset_all(struct net *net) | ||
341 | { | ||
342 | struct tipc_net *tn = tipc_net(net); | ||
343 | struct tipc_bearer *b; | ||
344 | int i; | ||
345 | |||
346 | for (i = 0; i < MAX_BEARERS; i++) { | ||
347 | b = rcu_dereference_rtnl(tn->bearer_list[i]); | ||
348 | if (b) | ||
349 | tipc_reset_bearer(net, b); | ||
350 | } | ||
351 | } | ||
352 | |||
338 | /** | 353 | /** |
339 | * bearer_disable | 354 | * bearer_disable |
340 | * | 355 | * |
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 0d337c7b6fad..f1e6db5e6345 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
@@ -198,6 +198,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest); | |||
198 | void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest); | 198 | void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest); |
199 | struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name); | 199 | struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name); |
200 | struct tipc_media *tipc_media_find(const char *name); | 200 | struct tipc_media *tipc_media_find(const char *name); |
201 | void tipc_bearer_reset_all(struct net *net); | ||
201 | int tipc_bearer_setup(void); | 202 | int tipc_bearer_setup(void); |
202 | void tipc_bearer_cleanup(void); | 203 | void tipc_bearer_cleanup(void); |
203 | void tipc_bearer_stop(struct net *net); | 204 | void tipc_bearer_stop(struct net *net); |
diff --git a/net/tipc/link.c b/net/tipc/link.c index c1df33f878b2..877d94f34814 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -350,6 +350,8 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l, | |||
350 | u16 ack = snd_l->snd_nxt - 1; | 350 | u16 ack = snd_l->snd_nxt - 1; |
351 | 351 | ||
352 | snd_l->ackers--; | 352 | snd_l->ackers--; |
353 | rcv_l->bc_peer_is_up = true; | ||
354 | rcv_l->state = LINK_ESTABLISHED; | ||
353 | tipc_link_bc_ack_rcv(rcv_l, ack, xmitq); | 355 | tipc_link_bc_ack_rcv(rcv_l, ack, xmitq); |
354 | tipc_link_reset(rcv_l); | 356 | tipc_link_reset(rcv_l); |
355 | rcv_l->state = LINK_RESET; | 357 | rcv_l->state = LINK_RESET; |
@@ -1582,7 +1584,12 @@ void tipc_link_bc_sync_rcv(struct tipc_link *l, struct tipc_msg *hdr, | |||
1582 | if (!msg_peer_node_is_up(hdr)) | 1584 | if (!msg_peer_node_is_up(hdr)) |
1583 | return; | 1585 | return; |
1584 | 1586 | ||
1585 | l->bc_peer_is_up = true; | 1587 | /* Open when peer ackowledges our bcast init msg (pkt #1) */ |
1588 | if (msg_ack(hdr)) | ||
1589 | l->bc_peer_is_up = true; | ||
1590 | |||
1591 | if (!l->bc_peer_is_up) | ||
1592 | return; | ||
1586 | 1593 | ||
1587 | /* Ignore if peers_snd_nxt goes beyond receive window */ | 1594 | /* Ignore if peers_snd_nxt goes beyond receive window */ |
1588 | if (more(peers_snd_nxt, l->rcv_nxt + l->window)) | 1595 | if (more(peers_snd_nxt, l->rcv_nxt + l->window)) |
diff --git a/net/tipc/node.c b/net/tipc/node.c index a3fc0a3f4077..95cc78b51532 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -1297,10 +1297,6 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id | |||
1297 | 1297 | ||
1298 | rc = tipc_bcast_rcv(net, be->link, skb); | 1298 | rc = tipc_bcast_rcv(net, be->link, skb); |
1299 | 1299 | ||
1300 | /* Broadcast link reset may happen at reassembly failure */ | ||
1301 | if (rc & TIPC_LINK_DOWN_EVT) | ||
1302 | tipc_node_reset_links(n); | ||
1303 | |||
1304 | /* Broadcast ACKs are sent on a unicast link */ | 1300 | /* Broadcast ACKs are sent on a unicast link */ |
1305 | if (rc & TIPC_LINK_SND_BC_ACK) { | 1301 | if (rc & TIPC_LINK_SND_BC_ACK) { |
1306 | tipc_node_read_lock(n); | 1302 | tipc_node_read_lock(n); |
@@ -1320,6 +1316,17 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id | |||
1320 | spin_unlock_bh(&be->inputq2.lock); | 1316 | spin_unlock_bh(&be->inputq2.lock); |
1321 | tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2); | 1317 | tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2); |
1322 | } | 1318 | } |
1319 | |||
1320 | if (rc & TIPC_LINK_DOWN_EVT) { | ||
1321 | /* Reception reassembly failure => reset all links to peer */ | ||
1322 | if (!tipc_link_is_up(be->link)) | ||
1323 | tipc_node_reset_links(n); | ||
1324 | |||
1325 | /* Retransmission failure => reset all links to all peers */ | ||
1326 | if (!tipc_link_is_up(tipc_bc_sndlink(net))) | ||
1327 | tipc_bearer_reset_all(net); | ||
1328 | } | ||
1329 | |||
1323 | tipc_node_put(n); | 1330 | tipc_node_put(n); |
1324 | } | 1331 | } |
1325 | 1332 | ||