tipc: obsolete TIPC_ZONE_SCOPE
authorJon Maloy <jon.maloy@ericsson.com>
Thu, 15 Mar 2018 15:48:51 +0000 (16:48 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 17 Mar 2018 21:11:46 +0000 (17:11 -0400)
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>
include/uapi/linux/tipc.h
net/tipc/addr.c
net/tipc/addr.h
net/tipc/msg.c
net/tipc/name_table.c
net/tipc/net.c
net/tipc/socket.c

index 14bacc7e6cef208b3cf1840022358d4403959a90..4ac9f1f02b06db56551b3824c3587a9b0479445b 100644 (file)
@@ -61,50 +61,6 @@ struct tipc_name_seq {
        __u32 upper;
 };
 
-/* TIPC Address Size, Offset, Mask specification for Z.C.N
- */
-#define TIPC_NODE_BITS          12
-#define TIPC_CLUSTER_BITS       12
-#define TIPC_ZONE_BITS          8
-
-#define TIPC_NODE_OFFSET        0
-#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
-#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
-
-#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
-#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
-#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
-
-#define TIPC_NODE_MASK         (TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
-#define TIPC_CLUSTER_MASK      (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
-#define TIPC_ZONE_MASK         (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
-
-#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
-
-static inline __u32 tipc_addr(unsigned int zone,
-                             unsigned int cluster,
-                             unsigned int node)
-{
-       return (zone << TIPC_ZONE_OFFSET) |
-               (cluster << TIPC_CLUSTER_OFFSET) |
-               node;
-}
-
-static inline unsigned int tipc_zone(__u32 addr)
-{
-       return addr >> TIPC_ZONE_OFFSET;
-}
-
-static inline unsigned int tipc_cluster(__u32 addr)
-{
-       return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
-}
-
-static inline unsigned int tipc_node(__u32 addr)
-{
-       return addr & TIPC_NODE_MASK;
-}
-
 /*
  * Application-accessible port name types
  */
@@ -117,9 +73,10 @@ static inline unsigned int tipc_node(__u32 addr)
 /*
  * Publication scopes when binding port names and port name sequences
  */
-#define TIPC_ZONE_SCOPE         1
-#define TIPC_CLUSTER_SCOPE      2
-#define TIPC_NODE_SCOPE         3
+enum tipc_scope {
+       TIPC_CLUSTER_SCOPE = 2, /* 0 can also be used */
+       TIPC_NODE_SCOPE    = 3
+};
 
 /*
  * Limiting values for messages
@@ -243,7 +200,7 @@ struct sockaddr_tipc {
 struct tipc_group_req {
        __u32 type;      /* group id */
        __u32 instance;  /* member id */
-       __u32 scope;     /* zone/cluster/node */
+       __u32 scope;     /* cluster/node */
        __u32 flags;
 };
 
@@ -268,4 +225,53 @@ struct tipc_sioc_ln_req {
        __u32 bearer_id;
        char linkname[TIPC_MAX_LINK_NAME];
 };
+
+
+/* The macros and functions below are deprecated:
+ */
+
+#define TIPC_ZONE_SCOPE         1
+
+#define TIPC_NODE_BITS          12
+#define TIPC_CLUSTER_BITS       12
+#define TIPC_ZONE_BITS          8
+
+#define TIPC_NODE_OFFSET        0
+#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
+#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
+
+#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
+#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
+#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
+
+#define TIPC_NODE_MASK         (TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
+#define TIPC_CLUSTER_MASK      (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
+#define TIPC_ZONE_MASK         (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
+
+#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
+
+static inline __u32 tipc_addr(unsigned int zone,
+                             unsigned int cluster,
+                             unsigned int node)
+{
+       return (zone << TIPC_ZONE_OFFSET) |
+               (cluster << TIPC_CLUSTER_OFFSET) |
+               node;
+}
+
+static inline unsigned int tipc_zone(__u32 addr)
+{
+       return addr >> TIPC_ZONE_OFFSET;
+}
+
+static inline unsigned int tipc_cluster(__u32 addr)
+{
+       return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
+}
+
+static inline unsigned int tipc_node(__u32 addr)
+{
+       return addr & TIPC_NODE_MASK;
+}
+
 #endif
index 48fd3b5a73fbaf934178c444cbba07aa1a0f5b8c..97cd857d7f434f13fb733c2fbe7746458a42f270 100644 (file)
@@ -63,23 +63,6 @@ int in_own_node(struct net *net, u32 addr)
        return (addr == tn->own_addr) || !addr;
 }
 
-/**
- * addr_domain - convert 2-bit scope value to equivalent message lookup domain
- *
- * Needed when address of a named message must be looked up a second time
- * after a network hop.
- */
-u32 addr_domain(struct net *net, u32 sc)
-{
-       struct tipc_net *tn = net_generic(net, tipc_net_id);
-
-       if (likely(sc == TIPC_NODE_SCOPE))
-               return tn->own_addr;
-       if (sc == TIPC_CLUSTER_SCOPE)
-               return tipc_cluster_mask(tn->own_addr);
-       return tipc_zone_mask(tn->own_addr);
-}
-
 /**
  * tipc_addr_domain_valid - validates a network domain address
  *
@@ -124,20 +107,6 @@ int tipc_in_scope(u32 domain, u32 addr)
        return 0;
 }
 
-/**
- * tipc_addr_scope - convert message lookup domain to a 2-bit scope value
- */
-int tipc_addr_scope(u32 domain)
-{
-       if (likely(!domain))
-               return TIPC_ZONE_SCOPE;
-       if (tipc_node(domain))
-               return TIPC_NODE_SCOPE;
-       if (tipc_cluster(domain))
-               return TIPC_CLUSTER_SCOPE;
-       return TIPC_ZONE_SCOPE;
-}
-
 char *tipc_addr_string_fill(char *string, u32 addr)
 {
        snprintf(string, 16, "<%u.%u.%u>",
index bebb347803ce8d1d1eab6fafae533833512d9ef1..2ecf5a5d40dd592ad65503278d4c55ea24f3ce6d 100644 (file)
@@ -60,6 +60,16 @@ static inline u32 tipc_cluster_mask(u32 addr)
        return addr & TIPC_ZONE_CLUSTER_MASK;
 }
 
+static inline int tipc_node2scope(u32 node)
+{
+       return node ? TIPC_NODE_SCOPE : TIPC_CLUSTER_SCOPE;
+}
+
+static inline int tipc_scope2node(struct net *net, int sc)
+{
+       return sc != TIPC_NODE_SCOPE ? 0 : tipc_own_addr(net);
+}
+
 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);
index 4e1c6f6450bb96d9f3c34f2ba771d740c4f98c98..b6c45dccba3d2e7a3301167a90eecbf36d8ac07b 100644 (file)
@@ -580,7 +580,7 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
        msg = buf_msg(skb);
        if (msg_reroute_cnt(msg))
                return false;
-       dnode = addr_domain(net, msg_lookup_scope(msg));
+       dnode = tipc_scope2node(net, msg_lookup_scope(msg));
        dport = tipc_nametbl_translate(net, msg_nametype(msg),
                                       msg_nameinst(msg), &dnode);
        if (!dport)
index e01c9c691ba2e115d77e906954f8011eed936c36..6772390fcb005372371fe489c89256c234980f21 100644 (file)
@@ -473,8 +473,7 @@ struct publication *tipc_nametbl_insert_publ(struct net *net, u32 type,
        struct name_seq *seq = nametbl_find_seq(net, type);
        int index = hash(type);
 
-       if ((scope < TIPC_ZONE_SCOPE) || (scope > TIPC_NODE_SCOPE) ||
-           (lower > upper)) {
+       if (scope > TIPC_NODE_SCOPE || lower > upper) {
                pr_debug("Failed to publish illegal {%u,%u,%u} with scope %u\n",
                         type, lower, upper, scope);
                return NULL;
index 1a2fde0d6f61398f5552750d782eded94668f56f..5c4c4405b78e284920c3f61211f4c7ab631c3e68 100644 (file)
@@ -118,7 +118,7 @@ int tipc_net_start(struct net *net, u32 addr)
        tipc_sk_reinit(net);
 
        tipc_nametbl_publish(net, TIPC_CFG_SRV, tn->own_addr, tn->own_addr,
-                            TIPC_ZONE_SCOPE, 0, tn->own_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",
index 8b04e601311c4fcb4807e4d1c510f23f3675fe77..910d3827f49932a9f83400a91a63cb979b3808c8 100644 (file)
@@ -644,7 +644,7 @@ static int tipc_bind(struct socket *sock, struct sockaddr *uaddr,
                goto exit;
        }
 
-       res = (addr->scope > 0) ?
+       res = (addr->scope >= 0) ?
                tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq) :
                tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq);
 exit:
@@ -1280,8 +1280,8 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
        struct tipc_msg *hdr = &tsk->phdr;
        struct tipc_name_seq *seq;
        struct sk_buff_head pkts;
-       u32 type, inst, domain;
        u32 dnode, dport;
+       u32 type, inst;
        int mtu, rc;
 
        if (unlikely(dlen > TIPC_MAX_USER_MSG_SIZE))
@@ -1332,13 +1332,12 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
        if (dest->addrtype == TIPC_ADDR_NAME) {
                type = dest->addr.name.name.type;
                inst = dest->addr.name.name.instance;
-               domain = dest->addr.name.domain;
-               dnode = domain;
+               dnode = dest->addr.name.domain;
                msg_set_type(hdr, TIPC_NAMED_MSG);
                msg_set_hdr_sz(hdr, NAMED_H_SIZE);
                msg_set_nametype(hdr, type);
                msg_set_nameinst(hdr, inst);
-               msg_set_lookup_scope(hdr, tipc_addr_scope(domain));
+               msg_set_lookup_scope(hdr, tipc_node2scope(dnode));
                dport = tipc_nametbl_translate(net, type, inst, &dnode);
                msg_set_destnode(hdr, dnode);
                msg_set_destport(hdr, dport);
@@ -2592,6 +2591,9 @@ static int tipc_sk_publish(struct tipc_sock *tsk, uint scope,
        struct publication *publ;
        u32 key;
 
+       if (scope != TIPC_NODE_SCOPE)
+               scope = TIPC_CLUSTER_SCOPE;
+
        if (tipc_sk_connected(sk))
                return -EINVAL;
        key = tsk->portid + tsk->pub_count + 1;
@@ -2617,6 +2619,9 @@ static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
        struct publication *safe;
        int rc = -EINVAL;
 
+       if (scope != TIPC_NODE_SCOPE)
+               scope = TIPC_CLUSTER_SCOPE;
+
        list_for_each_entry_safe(publ, safe, &tsk->publications, pport_list) {
                if (seq) {
                        if (publ->scope != scope)