On 03/19/2018 08:10 PM, Jon Maloy wrote: > The removal of an internal structure of the node address has an unwanted > side effect. > - Currently, if a user is sending an anycast message with destination > domain 0, the tipc_namebl_translate() function will use the 'closest- > first' algorithm to first look for a node local destination, and only > when no such is found, will it resort to the cluster global 'round- > robin' lookup algorithm. > - Current users can get around this, and enforce unconditional use of > global round-robin by indicating a destination as Z.0.0 or Z.C.0. > - This option disappears when we make the node address flat, since the > lookup algortithm has no way of recognizing this case. So, as long as
s/algortithm/algorithm > there are node local destinations, the algorithm will always select > one of those, and there is nothing the sender can do to change this. > > We solve this by eliminating the 'closest-first' option, which was never > a good idea anyway, for non-legacy users, but only for those. Agreed. In fact, I ever met a case where users used such feature. To > distinguish between legacy users and non-legacy users we introduce a new > flag 'legacy_addr_format' in struct tipc_core, to be set when the user > configures a legacy-style Z.C.N node address. Hence, when a legacy user > indicates a zero lookup domain 'closest-first' is selected, and in all > other cases we use 'round-robin'. > > Signed-off-by: Jon Maloy <[email protected]> Acked-by: Ying Xue <[email protected]> > --- > net/tipc/addr.c | 12 +++++++----- > net/tipc/addr.h | 2 +- > net/tipc/core.h | 3 ++- > net/tipc/discover.c | 13 ++++++------- > net/tipc/name_table.c | 8 +++++--- > net/tipc/net.c | 2 +- > 6 files changed, 22 insertions(+), 18 deletions(-) > > diff --git a/net/tipc/addr.c b/net/tipc/addr.c > index dfc31a7..1998799 100644 > --- a/net/tipc/addr.c > +++ b/net/tipc/addr.c > @@ -48,15 +48,17 @@ int in_own_node(struct net *net, u32 addr) > return (addr == tn->own_addr) || !addr; > } > > -int tipc_in_scope(u32 domain, u32 addr) > +bool tipc_in_scope(bool legacy_format, u32 domain, u32 addr) > { > if (!domain || (domain == addr)) > - return 1; > + return true; > + if (!legacy_format) > + return false; > if (domain == tipc_cluster_mask(addr)) /* domain <Z.C.0> */ > - return 1; > + return true; > if (domain == (addr & TIPC_ZONE_MASK)) /* domain <Z.0.0> */ > - return 1; > - return 0; > + return true; > + return false; > } > > char *tipc_addr_string_fill(char *string, u32 addr) > diff --git a/net/tipc/addr.h b/net/tipc/addr.h > index 5ffde51..97bdc0e 100644 > --- a/net/tipc/addr.h > +++ b/net/tipc/addr.h > @@ -67,7 +67,7 @@ static inline int tipc_scope2node(struct net *net, int sc) > > u32 tipc_own_addr(struct net *net); > int in_own_node(struct net *net, u32 addr); > -int tipc_in_scope(u32 domain, u32 addr); > +bool tipc_in_scope(bool legacy_format, u32 domain, u32 addr); > char *tipc_addr_string_fill(char *string, u32 addr); > > #endif > diff --git a/net/tipc/core.h b/net/tipc/core.h > index 347f850..bd2b112 100644 > --- a/net/tipc/core.h > +++ b/net/tipc/core.h > @@ -1,7 +1,7 @@ > /* > * net/tipc/core.h: Include file for TIPC global declarations > * > - * Copyright (c) 2005-2006, 2013 Ericsson AB > + * Copyright (c) 2005-2006, 2013-2018 Ericsson AB > * Copyright (c) 2005-2007, 2010-2013, Wind River Systems > * All rights reserved. > * > @@ -81,6 +81,7 @@ struct tipc_net { > u32 own_addr; > int net_id; > int random; > + bool legacy_addr_format; > > /* Node table and node list */ > spinlock_t node_list_lock; > diff --git a/net/tipc/discover.c b/net/tipc/discover.c > index ba4abb1..63fb4d3 100644 > --- a/net/tipc/discover.c > +++ b/net/tipc/discover.c > @@ -139,6 +139,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb, > struct tipc_net *tn = tipc_net(net); > struct tipc_msg *hdr = buf_msg(skb); > u16 caps = msg_node_capabilities(hdr); > + bool legacy = tn->legacy_addr_format; > u32 signature = msg_node_sig(hdr); > u32 dst = msg_dest_domain(hdr); > u32 net_id = msg_bc_netid(hdr); > @@ -164,13 +165,11 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb, > disc_dupl_alert(b, self, &maddr); > 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; > - } > + if (!tipc_in_scope(legacy, dst, self)) > + return; > + if (!tipc_in_scope(legacy, 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/name_table.c b/net/tipc/name_table.c > index bbbfc07..7478acb 100644 > --- a/net/tipc/name_table.c > +++ b/net/tipc/name_table.c > @@ -499,7 +499,9 @@ struct publication *tipc_nametbl_remove_publ(struct net > *net, u32 type, > u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, > u32 *destnode) > { > - struct tipc_net *tn = net_generic(net, tipc_net_id); > + struct tipc_net *tn = tipc_net(net); > + bool legacy = tn->legacy_addr_format; > + u32 self = tipc_own_addr(net); > struct sub_seq *sseq; > struct name_info *info; > struct publication *publ; > @@ -507,7 +509,7 @@ u32 tipc_nametbl_translate(struct net *net, u32 type, u32 > instance, > u32 port = 0; > u32 node = 0; > > - if (!tipc_in_scope(*destnode, tn->own_addr)) > + if (!tipc_in_scope(legacy, *destnode, self)) > return 0; > > rcu_read_lock(); > @@ -521,7 +523,7 @@ u32 tipc_nametbl_translate(struct net *net, u32 type, u32 > instance, > info = sseq->info; > > /* Closest-First Algorithm */ > - if (likely(!*destnode)) { > + if (legacy && !*destnode) { > if (!list_empty(&info->local_publ)) { > publ = list_first_entry(&info->local_publ, > struct publication, > diff --git a/net/tipc/net.c b/net/tipc/net.c > index a074f28..eb0d7a3 100644 > --- a/net/tipc/net.c > +++ b/net/tipc/net.c > @@ -240,7 +240,7 @@ int __tipc_nl_net_set(struct sk_buff *skb, struct > genl_info *info) > addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); > if (!addr) > return -EINVAL; > - > + tn->legacy_addr_format = true; > tipc_net_start(net, addr); > } > > ------------------------------------------------------------------------------ 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
