[libvirt] [PATCH 1/3] Utility functions to produce an IPv4 broadcast address
Laine Stump
laine at laine.org
Fri Dec 31 16:35:41 UTC 2010
On 12/31/2010 08:08 AM, Stefan Berger wrote:
> On 12/31/2010 06:33 AM, Laine Stump wrote:
>> These functions work only for IPv4, becasue IPv6 doesn't have the same
>> concept of "broadcast address" as IPv4. They merely OR the inverse of
>> the netmask with the given host address, thus turning on all the host
>> bits.
>> ---
>> src/libvirt_private.syms | 2 +
>> src/util/network.c | 55
>> ++++++++++++++++++++++++++++++++++++++++++++++
>> src/util/network.h | 6 +++++
>> 3 files changed, 63 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index a959ad9..19e581c 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -558,6 +558,8 @@ virShrinkN;
>>
>>
>> # network.h
>> +virSocketAddrBroadcast;
>> +virSocketAddrBroadcastByPrefix;
>> virSocketAddrIsNetmask;
>> virSocketAddrMask;
>> virSocketAddrMaskByPrefix;
>> diff --git a/src/util/network.c b/src/util/network.c
>> index 61044fc..f58986e 100644
>> --- a/src/util/network.c
>> +++ b/src/util/network.c
>> @@ -341,6 +341,61 @@ virSocketAddrMaskByPrefix(virSocketAddrPtr addr,
>> unsigned int prefix)
>> }
>>
>> /**
>> + * virSocketAddrBroadcast:
>> + * @addr: address that needs to be turned into broadcast address
>> (IPv4 only)
>> + * @netmask: the netmask address
>> + * @broadcast: virSocketAddr to recieve the broadcast address
>> + *
>> + * Mask ON the host bits of @addr according to @netmask, turning it
>> + * into a broadcast address.
>> + *
>> + * Returns 0 in case of success, or -1 on error.
>> + */
>> +int
>> +virSocketAddrBroadcast(const virSocketAddrPtr addr,
>> + const virSocketAddrPtr netmask,
>> + virSocketAddrPtr broadcast)
>> +{
>> + if ((addr->data.stor.ss_family != AF_INET) ||
>> + (netmask->data.stor.ss_family != AF_INET)) {
>> + broadcast->data.stor.ss_family = AF_UNSPEC;
>> + return -1;
>> + }
>> +
>> + broadcast->data.stor.ss_family = AF_INET;
>> + broadcast->len = addr->len;
>> + broadcast->data.inet4.sin_addr.s_addr
>> + = (addr->data.inet4.sin_addr.s_addr
>> + | ~netmask->data.inet4.sin_addr.s_addr);
>> + return 0;
>> +}
>> +
>> +/**
>> + * virSocketAddrBroadcastByPrefix:
>> + * @addr: address that needs to be turned into broadcast address
>> (IPv4 only)
>> + * @prefix: prefix (# of 1 bits) of netmask to apply
>> + * @broadcast: virSocketAddr to recieve the broadcast address
>> + *
>> + * Mask off the host bits of @addr according to @prefix, turning it
>> + * into a network address.
>> + *
>> + * Returns 0 in case of success, or -1 on error.
>> + */
>> +int
>> +virSocketAddrBroadcastByPrefix(const virSocketAddrPtr addr,
>> + unsigned int prefix,
>> + virSocketAddrPtr broadcast)
>> +{
>> + virSocketAddr netmask;
>> +
>> + if (virSocketAddrPrefixToNetmask(prefix,&netmask,
>> + addr->data.stor.ss_family)< 0)
>> + return -1;
>> +
>> + return virSocketAddrBroadcast(addr,&netmask, broadcast);
>> +}
>> +
>> +/**
>> * virSocketCheckNetmask:
>> * @addr1: a first network address
>> * @addr2: a second network address
>> diff --git a/src/util/network.h b/src/util/network.h
>> index 2fcee43..bcbc607 100644
>> --- a/src/util/network.h
>> +++ b/src/util/network.h
>> @@ -77,6 +77,12 @@ int virSocketAddrMask (virSocketAddrPtr addr,
>> const virSocketAddrPtr netmask);
>> int virSocketAddrMaskByPrefix(virSocketAddrPtr addr,
>> unsigned int prefix);
>> +int virSocketAddrBroadcast(const virSocketAddrPtr addr,
>> + const virSocketAddrPtr netmask,
>> + virSocketAddrPtr broadcast);
>> +int virSocketAddrBroadcastByPrefix(const virSocketAddrPtr addr,
>> + unsigned int prefix,
>> + virSocketAddrPtr broadcast);
>>
>> int virSocketGetNumNetmaskBits(const virSocketAddrPtr netmask);
>> int virSocketAddrPrefixToNetmask(unsigned int prefix,
> ACK.
Thanks, Stefan. Pushed.
More information about the libvir-list
mailing list