Hi Ying, It depends on what you men with 'cluster id here, but anyway it was never possible.
If you mean what we so far have called net id, it was never the intention that it should be possible. If you mean the "C" part of a Z.C.N address, it was meant to become possible, but luckily this was never applied. It is currently possible (and to my big surprise a few months ago) to set a node address as e.g., 5.6.7, instead of just 1.1.7 as I had believed (don't know who added this), and set up clusters isolated by a 5.6.0 discovery domain. However, it is not possible to change the discovery domain to e.g., 0, so establishing links between nodes in different clusters, e.g., 1.1.7<->5.6.7 is not possible. I tested this because I was concerned about it. So, should we after all accept inter-cluster links? I am not sure, but if there is a demand it would be easy to achieve. It would only mean that it must become possible to set the cluster id (the old network id) per bearer. We can then set up two different clusters with different cluster ids via e.g., Ethernet, and then enable a UDP bearer on one node in each cluster with a third, common id. Those two nodes will then see each other, but nobody else in the opposite cluster will. Maybe not a bad idea... BR ///jon > -----Original Message----- > From: Ying Xue [mailto:[email protected]] > Sent: Tuesday, March 20, 2018 09:27 > To: Jon Maloy <[email protected]>; Jon Maloy > <[email protected]> > Cc: [email protected]; Mohan Krishna Ghanta > Krishnamurthy <[email protected]>; > [email protected] > Subject: Re: [tipc-discussion] [net-next v2 3/8] tipc: remove restrictions on > node address values > > One more questions about the network_id or cluster_id: > > Now with the network_id or cluster_id, the nodes with different cluster_id > are completely isolated. But sometimes, one of the nodes with one > cluster_id needs to talk with another node with another cluster_id. > How can we make this happened? > > Thanks, > Ying > > On 03/20/2018 08:22 PM, Ying Xue wrote: > > On 03/19/2018 08:10 PM, Jon Maloy wrote: > >> Nominally, TIPC organizes network nodes into a three-level network > >> hierarchy consisting of the levels 'zone', 'cluster' and 'node'. This > >> hierarchy is reflected in the node address format, - it is > >> sub-divided into an 8-bit zone id, and 12 bit cluster id, and a 12-bit > >> node id. > >> > >> However, the 'zone' and 'cluster' levels have in reality never been > >> fully implemented,and never will be. The result of this has been that > >> the first 20 bits the node identity structure have been wasted, and > >> the usable node identity range within a cluster has been limited to > >> 12 bits. This is starting to become a problem. > >> > >> In the following commits, we will need to be able to connect between > >> nodes which are using the whole 32-bit value space of the node address. > >> We therefore remove the restrictions on which values can be assigned > >> to node identity, -it is from now on only a 32-bit integer with no > >> assumed internal structure. > >> > >> Isolation between clusters is now achieved only by setting different > >> values for the 'network id' field used during neighbor discovery, in > >> practice leading to the latter becoming the new 'cluster id'. > > > > I really like this idea that we use network_id to separate a big > > cluster into several small sub-clusters. It means the TIPC network > > node address structure has became from the original three-level > > hierarchy to a flat mode. As the network_id is very similar to vlan > > ID, it's much more flexible than previous node address structure. > > > >> > >> The rules for accepting discovery requests/responses from neigboring > > > > s/neigboring/neighboring > > > >> nodes now become: > >> > >> - If the user has configured a discovery domain different from 0 on a > >> bearer, and is using legacy address format on both peers, reception > >> of discovery messages is subject to the legacy lookup domain check > >> in addition to the cluster id check. > >> > >> - Otherwise, the discovery request/response is always accepted, > provided > >> both peers have the same cluster id. > >> > >> This secures backwards compatibility for users who have been using > >> zone or cluster identites as cluster separators, instead of the > >> intended > > > > s/identites/identities > > > >> 'network id'. > >> > >> Signed-off-by: Jon Maloy <[email protected]> > >> --- > >> net/tipc/addr.c | 50 > >> +------------------------------------------------- > >> net/tipc/addr.h | 11 ----------- > >> net/tipc/bearer.c | 27 ++++----------------------- > >> net/tipc/discover.c | 15 +++++++-------- > >> net/tipc/link.c | 6 ++---- > >> net/tipc/net.c | 4 ++-- > >> net/tipc/node.c | 8 ++------ > >> net/tipc/node.h | 5 +++-- > >> 8 files changed, 21 insertions(+), 105 deletions(-) > >> > >> diff --git a/net/tipc/addr.c b/net/tipc/addr.c index 97cd857..dfc31a7 > >> 100644 > >> --- a/net/tipc/addr.c > >> +++ b/net/tipc/addr.c > >> @@ -39,21 +39,6 @@ > >> #include "core.h" > >> > >> /** > >> - * in_own_cluster - test for cluster inclusion; <0.0.0> always > >> matches > >> - */ > >> -int in_own_cluster(struct net *net, u32 addr) -{ > >> - return in_own_cluster_exact(net, addr) || !addr; > >> -} > >> - > >> -int in_own_cluster_exact(struct net *net, u32 addr) -{ > >> - struct tipc_net *tn = net_generic(net, tipc_net_id); > >> - > >> - return !((addr ^ tn->own_addr) >> 12); > >> -} > >> - > >> -/** > >> * in_own_node - test for node inclusion; <0.0.0> always matches > >> */ > >> int in_own_node(struct net *net, u32 addr) @@ -63,46 +48,13 @@ int > >> in_own_node(struct net *net, u32 addr) > >> return (addr == tn->own_addr) || !addr; } > >> > >> -/** > >> - * tipc_addr_domain_valid - validates a network domain address > >> - * > >> - * Accepts <Z.C.N>, <Z.C.0>, <Z.0.0>, and <0.0.0>, > >> - * where Z, C, and N are non-zero. > >> - * > >> - * Returns 1 if domain address is valid, otherwise 0 > >> - */ > >> -int tipc_addr_domain_valid(u32 addr) -{ > >> - u32 n = tipc_node(addr); > >> - u32 c = tipc_cluster(addr); > >> - u32 z = tipc_zone(addr); > >> - > >> - if (n && (!z || !c)) > >> - return 0; > >> - if (c && !z) > >> - return 0; > >> - return 1; > >> -} > >> - > >> -/** > >> - * tipc_addr_node_valid - validates a proposed network address for > >> this node > >> - * > >> - * Accepts <Z.C.N>, where Z, C, and N are non-zero. > >> - * > >> - * Returns 1 if address can be used, otherwise 0 > >> - */ > >> -int tipc_addr_node_valid(u32 addr) > >> -{ > >> - return tipc_addr_domain_valid(addr) && tipc_node(addr); > >> -} > >> - > >> int tipc_in_scope(u32 domain, u32 addr) { > >> if (!domain || (domain == addr)) > >> return 1; > >> if (domain == tipc_cluster_mask(addr)) /* domain <Z.C.0> */ > >> return 1; > >> - if (domain == tipc_zone_mask(addr)) /* domain <Z.0.0> */ > >> + if (domain == (addr & TIPC_ZONE_MASK)) /* domain <Z.0.0> */ > >> return 1; > >> return 0; > >> } > >> diff --git a/net/tipc/addr.h b/net/tipc/addr.h index 2ecf5a5..5ffde51 > >> 100644 > >> --- a/net/tipc/addr.h > >> +++ b/net/tipc/addr.h > >> @@ -50,11 +50,6 @@ static inline u32 tipc_own_addr(struct net *net) > >> return tn->own_addr; > >> } > >> > >> -static inline u32 tipc_zone_mask(u32 addr) -{ > >> - return addr & TIPC_ZONE_MASK; > >> -} > >> - > >> static inline u32 tipc_cluster_mask(u32 addr) { > >> return addr & TIPC_ZONE_CLUSTER_MASK; @@ -71,14 +66,8 @@ > static > >> inline int tipc_scope2node(struct net *net, int sc) } > >> > >> u32 tipc_own_addr(struct net *net); > >> -int in_own_cluster(struct net *net, u32 addr); -int > >> in_own_cluster_exact(struct net *net, u32 addr); int > >> in_own_node(struct net *net, u32 addr); > >> -u32 addr_domain(struct net *net, u32 sc); -int > >> tipc_addr_domain_valid(u32); -int tipc_addr_node_valid(u32 addr); > >> int tipc_in_scope(u32 domain, u32 addr); -int tipc_addr_scope(u32 > >> domain); char *tipc_addr_string_fill(char *string, u32 addr); > >> > >> #endif > >> diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index > >> 76340b9..a71f318 100644 > >> --- a/net/tipc/bearer.c > >> +++ b/net/tipc/bearer.c > >> @@ -240,7 +240,6 @@ static int tipc_enable_bearer(struct net *net, > const char *name, > >> struct tipc_bearer *b; > >> struct tipc_media *m; > >> struct sk_buff *skb; > >> - char addr_string[16]; > >> int bearer_id = 0; > >> int res = -EINVAL; > >> char *errstr = ""; > >> @@ -256,21 +255,6 @@ static int tipc_enable_bearer(struct net *net, > const char *name, > >> goto rejected; > >> } > >> > >> - if (tipc_addr_domain_valid(disc_domain) && disc_domain != self) { > >> - if (tipc_in_scope(disc_domain, self)) { > >> - /* Accept any node in own cluster */ > >> - disc_domain = self & TIPC_ZONE_CLUSTER_MASK; > >> - res = 0; > >> - } else if (in_own_cluster_exact(net, disc_domain)) { > >> - /* Accept specified node in own cluster */ > >> - res = 0; > >> - } > >> - } > >> - if (res) { > >> - errstr = "illegal discovery domain"; > >> - goto rejected; > >> - } > >> - > >> if (prio > TIPC_MAX_LINK_PRI && prio != TIPC_MEDIA_LINK_PRI) { > >> errstr = "illegal priority"; > >> goto rejected; > >> @@ -354,12 +338,11 @@ static int tipc_enable_bearer(struct net *net, > const char *name, > >> return -ENOMEM; > >> } > >> > >> - tipc_addr_string_fill(addr_string, disc_domain); > >> - pr_info("Enabled bearer <%s>, discovery scope %s, priority %u\n", > >> - name, addr_string, prio); > >> + pr_info("Enabled bearer <%s>, priority %u\n", name, prio); > >> + > >> return res; > >> rejected: > >> - pr_warn("Bearer <%s> rejected, %s\n", name, errstr); > >> + pr_warn("Enabling of bearer <%s> rejected, %s\n", name, errstr); > >> return res; > >> } > >> > >> @@ -865,12 +848,10 @@ int __tipc_nl_bearer_enable(struct sk_buff > *skb, struct genl_info *info) > >> char *bearer; > >> struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1]; > >> struct net *net = sock_net(skb->sk); > >> - struct tipc_net *tn = net_generic(net, tipc_net_id); > >> - u32 domain; > >> + u32 domain = 0; > >> u32 prio; > >> > >> prio = TIPC_MEDIA_LINK_PRI; > >> - domain = tn->own_addr & TIPC_ZONE_CLUSTER_MASK; > > > > > >> > >> if (!info->attrs[TIPC_NLA_BEARER]) > >> return -EINVAL; > >> diff --git a/net/tipc/discover.c b/net/tipc/discover.c index > >> a737870..ba4abb1 100644 > >> --- a/net/tipc/discover.c > >> +++ b/net/tipc/discover.c > >> @@ -160,18 +160,17 @@ void tipc_disc_rcv(struct net *net, struct sk_buff > *skb, > >> return; > >> if (!memcmp(&maddr, &b->addr, sizeof(maddr))) > >> return; > >> - if (!tipc_addr_domain_valid(dst)) > >> - return; > >> - if (!tipc_addr_node_valid(src)) > >> - return; > >> if (in_own_node(net, src)) { > >> disc_dupl_alert(b, self, &maddr); > >> return; > >> } > >> - if (!tipc_in_scope(dst, self)) > >> - return; > >> - if (!tipc_in_scope(b->domain, src)) > >> - return; > >> + /* Domain filter only works if both peers use legacy address format > */ > >> + if (b->domain) { > >> + if (!tipc_in_scope(dst, self)) > >> + return; > >> + if (!tipc_in_scope(b->domain, src)) > >> + return; > >> + } > >> tipc_node_check_dest(net, src, b, caps, signature, > >> &maddr, &respond, &dupl_addr); > >> if (dupl_addr) > >> diff --git a/net/tipc/link.c b/net/tipc/link.c index 3c23046..86fde00 > >> 100644 > >> --- a/net/tipc/link.c > >> +++ b/net/tipc/link.c > >> @@ -434,7 +434,7 @@ char *tipc_link_name(struct tipc_link *l) > >> */ > >> bool tipc_link_create(struct net *net, char *if_name, int bearer_id, > >> int tolerance, char net_plane, u32 mtu, int priority, > >> - int window, u32 session, u32 ownnode, u32 peer, > >> + int window, u32 session, u32 self, u32 peer, > >> u16 peer_caps, > >> struct tipc_link *bc_sndlink, > >> struct tipc_link *bc_rcvlink, @@ -451,9 +451,7 @@ bool > >> tipc_link_create(struct net *net, char *if_name, int bearer_id, > >> l->session = session; > >> > >> /* Note: peer i/f name is completed by reset/activate message */ > >> - sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", > >> - tipc_zone(ownnode), tipc_cluster(ownnode), > tipc_node(ownnode), > >> - if_name, tipc_zone(peer), tipc_cluster(peer), > tipc_node(peer)); > >> + sprintf(l->name, "%x:%s-%x:unknown", self, if_name, peer); > >> strcpy(l->if_name, if_name); > >> l->addr = peer; > >> l->peer_caps = peer_caps; > >> diff --git a/net/tipc/net.c b/net/tipc/net.c index 5c4c440..a074f28 > >> 100644 > >> --- a/net/tipc/net.c > >> +++ b/net/tipc/net.c > >> @@ -121,7 +121,7 @@ int tipc_net_start(struct net *net, u32 addr) > >> TIPC_CLUSTER_SCOPE, 0, tn->own_addr); > >> > >> pr_info("Started in network mode\n"); > >> - pr_info("Own node address %s, network identity %u\n", > >> + pr_info("Own node address %s, cluster identity %u\n", > >> tipc_addr_string_fill(addr_string, tn->own_addr), > >> tn->net_id); > >> return 0; > >> @@ -238,7 +238,7 @@ int __tipc_nl_net_set(struct sk_buff *skb, struct > genl_info *info) > >> return -EPERM; > >> > >> addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); > >> - if (!tipc_addr_node_valid(addr)) > >> + if (!addr) > >> return -EINVAL; > >> > >> tipc_net_start(net, addr); > >> diff --git a/net/tipc/node.c b/net/tipc/node.c index 389193d..8a4b049 > >> 100644 > >> --- a/net/tipc/node.c > >> +++ b/net/tipc/node.c > >> @@ -233,9 +233,6 @@ static struct tipc_node *tipc_node_find(struct net > *net, u32 addr) > >> struct tipc_node *node; > >> unsigned int thash = tipc_hashfn(addr); > >> > >> - if (unlikely(!in_own_cluster_exact(net, addr))) > >> - return NULL; > >> - > >> rcu_read_lock(); > >> hlist_for_each_entry_rcu(node, &tn->node_htable[thash], hash) { > >> if (node->addr != addr) > >> @@ -836,10 +833,9 @@ void tipc_node_check_dest(struct net *net, u32 > >> onode, > >> > >> /* Now create new link if not already existing */ > >> if (!l) { > >> - if (n->link_cnt == 2) { > >> - pr_warn("Cannot establish 3rd link to %x\n", n- > >addr); > > > > I think the warning message is still useful for users especially when > > they meet some errors. > > > >> + if (n->link_cnt == 2) > >> goto exit; > >> - } > >> + > >> if_name = strchr(b->name, ':') + 1; > >> if (!tipc_link_create(net, if_name, b->identity, b->tolerance, > >> b->net_plane, b->mtu, b->priority, diff -- > git > >> a/net/tipc/node.h b/net/tipc/node.h index 4ce5e3a..5fb38cf 100644 > >> --- a/net/tipc/node.h > >> +++ b/net/tipc/node.h > >> @@ -49,13 +49,14 @@ enum { > >> TIPC_BCAST_STATE_NACK = (1 << 2), > >> TIPC_BLOCK_FLOWCTL = (1 << 3), > >> TIPC_BCAST_RCAST = (1 << 4), > >> - TIPC_MCAST_GROUPS = (1 << 5) > >> + TIPC_NODE_ID32 = (1 << 5) > >> }; > >> > >> #define TIPC_NODE_CAPABILITIES (TIPC_BCAST_SYNCH | \ > >> TIPC_BCAST_STATE_NACK | \ > >> TIPC_BCAST_RCAST | \ > >> - TIPC_BLOCK_FLOWCTL) > >> + TIPC_BLOCK_FLOWCTL | \ > >> + TIPC_NODE_ID32) > >> #define INVALID_BEARER_ID -1 > >> > >> void tipc_node_stop(struct net *net); > >> > > > > ---------------------------------------------------------------------- > > -------- Check out the vibrant tech community on one of the world's > > most engaging tech sites, Slashdot.org! http://sdm.link/slashdot > > _______________________________________________ > > tipc-discussion mailing list > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/tipc-discussion > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/tipc-discussion
