Index: libvirt-1.0.1/configure.ac =================================================================== --- libvirt-1.0.1.orig/configure.ac +++ libvirt-1.0.1/configure.ac @@ -102,6 +102,7 @@ AVAHI_REQUIRED="0.6.0" POLKIT_REQUIRED="0.6" PARTED_REQUIRED="1.8.0" NETCF_REQUIRED="0.1.4" +NETCONTROL_REQUIRED="0.2.0" UDEV_REQUIRED=145 PCIACCESS_REQUIRED=0.10.0 XMLRPC_REQUIRED=1.14.0 @@ -2005,6 +2006,38 @@ AM_CONDITIONAL([WITH_NETCF], [test "$wit AC_SUBST([NETCF_CFLAGS]) AC_SUBST([NETCF_LIBS]) +AC_ARG_WITH([netcontrol], + AC_HELP_STRING([--with-netcontrol], [SUSE netcontrol support to configure physical host network interfaces @<:@default=check@:>@]), + [], + [test "$with_netcontrol" = "yes" && with_netcontrol=no || with_netcontrol=check]) + +NETCONTROL_CFLAGS= +NETCONTROL_LIBS= +if test "$with_netcf" = "yes"; then + if test "$with_netcontrol" = "yes" || test "$with_netcontrol" = "check"; then + AC_MSG_WARN([netcf and netcontrol cannot be used together, disabling netcontrol]) + with_netcontrol=no + fi +fi + +if test "$with_netcontrol" = "yes" || test "$with_netcontrol" = "check"; then + PKG_CHECK_MODULES(NETCONTROL, netcontrol >= $NETCONTROL_REQUIRED, + [with_netcontrol=yes], [ + if test "$with_netcontrol" = "check" ; then + with_netcontrol=no + else + AC_MSG_ERROR( + [You must install netcontrol >= $NETCONTROL_REQUIRED to compile libvirt]) + fi + ]) + if test "$with_netcontrol" = "yes" ; then + AC_DEFINE_UNQUOTED([WITH_NETCONTROL], 1, + [whether libnetcontrol is available to configure physical host network interfaces]) + fi +fi +AM_CONDITIONAL([WITH_NETCONTROL], [test "$with_netcontrol" = "yes"]) +AC_SUBST([NETCONTROL_CFLAGS]) +AC_SUBST([NETCONTROL_LIBS]) AC_ARG_WITH([secrets], AC_HELP_STRING([--with-secrets], [with local secrets management driver @<:@default=yes@:>@]),[],[with_secrets=yes]) @@ -2863,11 +2896,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 @@ -3253,6 +3287,11 @@ AC_MSG_NOTICE([ netcf: $NETCF_CFLAGS $ else AC_MSG_NOTICE([ netcf: no]) fi +if test "$with_netcontrol" = "yes" ; then +AC_MSG_NOTICE([ netctrl: $NETCONTROL_CFLAGS $NETCONTROL_LIBS]) +else +AC_MSG_NOTICE([ netctrl: no]) +fi if test "$with_qemu" = "yes" && test "$LIBPCAP_FOUND" != "no"; then AC_MSG_NOTICE([ pcap: $LIBPCAP_CFLAGS $LIBPCAP_LIBS]) else Index: libvirt-1.0.1/src/Makefile.am =================================================================== --- libvirt-1.0.1.orig/src/Makefile.am +++ libvirt-1.0.1/src/Makefile.am @@ -617,6 +617,10 @@ if WITH_NETCF INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_netcf.c endif +if WITH_NETCONTROL +INTERFACE_DRIVER_SOURCES += \ + interface/interface_backend_netcf.c +endif if HAVE_UDEV INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_udev.c @@ -1105,11 +1109,16 @@ if WITH_NETCF libvirt_driver_interface_la_CFLAGS += $(NETCF_CFLAGS) libvirt_driver_interface_la_LIBADD += $(NETCF_LIBS) else +if WITH_NETCONTROL +libvirt_driver_interface_la_CFLAGS += $(NETCONTROL_CFLAGS) +libvirt_driver_interface_la_LIBADD += $(NETCONTROL_LIBS) +else if HAVE_UDEV libvirt_driver_interface_la_CFLAGS += $(UDEV_CFLAGS) libvirt_driver_interface_la_LIBADD += $(UDEV_LIBS) endif endif +endif if WITH_DRIVER_MODULES libvirt_driver_interface_la_LIBADD += ../gnulib/lib/libgnu.la libvirt_driver_interface_la_LDFLAGS += -module -avoid-version Index: libvirt-1.0.1/tools/virsh.c =================================================================== --- libvirt-1.0.1.orig/tools/virsh.c +++ libvirt-1.0.1/tools/virsh.c @@ -2730,6 +2730,8 @@ vshShowVersion(vshControl *ctl ATTRIBUTE vshPrint(ctl, " netcf"); # elif defined(HAVE_UDEV) vshPrint(ctl, " udev"); +# elif defined(WITH_NETCONTROL) + vshPrint(ctl, " netcontrol"); # endif #endif #ifdef WITH_NWFILTER Index: libvirt-1.0.1/src/interface/interface_backend_netcf.c =================================================================== --- libvirt-1.0.1.orig/src/interface/interface_backend_netcf.c +++ libvirt-1.0.1/src/interface/interface_backend_netcf.c @@ -23,7 +23,12 @@ #include -#include +#ifdef WITH_NETCONTROL +# include +# include +#else +# include +#endif #include "virterror_internal.h" #include "datatypes.h" @@ -52,6 +57,37 @@ static void interfaceDriverUnlock(struct virMutexUnlock(&driver->lock); } +#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(VIR_LOG_FROM_FILE, vp, file, line, func, 0, "%s", msg); +} +#endif + static int netcf_to_vir_err(int netcf_errcode) { switch (netcf_errcode) @@ -137,6 +173,10 @@ static virDrvOpenStatus interfaceOpenInt goto mutex_error; } +#ifdef WITH_NETCONTROL + nc_logger_redirect_to(interface_nc_log_driver); +#endif + /* open netcf */ if (ncf_init(&driverState->netcf, NULL) != 0) { Index: libvirt-1.0.1/src/interface/interface_driver.c =================================================================== --- libvirt-1.0.1.orig/src/interface/interface_driver.c +++ libvirt-1.0.1/src/interface/interface_driver.c @@ -28,8 +28,14 @@ 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 HAVE_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 /* HAVE_UDEV */