From 9699e372c279e03a5873115092e494b7fb78bf25 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 28 Feb 2008 01:23:14 +0000 Subject: [PATCH] Set MAC address on TUN device for Xenner compatability --- ChangeLog | 5 +++++ src/bridge.c | 14 ++++++++++++++ src/bridge.h | 1 + src/qemu_conf.c | 1 + 4 files changed, 21 insertions(+) diff --git a/ChangeLog b/ChangeLog index 085a936b69..d7374e09e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 27 20:21:35 EST 2008 Daniel P. Berrange + + * src/bridge.c, src/bridge.h, src/qemu_conf.c: Set mac address + on TUN device to work with Xenner + Wed Feb 27 20:12:35 CET 2008 Jim Meyering Make qemud/'s rpcgen rules work. diff --git a/src/bridge.c b/src/bridge.c index dd58262d7d..6626156ed0 100644 --- a/src/bridge.c +++ b/src/bridge.c @@ -42,6 +42,7 @@ #include /* SIOCBRADDBR etc. */ #include /* SYSFS_BRIDGE_ATTR */ #include /* IFF_TUN, IFF_NO_PI */ +#include /* ARPHRD_ETHER */ #include "internal.h" @@ -312,6 +313,7 @@ brDeleteInterface(brControl *ctl ATTRIBUTE_UNUSED, int brAddTap(brControl *ctl, const char *bridge, + unsigned char *macaddr, char *ifname, int maxlen, int *tapfd) @@ -355,6 +357,18 @@ brAddTap(brControl *ctl, } if (ioctl(fd, TUNSETIFF, &try) == 0) { + struct ifreq addr; + memset(&addr, 0, sizeof(addr)); + memcpy(addr.ifr_hwaddr.sa_data, macaddr, 6); + addr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + + /* Device actually starts in 'UP' state, but it + * needs to be down to set the MAC addr + */ + if ((errno = brSetInterfaceUp(ctl, try.ifr_name, 0))) + goto error; + if (ioctl(fd, SIOCSIFHWADDR, &addr) != 0) + goto error; if ((errno = brAddInterface(ctl, bridge, try.ifr_name))) goto error; if ((errno = brSetInterfaceUp(ctl, try.ifr_name, 1))) diff --git a/src/bridge.h b/src/bridge.h index 5dcca00040..bac776830f 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -62,6 +62,7 @@ int brDeleteInterface (brControl *ctl, int brAddTap (brControl *ctl, const char *bridge, + unsigned char *mac, char *ifname, int maxlen, int *tapfd); diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 8c10ba45c7..86b487020e 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -1530,6 +1530,7 @@ qemudNetworkIfaceConnect(virConnectPtr conn, } if ((err = brAddTap(driver->brctl, brname, + net->mac, ifname, BR_IFNAME_MAXLEN, &tapfd))) { qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "Failed to add tap interface '%s' to bridge '%s' : %s",