[PATCH] RFC: Support network interface downscript

Michal Privoznik mprivozn at redhat.com
Mon May 18 10:04:34 UTC 2020


On 5/14/20 5:19 PM, Chen Hanxiao wrote:
> https://gitlab.com/libvirt/libvirt/-/issues/13
> 
> Add support for downscript:
> 
> <interface type='ethernet'>
>      <mac address='00:11:22:33:44:55'/>
>      <script path='/etc/qemu-ifup'/>
>      <downscript path='/path/to/my/downscript'/>

Uh, this doesn't look very nice, but unfortunately 'script' is not 
future proof, so I guess 'downscript' is our only choice.

> </interface>
> 
> But -net ...,script=/etc/qemu-ifup has some limitation:
> https://github.com/qemu/qemu/blob/035b448b84f3557206abc44d786c5d3db2638f7d/net/tap.c#L818
> Maybe virNetDevRunEthernetScript is another choice.
> 
> Signed-off-by: Chen Hanxiao <chen_han_xiao at 126.com>
> ---
>   src/conf/domain_conf.c    | 7 +++++++
>   src/conf/domain_conf.h    | 1 +
>   src/qemu/qemu_extdevice.c | 2 ++
>   3 files changed, 10 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index c201fc9..5cb39a3 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -2520,6 +2520,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
>       VIR_FREE(def->teaming.persistent);
>       VIR_FREE(def->virtPortProfile);
>       VIR_FREE(def->script);
> +    VIR_FREE(def->downscript);
>       VIR_FREE(def->domain_name);
>       VIR_FREE(def->ifname);
>       VIR_FREE(def->ifname_guest);
> @@ -11977,6 +11978,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>       g_autofree char *ifname_guest = NULL;
>       g_autofree char *ifname_guest_actual = NULL;
>       g_autofree char *script = NULL;
> +    g_autofree char *downscript = NULL;
>       g_autofree char *address = NULL;
>       g_autofree char *port = NULL;
>       g_autofree char *localaddr = NULL;
> @@ -12149,6 +12151,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>               } else if (!script &&
>                          virXMLNodeNameEqual(cur, "script")) {
>                   script = virXMLPropString(cur, "path");
> +            } else if (!downscript &&
> +                       virXMLNodeNameEqual(cur, "downscript")) {
> +                downscript = virXMLPropString(cur, "path");
>               } else if (!domain_name &&
>                          virXMLNodeNameEqual(cur, "backenddomain")) {
>                   domain_name = virXMLPropString(cur, "name");
> @@ -12482,6 +12487,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>   
>       if (script != NULL)
>           def->script = g_steal_pointer(&script);
> +    if (downscript != NULL)
> +        def->downscript = g_steal_pointer(&downscript);
>       if (domain_name != NULL)
>           def->domain_name = g_steal_pointer(&domain_name);
>       if (ifname != NULL)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ddc75d8..e152c59 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1055,6 +1055,7 @@ struct _virDomainNetDef {
>           unsigned long sndbuf;
>       } tune;
>       char *script;
> +    char *downscript;
>       char *domain_name; /* backend domain name */
>       char *ifname; /* interface name on the host (<target dev='x'/>) */
>       int managed_tap; /* enum virTristateBool - ABSENT == YES */
> diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
> index 2096272..f8e440a 100644
> --- a/src/qemu/qemu_extdevice.c
> +++ b/src/qemu/qemu_extdevice.c
> @@ -234,6 +234,8 @@ qemuExtDevicesStop(virQEMUDriverPtr driver,
>   
>           if (slirp)
>               qemuSlirpStop(slirp, vm, driver, net);
> +        if (net->downscript)
> +            virNetDevRunEthernetScript(net->ifname, net->downscript);

This will run the script for all interface types, not only 'ethernet'. 
Also, it will run the script only when the domain is shut down 
(qemuExtDevicesStop() is called only from qemuProcessStop()), which is 
in contrast with the up script which is called on device hotplug. The 
downscript should be called on unplug too.

The code looks okayish, but in order to be merged it needs: RNG schema 
adjustment, some XML tests and documentation.

Michal




More information about the libvir-list mailing list