]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Set MAC address on TUN device for Xenner compatability
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 28 Feb 2008 01:23:14 +0000 (01:23 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 28 Feb 2008 01:23:14 +0000 (01:23 +0000)
ChangeLog
src/bridge.c
src/bridge.h
src/qemu_conf.c

index 085a936b6901fac229bab1c3bbe49712b819c5ae..d7374e09e14643eaa6e4a43df90fdbf24bd6d92d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Feb 27 20:21:35 EST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       * 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 <meyering@redhat.com>
 
        Make qemud/'s rpcgen rules work.
index dd58262d7d54c5211c3a8ba7c8844868a7ed5eb0..6626156ed093c3d7726a19d7068f3370f2db4081 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/sockios.h>   /* SIOCBRADDBR etc.   */
 #include <linux/if_bridge.h> /* SYSFS_BRIDGE_ATTR  */
 #include <linux/if_tun.h>    /* IFF_TUN, IFF_NO_PI */
+#include <net/if_arp.h>    /* 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)))
index 5dcca000407b36a0fdaef119dc91b37c9cefe1ab..bac776830f964f4b3a8f79f1e39d18b0de16e738 100644 (file)
@@ -62,6 +62,7 @@ int     brDeleteInterface       (brControl *ctl,
 
 int     brAddTap                (brControl *ctl,
                                  const char *bridge,
+                                 unsigned char *mac,
                                  char *ifname,
                                  int maxlen,
                                  int *tapfd);
index 8c10ba45c79101ec32685ad75466b2a21f07ded4..86b487020e805ca7c118637be374be01fe353618 100644 (file)
@@ -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",