]>
git.proxmox.com Git - ceph.git/blob - ceph/src/msg/msg_types.cc
1a78cb32680986285d882b15d3d92742eab622e7
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
11 #include "common/Formatter.h"
13 bool entity_name_t::parse(std::string_view s
)
15 const char* start
= s
.data();
16 if (s
.find("mon.") == 0) {
19 } else if (s
.find("osd.") == 0) {
22 } else if (s
.find("mds.") == 0) {
25 } else if (s
.find("client.") == 0) {
28 } else if (s
.find("mgr.") == 0) {
37 _num
= strtoll(start
, &end
, 10);
38 if (end
== nullptr || end
== start
) {
41 return end
== s
.data() + s
.size();
45 void entity_name_t::dump(ceph::Formatter
*f
) const
47 f
->dump_string("type", type_str());
48 f
->dump_unsigned("num", num());
51 void entity_addr_t::dump(ceph::Formatter
*f
) const
53 f
->dump_string("type", get_type_name(type
));
54 f
->dump_stream("addr") << get_sockaddr();
55 f
->dump_unsigned("nonce", nonce
);
58 void entity_inst_t::dump(ceph::Formatter
*f
) const
60 f
->dump_object("name", name
);
61 f
->dump_object("addr", addr
);
64 void entity_name_t::generate_test_instances(std::list
<entity_name_t
*>& o
)
66 o
.push_back(new entity_name_t(entity_name_t::MON()));
67 o
.push_back(new entity_name_t(entity_name_t::MON(1)));
68 o
.push_back(new entity_name_t(entity_name_t::OSD(1)));
69 o
.push_back(new entity_name_t(entity_name_t::CLIENT(1)));
72 void entity_addr_t::generate_test_instances(std::list
<entity_addr_t
*>& o
)
74 o
.push_back(new entity_addr_t());
75 entity_addr_t
*a
= new entity_addr_t();
78 entity_addr_t
*b
= new entity_addr_t();
79 b
->set_type(entity_addr_t::TYPE_LEGACY
);
81 b
->set_family(AF_INET
);
82 b
->set_in4_quad(0, 127);
83 b
->set_in4_quad(1, 0);
84 b
->set_in4_quad(2, 1);
85 b
->set_in4_quad(3, 2);
90 void entity_inst_t::generate_test_instances(std::list
<entity_inst_t
*>& o
)
92 o
.push_back(new entity_inst_t());
95 entity_inst_t
*a
= new entity_inst_t(name
, addr
);
99 bool entity_addr_t::parse(const std::string_view s
, int default_type
)
101 const char* start
= s
.data();
102 const char* end
= nullptr;
103 bool got
= parse(start
, &end
, default_type
);
104 return got
&& end
== start
+ s
.size();
107 bool entity_addr_t::parse(const char *s
, const char **end
, int default_type
)
109 *this = entity_addr_t();
111 const char *start
= s
;
116 int newtype
= default_type
;
117 if (strncmp("v1:", s
, 3) == 0) {
119 newtype
= TYPE_LEGACY
;
120 } else if (strncmp("v2:", s
, 3) == 0) {
122 newtype
= TYPE_MSGR2
;
123 } else if (strncmp("any:", s
, 4) == 0) {
126 } else if (*s
== '-') {
134 bool brackets
= false;
140 // inet_pton() requires a null terminated input, so let's fill two
141 // buffers, one with ipv4 allowed characters, and one with ipv6, and
142 // then see which parses.
145 const char *p
= start
;
146 while (o
< buf4
+ sizeof(buf4
) &&
147 *p
&& ((*p
== '.') ||
148 (*p
>= '0' && *p
<= '9'))) {
153 char buf6
[64]; // actually 39 + null is sufficient.
156 while (o
< buf6
+ sizeof(buf6
) &&
157 *p
&& ((*p
== ':') ||
158 (*p
>= '0' && *p
<= '9') ||
159 (*p
>= 'a' && *p
<= 'f') ||
160 (*p
>= 'A' && *p
<= 'F'))) {
164 //cout << "buf4 is '" << buf4 << "', buf6 is '" << buf6 << "'" << std::endl;
169 if (inet_pton(AF_INET
, buf4
, &a4
)) {
170 u
.sin
.sin_addr
.s_addr
= a4
.s_addr
;
171 u
.sa
.sa_family
= AF_INET
;
172 p
= start
+ strlen(buf4
);
173 } else if (inet_pton(AF_INET6
, buf6
, &a6
)) {
174 u
.sa
.sa_family
= AF_INET6
;
175 memcpy(&u
.sin6
.sin6_addr
, &a6
, sizeof(a6
));
176 p
= start
+ strlen(buf6
);
187 //cout << "p is " << *p << std::endl;
189 // parse a port, too!
192 if (port
> MAX_PORT_NUMBER
) {
196 while (*p
&& *p
>= '0' && *p
<= '9')
205 while (*p
&& *p
>= '0' && *p
<= '9')
214 //cout << *this << std::endl;
218 std::ostream
& operator<<(std::ostream
& out
, const entity_addr_t
&addr
)
220 if (addr
.type
== entity_addr_t::TYPE_NONE
) {
223 if (addr
.type
!= entity_addr_t::TYPE_ANY
) {
224 out
<< entity_addr_t::get_type_name(addr
.type
) << ":";
226 out
<< addr
.get_sockaddr() << '/' << addr
.nonce
;
230 std::ostream
& operator<<(std::ostream
& out
, const sockaddr
*psa
)
232 char buf
[NI_MAXHOST
] = { 0 };
234 switch (psa
->sa_family
) {
237 const sockaddr_in
*sa
= (const sockaddr_in
*)psa
;
238 inet_ntop(AF_INET
, &sa
->sin_addr
, buf
, NI_MAXHOST
);
239 return out
<< buf
<< ':'
240 << ntohs(sa
->sin_port
);
244 const sockaddr_in6
*sa
= (const sockaddr_in6
*)psa
;
245 inet_ntop(AF_INET6
, &sa
->sin6_addr
, buf
, NI_MAXHOST
);
246 return out
<< '[' << buf
<< "]:"
247 << ntohs(sa
->sin6_port
);
250 return out
<< "(unrecognized address family " << psa
->sa_family
<< ")";
254 std::ostream
& operator<<(std::ostream
& out
, const sockaddr_storage
&ss
)
256 return out
<< (const sockaddr
*)&ss
;
262 bool entity_addrvec_t::parse(const char *s
, const char **end
)
264 const char *orig_s
= s
;
265 const char *static_end
;
272 bool brackets
= false;
274 // weirdness: make sure this isn't an IPV6 addr!
277 if (!a
.parse(s
, &p
) || !a
.is_ipv6()) {
285 bool r
= a
.parse(s
, end
);
317 void entity_addrvec_t::encode(ceph::buffer::list
& bl
, uint64_t features
) const
320 if ((features
& CEPH_FEATURE_MSG_ADDR2
) == 0) {
321 // encode a single legacy entity_addr_t for unfeatured peers
322 encode(legacy_addr(), bl
, 0);
326 encode(v
, bl
, features
);
329 void entity_addrvec_t::decode(ceph::buffer::list::const_iterator
& bl
)
337 addr
.decode_legacy_addr_after_marker(bl
);
345 decode(addr
.type
, bl
);
346 decode(addr
.nonce
, bl
);
350 struct sockaddr
*sa
= (struct sockaddr
*)addr
.get_sockaddr();
351 #if defined(__FreeBSD__) || defined(__APPLE__)
355 if (elen
< sizeof(ss_family
)) {
356 throw ceph::buffer::malformed_input("elen smaller than family len");
358 decode(ss_family
, bl
);
359 sa
->sa_family
= ss_family
;
360 elen
-= sizeof(ss_family
);
361 if (elen
> addr
.get_sockaddr_len() - sizeof(sa
->sa_family
)) {
362 throw ceph::buffer::malformed_input("elen exceeds sockaddr len");
364 bl
.copy(elen
, sa
->sa_data
);
372 throw ceph::buffer::malformed_input("entity_addrvec_marker > 2");
376 void entity_addrvec_t::dump(ceph::Formatter
*f
) const
378 f
->open_array_section("addrvec");
379 for (auto p
= v
.begin(); p
!= v
.end(); ++p
) {
380 f
->dump_object("addr", *p
);
385 void entity_addrvec_t::generate_test_instances(std::list
<entity_addrvec_t
*>& ls
)
387 ls
.push_back(new entity_addrvec_t());
388 ls
.push_back(new entity_addrvec_t());
389 ls
.back()->v
.push_back(entity_addr_t());
390 ls
.push_back(new entity_addrvec_t());
391 ls
.back()->v
.push_back(entity_addr_t());
392 ls
.back()->v
.push_back(entity_addr_t());
395 std::string
entity_addr_t::ip_only_to_str() const
397 const char *host_ip
= NULL
;
398 char addr_buf
[INET6_ADDRSTRLEN
];
399 switch (get_family()) {
401 host_ip
= inet_ntop(AF_INET
, &in4_addr().sin_addr
,
402 addr_buf
, INET_ADDRSTRLEN
);
405 host_ip
= inet_ntop(AF_INET6
, &in6_addr().sin6_addr
,
406 addr_buf
, INET6_ADDRSTRLEN
);
411 return host_ip
? host_ip
: "";
414 std::string
entity_addr_t::ip_n_port_to_str() const
417 addr
+= ip_only_to_str();
419 addr
= '[' + addr
+ ']';
422 addr
+= std::to_string(get_port());