mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-30 17:45:23 +00:00
util: new virSocketAddrIsPrivate function
This new function returns true if the given address is in the range of any "private" or "local" networks as defined in RFC1918 (IPv4) or RFC3484/RFC4193 (IPv6), otherwise they return false. These ranges are: 192.168.0.0/16 172.16.0.0/16 10.0.0.0/24 FC00::/7 FEC0::/10
This commit is contained in:
parent
c1bbfabd04
commit
337efad95e
@ -1738,6 +1738,7 @@ virSocketAddrFormatFull;
|
|||||||
virSocketAddrGetPort;
|
virSocketAddrGetPort;
|
||||||
virSocketAddrGetRange;
|
virSocketAddrGetRange;
|
||||||
virSocketAddrIsNetmask;
|
virSocketAddrIsNetmask;
|
||||||
|
virSocketAddrIsPrivate;
|
||||||
virSocketAddrMask;
|
virSocketAddrMask;
|
||||||
virSocketAddrMaskByPrefix;
|
virSocketAddrMaskByPrefix;
|
||||||
virSocketAddrParse;
|
virSocketAddrParse;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2009-2011 Red Hat, Inc.
|
* Copyright (C) 2009-2012 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -193,6 +193,39 @@ virSocketAddrEqual(const virSocketAddrPtr s1, const virSocketAddrPtr s2)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* virSocketAddrIsPrivate:
|
||||||
|
* @s: the location of the IP address
|
||||||
|
*
|
||||||
|
* Return true if this address is in its family's defined
|
||||||
|
* "private/local" address space. For IPv4, private addresses are in
|
||||||
|
* the range of 192.168.0.0/16, 172.16.0.0/16, or 10.0.0.0/8. For
|
||||||
|
* IPv6, local addresses are in the range of FC00::/7 or FEC0::/10
|
||||||
|
* (that last one is deprecated, but still in use).
|
||||||
|
*
|
||||||
|
* See RFC1918, RFC3484, and RFC4193 for details.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
virSocketAddrIsPrivate(const virSocketAddrPtr addr)
|
||||||
|
{
|
||||||
|
unsigned long val;
|
||||||
|
|
||||||
|
switch (addr->data.stor.ss_family) {
|
||||||
|
case AF_INET:
|
||||||
|
val = ntohl(addr->data.inet4.sin_addr.s_addr);
|
||||||
|
|
||||||
|
return ((val & 0xFFFF0000) == ((192L << 24) + (168 << 16)) ||
|
||||||
|
(val & 0xFFFF0000) == ((172L << 24) + (16 << 16)) ||
|
||||||
|
(val & 0xFF000000) == ((10L << 24)));
|
||||||
|
|
||||||
|
case AF_INET6:
|
||||||
|
return ((addr->data.inet6.sin6_addr.s6_addr[0] & 0xFE) == 0xFC ||
|
||||||
|
((addr->data.inet6.sin6_addr.s6_addr[0] & 0xFF) == 0xFE &&
|
||||||
|
(addr->data.inet6.sin6_addr.s6_addr[1] & 0xC0) == 0xC0));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virSocketAddrFormat:
|
* virSocketAddrFormat:
|
||||||
* @addr: an initialized virSocketAddrPtr
|
* @addr: an initialized virSocketAddrPtr
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2009-2011 Red Hat, Inc.
|
* Copyright (C) 2009-2012 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -104,5 +104,6 @@ int virSocketAddrPrefixToNetmask(unsigned int prefix,
|
|||||||
int family);
|
int family);
|
||||||
bool virSocketAddrEqual(const virSocketAddrPtr s1,
|
bool virSocketAddrEqual(const virSocketAddrPtr s1,
|
||||||
const virSocketAddrPtr s2);
|
const virSocketAddrPtr s2);
|
||||||
|
bool virSocketAddrIsPrivate(const virSocketAddrPtr addr);
|
||||||
|
|
||||||
#endif /* __VIR_SOCKETADDR_H__ */
|
#endif /* __VIR_SOCKETADDR_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user