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.
---
src/util/virnetdev.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index ee60f09..df48763 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -584,6 +584,8 @@ int virNetDevSetNamespace(const char *ifname, pid_t pidInNs)
{
int rc;
char *pid = NULL;
+ char *phy_path = NULL;
+
const char *argv[] = {
"ip", "link", "set", ifname, "netns",
NULL, NULL
};
@@ -591,6 +593,35 @@ int virNetDevSetNamespace(const char *ifname, pid_t pidInNs)
if (virAsprintf(&pid, "%lld", (long long) pidInNs) == -1)
return -1;
+ /* The 802.11 wireless devices only move together with their PHY. */
+ if (virNetDevSysfsFile(&phy_path, ifname, "phy80211/name") >= 0) {
+ int len;
+ char *phy = NULL;
+
+ len = virFileReadAllQuiet(phy_path, 1024, &phy);
+ VIR_FREE(phy_path);
+
+ /* Remove a line break. */
+ if (len > 0)
+ phy[len - 1] = '\0';
+
+ if (len >= 0) {
+ const char *iwargv[] = {
+ "iw", "phy", phy, "set", "netns",
NULL, NULL
+ };
+
+ iwargv[5] = pid;
+ rc = virRun(iwargv, NULL);
+
+ VIR_FREE(phy);
+
+ if (rc == 0) {
+ VIR_FREE(pid);
+ return rc;
+ }
+ }
+ }
+
argv[5] = pid;
rc = virRun(argv, NULL);
--
2.1.0