*
*/
-#include "config-host.h"
-
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <ctype.h>
-#include <glib.h>
-
-#include <sys/types.h>
+#include "qemu/osdep.h"
+
+
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
unsigned long ifargs[4];
#endif
int ifindex;
- int fd, ctlfd, unixfd = -1;
+ int fd = -1, ctlfd = -1, unixfd = -1;
int use_vnet = 0;
int mtu;
const char *bridge = NULL;
goto cleanup;
}
+ /* Linux uses the lowest enslaved MAC address as the MAC address of
+ * the bridge. Set MAC address to a high value so that it doesn't
+ * affect the MAC address of the bridge.
+ */
+ if (ioctl(ctlfd, SIOCGIFHWADDR, &ifr) < 0) {
+ fprintf(stderr, "failed to get MAC address of device `%s': %s\n",
+ iface, strerror(errno));
+ ret = EXIT_FAILURE;
+ goto cleanup;
+ }
+ ifr.ifr_hwaddr.sa_data[0] = 0xFE;
+ if (ioctl(ctlfd, SIOCSIFHWADDR, &ifr) < 0) {
+ fprintf(stderr, "failed to set MAC address of device `%s': %s\n",
+ iface, strerror(errno));
+ ret = EXIT_FAILURE;
+ goto cleanup;
+ }
+
/* add the interface to the bridge */
prep_ifreq(&ifr, bridge);
ifindex = if_nametoindex(iface);
/* profit! */
cleanup:
-
+ if (fd >= 0) {
+ close(fd);
+ }
+ if (ctlfd >= 0) {
+ close(ctlfd);
+ }
while ((acl_rule = QSIMPLEQ_FIRST(&acl_list)) != NULL) {
QSIMPLEQ_REMOVE_HEAD(&acl_list, entry);
g_free(acl_rule);