aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/node.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-10-22 08:51:42 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-24 09:56:39 -0400
commitb06b281e79375fcbd9ffaec7c5fdc350b888d089 (patch)
tree74227c840529e15377aad08e5dc4ddab21fba2cd /net/tipc/node.c
parent5266698661401afc5e4a1a521cf9ba10724d10dd (diff)
tipc: simplify bearer level broadcast
Until now, we have been keeping track of the exact set of broadcast destinations though the help structure tipc_node_map. This leads us to have to maintain a whole infrastructure for supporting this, including a pseudo-bearer and a number of functions to manipulate both the bearers and the node map correctly. Apart from the complexity, this approach is also limiting, as struct tipc_node_map only can support cluster local broadcast if we want to avoid it becoming excessively large. We want to eliminate this limitation, in order to enable introduction of scoped multicast in the future. A closer analysis reveals that it is unnecessary maintaining this "full set" overview; it is sufficient to keep a counter per bearer, indicating how many nodes can be reached via this bearer at the moment. The protocol is now robust enough to handle transitional discrepancies between the nominal number of reachable destinations, as expected by the broadcast protocol itself, and the number which is actually reachable at the moment. The initial broadcast synchronization, in conjunction with the retransmission mechanism, ensures that all packets will eventually be acknowledged by the correct set of destinations. This commit introduces these changes. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r--net/tipc/node.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c
index cd924552244b..b27439097d6c 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -346,6 +346,7 @@ static void __tipc_node_link_up(struct tipc_node *n, int bearer_id,
346 n->links[bearer_id].mtu = nl->mtu - INT_H_SIZE; 346 n->links[bearer_id].mtu = nl->mtu - INT_H_SIZE;
347 347
348 tipc_bearer_add_dest(n->net, bearer_id, n->addr); 348 tipc_bearer_add_dest(n->net, bearer_id, n->addr);
349 tipc_bcast_inc_bearer_dst_cnt(n->net, bearer_id);
349 350
350 pr_debug("Established link <%s> on network plane %c\n", 351 pr_debug("Established link <%s> on network plane %c\n",
351 nl->name, nl->net_plane); 352 nl->name, nl->net_plane);
@@ -356,7 +357,7 @@ static void __tipc_node_link_up(struct tipc_node *n, int bearer_id,
356 *slot1 = bearer_id; 357 *slot1 = bearer_id;
357 tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT); 358 tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT);
358 n->action_flags |= TIPC_NOTIFY_NODE_UP; 359 n->action_flags |= TIPC_NOTIFY_NODE_UP;
359 tipc_bcast_add_peer(n->net, n->addr, nl, xmitq); 360 tipc_bcast_add_peer(n->net, nl, xmitq);
360 return; 361 return;
361 } 362 }
362 363
@@ -443,8 +444,10 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,
443 tipc_link_build_reset_msg(l, xmitq); 444 tipc_link_build_reset_msg(l, xmitq);
444 *maddr = &n->links[*bearer_id].maddr; 445 *maddr = &n->links[*bearer_id].maddr;
445 node_lost_contact(n, &le->inputq); 446 node_lost_contact(n, &le->inputq);
447 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id);
446 return; 448 return;
447 } 449 }
450 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id);
448 451
449 /* There is still a working link => initiate failover */ 452 /* There is still a working link => initiate failover */
450 tnl = node_active_link(n, 0); 453 tnl = node_active_link(n, 0);
@@ -860,7 +863,7 @@ static void node_lost_contact(struct tipc_node *n,
860 tipc_addr_string_fill(addr_string, n->addr)); 863 tipc_addr_string_fill(addr_string, n->addr));
861 864
862 /* Clean up broadcast state */ 865 /* Clean up broadcast state */
863 tipc_bcast_remove_peer(n->net, n->addr, n->bc_entry.link); 866 tipc_bcast_remove_peer(n->net, n->bc_entry.link);
864 867
865 /* Abort any ongoing link failover */ 868 /* Abort any ongoing link failover */
866 for (i = 0; i < MAX_BEARERS; i++) { 869 for (i = 0; i < MAX_BEARERS; i++) {