[libvirt] [PATCH 07/10] libxl: prevent attaching multiple netdevs with the same MAC
Marek Marczykowski-Górecki
marmarek at invisiblethingslab.com
Fri Feb 20 01:51:00 UTC 2015
On Thu, Feb 19, 2015 at 06:13:01PM -0700, Jim Fehlig wrote:
> Marek Marczykowski-Górecki wrote:
> > On Thu, Feb 19, 2015 at 03:58:30PM -0700, Jim Fehlig wrote:
> >
> >> Marek Marczykowski-Górecki wrote:
> >>
> >>> On Thu, Feb 19, 2015 at 03:10:13PM -0700, Jim Fehlig wrote:
> >>>
> >>>> Jim Fehlig wrote:
> >>>>
> >>>>> Marek Marczykowski-Górecki wrote:
> >>>>>
> >>>>>> On Thu, Feb 19, 2015 at 01:58:02PM -0700, Jim Fehlig wrote:
> >>>>>>
> >>>>>>> Marek Marczykowski-Górecki wrote:
> >>>>>>>
> >>>>>>>> On Thu, Feb 19, 2015 at 11:43:15AM -0700, Jim Fehlig wrote:
> >>>>>>>>
> >>>>>>>>> Marek Marczykowski-Górecki wrote:
> >>>>>>>>>
> >>>>>>>>>> It will not be possible to detach such device later. Also improve
> >>>>>>>>>> logging in such cases.
> >>>>>>>>>>
> >>>>>>>>>> Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
> >>>>>>>>>> ---
> >>>>>>>>>> src/libxl/libxl_driver.c | 41 +++++++++++++++++++++++++++++++++++++++--
> >>>>>>>>>> 1 file changed, 39 insertions(+), 2 deletions(-)
> >>>>>>>>>>
> >>>>>>>>>> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> >>>>>>>>>> index ce3a99b..005cc96 100644
> >>>>>>>>>> --- a/src/libxl/libxl_driver.c
> >>>>>>>>>> +++ b/src/libxl/libxl_driver.c
> >>>>>>>>>> @@ -2787,6 +2787,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
> >>>>>>>>>> int actualType;
> >>>>>>>>>> libxl_device_nic nic;
> >>>>>>>>>> int ret = -1;
> >>>>>>>>>> + char mac[VIR_MAC_STRING_BUFLEN];
> >>>>>>>>>>
> >>>>>>>>>> /* preallocate new slot for device */
> >>>>>>>>>> if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
> >>>>>>>>>> @@ -2801,6 +2802,14 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
> >>>>>>>>>>
> >>>>>>>>>> actualType = virDomainNetGetActualType(net);
> >>>>>>>>>>
> >>>>>>>>>> + /* -2 means "multiple matches" so then fail also */
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>> No longer true after commit 2fbae1b2. I think you just want to check if
> >>>>>>>>> virDomainNetFindIdx() >= 0, meaning the def already contains a net
> >>>>>>>>> device with the same mac address.
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>> But here the error is when the device *is* found, so the opposite case
> >>>>>>>> than already reported as an error by virDomainNetFindIdx.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>> If you find an idx >= 0, then the domain def already contains a net
> >>>>>>> device with the same mac address, right? In that case, you report an
> >>>>>>> error and return failure from libxlDomainAttachNetDevice().
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> Right, but if I do not find one (idx == -1), I will proceed with
> >>>>>> (possibly successful) adding the device, while the error was already
> >>>>>> reported by virDomainNetFindIdx.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>> Ah, right :-/.
> >>>>>
> >>>>> Another option: introduce virDomainHasNet() to detect if the domain def
> >>>>> already contains the net device.
> >>>>>
> >>>>>
> >>>>>
> >>>> A better option would be to fix this in libxl, for the benefit of other
> >>>> libxl apps.
> >>>>
> >>>>
> >>> Actually libxl has no problem with duplicated mac addresses, its libvirt
> >>> that makes problem.
> >>>
> >> Yeah, it appears duplicate mac addresses are only valid if on different
> >> PCI devices.
> >>
> >
> > Is that true for libvirt generally (all drivers)?
> >
> >
> >> Back to virDomainHasNet? :-) Or checking for the
> >> duplicate directly in libxlDomainAttachNetDevice()?
> >>
> >
> > What do you mean by "directly"? This is exactly what my patch did (until
> > virDomainNetFindIdx stopped reporting duplicates).
> >
>
> I mean coding up the search for an existing mac directly in
> libxlDomainAttachNetDevice(). E.g.
I see, IMO its better with (reusable...) virDomainHasNet.
> static int
> libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
> libxlDomainObjPrivatePtr priv,
> virDomainObjPtr vm,
> virDomainNetDefPtr net)
> {
> int actualType;
> libxl_device_nic nic;
> int ret = -1;
> size_t i;
> virDomainDefPtr def = vm->def;
>
> for (i = 0; i < def->nnets; i++) {
> if (virMacAddrCmp(&def->nets[i]->mac, &net->mac) == 0)
> error;
> }
> ...
> }
>
> Regards,
> Jim
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150220/067f2f69/attachment-0001.sig>
More information about the libvir-list
mailing list