Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tipc: obsolete TIPC_ZONE_SCOPE

Publications for TIPC_CLUSTER_SCOPE and TIPC_ZONE_SCOPE are in all
aspects handled the same way, both on the publishing node and on the
receiving nodes.

Despite previous ambitions to the contrary, this is never going to change,
so we take the conseqeunce of this and obsolete TIPC_ZONE_SCOPE and related
macros/functions. Whenever a user is doing a bind() or a sendmsg() attempt
using ZONE_SCOPE we translate this internally to CLUSTER_SCOPE, while we
remain compatible with users and remote nodes still using ZONE_SCOPE.

Furthermore, the non-formalized scope value 0 has always been permitted
for use during lookup, with the same meaning as ZONE_SCOPE/CLUSTER_SCOPE.
We now permit it even as binding scope, but for compatibility reasons we
choose to not change the value of TIPC_CLUSTER_SCOPE.

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>

authored by

Jon Maloy and committed by
David S. Miller
928df188 4f1aec01

+77 -88
+54 -48
include/uapi/linux/tipc.h
··· 61 61 __u32 upper; 62 62 }; 63 63 64 - /* TIPC Address Size, Offset, Mask specification for Z.C.N 65 - */ 66 - #define TIPC_NODE_BITS 12 67 - #define TIPC_CLUSTER_BITS 12 68 - #define TIPC_ZONE_BITS 8 69 - 70 - #define TIPC_NODE_OFFSET 0 71 - #define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS 72 - #define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) 73 - 74 - #define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) 75 - #define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) 76 - #define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) 77 - 78 - #define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) 79 - #define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) 80 - #define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) 81 - 82 - #define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) 83 - 84 - static inline __u32 tipc_addr(unsigned int zone, 85 - unsigned int cluster, 86 - unsigned int node) 87 - { 88 - return (zone << TIPC_ZONE_OFFSET) | 89 - (cluster << TIPC_CLUSTER_OFFSET) | 90 - node; 91 - } 92 - 93 - static inline unsigned int tipc_zone(__u32 addr) 94 - { 95 - return addr >> TIPC_ZONE_OFFSET; 96 - } 97 - 98 - static inline unsigned int tipc_cluster(__u32 addr) 99 - { 100 - return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; 101 - } 102 - 103 - static inline unsigned int tipc_node(__u32 addr) 104 - { 105 - return addr & TIPC_NODE_MASK; 106 - } 107 - 108 64 /* 109 65 * Application-accessible port name types 110 66 */ ··· 73 117 /* 74 118 * Publication scopes when binding port names and port name sequences 75 119 */ 76 - #define TIPC_ZONE_SCOPE 1 77 - #define TIPC_CLUSTER_SCOPE 2 78 - #define TIPC_NODE_SCOPE 3 120 + enum tipc_scope { 121 + TIPC_CLUSTER_SCOPE = 2, /* 0 can also be used */ 122 + TIPC_NODE_SCOPE = 3 123 + }; 79 124 80 125 /* 81 126 * Limiting values for messages ··· 200 243 struct tipc_group_req { 201 244 __u32 type; /* group id */ 202 245 __u32 instance; /* member id */ 203 - __u32 scope; /* zone/cluster/node */ 246 + __u32 scope; /* cluster/node */ 204 247 __u32 flags; 205 248 }; 206 249 ··· 225 268 __u32 bearer_id; 226 269 char linkname[TIPC_MAX_LINK_NAME]; 227 270 }; 271 + 272 + 273 + /* The macros and functions below are deprecated: 274 + */ 275 + 276 + #define TIPC_ZONE_SCOPE 1 277 + 278 + #define TIPC_NODE_BITS 12 279 + #define TIPC_CLUSTER_BITS 12 280 + #define TIPC_ZONE_BITS 8 281 + 282 + #define TIPC_NODE_OFFSET 0 283 + #define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS 284 + #define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) 285 + 286 + #define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) 287 + #define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) 288 + #define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) 289 + 290 + #define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) 291 + #define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) 292 + #define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) 293 + 294 + #define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) 295 + 296 + static inline __u32 tipc_addr(unsigned int zone, 297 + unsigned int cluster, 298 + unsigned int node) 299 + { 300 + return (zone << TIPC_ZONE_OFFSET) | 301 + (cluster << TIPC_CLUSTER_OFFSET) | 302 + node; 303 + } 304 + 305 + static inline unsigned int tipc_zone(__u32 addr) 306 + { 307 + return addr >> TIPC_ZONE_OFFSET; 308 + } 309 + 310 + static inline unsigned int tipc_cluster(__u32 addr) 311 + { 312 + return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; 313 + } 314 + 315 + static inline unsigned int tipc_node(__u32 addr) 316 + { 317 + return addr & TIPC_NODE_MASK; 318 + } 319 + 228 320 #endif
-31
net/tipc/addr.c
··· 64 64 } 65 65 66 66 /** 67 - * addr_domain - convert 2-bit scope value to equivalent message lookup domain 68 - * 69 - * Needed when address of a named message must be looked up a second time 70 - * after a network hop. 71 - */ 72 - u32 addr_domain(struct net *net, u32 sc) 73 - { 74 - struct tipc_net *tn = net_generic(net, tipc_net_id); 75 - 76 - if (likely(sc == TIPC_NODE_SCOPE)) 77 - return tn->own_addr; 78 - if (sc == TIPC_CLUSTER_SCOPE) 79 - return tipc_cluster_mask(tn->own_addr); 80 - return tipc_zone_mask(tn->own_addr); 81 - } 82 - 83 - /** 84 67 * tipc_addr_domain_valid - validates a network domain address 85 68 * 86 69 * Accepts <Z.C.N>, <Z.C.0>, <Z.0.0>, and <0.0.0>, ··· 105 122 if (domain == tipc_zone_mask(addr)) /* domain <Z.0.0> */ 106 123 return 1; 107 124 return 0; 108 - } 109 - 110 - /** 111 - * tipc_addr_scope - convert message lookup domain to a 2-bit scope value 112 - */ 113 - int tipc_addr_scope(u32 domain) 114 - { 115 - if (likely(!domain)) 116 - return TIPC_ZONE_SCOPE; 117 - if (tipc_node(domain)) 118 - return TIPC_NODE_SCOPE; 119 - if (tipc_cluster(domain)) 120 - return TIPC_CLUSTER_SCOPE; 121 - return TIPC_ZONE_SCOPE; 122 125 } 123 126 124 127 char *tipc_addr_string_fill(char *string, u32 addr)
+10
net/tipc/addr.h
··· 60 60 return addr & TIPC_ZONE_CLUSTER_MASK; 61 61 } 62 62 63 + static inline int tipc_node2scope(u32 node) 64 + { 65 + return node ? TIPC_NODE_SCOPE : TIPC_CLUSTER_SCOPE; 66 + } 67 + 68 + static inline int tipc_scope2node(struct net *net, int sc) 69 + { 70 + return sc != TIPC_NODE_SCOPE ? 0 : tipc_own_addr(net); 71 + } 72 + 63 73 u32 tipc_own_addr(struct net *net); 64 74 int in_own_cluster(struct net *net, u32 addr); 65 75 int in_own_cluster_exact(struct net *net, u32 addr);
+1 -1
net/tipc/msg.c
··· 580 580 msg = buf_msg(skb); 581 581 if (msg_reroute_cnt(msg)) 582 582 return false; 583 - dnode = addr_domain(net, msg_lookup_scope(msg)); 583 + dnode = tipc_scope2node(net, msg_lookup_scope(msg)); 584 584 dport = tipc_nametbl_translate(net, msg_nametype(msg), 585 585 msg_nameinst(msg), &dnode); 586 586 if (!dport)
+1 -2
net/tipc/name_table.c
··· 473 473 struct name_seq *seq = nametbl_find_seq(net, type); 474 474 int index = hash(type); 475 475 476 - if ((scope < TIPC_ZONE_SCOPE) || (scope > TIPC_NODE_SCOPE) || 477 - (lower > upper)) { 476 + if (scope > TIPC_NODE_SCOPE || lower > upper) { 478 477 pr_debug("Failed to publish illegal {%u,%u,%u} with scope %u\n", 479 478 type, lower, upper, scope); 480 479 return NULL;
+1 -1
net/tipc/net.c
··· 118 118 tipc_sk_reinit(net); 119 119 120 120 tipc_nametbl_publish(net, TIPC_CFG_SRV, tn->own_addr, tn->own_addr, 121 - TIPC_ZONE_SCOPE, 0, tn->own_addr); 121 + TIPC_CLUSTER_SCOPE, 0, tn->own_addr); 122 122 123 123 pr_info("Started in network mode\n"); 124 124 pr_info("Own node address %s, network identity %u\n",
+10 -5
net/tipc/socket.c
··· 644 644 goto exit; 645 645 } 646 646 647 - res = (addr->scope > 0) ? 647 + res = (addr->scope >= 0) ? 648 648 tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq) : 649 649 tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq); 650 650 exit: ··· 1280 1280 struct tipc_msg *hdr = &tsk->phdr; 1281 1281 struct tipc_name_seq *seq; 1282 1282 struct sk_buff_head pkts; 1283 - u32 type, inst, domain; 1284 1283 u32 dnode, dport; 1284 + u32 type, inst; 1285 1285 int mtu, rc; 1286 1286 1287 1287 if (unlikely(dlen > TIPC_MAX_USER_MSG_SIZE)) ··· 1332 1332 if (dest->addrtype == TIPC_ADDR_NAME) { 1333 1333 type = dest->addr.name.name.type; 1334 1334 inst = dest->addr.name.name.instance; 1335 - domain = dest->addr.name.domain; 1336 - dnode = domain; 1335 + dnode = dest->addr.name.domain; 1337 1336 msg_set_type(hdr, TIPC_NAMED_MSG); 1338 1337 msg_set_hdr_sz(hdr, NAMED_H_SIZE); 1339 1338 msg_set_nametype(hdr, type); 1340 1339 msg_set_nameinst(hdr, inst); 1341 - msg_set_lookup_scope(hdr, tipc_addr_scope(domain)); 1340 + msg_set_lookup_scope(hdr, tipc_node2scope(dnode)); 1342 1341 dport = tipc_nametbl_translate(net, type, inst, &dnode); 1343 1342 msg_set_destnode(hdr, dnode); 1344 1343 msg_set_destport(hdr, dport); ··· 2591 2592 struct publication *publ; 2592 2593 u32 key; 2593 2594 2595 + if (scope != TIPC_NODE_SCOPE) 2596 + scope = TIPC_CLUSTER_SCOPE; 2597 + 2594 2598 if (tipc_sk_connected(sk)) 2595 2599 return -EINVAL; 2596 2600 key = tsk->portid + tsk->pub_count + 1; ··· 2618 2616 struct publication *publ; 2619 2617 struct publication *safe; 2620 2618 int rc = -EINVAL; 2619 + 2620 + if (scope != TIPC_NODE_SCOPE) 2621 + scope = TIPC_CLUSTER_SCOPE; 2621 2622 2622 2623 list_for_each_entry_safe(publ, safe, &tsk->publications, pport_list) { 2623 2624 if (seq) {