Hi Brian, I now had more time to look at it - thanks for your patience and your detailed report! The around that currently is this in libvirt doing that is like this: 110 #if defined(HAVE_STRUCT_IFREQ) && defined(__linux__) 111 /* 112 * Bridge parameters can be set via sysfs on newish kernels, 113 * or by ioctl on older kernels. Perhaps we could just use 114 * ioctl for every kernel, but its not clear what the long 115 * term lifespan of the ioctl interface is... 116 */ 117 static int virNetDevBridgeSet(const char *brname, 118 const char *paramname, /* sysfs param name */ 119 unsigned long value, /* new value */ 120 int fd, /* control socket */ 121 struct ifreq *ifr) /* pre-filled bridge name */ 122 { 123 VIR_AUTOFREE(char *) path = NULL; 124 125 if (virAsprintf(&path, SYSFS_NET_DIR "%s/bridge/%s", brname, paramname) < 0) 126 return -1; 127 128 if (virFileExists(path)) { 129 char valuestr[INT_BUFSIZE_BOUND(value)]; 130 snprintf(valuestr, sizeof(valuestr), "%lu", value); 131 if (virFileWriteStr(path, valuestr, 0) < 0) { 132 virReportSystemError(errno, 133 _("Unable to set bridge %s %s"), brname, paramname); 134 return -1; 135 } 136 } else { 137 unsigned long paramid; 138 if (STREQ(paramname, "stp_state")) { 139 paramid = BRCTL_SET_BRIDGE_STP_STATE; 140 } else if (STREQ(paramname, "forward_delay")) { 141 paramid = BRCTL_SET_BRIDGE_FORWARD_DELAY; 142 } else { 143 virReportSystemError(EINVAL, 144 _("Unable to set bridge %s %s"), brname, paramname); 145 return -1; 146 } 147 unsigned long args[] = { paramid, value, 0, 0 }; 148 ifr->ifr_data = (char*)&args; 149 if (ioctl(fd, SIOCDEVPRIVATE, ifr) < 0) { 150 virReportSystemError(errno, 151 _("Unable to set bridge %s %s"), brname, paramname); 152 return -1; 153 } 154 } 155 156 return 0; 157 } Which means if the sysfs path exists it tries through sysfs (only) and only otherwise with the older ioctl interface. The code is stable from libvirt 4.0 as in Ubuntu 18.04 until todays 4.9 just released upstream. I think it would not be unreasonable to modify that be a fallback instead of an if/else. I have coded something up (experimentally) that I'd want you to test from [1]. If that is working for you as expected than I'd suggest the same upstream in a polished way. Please let me know what happens if you use this libvirt 4.0.0-1ubuntu8.7~ppa1 (in your container). [1]: https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/3525/+packages