]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
tipc: introduce new capability flag for cluster
authorHoang Le <hoang.h.le@dektech.com.au>
Tue, 19 Mar 2019 11:49:49 +0000 (18:49 +0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Mar 2019 20:56:17 +0000 (13:56 -0700)
As a preparation for introducing a smooth switching between replicast
and broadcast method for multicast message, We have to introduce a new
capability flag TIPC_MCAST_RBCTL to handle this new feature.

During a cluster upgrade a node can come back with this new capabilities
which also must be reflected in the cluster capabilities field.
The new feature is only applicable if all node in the cluster supports
this new capability.

Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/core.c
net/tipc/core.h
net/tipc/node.c
net/tipc/node.h

index 5b38f516428147d6e2f1e03a1d3f9e2bfe9a769f..27cccd101ef663476f0b582487eae9d79533994e 100644 (file)
@@ -43,6 +43,7 @@
 #include "net.h"
 #include "socket.h"
 #include "bcast.h"
+#include "node.h"
 
 #include <linux/module.h>
 
@@ -59,6 +60,7 @@ static int __net_init tipc_init_net(struct net *net)
        tn->node_addr = 0;
        tn->trial_addr = 0;
        tn->addr_trial_end = 0;
+       tn->capabilities = TIPC_NODE_CAPABILITIES;
        memset(tn->node_id, 0, sizeof(tn->node_id));
        memset(tn->node_id_string, 0, sizeof(tn->node_id_string));
        tn->mon_threshold = TIPC_DEF_MON_THRESHOLD;
index 8020a6c360ffd2eeef2430308f2ba3b13b5d13cc..7a68e1b6a066922b54bbc50c3ad1bff7e65c0973 100644 (file)
@@ -122,6 +122,9 @@ struct tipc_net {
        /* Topology subscription server */
        struct tipc_topsrv *topsrv;
        atomic_t subscription_count;
+
+       /* Cluster capabilities */
+       u16 capabilities;
 };
 
 static inline struct tipc_net *tipc_net(struct net *net)
index 2dc4919ab23cace02749ddb9b4838c2b64c09152..2717893e9dbe44fa97a7afe75f29f666782184ab 100644 (file)
@@ -383,6 +383,11 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,
                                tipc_link_update_caps(l, capabilities);
                }
                write_unlock_bh(&n->lock);
+               /* Calculate cluster capabilities */
+               tn->capabilities = TIPC_NODE_CAPABILITIES;
+               list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
+                       tn->capabilities &= temp_node->capabilities;
+               }
                goto exit;
        }
        n = kzalloc(sizeof(*n), GFP_ATOMIC);
@@ -433,6 +438,11 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,
                        break;
        }
        list_add_tail_rcu(&n->list, &temp_node->list);
+       /* Calculate cluster capabilities */
+       tn->capabilities = TIPC_NODE_CAPABILITIES;
+       list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
+               tn->capabilities &= temp_node->capabilities;
+       }
        trace_tipc_node_create(n, true, " ");
 exit:
        spin_unlock_bh(&tn->node_list_lock);
@@ -589,6 +599,7 @@ static void  tipc_node_clear_links(struct tipc_node *node)
  */
 static bool tipc_node_cleanup(struct tipc_node *peer)
 {
+       struct tipc_node *temp_node;
        struct tipc_net *tn = tipc_net(peer->net);
        bool deleted = false;
 
@@ -604,6 +615,13 @@ static bool tipc_node_cleanup(struct tipc_node *peer)
                deleted = true;
        }
        tipc_node_write_unlock(peer);
+
+       /* Calculate cluster capabilities */
+       tn->capabilities = TIPC_NODE_CAPABILITIES;
+       list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
+               tn->capabilities &= temp_node->capabilities;
+       }
+
        spin_unlock_bh(&tn->node_list_lock);
        return deleted;
 }
index 4f59a30e989a75827365e2acddc5a9c45b86694d..2404225c5d58ba84ead791f1a1343712cd845566 100644 (file)
@@ -51,7 +51,8 @@ enum {
        TIPC_BLOCK_FLOWCTL    = (1 << 3),
        TIPC_BCAST_RCAST      = (1 << 4),
        TIPC_NODE_ID128       = (1 << 5),
-       TIPC_LINK_PROTO_SEQNO = (1 << 6)
+       TIPC_LINK_PROTO_SEQNO = (1 << 6),
+       TIPC_MCAST_RBCTL      = (1 << 7)
 };
 
 #define TIPC_NODE_CAPABILITIES (TIPC_SYN_BIT           |  \
@@ -60,7 +61,8 @@ enum {
                                TIPC_BCAST_RCAST       |   \
                                TIPC_BLOCK_FLOWCTL     |   \
                                TIPC_NODE_ID128        |   \
-                               TIPC_LINK_PROTO_SEQNO)
+                               TIPC_LINK_PROTO_SEQNO  |   \
+                               TIPC_MCAST_RBCTL)
 #define INVALID_BEARER_ID -1
 
 void tipc_node_stop(struct net *net);