tipc: reset all unicast links when broadcast send link fails
In test situations with many nodes and a heavily stressed system we have observed that the transmission broadcast link may fail due to an excessive number of retransmissions of the same packet. In such situations we need to reset all unicast links to all peers, in order to reset and re-synchronize the broadcast link. In this commit, we add a new function tipc_bearer_reset_all() to be used in such situations. The function scans across all bearers and resets all their pertaining links. Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
a71eb72035
Коммит
1fc07f3e15
|
@ -330,6 +330,21 @@ static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* tipc_bearer_reset_all - reset all links on all bearers
|
||||
*/
|
||||
void tipc_bearer_reset_all(struct net *net)
|
||||
{
|
||||
struct tipc_net *tn = tipc_net(net);
|
||||
struct tipc_bearer *b;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_BEARERS; i++) {
|
||||
b = rcu_dereference_rtnl(tn->bearer_list[i]);
|
||||
if (b)
|
||||
tipc_reset_bearer(net, b);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bearer_disable
|
||||
*
|
||||
|
|
|
@ -198,6 +198,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest);
|
|||
void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest);
|
||||
struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name);
|
||||
struct tipc_media *tipc_media_find(const char *name);
|
||||
void tipc_bearer_reset_all(struct net *net);
|
||||
int tipc_bearer_setup(void);
|
||||
void tipc_bearer_cleanup(void);
|
||||
void tipc_bearer_stop(struct net *net);
|
||||
|
|
|
@ -1297,10 +1297,6 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id
|
|||
|
||||
rc = tipc_bcast_rcv(net, be->link, skb);
|
||||
|
||||
/* Broadcast link reset may happen at reassembly failure */
|
||||
if (rc & TIPC_LINK_DOWN_EVT)
|
||||
tipc_node_reset_links(n);
|
||||
|
||||
/* Broadcast ACKs are sent on a unicast link */
|
||||
if (rc & TIPC_LINK_SND_BC_ACK) {
|
||||
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
|
|||
spin_unlock_bh(&be->inputq2.lock);
|
||||
tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2);
|
||||
}
|
||||
|
||||
if (rc & TIPC_LINK_DOWN_EVT) {
|
||||
/* Reception reassembly failure => reset all links to peer */
|
||||
if (!tipc_link_is_up(be->link))
|
||||
tipc_node_reset_links(n);
|
||||
|
||||
/* Retransmission failure => reset all links to all peers */
|
||||
if (!tipc_link_is_up(tipc_bc_sndlink(net)))
|
||||
tipc_bearer_reset_all(net);
|
||||
}
|
||||
|
||||
tipc_node_put(n);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче