mirror of
https://github.com/ceph/ceph
synced 2025-03-21 09:48:37 +00:00
common/pick_address: check if address in subnet all public address
When mon trying to check if osd joining within subnet address, it will check only the first subnet and not the rest of the subnets. this fix will loop over all the other subnet for checks. Fixes: https://tracker.ceph.com/issues/65186 Signed-off-by: Nitzan Mordechai <nmordec@redhat.com>
This commit is contained in:
parent
107e1624f2
commit
3e2ef5ec2b
@ -644,15 +644,24 @@ bool is_addr_in_subnet(
|
||||
{
|
||||
const auto nets = get_str_list(networks);
|
||||
ceph_assert(!nets.empty());
|
||||
const auto &net = nets.front();
|
||||
struct ifaddrs ifa;
|
||||
|
||||
unsigned ipv = CEPH_PICK_ADDRESS_IPV4;
|
||||
struct sockaddr_in public_addr;
|
||||
|
||||
ifa.ifa_next = nullptr;
|
||||
ifa.ifa_addr = (struct sockaddr*)&public_addr;
|
||||
public_addr.sin_family = AF_INET;
|
||||
inet_pton(AF_INET, addr.c_str(), &public_addr.sin_addr);
|
||||
|
||||
return matches_with_net(cct, ifa, net, ipv);
|
||||
if(inet_pton(AF_INET, addr.c_str(), &public_addr.sin_addr) != 1) {
|
||||
lderr(cct) << "unable to convert chosen address to string: " << addr << dendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const auto &net : nets) {
|
||||
struct ifaddrs ifa;
|
||||
memset(&ifa, 0, sizeof(ifa));
|
||||
ifa.ifa_next = nullptr;
|
||||
ifa.ifa_addr = (struct sockaddr*)&public_addr;
|
||||
if(matches_with_net(cct, ifa, net, ipv)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user