[libvirt] [PATCH] Fix vlan ID detection in udev interface driver

Ján Tomko jtomko at redhat.com
Sun May 4 13:09:59 UTC 2014


On 04/30/2014 06:02 PM, Michal Privoznik wrote:
> My ACK was premature ..
> 
> On 24.04.2014 15:19, Ján Tomko wrote:
>> Instead of guessing it from the interface name, look into
>> /proc/net/vlan/<interface>.
>>
>> This works for devices not named <real_device>.<vlan ID>,
>> avoiding an error flood when virt-manager keeps asking about
>> them every second:
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=966329
>> ---
>>   src/interface/interface_backend_udev.c | 67
>> ++++++++++++++++++++++++++--------
>>   1 file changed, 51 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/interface/interface_backend_udev.c
>> b/src/interface/interface_backend_udev.c
>> index b05ac0e..bec8c45 100644
>> --- a/src/interface/interface_backend_udev.c
>> +++ b/src/interface/interface_backend_udev.c
>> @@ -20,11 +20,13 @@
>>    */
>>   #include <config.h>
>>
>> +#include <ctype.h>
>>   #include <errno.h>
>>   #include <dirent.h>
>>   #include <libudev.h>
>>
>>   #include "virerror.h"
>> +#include "virfile.h"
>>   #include "c-ctype.h"
>>   #include "datatypes.h"
>>   #include "domain_conf.h"
>> @@ -966,31 +968,64 @@ udevGetIfaceDefVlan(struct udev *udev ATTRIBUTE_UNUSED,
>>                       const char *name,
>>                       virInterfaceDef *ifacedef)
>>   {
>> -    const char *vid;
>> +    char *procpath = NULL;
>> +    char *buf = NULL;
>> +    char *vid_pos, *dev_pos;
>> +    size_t vid_len, dev_len;
>> +    const char *vid_prefix = "VID: ";
>> +    const char *dev_prefix = "\nDevice: ";
>> +    int ret = -1;
>> +
>> +    if (virAsprintf(&procpath, "/proc/net/vlan/%s", name) < 0)
>> +        goto cleanup;
>> +
>> +    if (virFileReadAll(procpath, BUFSIZ, &buf) < 0)
>> +        goto cleanup;
>>
>> -    /* Find the DEVICE.VID again */
>> -    vid = strrchr(name, '.');
>> -    if (!vid) {
>> +    if ((vid_pos = strstr(buf, vid_prefix)) == NULL) {
>>           virReportError(VIR_ERR_INTERNAL_ERROR,
>>                          _("failed to find the VID for the VLAN device '%s'"),
>>                          name);
>> -        return -1;
>> +        goto cleanup;
>>       }
>> +    vid_pos += strlen(vid_prefix);
>>
>> -    /* Set the VLAN specifics */
>> -    if (VIR_STRDUP(ifacedef->data.vlan.tag, vid + 1) < 0)
>> -        goto error;
>> -    if (VIR_STRNDUP(ifacedef->data.vlan.devname,
>> -                    name, (vid - name)) < 0)
>> -        goto error;
>> +    if ((vid_len = strspn(vid_pos, "0123456789")) == 0 ||
>> +        !isspace(vid_pos[vid_len])) {
> 
> s/isspace/c_isspace/
> 
> With this change my ACK still stands.
> 

I've changed it to c_isspace and pushed.

Jan


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140504/99fd3a68/attachment-0001.sig>


More information about the libvir-list mailing list