On 02/24/2013 09:36 PM, Doug Goldstein wrote:
The bridge device was showing the vnet devices created for the
domains
as connected to the bridge. libvirt should only show host devices when
trying to get the interface definition rather than the domain devices as
well.
---
Honestly this method sucks. But it makes the code path work and doesn't
result in brokenness. I was really thinking of sscanf() but I don't really
care to store the values. Suggestions?
This is of course still inexact, since 1) it is possible/acceptable for
someone to name their tap devices something else, and 2) other pieces of
software may also be creating transient devices that could be connected
to a bridge. In the end, this is just one of the symptoms of using
"current live status" to make an approximation of what is really
supposed to be "persistent configuration". I've always been a bit
lukewarm on the idea (as you know :-).
I don't really have any better idea for this (other than directly
reading the configuration off of disk, in which case you should be
writing a netcf backend rather than a libvirt interface driver backend),
and this apparently makes the situation better than it was before, so
ACK to this patch.
---
src/interface/interface_backend_udev.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/interface/interface_backend_udev.c
b/src/interface/interface_backend_udev.c
index bd83545..dca85b3 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -24,7 +24,9 @@
#include <libudev.h>
#include "virerror.h"
+#include "c-ctype.h"
#include "datatypes.h"
+#include "domain_conf.h"
#include "interface_driver.h"
#include "interface_conf.h"
#include "viralloc.h"
@@ -527,6 +529,16 @@ udevIfaceBridgeScanDirFilter(const struct dirent *entry)
if (STREQ(entry->d_name, ".") || STREQ(entry->d_name,
".."))
return 0;
+ /* Omit the domain interfaces from the list of bridge attached
+ * devices. All we can do is check for the device name matching
+ * vnet%d. Improvements to this check are welcome.
+ */
+ if (strlen(entry->d_name) >= 5) {
+ if (STRPREFIX(entry->d_name, VIR_NET_GENERATED_PREFIX) &&
+ c_isdigit(entry->d_name[4]))
+ return 0;
+ }
+
return 1;
}