libceph: use TYPE_LEGACY for entity addrs instead of TYPE_NONE
authorJeff Layton <jlayton@kernel.org>
Mon, 17 Jun 2019 10:57:25 +0000 (06:57 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Jul 2019 12:01:43 +0000 (14:01 +0200)
Going forward, we'll have different address types so let's use
the addr2 TYPE_LEGACY for internal tracking rather than TYPE_NONE.

Also, make ceph_pr_addr print the address type value as well.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
include/linux/ceph/decode.h
net/ceph/decode.c
net/ceph/messenger.c

index 1c0a665bfc03d1177f11c4daef8dcbfbeca028ed..ce488d95be8950a6ec37b065c138e58272f4926d 100644 (file)
@@ -218,16 +218,23 @@ static inline void ceph_encode_timespec64(struct ceph_timespec *tv,
 /*
  * sockaddr_storage <-> ceph_sockaddr
  */
+#define CEPH_ENTITY_ADDR_TYPE_NONE     0
+#define CEPH_ENTITY_ADDR_TYPE_LEGACY   __cpu_to_le32(1)
+
 static inline void ceph_encode_addr(struct ceph_entity_addr *a)
 {
        __be16 ss_family = htons(a->in_addr.ss_family);
        a->in_addr.ss_family = *(__u16 *)&ss_family;
+
+       /* Banner addresses require TYPE_NONE */
+       a->type = CEPH_ENTITY_ADDR_TYPE_NONE;
 }
 static inline void ceph_decode_addr(struct ceph_entity_addr *a)
 {
        __be16 ss_family = *(__be16 *)&a->in_addr.ss_family;
        a->in_addr.ss_family = ntohs(ss_family);
        WARN_ON(a->in_addr.ss_family == 512);
+       a->type = CEPH_ENTITY_ADDR_TYPE_LEGACY;
 }
 
 extern int ceph_decode_entity_addr(void **p, void *end,
index b82981199549393203367058671c5cd23a828742..eea529595a7a1128e774262b114d9f5491a10f49 100644 (file)
@@ -21,17 +21,6 @@ ceph_decode_entity_addr_versioned(void **p, void *end,
 
        ceph_decode_copy_safe(p, end, &addr->type, sizeof(addr->type), bad);
 
-       /*
-        * TYPE_NONE == 0
-        * TYPE_LEGACY == 1
-        *
-        * Clients that don't support ADDR2 always send TYPE_NONE.
-        * For now, since all we support is msgr1, just set this to 0
-        * when we get a TYPE_LEGACY type.
-        */
-       if (addr->type == cpu_to_le32(1))
-               addr->type = 0;
-
        ceph_decode_copy_safe(p, end, &addr->nonce, sizeof(addr->nonce), bad);
 
        ceph_decode_32_safe(p, end, addr_len, bad);
@@ -61,7 +50,12 @@ ceph_decode_entity_addr_legacy(void **p, void *end,
 
        /* Skip rest of type field */
        ceph_decode_skip_n(p, end, 3, bad);
-       addr->type = 0;
+
+       /*
+        * Clients that don't support ADDR2 always send TYPE_NONE, change it
+        * to TYPE_LEGACY for forward compatibility.
+        */
+       addr->type = CEPH_ENTITY_ADDR_TYPE_LEGACY;
        ceph_decode_copy_safe(p, end, &addr->nonce, sizeof(addr->nonce), bad);
        memset(&addr->in_addr, 0, sizeof(addr->in_addr));
        ceph_decode_copy_safe(p, end, &addr->in_addr,
index 8d0c51dd46666202c68850704bb5db42319e2d5d..0a3ef33cf7ac2a62debd9f42d0680e01d9ad57f4 100644 (file)
@@ -199,12 +199,14 @@ const char *ceph_pr_addr(const struct ceph_entity_addr *addr)
 
        switch (ss.ss_family) {
        case AF_INET:
-               snprintf(s, MAX_ADDR_STR_LEN, "%pI4:%hu", &in4->sin_addr,
+               snprintf(s, MAX_ADDR_STR_LEN, "(%d)%pI4:%hu",
+                        le32_to_cpu(addr->type), &in4->sin_addr,
                         ntohs(in4->sin_port));
                break;
 
        case AF_INET6:
-               snprintf(s, MAX_ADDR_STR_LEN, "[%pI6c]:%hu", &in6->sin6_addr,
+               snprintf(s, MAX_ADDR_STR_LEN, "(%d)[%pI6c]:%hu",
+                        le32_to_cpu(addr->type), &in6->sin6_addr,
                         ntohs(in6->sin6_port));
                break;
 
@@ -1982,6 +1984,7 @@ int ceph_parse_ips(const char *c, const char *end,
                }
 
                addr_set_port(&addr[i], port);
+               addr[i].type = CEPH_ENTITY_ADDR_TYPE_LEGACY;
 
                dout("parse_ips got %s\n", ceph_pr_addr(&addr[i]));