From e5982092d15142b0e780b2c35df3079a09ca5c45 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Tue, 14 Apr 2015 18:21:44 +0200 Subject: [PATCH] lxc: move wireless PHYs to a network namespace 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 (cherry picked from commit 3a495948b97770b026afab1ccaac560a9669a36e) --- 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 93f67153b2..e111a07aa3 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -551,20 +551,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) -- GitLab