]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types: allow parsing of IPs without assuming v1 vs v2
authorSage Weil <sage@redhat.com>
Tue, 6 Nov 2018 23:21:21 +0000 (17:21 -0600)
committerSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 21:31:32 +0000 (15:31 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/ceph_argparse.cc
src/common/ceph_argparse.h
src/msg/msg_types.cc
src/msg/msg_types.h
src/test/test_ipaddr.cc

index b20fc6c32265363e47c9821cd08048241a72c7a5..13d2cfc1ed620dc15fa4ff46042f556e6944f5bd 100644 (file)
@@ -201,14 +201,14 @@ void ceph_arg_value_type(const char * nextargstr, bool *bool_option, bool *bool_
   return;
 }
 
-bool parse_ip_port_vec(const char *s, vector<entity_addr_t>& vec)
+bool parse_ip_port_vec(const char *s, vector<entity_addr_t>& vec, int type)
 {
   const char *p = s;
   const char *end = p + strlen(p);
   while (p < end) {
     entity_addr_t a;
     //cout << " parse at '" << p << "'" << std::endl;
-    if (!a.parse(p, &p)) {
+    if (!a.parse(p, &p, type)) {
       //dout(0) << " failed to parse address '" << p << "'" << dendl;
       return false;
     }
index 465b8452e3548e0b470f65d16ce9d60d8c75e288..af2955168450c1c1a8fde9fd8e56843ad812a569 100644 (file)
@@ -48,7 +48,8 @@ extern void argv_to_vec(int argc, const char **argv,
 extern void vec_to_argv(const char *argv0, std::vector<const char*>& args,
                        int *argc, const char ***argv);
 
-extern bool parse_ip_port_vec(const char *s, std::vector<entity_addr_t>& vec);
+extern bool parse_ip_port_vec(const char *s, std::vector<entity_addr_t>& vec,
+                             int type=0);
 bool ceph_argparse_double_dash(std::vector<const char*> &args,
        std::vector<const char*>::iterator &i);
 bool ceph_argparse_flag(std::vector<const char*> &args,
index d7e26b3f88b9550d2e70e29680b7f9fa8735f2fa..8343bbadd9ee34b6af9368b6b029ac35ca1c06d9 100644 (file)
@@ -62,13 +62,13 @@ void entity_inst_t::generate_test_instances(list<entity_inst_t*>& o)
   o.push_back(a);
 }
 
-bool entity_addr_t::parse(const char *s, const char **end)
+bool entity_addr_t::parse(const char *s, const char **end, int default_type)
 {
   *this = entity_addr_t();
 
   const char *start = s;
 
-  int newtype = TYPE_DEFAULT;
+  int newtype;
   if (strncmp("v1:", s, 3) == 0) {
     start += 3;
     newtype = TYPE_LEGACY;
@@ -76,10 +76,13 @@ bool entity_addr_t::parse(const char *s, const char **end)
     start += 3;
     newtype = TYPE_MSGR2;
   } else if (*s == '-') {
+    newtype = TYPE_NONE;
     if (end) {
       *end = s + 1;
     }
     return true;
+  } else {
+    newtype = default_type ? default_type : TYPE_DEFAULT;
   }
 
   bool brackets = false;
index 349692536efd8786671e502f7bab1dfbf67dc9a8..7198c287e3259aa06a7800853da925e18cc9c4f2 100644 (file)
@@ -232,6 +232,7 @@ struct entity_addr_t {
     TYPE_NONE = 0,
     TYPE_LEGACY = 1,  ///< legacy msgr1 protocol (ceph jewel and older)
     TYPE_MSGR2 = 2,   ///< msgr2 protocol (new in ceph kraken)
+    TYPE_V1ORV2 = 3,  ///< ambiguous
   } type_t;
   static const type_t TYPE_DEFAULT = TYPE_MSGR2;
   static const char *get_type_name(int t) {
@@ -414,7 +415,7 @@ struct entity_addr_t {
 
   std::string ip_only_to_str() const;
 
-  bool parse(const char *s, const char **end = 0);
+  bool parse(const char *s, const char **end = 0, int type=0);
 
   void decode_legacy_addr_after_marker(bufferlist::const_iterator& bl)
   {
index 1bac1817bd443f9c5088afcd733cd567db8f36b6..09838804ffd97f606589428e0acc9ee8c8160404 100644 (file)
@@ -542,6 +542,24 @@ TEST(CommonIPAddr, ParseNetwork_IPv6_9000)
   ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
 }
 
+TEST(CommonIPAddr, ambiguous)
+{
+  entity_addr_t a;
+  bool ok;
+
+  ok = a.parse("1.2.3.4", nullptr, entity_addr_t::TYPE_V1ORV2);
+  ASSERT_TRUE(ok);
+  ASSERT_EQ(entity_addr_t::TYPE_V1ORV2, a.get_type());
+
+  ok = a.parse("v1:1.2.3.4", nullptr, entity_addr_t::TYPE_V1ORV2);
+  ASSERT_TRUE(ok);
+  ASSERT_EQ(entity_addr_t::TYPE_LEGACY, a.get_type());
+
+  ok = a.parse("v2:1.2.3.4", nullptr, entity_addr_t::TYPE_V1ORV2);
+  ASSERT_TRUE(ok);
+  ASSERT_EQ(entity_addr_t::TYPE_MSGR2, a.get_type());
+}
+
 TEST(CommonIPAddr, network_contains)
 {
   entity_addr_t network, addr;