configure.ac+Makefile.am:
support libnl-3 as well as libnl-1
src/util/virnetlink.c:
support libnl3 api. To minimize impact on code flow with #ifdefs as
requested by Stefan Berger, do some #defines at the top.
Unfortunately libnl3 moves netlink/msg.h to
/usr/include/libnl3/netlink/msg.h, so the LIBNL_CFLAGS need to be added
to a bunch of places where they weren't needed with libnl1.
Stefan,
in this version I may have gone too far :) if you prefer I just
stick to using 'struct nl_socket nlhandle' and leave the rest
with explicit #ifdefs, let me know. But this version leaves the
original code flow unencumbered by ifdefs and easier to read and
vet.
Signed-off-by: Serge Hallyn <serge.hallyn(a)canonical.com>
---
configure.ac | 24 +++++++++++++++++-------
daemon/Makefile.am | 5 ++++-
src/Makefile.am | 25 +++++++++++++++++--------
src/util/virnetlink.c | 22 ++++++++++++++++------
4 files changed, 54 insertions(+), 22 deletions(-)
diff --git a/configure.ac b/configure.ac
index a819898..ab40e1d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2626,19 +2626,29 @@ AM_CONDITIONAL([WITH_VIRTUALPORT], [test
"$with_virtualport" = "yes"])
dnl netlink library
+LIBNL_ROUTE3_CFLAGS=""
+LIBNL_ROUTE3_LIBS=""
LIBNL_CFLAGS=""
LIBNL_LIBS=""
have_libnl=no
if test "$with_linux" = "yes"; then
- PKG_CHECK_MODULES([LIBNL], [libnl-1 >= $LIBNL_REQUIRED], [
+ PKG_CHECK_MODULES([LIBNL],[libnl-3.0],[
have_libnl=yes
- AC_DEFINE_UNQUOTED([HAVE_LIBNL], 1, [whether the netlink library is available])
- ], [
- if test "$with_macvtap" = "yes"; then
- AC_MSG_ERROR([libnl-devel >= $LIBNL_REQUIRED is required for macvtap
support])
- fi
- ])
+ AC_DEFINE([HAVE_LIBNL3], [1], [Use libnl-3.0])
+ AC_DEFINE([HAVE_LIBNL], [1], [whether the netlink library is available])
+ PKG_CHECK_MODULES([LIBNL_ROUTE3],[libnl-route-3.0])
+ ],
+ PKG_CHECK_MODULES([LIBNL], [libnl-1 >= $LIBNL_REQUIRED], [
+ have_libnl=yes
+ AC_DEFINE_UNQUOTED([HAVE_LIBNL], 1, [whether the netlink library is
available])
+ AC_DEFINE_UNQUOTED([HAVE_LIBNL1], 1, [whether the netlink v1 library is
available])
+ ], [
+ if test "$with_macvtap" = "yes"; then
+ AC_MSG_ERROR([libnl-devel >= $LIBNL_REQUIRED is required for macvtap
support])
+ fi
+ ])
+ )
fi
AM_CONDITIONAL([HAVE_LIBNL], [test "$have_libnl" = "yes"])
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 24cce8f..8074803 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -95,6 +95,7 @@ libvirtd_SOURCES = $(DAEMON_SOURCES)
libvirtd_CFLAGS = \
$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \
$(XDR_CFLAGS) $(POLKIT_CFLAGS) $(DBUS_CFLAGS) \
+ $(LIBNL_CFLAGS) $(LIBNL_ROUTE3_CFLAGS) \
$(WARN_CFLAGS) \
$(COVERAGE_CFLAGS) \
-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\"" \
@@ -109,7 +110,9 @@ libvirtd_LDADD = \
$(GNUTLS_LIBS) \
$(SASL_LIBS) \
$(DBUS_LIBS) \
- $(POLKIT_LIBS)
+ $(POLKIT_LIBS) \
+ $(LIBNL_LIBS) \
+ $(LIBNL_ROUTE3_LIBS)
if WITH_DTRACE_PROBES
libvirtd_LDADD += ../src/probes.o
diff --git a/src/Makefile.am b/src/Makefile.am
index e48dfa5..c159c1e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -576,10 +576,10 @@ libvirt_util_la_SOURCES = \
$(UTIL_SOURCES)
libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \
$(AM_CFLAGS) $(AUDIT_CFLAGS) $(DEVMAPPER_CFLAGS) \
- $(DBUS_CFLAGS)
+ $(DBUS_CFLAGS) $(LIBNL_ROUTE3_CFLAGS)
libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \
$(THREAD_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \
- $(RT_LIBS) $(DBUS_LIBS)
+ $(RT_LIBS) $(DBUS_LIBS) $(LIBNL_ROUTE3_LIBS)
noinst_LTLIBRARIES += libvirt_conf.la
@@ -809,12 +809,16 @@ endif
libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS) \
$(GNUTLS_CFLAGS) \
$(LIBXML_CFLAGS) \
+ $(LIBNL_CFLAGS) \
+ $(LIBNL_ROUTE3_CFLAGS) \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
libvirt_driver_qemu_la_LDFLAGS = $(AM_LDFLAGS)
libvirt_driver_qemu_la_LIBADD = $(NUMACTL_LIBS) \
$(CAPNG_LIBS) \
$(GNUTLS_LIBS) \
- $(LIBXML_LIBS)
+ $(LIBXML_LIBS) \
+ $(LIBNL_LIBS) \
+ $(LIBNL_ROUTE3_LIBS)
if WITH_DRIVER_MODULES
libvirt_driver_qemu_la_LIBADD += ../gnulib/lib/libgnu.la
libvirt_driver_qemu_la_LDFLAGS += -module -avoid-version
@@ -840,8 +844,9 @@ noinst_LTLIBRARIES += libvirt_driver_lxc.la
#libvirt_la_BUILT_LIBADD += libvirt_driver_lxc.la
endif
libvirt_driver_lxc_la_CFLAGS = \
+ $(LIBNL_CFLAGS) $(LIBNL_ROUTE3_CFLAGS) \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
-libvirt_driver_lxc_la_LIBADD = $(CAPNG_LIBS)
+libvirt_driver_lxc_la_LIBADD = $(CAPNG_LIBS) $(LIBNL_LIBS) $(LIBNL_ROUTE3_LIBS)
if WITH_SECDRIVER_SELINUX
libvirt_driver_lxc_la_LIBADD += $(SELINUX_LIBS)
endif
@@ -941,9 +946,10 @@ noinst_LTLIBRARIES += libvirt_driver_network.la
#libvirt_la_BUILT_LIBADD += libvirt_driver_network.la
endif
libvirt_driver_network_la_CFLAGS = \
+ $(LIBNL_CFLAGS) $(LIBNL_ROUTE3_CFLAGS) \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
if WITH_DRIVER_MODULES
-libvirt_driver_network_la_LIBADD = ../gnulib/lib/libgnu.la
+libvirt_driver_network_la_LIBADD = ../gnulib/lib/libgnu.la $(LIBNL_LIBS)
$(LIBNL_ROUTE3_LIBS)
libvirt_driver_network_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
endif
libvirt_driver_network_la_SOURCES = $(NETWORK_DRIVER_SOURCES)
@@ -1086,9 +1092,10 @@ libvirt_la_BUILT_LIBADD += libvirt_driver_nwfilter.la
noinst_LTLIBRARIES += libvirt_driver_nwfilter.la
endif
libvirt_driver_nwfilter_la_CFLAGS = $(LIBPCAP_CFLAGS) \
- -I$(top_srcdir)/src/conf $(AM_CFLAGS)
+ -I$(top_srcdir)/src/conf $(LIBNL_CFLAGS) \
+ $(LIBNL_ROUTE3_CFLAGS) $(AM_CFLAGS)
libvirt_driver_nwfilter_la_LDFLAGS = $(LD_AMFLAGS)
-libvirt_driver_nwfilter_la_LIBADD = $(LIBPCAP_LIBS)
+libvirt_driver_nwfilter_la_LIBADD = $(LIBPCAP_LIBS) $(LIBNL_LIBS) $(LIBNL_ROUTE3_LIBS)
if WITH_DRIVER_MODULES
libvirt_driver_nwfilter_la_LIBADD += ../gnulib/lib/libgnu.la
libvirt_driver_nwfilter_la_LDFLAGS += -module -avoid-version
@@ -1522,7 +1529,7 @@ libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(AM_LDFLAGS)
libvirt_lxc_LDADD = $(CAPNG_LIBS) $(YAJL_LIBS) \
$(LIBXML_LIBS) $(NUMACTL_LIBS) $(THREAD_LIBS) \
$(LIBNL_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \
- $(RT_LIBS) $(DBUS_LIBS) \
+ $(RT_LIBS) $(DBUS_LIBS) $(LIBNL_ROUTE3_LIBS) \
../gnulib/lib/libgnu.la
if WITH_DTRACE_PROBES
libvirt_lxc_LDADD += probes.o
@@ -1540,6 +1547,8 @@ libvirt_lxc_CFLAGS = \
$(YAJL_CFLAGS) \
$(AUDIT_CFLAGS) \
$(DBUS_CFLAGS) \
+ $(LIBNL_CFLAGS) \
+ $(LIBNL_ROUTE3_CFLAGS) \
-I$(top_srcdir)/src/conf \
$(AM_CFLAGS)
if HAVE_LIBBLKID
diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c
index b2e9d51..596a917 100644
--- a/src/util/virnetlink.c
+++ b/src/util/virnetlink.c
@@ -60,6 +60,16 @@ struct virNetlinkEventHandle {
int deleted;
};
+#ifdef HAVE_LIBNL1
+#define nl_alloc nl_handle_alloc
+#define nl_free nl_handle_destroy
+typedef struct nl_handle nlhandle_t;
+#else
+#define nl_alloc nl_socket_alloc
+#define nl_free nl_socket_free
+typedef struct nl_sock nlhandle_t;
+#endif
+
typedef struct _virNetlinkEventSrvPrivate virNetlinkEventSrvPrivate;
typedef virNetlinkEventSrvPrivate *virNetlinkEventSrvPrivatePtr;
struct _virNetlinkEventSrvPrivate {
@@ -67,7 +77,7 @@ struct _virNetlinkEventSrvPrivate {
virMutex lock;
int eventwatch;
int netlinkfd;
- struct nl_handle *netlinknh;
+ nlhandle_t *netlinknh;
/*Events*/
int handled;
size_t handlesCount;
@@ -121,7 +131,7 @@ int virNetlinkCommand(struct nl_msg *nl_msg,
int fd;
int n;
struct nlmsghdr *nlmsg = nlmsg_hdr(nl_msg);
- struct nl_handle *nlhandle = nl_handle_alloc();
+ nlhandle_t *nlhandle = nl_alloc();
if (!nlhandle) {
virReportSystemError(errno,
@@ -178,7 +188,7 @@ error:
*respbuflen = 0;
}
- nl_handle_destroy(nlhandle);
+ nl_free(nlhandle);
return rc;
}
@@ -285,7 +295,7 @@ virNetlinkEventServiceStop(void)
virNetlinkEventServerLock(srv);
nl_close(srv->netlinknh);
- nl_handle_destroy(srv->netlinknh);
+ nl_free(srv->netlinknh);
virEventRemoveHandle(srv->eventwatch);
/* free any remaining clients on the list */
@@ -346,7 +356,7 @@ virNetlinkEventServiceStart(void)
virNetlinkEventServerLock(srv);
/* Allocate a new socket and get fd */
- srv->netlinknh = nl_handle_alloc();
+ srv->netlinknh = nl_alloc();
if (!srv->netlinknh) {
virReportSystemError(errno,
@@ -392,7 +402,7 @@ virNetlinkEventServiceStart(void)
error_server:
if (ret < 0) {
nl_close(srv->netlinknh);
- nl_handle_destroy(srv->netlinknh);
+ nl_free(srv->netlinknh);
}
error_locked:
virNetlinkEventServerUnlock(srv);
--
1.7.9.5