[libvirt] [PATCH v3 05/36] network: use 'bridge' as actual type instead of 'network'
Cole Robinson
crobinso at redhat.com
Fri Mar 22 14:30:08 UTC 2019
On 3/21/19 10:16 PM, Laine Stump wrote:
> On 3/21/19 9:07 PM, Cole Robinson wrote:
>> On 3/19/19 8:46 AM, Daniel P. Berrangé wrote:
>>> Ports allocated on virtual networks with type=nat|route|open all get
>>> given an actual type of 'network'.
>>>
>>> Only ports in networks with type=bridge use an actual type of 'bridge'.
>>>
>>> This distinction makes little sense since the virtualization drivers
>>> will treat both actual types in exactly the same way, as they're all
>>> just bridge devices a VM needs to be connected to.
>>>
>>> This doesn't affect user visible XML since the "actual" device XML
>>> is internal only, but we need code to convert the data upgrades.
>>>
>>> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
>>> ---
>>> src/network/bridge_driver.c | 20 ++++++++++++--------
>>> 1 file changed, 12 insertions(+), 8 deletions(-)
>>>
>> Conceptually this makes sense. I wonder what the original motivation for
>> the differentiation was.
>
>
> I remember there was *some* reason for it, but it's very possible it's
> not valid. So lacking any solid memory from that distant time, one thing
> to do is audit all occurrences of VIR_DOMAIN_NET_TYPE_NETWORK where the
> actualType is being compared (rather than the NetDef's type), and
> behavior is different from VIR_DOMAIN_NET_TYPE_BRIDGE (which is
> apparently what Cole did, since he's already found most of the
> "interesting" places I found :-)). He mentions one that he found below,
> and he also pointed out the class_id thing during parsing in the
> previous patch, which will now be broken even if we don't support
> bandwidth on unmanaged bridge networks (because class_id is only parsed
> when actualType == NETWORK). I'll see if I find any others with a quick
> search...
>
It's difficult to audit: to know whether actualType can even be
TYPE_NETWORK after this patch requires knowing if the caller is acting
on a live/starting VM or not which is context dependent.
>
>> This also makes me wish there was a separate
>> enum for the internal actual->type field, it would make ambiguous code
>> much more readable
>>
>>> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
>>> index 4770dd1e4e..40122612c8 100644
>>> --- a/src/network/bridge_driver.c
>>> +++ b/src/network/bridge_driver.c
>>> @@ -4454,11 +4454,7 @@ networkAllocateActualDevice(virNetworkPtr net,
>>> case VIR_NETWORK_FORWARD_NAT:
>>> case VIR_NETWORK_FORWARD_ROUTE:
>>> case VIR_NETWORK_FORWARD_OPEN:
>>> - /* for these forward types, the actual net type really *is*
>>> - * NETWORK; we just keep the info from the portgroup in
>>> - * iface->data.network.actual
>>> - */
>>> - iface->data.network.actual->type = VIR_DOMAIN_NET_TYPE_NETWORK;
>>> + iface->data.network.actual->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
>>> /* we also store the bridge device and macTableManager
>>> settings
>>> * in iface->data.network.actual->data.bridge for later use
>>> @@ -4832,6 +4828,15 @@ networkNotifyActualDevice(virNetworkPtr net,
>>> netdef->bridge) < 0))
>>> goto error;
>>> + /* Older libvirtd uses actualType==network, but we now
>>> + * just use actualType==bridge, as nothing needs to
>>> + * distinguish the two cases, and this simplifies virt
>>> + * drive code */
>>> + if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
>>> + iface->data.network.actual->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
>>> + actualType = VIR_DOMAIN_NET_TYPE_BRIDGE;
>>> + }
>>> +
>> Why do this here and not at the status XML parse time? This code path is
>> only called on reconnected devices correct? So that should always be
>> hitting the status XML parser too AFAICT.
>
>
> I *think* that's correct, but it's been too long since I looked at the
> code.
>
>
>> That would make it easier to
>> audit any TYPE_NETWORK paths in the status parser as well
>>
>> qemu_driver.c processNicRxFilterChangedEvent also has a
>>
>> if (virDomainNetGetActualType(def) == VIR_DOMAIN_NET_TYPE_NETWORK) {
>>
>> which looks sketchy after this. And it's involving bandwidth stuff so it
>> may affect the previous patch too.
>
> virDomainNetResolveActualType() also needs to be adjusted.
>
>
> Also libxl handles the two types differently in libxlMakeNic, although I
> don't know enough about Xen networking to know which is way is better.
>
Patch 8 addresses that case, by removing it entirely :)
- Cole
More information about the libvir-list
mailing list