Index: libvirt-1.2.9/configure.ac =================================================================== --- libvirt-1.2.9.orig/configure.ac +++ libvirt-1.2.9/configure.ac @@ -237,6 +237,7 @@ LIBVIRT_CHECK_FUSE LIBVIRT_CHECK_GLUSTER LIBVIRT_CHECK_HAL LIBVIRT_CHECK_NETCF +LIBVIRT_CHECK_NETCONTROL LIBVIRT_CHECK_NUMACTL LIBVIRT_CHECK_OPENWSMAN LIBVIRT_CHECK_PCIACCESS @@ -2456,11 +2457,12 @@ if test "$with_libvirtd" = "no" ; then with_interface=no fi -dnl The interface driver depends on the netcf library or udev library -case $with_interface:$with_netcf:$with_udev in +dnl The interface driver depends on the netcf library, netcontrol library, or +dnl udev library +case $with_interface:$with_netcf:$with_netcontrol:$with_udev in check:*yes*) with_interface=yes ;; check:no:no) with_interface=no ;; - yes:no:no) AC_MSG_ERROR([Requested the Interface driver without netcf or udev support]) ;; + yes:no:no) AC_MSG_ERROR([Requested the Interface driver without netcf, netcontrol, or udev support]) ;; esac if test "$with_interface" = "yes" ; then @@ -2882,6 +2884,7 @@ LIBVIRT_RESULT_FUSE LIBVIRT_RESULT_GLUSTER LIBVIRT_RESULT_HAL LIBVIRT_RESULT_NETCF +LIBVIRT_RESULT_NETCONTROL LIBVIRT_RESULT_NUMACTL LIBVIRT_RESULT_OPENWSMAN LIBVIRT_RESULT_PCIACCESS Index: libvirt-1.2.9/src/Makefile.am =================================================================== --- libvirt-1.2.9.orig/src/Makefile.am +++ libvirt-1.2.9/src/Makefile.am @@ -826,6 +826,10 @@ if WITH_NETCF INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_netcf.c endif WITH_NETCF +if WITH_NETCONTROL +INTERFACE_DRIVER_SOURCES += \ + interface/interface_backend_netcf.c +endif if WITH_UDEV INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_udev.c @@ -1465,10 +1469,15 @@ if WITH_NETCF libvirt_driver_interface_la_CFLAGS += $(NETCF_CFLAGS) libvirt_driver_interface_la_LIBADD += $(NETCF_LIBS) else ! WITH_NETCF +if WITH_NETCONTROL +libvirt_driver_interface_la_CFLAGS += $(NETCONTROL_CFLAGS) +libvirt_driver_interface_la_LIBADD += $(NETCONTROL_LIBS) +else ! WITH_NETCONTROL if WITH_UDEV libvirt_driver_interface_la_CFLAGS += $(UDEV_CFLAGS) libvirt_driver_interface_la_LIBADD += $(UDEV_LIBS) endif WITH_UDEV +endif ! WITH_NETCONTROL endif ! WITH_NETCF if WITH_DRIVER_MODULES libvirt_driver_interface_la_LIBADD += ../gnulib/lib/libgnu.la Index: libvirt-1.2.9/tools/virsh.c =================================================================== --- libvirt-1.2.9.orig/tools/virsh.c +++ libvirt-1.2.9/tools/virsh.c @@ -3340,6 +3340,8 @@ vshShowVersion(vshControl *ctl ATTRIBUTE vshPrint(ctl, " Interface"); # if defined(WITH_NETCF) vshPrint(ctl, " netcf"); +# elif defined(WITH_NETCONTROL) + vshPrint(ctl, " netcontrol"); # elif defined(WITH_UDEV) vshPrint(ctl, " udev"); # endif Index: libvirt-1.2.9/src/interface/interface_backend_netcf.c =================================================================== --- libvirt-1.2.9.orig/src/interface/interface_backend_netcf.c +++ libvirt-1.2.9/src/interface/interface_backend_netcf.c @@ -23,7 +23,12 @@ #include -#include +#ifdef WITH_NETCONTROL +# include +# include +#else +# include +#endif #include "virerror.h" #include "datatypes.h" @@ -65,6 +70,37 @@ VIR_ONCE_GLOBAL_INIT(virNetcfDriverState static virNetcfDriverStatePtr driverState = NULL; +#ifdef WITH_NETCONTROL +static void +interface_nc_log_driver(const char *category, + int priority, + const char *func, + const char *file, + long long line, + const char *msg, + size_t len ATTRIBUTE_UNUSED) +{ + int vp; + + switch(priority) { + case NC_LOG_FATAL: + case NC_LOG_ERROR: + vp = VIR_LOG_ERROR; + break; + case NC_LOG_WARN: + vp = VIR_LOG_WARN; + break; + case NC_LOG_INFO: + vp = VIR_LOG_INFO; + break; + case NC_LOG_DEBUG: + default: + vp = VIR_LOG_DEBUG; + break; + } + virLogMessage(&virLogSelf, vp, file, line, func, 0, "%s", msg); +} +#endif static void virNetcfDriverStateDispose(void *obj) @@ -87,7 +123,22 @@ netcfStateInitialize(bool privileged ATT if (!(driverState = virObjectLockableNew(virNetcfDriverStateClass))) return -1; +#ifdef WITH_NETCONTROL + nc_logger_redirect_to(interface_nc_log_driver); + /* open netcf */ + /* Note: On SUSE, ncf_init will fail if Network Manager is enabled. Ignore + * the failure so libvirtd will still start. Connections to the driver will + * fail in netcfInterfaceOpen. This restores the behavior before + * commit 822fe136. + */ + if (ncf_init(&driverState->netcf, NULL) != 0) { + VIR_WARN("Failed to initialize netcontrol. Continuing with network " + "interface management features disabled"); + virObjectUnref(driverState); + driverState = NULL; + } +#else if (ncf_init(&driverState->netcf, NULL) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to initialize netcf")); @@ -95,6 +146,7 @@ netcfStateInitialize(bool privileged ATT driverState = NULL; return -1; } +#endif return 0; } Index: libvirt-1.2.9/src/interface/interface_driver.c =================================================================== --- libvirt-1.2.9.orig/src/interface/interface_driver.c +++ libvirt-1.2.9/src/interface/interface_driver.c @@ -30,8 +30,15 @@ interfaceRegister(void) if (netcfIfaceRegister() == 0) return 0; #endif /* WITH_NETCF */ +#ifdef WITH_NETCONTROL + /* Attempt to load the netcontrol based backend, which is a slightly + patched netcf backend */ + if (netcfIfaceRegister() == 0) + return 0; +#endif /* WITH_NETCONTROL */ #if WITH_UDEV - /* If there's no netcf or it failed to load, register the udev backend */ + /* If there's no netcf or netcontrol, or it failed to load, register the + udev backend */ if (udevIfaceRegister() == 0) return 0; #endif /* WITH_UDEV */ Index: libvirt-1.2.9/m4/virt-netcontrol.m4 =================================================================== --- /dev/null +++ libvirt-1.2.9/m4/virt-netcontrol.m4 @@ -0,0 +1,35 @@ +dnl The libnetcontrol library +dnl +dnl Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl . +dnl + +AC_DEFUN([LIBVIRT_CHECK_NETCONTROL],[ + LIBVIRT_CHECK_PKG([NETCONTROL], [netcontrol], [0.2.0]) + + if test "$with_netcontrol" = "yes" ; then + old_CFLAGS="$CFLAGS" + old_LIBS="$CFLAGS" + CFLAGS="$CFLAGS $NETCONTROL_CFLAGS" + LIBS="$LIBS $NETCONTROL_LIBS" + CFLAGS="$old_CFLAGS" + LIBS="$old_LIBS" + fi +]) + +AC_DEFUN([LIBVIRT_RESULT_NETCONTROL],[ + LIBVIRT_RESULT_LIB([NETCONTROL]) +])