From: Sage Weil Date: Tue, 6 Nov 2018 23:21:21 +0000 (-0600) Subject: msg/msg_types: allow parsing of IPs without assuming v1 vs v2 X-Git-Tag: v14.1.0~484^2~81 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bdfbd857e2aa5930dd633e4706ee4ab4b2ccc582;p=ceph.git msg/msg_types: allow parsing of IPs without assuming v1 vs v2 Signed-off-by: Sage Weil --- diff --git a/src/common/ceph_argparse.cc b/src/common/ceph_argparse.cc index b20fc6c32265..13d2cfc1ed62 100644 --- a/src/common/ceph_argparse.cc +++ b/src/common/ceph_argparse.cc @@ -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& vec) +bool parse_ip_port_vec(const char *s, vector& 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; } diff --git a/src/common/ceph_argparse.h b/src/common/ceph_argparse.h index 465b8452e354..af2955168450 100644 --- a/src/common/ceph_argparse.h +++ b/src/common/ceph_argparse.h @@ -48,7 +48,8 @@ extern void argv_to_vec(int argc, const char **argv, extern void vec_to_argv(const char *argv0, std::vector& args, int *argc, const char ***argv); -extern bool parse_ip_port_vec(const char *s, std::vector& vec); +extern bool parse_ip_port_vec(const char *s, std::vector& vec, + int type=0); bool ceph_argparse_double_dash(std::vector &args, std::vector::iterator &i); bool ceph_argparse_flag(std::vector &args, diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index d7e26b3f88b9..8343bbadd9ee 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -62,13 +62,13 @@ void entity_inst_t::generate_test_instances(list& 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; diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 349692536efd..7198c287e325 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -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) { diff --git a/src/test/test_ipaddr.cc b/src/test/test_ipaddr.cc index 1bac1817bd44..09838804ffd9 100644 --- a/src/test/test_ipaddr.cc +++ b/src/test/test_ipaddr.cc @@ -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;