[libvirt] [PATCH v2] BSD: implement virNetDev(Set|Clear)IPv4Address

Roman Bogorodskiy bogorodskiy at gmail.com
Tue Jun 25 12:44:58 UTC 2013


Provide an implementation of virNetDev(Set|Clear)IPv4Address based on
BSD ifconfig tool in addition to 'ip' from Linux iproute2 package.
---
 configure.ac         | 15 +++++++++++++++
 src/util/virnetdev.c | 26 ++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/configure.ac b/configure.ac
index ef246a6..15618dc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -386,6 +386,10 @@ if test "$prefix" = "/usr" && test "$sysconfdir" = '${prefix}/etc' ; then
     sysconfdir='/etc'
 fi
 
+dnl Specify if we rely on ifconfig instead of iproute2 (e.g. in case
+dnl we're working on BSD)
+want_ifconfig=no
+
 dnl Make some notes about which OS we're compiling for, as the lxc and qemu
 dnl drivers require linux headers, and storage_mpath, dtrace, and nwfilter
 dnl are also linux specific.  The "network" and storage_fs drivers are known
@@ -408,6 +412,8 @@ if test $with_linux = no; then
 fi
 
 if test $with_freebsd = yes; then
+   want_ifconfig=yes
+
    with_firewalld=no
 fi
 
@@ -2410,6 +2416,15 @@ AC_CHECK_DECLS([BRDGSFD, BRDGADD, BRDGDEL],
                 #include <net/if_bridgevar.h>
                ])
 
+# Check if we need to look for ifconfig
+if test "$want_ifconfig" = "yes"; then
+     AC_PATH_PROG([IFCONFIG_PATH], [ifconfig])
+     if test -z "$IFCONFIG_PATH"; then
+         AC_MSG_ERROR([Failed to find ifconfig.])
+     fi
+     AC_DEFINE_UNQUOTED([IFCONFIG_PATH], "$IFCONFIG_PATH", [path to ifconfig binary])
+fi
+
 # Detect when running under the clang static analyzer's scan-build driver
 # or Coverity-prevent's cov-build.  Define STATIC_ANALYSIS accordingly.
 AC_CACHE_CHECK([whether this build is done by a static analysis tool],
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index ebe20d0..4d53ac3 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -816,12 +816,26 @@ int virNetDevSetIPv4Address(const char *ifname,
          !(bcaststr = virSocketAddrFormat(&broadcast)))) {
         goto cleanup;
     }
+#ifdef IFCONFIG_PATH
+    cmd = virCommandNew(IFCONFIG_PATH);
+    virCommandAddArg(cmd, ifname);
+    if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET)) {
+        virCommandAddArg(cmd, "inet");
+    } else if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET6)) {
+        virCommandAddArg(cmd, "inet6");
+    }
+    virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
+    if (bcaststr)
+        virCommandAddArgList(cmd, "broadcast", bcaststr, NULL);
+    virCommandAddArg(cmd, "alias");
+#else
     cmd = virCommandNew(IP_PATH);
     virCommandAddArgList(cmd, "addr", "add", NULL);
     virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
     if (bcaststr)
         virCommandAddArgList(cmd, "broadcast", bcaststr, NULL);
     virCommandAddArgList(cmd, "dev", ifname, NULL);
+#endif
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
@@ -901,10 +915,22 @@ int virNetDevClearIPv4Address(const char *ifname,
 
     if (!(addrstr = virSocketAddrFormat(addr)))
         goto cleanup;
+#ifdef IFCONFIG_PATH
+    cmd = virCommandNew(IFCONFIG_PATH);
+    virCommandAddArg(cmd, ifname);
+    if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET)) {
+        virCommandAddArg(cmd, "inet");
+    } else if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET6)) {
+        virCommandAddArg(cmd, "inet6");
+    }
+    virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
+    virCommandAddArg(cmd, "-alias");
+#else
     cmd = virCommandNew(IP_PATH);
     virCommandAddArgList(cmd, "addr", "del", NULL);
     virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
     virCommandAddArgList(cmd, "dev", ifname, NULL);
+#endif
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
-- 
1.7.11.5




More information about the libvir-list mailing list