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;
}
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,
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;
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;
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) {
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)
{
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;