In order to make a client-only build successful on RHEL4, commit
3ed2e54 modified src/util/virnetdev.c so that the functional version
of virNetDevGetVLanID() was only compiled if GET_VLAN_VID_CMD was
defined. However, it is *never* defined, but is only an enum value, so
the proper version was no longer compiled even on platforms that
support it. This resulted in the vlan tag not being properly set for
guest traffic on VEPA mode guest macvtap interfaces that were bound to
a vlan interface (that's the only place that libvirt currently uses
virNetDevGetVLanID)
Since there is no way to compile conditionally based on the presence
of an enum value, this patch modifies configure.ac to check for said
enum value with AC_TRY_COMPILE(), and #defines HAVE_GET_VLAN_VID_CMD
if it's successful compiling a test program that uses
GET_VLAN_VID_CMD. We can then make the compilation of
virNetDevGetVLanID() conditional on that #define instead.
---
configure.ac | 10 ++++++++++
src/util/virnetdev.c | 4 ++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 7ecbee9..fcd0170 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2470,6 +2470,16 @@ if test "$with_virtualport" != "no"; then
fi
AM_CONDITIONAL([WITH_VIRTUALPORT], [test "$with_virtualport" =
"yes"])
+AC_MSG_CHECKING([for GET_VLAN_VID_CMD in /usr/linux/if_vlan.h])
+AC_TRY_COMPILE([ #include <linux/if_vlan.h> ],
+ [ int x = GET_VLAN_VID_CMD; ],
+ [ have_get_vlan_vid_cmd=yes ],
+ [ have_get_vlan_vid_cmd=no ])
+if test "$have_get_vlan_vid_cmd" = "yes"; then
+ AC_DEFINE_UNQUOTED([HAVE_GET_VLAN_VID_CMD], 1,
+ [whether the kernel SIOCGIFVLAN ioctl supports GET_VLAN_VID_CMD])
+fi
+AC_MSG_RESULT([$have_get_vlan_vid_cmd])
dnl netlink library
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index e74fc5f..72f52c7 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2013 Red Hat, Inc.
+ * Copyright (C) 2007-2014 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -732,7 +732,7 @@ int virNetDevGetIndex(const char *ifname ATTRIBUTE_UNUSED,
#endif /* ! SIOCGIFINDEX */
-#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) &&
defined(GET_VLAN_VID_CMD)
+#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) &&
defined(HAVE_GET_VLAN_VID_CMD)
int virNetDevGetVLanID(const char *ifname, int *vlanid)
{
struct vlan_ioctl_args vlanargs = {
--
1.8.5.3