[libvirt] [PATCH 6/6] qemu: change macvtap device MAC address in response to NIC_RX_FILTER_CHANGED
Laine Stump
laine at laine.org
Fri Sep 26 18:46:41 UTC 2014
On 09/24/2014 10:19 PM, John Ferlan wrote:
>
> On 09/24/2014 05:50 AM, Laine Stump wrote:
>> This patch fills in the functionality of
>> processNicRxFilterChangedEvent(). It now checks if it is appropriate
>> to respond to the NIC_RX_FILTER_CHANGED event (based on device type
>> and configuration) and takes appropriate action. Currently it checks
>> if the guest interface has been configured with
>> trustGuestRxFilters='yes', and if the host side device is macvtap. If
>> so, and the MAC address on the guest has changed, the MAC address of
>> the macvtap device is changed to match.
>>
>> The result of this is that networking from the guest will continue to
>> work if the mac address of a macvtap-connected network device is
>> changed from within the guest, as long as trustGuestRxFilters='yes'
>> (previously changing the MAC address in the guest would break
>> networking).
>> ---
>> src/qemu/qemu_driver.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 50 insertions(+)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 64f1d45..7801d91 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -4146,8 +4146,13 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
>> char *devAlias)
>> {
>> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>> + qemuDomainObjPrivatePtr priv = vm->privateData;
>> virDomainDeviceDef dev;
>> virDomainNetDefPtr def;
>> + virNetDevRxFilterPtr filter = NULL;
>> + virMacAddr oldMAC;
>> + char newMacStr[VIR_MAC_STRING_BUFLEN];
>> + int ret;
>>
>> VIR_DEBUG("Received NIC_RX_FILTER_CHANGED event for device %s "
>> "from domain %p %s",
>> @@ -4175,11 +4180,55 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
>> }
>> def = dev.data.net;
>>
>> + if (!virDomainNetGetActualTrustGuestRxFilters(def)) {
>> + VIR_WARN("ignore NIC_RX_FILTER_CHANGED event for network "
>> + "device %s in domain %s",
>> + def->info.alias, vm->def->name);
> So how often could this be emitted? Do we need some sort of "filter" to
> only message once per life of the domain?
As often as we respond to the previous NIC_RX_FILTER_CHANGED event -
qemu won't send another event until we've issued a new query-rx-filter
command for that same interface. So for domains where we've set
trustGuestRxFilters='no', we will get exactly one event per interface.
On domains where we trust the guest enough to use its filter info, we
will never get a backlog of more than one per interface.
>
>> + /* not sending "query-rx-filter" will also suppress any
>> + * further NIC_RX_FILTER_CHANGED events for this device
>> + */
>> + goto endjob;
>> + }
>> +
>> /* handle the event - send query-rx-filter and respond to it. */
>>
>> VIR_DEBUG("process NIC_RX_FILTER_CHANGED event for network "
>> "device %s in domain %s", def->info.alias, vm->def->name);
>>
> There's no capabilities check necessary? What if the command doesn't
> exist in the underlying qemu?
If NIC_RX_FILTER_CHANGED exists, then query-rx-filter exists. If
NIC_RX_FILTER_CHANGED doesn't exist, we will never get to this point.
>
>> + qemuDomainObjEnterMonitor(driver, vm);
>> + ret = qemuMonitorQueryRxFilter(priv->mon, devAlias, &filter);
>> + qemuDomainObjExitMonitor(driver, vm);
>> + if (ret < 0)
>> + goto endjob;
> You filled in a lot of data from the qemuMonitorQueryRxFilter(), but
> you're only using filter->mac (e.g. main-mac).
>
> Or am I missing something?
No, you're not missing anything. All the other information will be used
in the future in a similar manner. This single patch was all that was
necessary to get regular unicast traffic working after a mac address
change, so it is useful on its own, but I didn't want to add in the
utility functions half-finished.
More information about the libvir-list
mailing list