On Nov 21, 2012, at 8:55 PM, Laine Stump <la...@laine.org> wrote:

> 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
> 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
> ---
> src/libvirt_private.syms |  1 +
> src/util/virsocketaddr.c | 32 +++++++++++++++++++++++++++++++-
> src/util/virsocketaddr.h |  3 ++-
> 3 files changed, 34 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 24d2033..85bff2c 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1776,6 +1776,7 @@ virSocketAddrFormatFull;
> virSocketAddrGetPort;
> virSocketAddrGetRange;
> virSocketAddrIsNetmask;
> +virSocketAddrIsPrivate;
> virSocketAddrMask;
> virSocketAddrMaskByPrefix;
> virSocketAddrParse;
> diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c
> index b6cc16f..2d39458 100644
> --- a/src/util/virsocketaddr.c
> +++ b/src/util/virsocketaddr.c
> @@ -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
>  * modify it under the terms of the GNU Lesser General Public
> @@ -194,6 +194,36 @@ virSocketAddrEqual(const virSocketAddrPtr s1, const 
> virSocketAddrPtr s2)
> }
> 
> /*
> + * 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.
> + *
> + * See RFC1918 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] & 0xFC) == 0xFC;
> +    }
> +    return false;
> +}
> +
> +/*
>  * virSocketAddrFormat:
>  * @addr: an initialized virSocketAddrPtr
>  *
> diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h
> index 51ddd2d..66d4265 100644
> --- a/src/util/virsocketaddr.h
> +++ b/src/util/virsocketaddr.h
> @@ -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
>  * modify it under the terms of the GNU Lesser General Public
> @@ -104,5 +104,6 @@ int virSocketAddrPrefixToNetmask(unsigned int prefix,
>                                  int family);
> bool virSocketAddrEqual(const virSocketAddrPtr s1,
>                         const virSocketAddrPtr s2);
> +bool virSocketAddrIsPrivate(const virSocketAddrPtr addr);
> 
> #endif /* __VIR_SOCKETADDR_H__ */
> -- 
> 1.7.11.7
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

ACK. Looks good.

--
Doug

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to