[libvirt] [PATCH] lxc: move wireless PHYs to a network namespace

Daniel P. Berrange berrange at redhat.com
Thu Apr 16 16:19:08 UTC 2015


On Thu, Apr 16, 2015 at 05:22:55PM +0200, Michal Privoznik wrote:
> From: Lubomir Rintel <lkundrak at v3.sk>
> 
> The 802.11 interfaces can not be moved by themselves, their Phy has to move too.
> 
> If there are other interfaces, they have to move too -- hopefully it's not too
> confusing. This is a less-invasive alternative to defining a new hostdev type
> for PHYs.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/util/virnetdev.c | 39 ++++++++++++++++++++++++++++++++++++---
>  1 file changed, 36 insertions(+), 3 deletions(-)
> 
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index a816e5d..21fa9d0 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -560,20 +560,53 @@ int virNetDevSetMTUFromDevice(const char *ifname,
>   */
>  int virNetDevSetNamespace(const char *ifname, pid_t pidInNs)
>  {
> -    int rc;
> +    int ret = -1;
>      char *pid = NULL;
> +    char *phy = NULL;
> +    char *phy_path = NULL;
> +    int len;
> +
>      const char *argv[] = {
>          "ip", "link", "set", ifname, "netns", NULL, NULL
>      };
>  
> +    const char *iwargv[] = {
> +        "iw", "phy", NULL, "set", "netns", NULL, NULL
> +    };
> +
>      if (virAsprintf(&pid, "%lld", (long long) pidInNs) == -1)
>          return -1;
>  
>      argv[5] = pid;
> -    rc = virRun(argv, NULL);
> +    if (virRun(argv, NULL) < 0)
> +        goto cleanup;
>  
> +    /* The 802.11 wireless devices only move together with their PHY. */
> +    if (virNetDevSysfsFile(&phy_path, ifname, "phy80211/name") < 0)
> +        goto cleanup;
> +
> +    if ((len = virFileReadAllQuiet(phy_path, 1024, &phy) < 0)) {
> +        if (errno == ENOENT) {
> +            /* Okay, this is not a wireless card. Claim success. */
> +            ret = 0;
> +        }
> +        goto cleanup;
> +    }
> +
> +    /* Remove a line break. */
> +    phy[len - 1] = '\0';
> +
> +    iwargv[2] = phy;
> +    iwargv[5] = pid;
> +    if (virRun(iwargv, NULL) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> + cleanup:
> +    VIR_FREE(phy_path);
> +    VIR_FREE(phy);
>      VIR_FREE(pid);
> -    return rc;
> +    return ret;
>  }
>  
>  #if defined(SIOCSIFNAME) && defined(HAVE_STRUCT_IFREQ)

ACK, this matches what lxc tools do.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list