]> xenbits.xensource.com Git - libvirt.git/commitdiff
Utility functions to produce an IPv4 broadcast address
authorLaine Stump <laine@laine.org>
Fri, 31 Dec 2010 02:33:24 +0000 (21:33 -0500)
committerLaine Stump <laine@laine.org>
Fri, 31 Dec 2010 16:34:12 +0000 (11:34 -0500)
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
src/util/network.c
src/util/network.h

index a959ad92ed2ffc19a8662c84c814250fc0efda6a..19e581c65354bbda7f69169b4eb1104fb35bb112 100644 (file)
@@ -558,6 +558,8 @@ virShrinkN;
 
 
 # network.h
+virSocketAddrBroadcast;
+virSocketAddrBroadcastByPrefix;
 virSocketAddrIsNetmask;
 virSocketAddrMask;
 virSocketAddrMaskByPrefix;
index 61044fc19dacaed305308163c83219c539837bfd..f58986e0e56364db738951a867cbb95cc964a48c 100644 (file)
@@ -340,6 +340,61 @@ virSocketAddrMaskByPrefix(virSocketAddrPtr addr, unsigned int prefix)
     return virSocketAddrMask(addr, &netmask);
 }
 
+/**
+ * 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
index 2fcee434d2d86d9837b01c107fc4cb9c316cb488..bcbc6076ae6b8fe78739c47dd13b961c06502ce9 100644 (file)
@@ -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,