Re: [PATCH 2/2] ch: Enable NAT Network mode support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 27, 2024 at 11:05:39AM -0500, Praveen K Paladugu wrote:
> 
> 
> On 8/27/2024 5:18 AM, Pavel Hrdina wrote:
> > On Thu, Aug 01, 2024 at 05:25:14PM -0500, Praveen K Paladugu wrote:
> > > From: Praveen K Paladugu <praveenkpaladugu@xxxxxxxxx>
> > > 
> > > From: Praveen K Paladugu <prapal@xxxxxxxxxxxxxxxxxxx>
> > > 
> > > enable VIR_DOMAIN_NET_TYPE_NETWORK network support for ch guests.
> > > Tested with following config:
> > > 
> > >    <interface type='network'>
> > >        <source network="default" bridge='virbr0'/>
> > >        <model type='virtio'/>
> > >        <driver queues="1"/>
> > >    </interface>
> > > 
> > > Signed-off-by: Praveen K Paladugu <praveenkpaladugu@xxxxxxxxx>
> > > Signed-off-by: Praveen K Paladugu <prapal@xxxxxxxxxxxxxxxxxxx>
> > > ---
> > >   src/ch/ch_interface.c | 57 +++++++++++++++++++++++++++++++------------
> > >   1 file changed, 42 insertions(+), 15 deletions(-)
> > > 
> > > diff --git a/src/ch/ch_interface.c b/src/ch/ch_interface.c
> > > index c7af6a35fa..07bdd71560 100644
> > > --- a/src/ch/ch_interface.c
> > > +++ b/src/ch/ch_interface.c
> > > @@ -28,7 +28,7 @@
> > >   #include "ch_interface.h"
> > >   #include "virjson.h"
> > >   #include "virlog.h"
> > > -
> > > +#include "datatypes.h"
> > >   #define VIR_FROM_THIS VIR_FROM_CH
> > > @@ -39,8 +39,9 @@ VIR_LOG_INIT("ch.ch_interface");
> > >    * @driver: pointer to ch driver object
> > >    * @vm: pointer to domain definition
> > >    * @net: pointer to a guest net
> > > - * @nicindexes: returned array of FDs of guest interfaces
> > > - * @nnicindexes: returned number of guest interfaces
> > > + * @tapfds: returned array of tap FDs
> > > + * @nicindexes: returned array list of network interface indexes
> > > + * @nnicindexes: returned number of network interfaces
> > >    *
> > >    *
> > >    * Returns 0 on success, -1 on error.
> > > @@ -49,10 +50,24 @@ int
> > >   virCHConnetNetworkInterfaces(virCHDriver *driver,
> > >                                virDomainDef *vm,
> > >                                virDomainNetDef *net,
> > > -                             int *tapfds, int **nicindexes, size_t *nnicindexes)
> > > +                             int *tapfds,
> > > +                             int **nicindexes, size_t *nnicindexes)
> > >   {
> > >       virDomainNetType actualType = virDomainNetGetActualType(net);
> > > +    g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
> > > +    g_autoptr(virConnect) conn = NULL;
> > > +
> > > +    /* If appropriate, grab a physical device from the configured
> > > +     * network's pool of devices, or resolve bridge device name
> > > +     * to the one defined in the network definition.
> > > +     */
> > > +    if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> > > +        if (!(conn = virGetConnectNetwork()))
> > > +            return -1;
> > > +        if (virDomainNetAllocateActualDevice(conn, vm, net) < 0)
> > > +            return -1;
> > > +    }
> > >       switch (actualType) {
> > >       case VIR_DOMAIN_NET_TYPE_ETHERNET:
> > > @@ -63,20 +78,19 @@ virCHConnetNetworkInterfaces(virCHDriver *driver,
> > >                                                 net->driver.virtio.queues) < 0)
> > >               return -1;
> > > -        G_GNUC_FALLTHROUGH;
> > > +        break;
> > >       case VIR_DOMAIN_NET_TYPE_NETWORK:
> > > +        if (virDomainInterfaceBridgeConnect(vm, net,
> > > +                                            tapfds,
> > > +                                            net->driver.virtio.queues,
> > > +                                            driver->privileged,
> > > +                                            driver->ebtables,
> > > +                                            false,
> > > +                                            NULL) < 0)
> > > +            return -1;
> > > +        break;
> > >       case VIR_DOMAIN_NET_TYPE_BRIDGE:
> > >       case VIR_DOMAIN_NET_TYPE_DIRECT:
> > > -        if (nicindexes && nnicindexes && net->ifname) {
> > > -            int nicindex = 0;
> > > -
> > > -            if (virNetDevGetIndex(net->ifname, &nicindex) < 0)
> > > -                return -1;
> > > -
> > > -            VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex);
> > > -        }
> > > -
> > > -        break;
> > >       case VIR_DOMAIN_NET_TYPE_USER:
> > >       case VIR_DOMAIN_NET_TYPE_SERVER:
> > >       case VIR_DOMAIN_NET_TYPE_CLIENT:
> > > @@ -94,6 +108,19 @@ virCHConnetNetworkInterfaces(virCHDriver *driver,
> > >                          _("Unsupported Network type %1$d"), actualType);
> > >           return -1;
> > >       }
> > > +    if ( actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
> > > +         actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
> > > +         actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
> > > +         actualType == VIR_DOMAIN_NET_TYPE_DIRECT ) {
> > > +            if (nicindexes && nnicindexes && net->ifname) {
> > > +                int nicindex = 0;
> > > +
> > > +                if (virNetDevGetIndex(net->ifname, &nicindex) < 0)
> > > +                    return -1;
> > > +
> > > +                VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex);
> > > +            }
> > > +    }
> > 
> > Coverity complains here that this code is unreachable, which is not true
> > but moving it here after the switch makes regression to the original
> > code. With this change it will never be done for
> > VIR_DOMAIN_NET_TYPE_BRIDGE or VIR_DOMAIN_NET_TYPE_DIRECT and both
> > network types will result in error "Unsupported Network type ...".
> > 
> > Pavel
> 
> I don't follow your claim about "makes regression to the original code".
> Here "actualType" is evaluated at the top and checked after the
> switch case.
> 
> If "actualType" if any of the above types, nicindexes will be updated
> appropriately.
> 
> If the concern is about connecting the interface to configured bridge,
> that is handled elsewhere. For example:
> 
> https://lists.libvirt.org/archives/list/devel@xxxxxxxxxxxxxxxxx/thread/M6ZNU2E3KN6T4ELDNUWT7V65JBP4I3PW/
> 
> This enables Bridge mode networking.

Let me paste the whole function here as the diff is not complete and
hides the issue:

> virCHConnetNetworkInterfaces(virCHDriver *driver,
>                              virDomainDef *vm,
>                              virDomainNetDef *net,
>                              int *tapfds,
>                              int **nicindexes,
>                              size_t *nnicindexes)
> {
>     virDomainNetType actualType = virDomainNetGetActualType(net);
>     g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
>     g_autoptr(virConnect) conn = NULL;
>     size_t tapfdSize = net->driver.virtio.queues;
> 
>     /* If appropriate, grab a physical device from the configured
>      * network's pool of devices, or resolve bridge device name
>      * to the one defined in the network definition.
>      */
>     if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
>         if (!(conn = virGetConnectNetwork()))
>             return -1;
>         if (virDomainNetAllocateActualDevice(conn, vm, net) < 0)
>             return -1;
>     }
> 
>     switch (actualType) {

Here we have switch that covers all possible values for actualType ...

>     case VIR_DOMAIN_NET_TYPE_ETHERNET:
>         if (virDomainInterfaceEthernetConnect(vm, net,
>                                               driver->ebtables, false,
>                                               driver->privileged, tapfds,
>                                               net->driver.virtio.queues) < 0)
>             return -1;
> 
>         break;
>     case VIR_DOMAIN_NET_TYPE_NETWORK:
>         if (virDomainInterfaceBridgeConnect(vm, net,
>                                             tapfds,
>                                             &tapfdSize,
>                                             driver->privileged,
>                                             driver->ebtables,
>                                             false,
>                                             NULL) < 0)
>             return -1;
>         break;
>     case VIR_DOMAIN_NET_TYPE_BRIDGE:
>     case VIR_DOMAIN_NET_TYPE_DIRECT:

... here you have cases for bridge and direct types ...

>     case VIR_DOMAIN_NET_TYPE_USER:
>     case VIR_DOMAIN_NET_TYPE_SERVER:
>     case VIR_DOMAIN_NET_TYPE_CLIENT:
>     case VIR_DOMAIN_NET_TYPE_MCAST:
>     case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
>     case VIR_DOMAIN_NET_TYPE_INTERNAL:
>     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
>     case VIR_DOMAIN_NET_TYPE_UDP:
>     case VIR_DOMAIN_NET_TYPE_VDPA:
>     case VIR_DOMAIN_NET_TYPE_NULL:
>     case VIR_DOMAIN_NET_TYPE_VDS:
>     case VIR_DOMAIN_NET_TYPE_LAST:
>     default:

... and here in case of bridge or direct type it will result in error
and the code that updates nicindexes is never executed.

>         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                        _("Unsupported Network type %1$d"), actualType);
>         return -1;
>     }

If the actualType == VIR_DOMAIN_NET_TYPE_BRIDGE we will never get to
this part as it will reach the error above and returns from this
function, the same happens for VIR_DOMAIN_NET_TYPE_DIRECT.

Before this patch actualType VIR_DOMAIN_NET_TYPE_BRIDGE and
VIR_DOMAIN_NET_TYPE_DIRECT had nicindexes updated.

After this patch only VIR_DOMAIN_NET_TYPE_ETHERNET and
VIR_DOMAIN_NET_TYPE_NETWORK have nicindexes updated.

>     if (actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
>         actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
>         actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>         actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
>         if (nicindexes && nnicindexes && net->ifname) {
>             int nicindex = 0;
> 
>             if (virNetDevGetIndex(net->ifname, &nicindex) < 0)
>                 return -1;
> 
>             VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex);
>         }
>     }
> 
>     return 0;
> }

Pavel

> 
> > 
> > >       return 0;
> > >   }
> > > -- 
> > > 2.44.0
> > > 
> 
> -- 
> Regards,
> Praveen K Paladugu
> 

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux