
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; }