Devel
  Threads by month 
                
            - ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
July 2012
- 99 participants
- 305 discussions
 
                        
                    
                        
                            
                                
                            
                            Re: [libvirt] How to get the real device in guest os after attached a disk?
                        
                        
by Stefan Hajnoczi 18 Jul '12
                    by Stefan Hajnoczi 18 Jul '12
18 Jul '12
                    
                        On Tue, Jul 17, 2012 at 4:40 AM, Wangpan <hzwangpan(a)corp.netease.com> wrote:
> I have a question as the subject above, the reason I want to know this is that, if I attach some disks on the guest,
> for example, I specified /dev/vdc&/dev/vdd(target device) at the cmd line by using 'virsh attach-disk', but they may be /dev/vdb&/dev/vdc in the guest os,
> so if the guest user want to detach the /dev/vdb(guest device), he\she will be confused with the two target devices /dev/vdb&/dev/vdc,
> because he\she doesn't know the corresponding relation of the guest device and target device,
> he\she may detach an error device /dev/vdd(target device) which corresponding to /dev/vdc(guest device).
>
> Could anyone give me some idea?
You can use the virtio-blk serial or file system/volume labels to
distinguish them.
For libvirt disk <serial> information, see the Domain XML documentation:
http://libvirt.org/formatdomain.html#elementsDisks
Stefan
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    
                    
                        ---
Can't we just get rid of this horrific and mostly unmaintained xenapi code
completely? :-)
 src/xenapi/xenapi_driver.c |  3 ++-
 src/xenapi/xenapi_utils.c  | 36 ++++++++++++++----------------------
 2 files changed, 16 insertions(+), 23 deletions(-)
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index 298ab21..a91f497 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -1512,7 +1512,8 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
             }
             xen_vif_get_record(session, &vif_rec, vif);
             if (vif_rec != NULL) {
-                if (virMacAddrParse((const char *)vif_rec->mac,defPtr->nets[i]->mac) < 0)
+                if (virMacAddrParse((const char *)vif_rec->mac,
+                                    &defPtr->nets[i]->mac) < 0)
                     xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
                                               _("Unable to parse given mac address"));
                 xen_vif_record_free(vif_rec);
diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
index e5a9cc5..c8b12de 100644
--- a/src/xenapi/xenapi_utils.c
+++ b/src/xenapi/xenapi_utils.c
@@ -453,7 +453,6 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
     char uuidStr[VIR_UUID_STRING_BUFLEN];
     xen_string_string_map *strings = NULL;
     int device_number = 0;
-    char *bridge = NULL, *mac = NULL;
     int i;
 
     *record = xen_vm_record_alloc();
@@ -542,28 +541,21 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
     }
 
     for (i = 0; i < def->nnets; i++) {
-        if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
-            if (def->nets[i]->data.bridge.brname)
-                if (!(bridge = strdup(def->nets[i]->data.bridge.brname)))
-                    goto error_cleanup;
-            if (def->nets[i]->mac) {
-                char macStr[VIR_MAC_STRING_BUFLEN];
-                virMacAddrFormat(def->nets[i]->mac, macStr);
-                if (!(mac = strdup(macStr))) {
-                    VIR_FREE(bridge);
-                    goto error_cleanup;
-                }
-            }
-            if (mac != NULL && bridge != NULL) {
-                if (createVifNetwork(conn, *vm, device_number, bridge,
-                                     mac) < 0) {
-                    VIR_FREE(bridge);
-                    goto error_cleanup;
-                }
-                VIR_FREE(bridge);
-                device_number++;
+        if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
+            def->nets[i]->data.bridge.brname) {
+            char *mac;
+
+            if (VIR_ALLOC_N(mac, VIR_MAC_STRING_BUFLEN) < 0)
+                goto error_cleanup;
+            virMacAddrFormat(&def->nets[i]->mac, mac);
+
+            if (createVifNetwork(conn, *vm, device_number,
+                                 def->nets[i]->data.bridge.brname,
+                                 mac) < 0) {
+                VIR_FREE(mac);
+                goto error_cleanup;
             }
-            VIR_FREE(bridge);
+            device_number++;
         }
     }
     return 0;
-- 
1.7.11.1
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    
                    
                        I'm curious to know how you are providing IPs for your Windows VMs
when connected via a bridge.  Since broadcasts from the VMs are going
out the bridged interface, I'm thinking about implementing ebtables to
block dhcp broadcasts from going in/out the interface so that dnsmasq
would only respond to dhcp requests from the local guest VMs.  Before
I venture down this path, I thought I might ask if there's an easier
way to do this with libvirt.
Thanks for any help.
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            1
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [libvirt] [PATCH] nwfilter: Convert to virMacAddrPtr not virMacAddrPtr*
                        
                        
by Michal Privoznik 17 Jul '12
                    by Michal Privoznik 17 Jul '12
17 Jul '12
                    
                        My previous patch wasn't complete as it converted from
(unsigned char *) to (virMacAddrPtr *). It should be
(virMacAddrPtr) only.
---
Again, pushed under build breaker.
 src/nwfilter/nwfilter_dhcpsnoop.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
index 312fada..b38e780 100644
--- a/src/nwfilter/nwfilter_dhcpsnoop.c
+++ b/src/nwfilter/nwfilter_dhcpsnoop.c
@@ -2200,7 +2200,7 @@ virNWFilterDHCPSnoopReq(virNWFilterTechDriverPtr techdriver ATTRIBUTE_UNUSED,
                         const char *linkdev ATTRIBUTE_UNUSED,
                         enum virDomainNetType nettype ATTRIBUTE_UNUSED,
                         const unsigned char *vmuuid ATTRIBUTE_UNUSED,
-                        const virMacAddrPtr *macaddr ATTRIBUTE_UNUSED,
+                        const virMacAddrPtr macaddr ATTRIBUTE_UNUSED,
                         const char *filtername ATTRIBUTE_UNUSED,
                         virNWFilterHashTablePtr filterparams ATTRIBUTE_UNUSED,
                         virNWFilterDriverStatePtr driver ATTRIBUTE_UNUSED)
-- 
1.7.8.6
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [libvirt] [PATCH 0/4] qemu: configurable port boundaries for remote displays
                        
                        
by Martin Kletzander 17 Jul '12
                    by Martin Kletzander 17 Jul '12
17 Jul '12
                    
                        This series introduces a possibility to change default minimal and
maximal port numbers that are used to specify a remote display port
for both VNC and SPICE.
Because the code was a bit messy, PATCH 1/4 cleans up few things
needed to make a clean run of PATCH 2/4, that does the main change in
the code.
I also noticed two things that could be changed and it made sense for
me to do that, but these are nowhere near any importance, so feel free
to reject them if your heart feels that way.
PATCH 3/4 rewords three messages and applying it would mean that they are not translated. Even though I think it makes more sense this way, I'm not a good English speaker, so that's more like an RFC.
PATCH 4/4 makes more flexible port searching available, but is used on one place and because there are so many ports, it won't be that used, I guess.
P.S.: this is basically v2 for
https://www.redhat.com/archives/libvir-list/2012-May/msg01081.html but
it changed a lot and the name is also different, so I didn't want to
create any confision.
Martin Kletzander (4):
  qemu: Unify port-wise SPICE and VNC behavior
  qemu: configurable remote display port boundaries
  qemu: modify 3 error messages
  qemu: allow searching for all open ports
 src/conf/domain_conf.c             |    2 +-
 src/qemu/libvirtd_qemu.aug         |    4 ++
 src/qemu/qemu.conf                 |   14 ++++++
 src/qemu/qemu_command.h            |   11 ++++-
 src/qemu/qemu_conf.c               |   40 +++++++++++++++++-
 src/qemu/qemu_conf.h               |    4 +-
 src/qemu/qemu_driver.c             |   19 ++++-----
 src/qemu/qemu_process.c            |   81 +++++++++++++++++++++---------------
 src/qemu/test_libvirtd_qemu.aug.in |    2 +
 9 files changed, 128 insertions(+), 49 deletions(-)
--
1.7.8.6
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            6
                            
                          
                          
                            
    
                          
                        
                     
                        
                    17 Jul '12
                    
                        The previous commit (387117ad92) was incomplete leaving those
who does not use libpcap with uncompilable sources beacuse
of incomplete conversion of virNWFilterDHCPSnoopReq function.
---
Pushing under build breaker and trivial rules.
 src/nwfilter/nwfilter_dhcpsnoop.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
index d712b15..312fada 100644
--- a/src/nwfilter/nwfilter_dhcpsnoop.c
+++ b/src/nwfilter/nwfilter_dhcpsnoop.c
@@ -2200,7 +2200,7 @@ virNWFilterDHCPSnoopReq(virNWFilterTechDriverPtr techdriver ATTRIBUTE_UNUSED,
                         const char *linkdev ATTRIBUTE_UNUSED,
                         enum virDomainNetType nettype ATTRIBUTE_UNUSED,
                         const unsigned char *vmuuid ATTRIBUTE_UNUSED,
-                        const unsigned char *macaddr ATTRIBUTE_UNUSED,
+                        const virMacAddrPtr *macaddr ATTRIBUTE_UNUSED,
                         const char *filtername ATTRIBUTE_UNUSED,
                         virNWFilterHashTablePtr filterparams ATTRIBUTE_UNUSED,
                         virNWFilterDriverStatePtr driver ATTRIBUTE_UNUSED)
-- 
1.7.8.6
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        See https://www.redhat.com/archives/libvir-list/2012-July/msg00493.html
Basically building against librbd doesn't seem to actually require -lcrypto.
Also report the rbd linker flags in configure output
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
 configure.ac |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index d45f4f1..ae814cb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1999,7 +1999,7 @@ if test "$with_storage_rbd" = "yes" || test "$with_storage_rbd" = "check"; then
 
     if test "$LIBRBD_FOUND" = "yes"; then
         with_storage_rbd=yes
-        LIBRBD_LIBS="-lrbd -lrados -lcrypto"
+        LIBRBD_LIBS="-lrbd -lrados"
         AC_DEFINE_UNQUOTED([WITH_STORAGE_RBD], [1],
          [whether RBD backend for storage driver is enabled])
     else
@@ -2962,6 +2962,12 @@ AC_MSG_NOTICE([     xdr: $XDR_CFLAGS])
 else
 AC_MSG_NOTICE([     xdr: no])
 fi
+if test "$with_storage_rbd" = "yes" ; then
+AC_MSG_NOTICE([     rbd: $LIBRBD_LIBS])
+else
+AC_MSG_NOTICE([     rbd: no])
+fi
+
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Test suite])
 AC_MSG_NOTICE([])
-- 
1.7.10.4
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    17 Jul '12
                    
                        Introduce new members in the virMacAddr 'class'
- virMacAddrSet: set virMacAddr from a virMacAddr
- virMacAddrSetRaw: setting virMacAddr from raw 6 byte MAC address buffer
- virMacAddrGetRaw: writing virMacAddr into raw 6 byte MAC address buffer
- virMacAddrCmp: comparing two virMacAddr
- virMacAddrCmpRaw: comparing a virMacAddr with a raw 6 byte MAC address buffer
then replace raw MAC addresses by replacing
- 'unsigned char *' with virMacAddrPtr
- 'unsigned char ... [VIR_MAC_BUFLEN]' with virMacAddr
and introduce usage of above functions where necessary.
---
 src/conf/capabilities.c                   |    4 -
 src/conf/capabilities.h                   |    4 -
 src/conf/domain_audit.c                   |    6 -
 src/conf/domain_conf.c                    |   32 ++++-----
 src/conf/domain_conf.h                    |    6 -
 src/conf/network_conf.c                   |   14 ++--
 src/conf/network_conf.h                   |    2 
 src/conf/nwfilter_conf.c                  |   17 +---
 src/conf/nwfilter_conf.h                  |   14 +---
 src/conf/nwfilter_params.h                |    1 
 src/libvirt_private.syms                  |    5 +
 src/libxl/libxl_conf.c                    |    2 
 src/lxc/lxc_driver.c                      |    6 -
 src/network/bridge_driver.c               |    2 
 src/nwfilter/nwfilter_dhcpsnoop.c         |   16 ++--
 src/nwfilter/nwfilter_dhcpsnoop.h         |    2 
 src/nwfilter/nwfilter_ebiptables_driver.c |    6 -
 src/nwfilter/nwfilter_gentech_driver.c    |    8 +-
 src/nwfilter/nwfilter_gentech_driver.h    |    2 
 src/nwfilter/nwfilter_learnipaddr.c       |   29 +++-----
 src/nwfilter/nwfilter_learnipaddr.h       |    4 -
 src/openvz/openvz_conf.c                  |    2 
 src/openvz/openvz_driver.c                |    8 +-
 src/qemu/qemu_bridge_filter.c             |    4 -
 src/qemu/qemu_bridge_filter.h             |    4 -
 src/qemu/qemu_command.c                   |   22 +++---
 src/qemu/qemu_driver.c                    |   16 ++--
 src/qemu/qemu_hostdev.c                   |    8 +-
 src/qemu/qemu_hotplug.c                   |   14 ++--
 src/qemu/qemu_migration.c                 |    6 -
 src/qemu/qemu_process.c                   |    4 -
 src/uml/uml_conf.c                        |    6 -
 src/util/ebtables.c                       |   16 ++--
 src/util/ebtables.h                       |    6 +
 src/util/virmacaddr.c                     |  104 +++++++++++++++++++++++++-----
 src/util/virmacaddr.h                     |   25 +++++--
 src/util/virnetdev.c                      |   61 ++++++++---------
 src/util/virnetdev.h                      |   11 +--
 src/util/virnetdevmacvlan.c               |   38 +++++-----
 src/util/virnetdevmacvlan.h               |   11 +--
 src/util/virnetdevopenvswitch.c           |    2 
 src/util/virnetdevopenvswitch.h           |    2 
 src/util/virnetdevtap.c                   |   19 ++---
 src/util/virnetdevtap.h                   |    2 
 src/util/virnetdevvportprofile.c          |   18 ++---
 src/util/virnetdevvportprofile.h          |    5 -
 src/util/virnetlink.c                     |   15 ++--
 src/util/virnetlink.h                     |    7 +-
 src/vbox/vbox_tmpl.c                      |   16 ++--
 src/vmx/vmx.c                             |   10 +-
 src/xen/xend_internal.c                   |    6 -
 src/xen/xm_internal.c                     |    4 -
 src/xenxs/xen_sxpr.c                      |    6 -
 src/xenxs/xen_xm.c                        |    8 +-
 tools/virsh.c                             |    8 +-
 55 files changed, 377 insertions(+), 299 deletions(-)
Index: libvirt-acl/src/conf/domain_conf.h
===================================================================
--- libvirt-acl.orig/src/conf/domain_conf.h
+++ libvirt-acl/src/conf/domain_conf.h
@@ -785,7 +785,7 @@ struct _virDomainActualNetDef {
 /* Stores the virtual network interface configuration */
 struct _virDomainNetDef {
     enum virDomainNetType type;
-    unsigned char mac[VIR_MAC_BUFLEN];
+    virMacAddr mac;
     char *model;
     union {
         struct {
@@ -1998,12 +1998,12 @@ virDomainDiskRemove(virDomainDefPtr def,
 virDomainDiskDefPtr
 virDomainDiskRemoveByName(virDomainDefPtr def, const char *name);
 
-int virDomainNetIndexByMac(virDomainDefPtr def, const unsigned char *mac);
+int virDomainNetIndexByMac(virDomainDefPtr def, const virMacAddrPtr mac);
 int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net);
 virDomainNetDefPtr
 virDomainNetRemove(virDomainDefPtr def, size_t i);
 virDomainNetDefPtr
-virDomainNetRemoveByMac(virDomainDefPtr def, const unsigned char *mac);
+virDomainNetRemoveByMac(virDomainDefPtr def, const virMacAddrPtr mac);
 
 int virDomainHostdevInsert(virDomainDefPtr def, virDomainHostdevDefPtr hostdev);
 virDomainHostdevDefPtr
Index: libvirt-acl/src/util/virmacaddr.c
===================================================================
--- libvirt-acl.orig/src/util/virmacaddr.c
+++ libvirt-acl/src/util/virmacaddr.c
@@ -62,6 +62,76 @@ virMacAddrCompare(const char *p, const c
 }
 
 /**
+ * virMacAddrCmp:
+ * @mac1: pointer to 1st MAC address
+ * @mac2: pointer to 2nd MAC address
+ *
+ * Return 0 if MAC addresses are equal,
+ * < 0 if mac1 < mac2,
+ * > 0 if mac1 > mac2
+ */
+int
+virMacAddrCmp(const virMacAddrPtr mac1, const virMacAddrPtr mac2)
+{
+    return memcmp(mac1->addr, mac2->addr, VIR_MAC_BUFLEN);
+}
+
+/**
+ * virMacAddrCmpRaw:
+ * @mac1: pointer to 1st MAC address
+ * @mac2: pointer to 2nd MAC address in plain buffer
+ *
+ * Return 0 if MAC addresses are equal,
+ * < 0 if mac1 < mac2,
+ * > 0 if mac1 > mac2
+ */
+int
+virMacAddrCmpRaw(const virMacAddrPtr mac1,
+                 const unsigned char mac2[VIR_MAC_BUFLEN])
+{
+    return memcmp(mac1->addr, mac2, VIR_MAC_BUFLEN);
+}
+
+/**
+ * virMacAddrSet
+ * @dst: pointer to destination
+ * @src: pointer to source
+ *
+ * Copy src to dst
+ */
+void
+virMacAddrSet(virMacAddrPtr dst, const virMacAddrPtr src)
+{
+    memcpy(dst, src, sizeof(*src));
+}
+
+/**
+ * virMacAddrSetRaw
+ * @dst: pointer to destination to hold MAC address
+ * @src: raw MAC address data
+ *
+ * Set the MAC address to the given value
+ */
+void
+virMacAddrSetRaw(virMacAddrPtr dst, const unsigned char src[VIR_MAC_BUFLEN])
+{
+    memcpy(dst->addr, src, VIR_MAC_BUFLEN);
+}
+
+/**
+ * virMacAddrGetRaw
+ * @src: pointer to MAC address
+ * @dst: pointer to raw memory to write MAC address into
+ *
+ * Copies the MAC address into raw memory
+ */
+void
+virMacAddrGetRaw(virMacAddrPtr src, unsigned char dst[VIR_MAC_BUFLEN])
+{
+    memcpy(dst, src->addr, VIR_MAC_BUFLEN);
+}
+
+/**
  * virMacAddrParse:
  * @str: string representation of MAC address, e.g., "0:1E:FC:E:3a:CB"
  * @addr: 6-byte MAC address
@@ -71,7 +141,7 @@ virMacAddrCompare(const char *p, const c
  * Return 0 upon success, or -1 in case of error.
  */
 int
-virMacAddrParse(const char* str, unsigned char *addr)
+virMacAddrParse(const char* str, virMacAddrPtr addr)
 {
     int i;
 
@@ -93,7 +163,7 @@ virMacAddrParse(const char* str, unsigne
             (0xFF < result))
             break;
 
-        addr[i] = (unsigned char) result;
+        addr->addr[i] = (unsigned char) result;
 
         if ((i == 5) && (*end_ptr == '\0'))
             return 0;
@@ -106,36 +176,36 @@ virMacAddrParse(const char* str, unsigne
     return -1;
 }
 
-void virMacAddrFormat(const unsigned char *addr,
+void virMacAddrFormat(const virMacAddrPtr addr,
                       char *str)
 {
     snprintf(str, VIR_MAC_STRING_BUFLEN,
              "%02X:%02X:%02X:%02X:%02X:%02X",
-             addr[0], addr[1], addr[2],
-             addr[3], addr[4], addr[5]);
+             addr->addr[0], addr->addr[1], addr->addr[2],
+             addr->addr[3], addr->addr[4], addr->addr[5]);
     str[VIR_MAC_STRING_BUFLEN-1] = '\0';
 }
 
-void virMacAddrGenerate(const unsigned char *prefix,
-                        unsigned char *addr)
+void virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN],
+                        virMacAddrPtr addr)
 {
-    addr[0] = prefix[0];
-    addr[1] = prefix[1];
-    addr[2] = prefix[2];
-    addr[3] = virRandomBits(8);
-    addr[4] = virRandomBits(8);
-    addr[5] = virRandomBits(8);
+    addr->addr[0] = prefix[0];
+    addr->addr[1] = prefix[1];
+    addr->addr[2] = prefix[2];
+    addr->addr[3] = virRandomBits(8);
+    addr->addr[4] = virRandomBits(8);
+    addr->addr[5] = virRandomBits(8);
 }
 
 /* The low order bit of the first byte is the "multicast" bit. */
 bool
-virMacAddrIsMulticast(const unsigned char *addr)
+virMacAddrIsMulticast(const virMacAddrPtr mac)
 {
-    return !!(addr[0] & 1);
+    return !!(mac->addr[0] & 1);
 }
 
 bool
-virMacAddrIsUnicast(const unsigned char *addr)
+virMacAddrIsUnicast(const virMacAddrPtr mac)
 {
-    return !(addr[0] & 1);
+    return !(mac->addr[0] & 1);
 }
Index: libvirt-acl/src/util/virmacaddr.h
===================================================================
--- libvirt-acl.orig/src/util/virmacaddr.h
+++ libvirt-acl/src/util/virmacaddr.h
@@ -30,15 +30,26 @@
 # define VIR_MAC_PREFIX_BUFLEN 3
 # define VIR_MAC_STRING_BUFLEN (VIR_MAC_BUFLEN * 3)
 
-typedef unsigned char virMacAddr[VIR_MAC_BUFLEN];
+typedef struct _virMacAddr virMacAddr;
+typedef virMacAddr *virMacAddrPtr;
+
+struct _virMacAddr {
+    unsigned char addr[VIR_MAC_BUFLEN];
+};
 
 int virMacAddrCompare(const char *mac1, const char *mac2);
-void virMacAddrFormat(const unsigned char *addr,
+int virMacAddrCmp(const virMacAddrPtr mac1, const virMacAddrPtr mac2);
+int virMacAddrCmpRaw(const virMacAddrPtr mac1,
+                     const unsigned char s[VIR_MAC_BUFLEN]);
+void virMacAddrSet(virMacAddrPtr dst, const virMacAddrPtr src);
+void virMacAddrSetRaw(virMacAddrPtr dst, const unsigned char s[VIR_MAC_BUFLEN]);
+void virMacAddrGetRaw(virMacAddrPtr src, unsigned char dst[VIR_MAC_BUFLEN]);
+void virMacAddrFormat(const virMacAddrPtr addr,
                       char *str);
-void virMacAddrGenerate(const unsigned char *prefix,
-                        unsigned char *addr);
+void virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN],
+                        virMacAddrPtr addr);
 int virMacAddrParse(const char* str,
-                    unsigned char *addr) ATTRIBUTE_RETURN_CHECK;
-bool virMacAddrIsUnicast(const unsigned char *addr);
-bool virMacAddrIsMulticast(const unsigned char *addr);
+                    virMacAddrPtr addr) ATTRIBUTE_RETURN_CHECK;
+bool virMacAddrIsUnicast(const virMacAddrPtr addr);
+bool virMacAddrIsMulticast(const virMacAddrPtr addr);
 #endif /* __VIR_MACADDR_H__ */
Index: libvirt-acl/src/util/virnetdev.c
===================================================================
--- libvirt-acl.orig/src/util/virnetdev.c
+++ libvirt-acl/src/util/virnetdev.c
@@ -137,7 +137,7 @@ int virNetDevExists(const char *ifname)
 /**
  * virNetDevSetMAC:
  * @ifname: interface name to set MTU for
- * @macaddr: MAC address (VIR_MAC_BUFLEN in size)
+ * @macaddr: MAC address
  *
  * This function sets the @macaddr for a given interface @ifname. This
  * gets rid of the kernel's automatically assigned random MAC.
@@ -145,7 +145,7 @@ int virNetDevExists(const char *ifname)
  * Returns 0 in case of success or -1 on failure
  */
 int virNetDevSetMAC(const char *ifname,
-                    const unsigned char *macaddr)
+                    const virMacAddrPtr macaddr)
 {
     int fd = -1;
     int ret = -1;
@@ -162,7 +162,7 @@ int virNetDevSetMAC(const char *ifname,
         goto cleanup;
     }
 
-    memcpy(ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN);
+    virMacAddrGetRaw(macaddr, (unsigned char *)ifr.ifr_hwaddr.sa_data);
 
     if (ioctl(fd, SIOCSIFHWADDR, &ifr) < 0) {
         virReportSystemError(errno,
@@ -179,7 +179,7 @@ cleanup:
 }
 #else
 int virNetDevSetMAC(const char *ifname,
-                    const unsigned char *macaddr ATTRIBUTE_UNUSED)
+                    const virMacAddrPtr macaddr ATTRIBUTE_UNUSED)
 {
     virReportSystemError(ENOSYS,
                          _("Cannot set interface MAC on '%s'"),
@@ -193,14 +193,14 @@ int virNetDevSetMAC(const char *ifname,
 /**
  * virNetDevGetMAC:
  * @ifname: interface name to set MTU for
- * @macaddr: MAC address (VIR_MAC_BUFLEN in size)
+ * @macaddr: MAC address
  *
  * This function gets the @macaddr for a given interface @ifname.
  *
  * Returns 0 in case of success or -1 on failure
  */
 int virNetDevGetMAC(const char *ifname,
-                    unsigned char *macaddr)
+                    virMacAddrPtr macaddr)
 {
     int fd = -1;
     int ret = -1;
@@ -216,7 +216,7 @@ int virNetDevGetMAC(const char *ifname,
         goto cleanup;
     }
 
-    memcpy(macaddr, ifr.ifr_hwaddr.sa_data, VIR_MAC_BUFLEN);
+    virMacAddrSetRaw(macaddr, (unsigned char *)ifr.ifr_hwaddr.sa_data);
 
     ret = 0;
 
@@ -226,7 +226,7 @@ cleanup:
 }
 #else
 int virNetDevGetMAC(const char *ifname,
-                    unsigned char *macaddr ATTRIBUTE_UNUSED)
+                    virMacAddrPtr macaddr ATTRIBUTE_UNUSED)
 {
     virReportSystemError(ENOSYS,
                          _("Cannot get interface MAC on '%s'"),
@@ -248,14 +248,14 @@ int virNetDevGetMAC(const char *ifname,
  */
 int
 virNetDevReplaceMacAddress(const char *linkdev,
-                           const unsigned char *macaddress,
+                           const virMacAddrPtr macaddress,
                            const char *stateDir)
 {
-    unsigned char oldmac[6];
+    virMacAddr oldmac;
     char *path = NULL;
     char macstr[VIR_MAC_STRING_BUFLEN];
 
-    if (virNetDevGetMAC(linkdev, oldmac) < 0)
+    if (virNetDevGetMAC(linkdev, &oldmac) < 0)
         return -1;
 
 
@@ -265,7 +265,7 @@ virNetDevReplaceMacAddress(const char *l
         virReportOOMError();
         return -1;
     }
-    virMacAddrFormat(oldmac, macstr);
+    virMacAddrFormat(&oldmac, macstr);
     if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) {
         virReportSystemError(errno, _("Unable to preserve mac for %s"),
                              linkdev);
@@ -294,7 +294,7 @@ virNetDevRestoreMacAddress(const char *l
     char *oldmacname = NULL;
     char *macstr = NULL;
     char *path = NULL;
-    unsigned char oldmac[6];
+    virMacAddr oldmac;
 
     if (virAsprintf(&path, "%s/%s",
                     stateDir,
@@ -306,7 +306,7 @@ virNetDevRestoreMacAddress(const char *l
     if (virFileReadAll(path, VIR_MAC_STRING_BUFLEN, &macstr) < 0)
         return -1;
 
-    if (virMacAddrParse(macstr, &oldmac[0]) != 0) {
+    if (virMacAddrParse(macstr, &oldmac) != 0) {
         virNetDevError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot parse MAC address from '%s'"),
                        oldmacname);
@@ -315,7 +315,7 @@ virNetDevRestoreMacAddress(const char *l
     }
 
     /*reset mac and remove file-ignore results*/
-    rc = virNetDevSetMAC(linkdev, oldmac);
+    rc = virNetDevSetMAC(linkdev, &oldmac);
     ignore_value(unlink(path));
     VIR_FREE(macstr);
 
@@ -876,7 +876,7 @@ int virNetDevGetIPv4Address(const char *
  */
 #if defined(HAVE_STRUCT_IFREQ)
 int virNetDevValidateConfig(const char *ifname,
-                            const unsigned char *macaddr, int ifindex)
+                            const virMacAddrPtr macaddr, int ifindex)
 {
     int fd = -1;
     int ret = -1;
@@ -906,7 +906,8 @@ int virNetDevValidateConfig(const char *
             goto cleanup;
         }
 
-        if (memcmp(&ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN) != 0) {
+        if (virMacAddrCmpRaw(macaddr,
+                             (unsigned char *)ifr.ifr_hwaddr.sa_data) != 0) {
             ret = 0;
             goto cleanup;
         }
@@ -1333,7 +1334,7 @@ buffer_too_small:
 
 static int
 virNetDevSetVfConfig(const char *ifname, int ifindex, int vf,
-                     bool nltarget_kernel, const unsigned char *macaddr,
+                     bool nltarget_kernel, const virMacAddrPtr macaddr,
                      int vlanid, uint32_t (*getPidFunc)(void))
 {
     int rc = -1;
@@ -1378,7 +1379,7 @@ virNetDevSetVfConfig(const char *ifname,
              .mac = { 0, },
         };
 
-        memcpy(ifla_vf_mac.mac, macaddr, VIR_MAC_BUFLEN);
+        virMacAddrGetRaw(macaddr, ifla_vf_mac.mac);
 
         if (nla_put(nl_msg, IFLA_VF_MAC, sizeof(ifla_vf_mac),
                     &ifla_vf_mac) < 0)
@@ -1456,7 +1457,7 @@ buffer_too_small:
 }
 
 static int
-virNetDevParseVfConfig(struct nlattr **tb, int32_t vf, unsigned char *mac,
+virNetDevParseVfConfig(struct nlattr **tb, int32_t vf, virMacAddrPtr mac,
                        int *vlanid)
 {
     const char *msg = NULL;
@@ -1483,7 +1484,7 @@ virNetDevParseVfConfig(struct nlattr **t
             if (tb[IFLA_VF_MAC]) {
                 vf_mac = RTA_DATA(tb_vf[IFLA_VF_MAC]);
                 if (vf_mac && vf_mac->vf == vf)  {
-                    memcpy(mac, vf_mac->mac, VIR_MAC_BUFLEN);
+                    virMacAddrSetRaw(mac, vf_mac->mac);
                     found = 1;
                 }
             }
@@ -1510,7 +1511,7 @@ cleanup:
 }
 
 static int
-virNetDevGetVfConfig(const char *ifname, int vf, unsigned char *mac,
+virNetDevGetVfConfig(const char *ifname, int vf, virMacAddrPtr mac,
                      int *vlanid)
 {
     int rc = -1;
@@ -1531,17 +1532,17 @@ virNetDevGetVfConfig(const char *ifname,
 
 static int
 virNetDevReplaceVfConfig(const char *pflinkdev, int vf,
-                         const unsigned char *macaddress,
+                         const virMacAddrPtr macaddress,
                          int vlanid,
                          const char *stateDir)
 {
-    unsigned char oldmac[6];
+    virMacAddr oldmac;
     int oldvlanid = -1;
     char *path = NULL;
     char macstr[VIR_MAC_STRING_BUFLEN];
     int ifindex = -1;
 
-    if (virNetDevGetVfConfig(pflinkdev, vf, oldmac, &oldvlanid) < 0)
+    if (virNetDevGetVfConfig(pflinkdev, vf, &oldmac, &oldvlanid) < 0)
         return -1;
 
     if (virAsprintf(&path, "%s/%s_vf%d",
@@ -1550,7 +1551,7 @@ virNetDevReplaceVfConfig(const char *pfl
         return -1;
     }
 
-    virMacAddrFormat(oldmac, macstr);
+    virMacAddrFormat(&oldmac, macstr);
     if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) {
         virReportSystemError(errno, _("Unable to preserve mac for pf = %s,"
                              " vf = %d"), pflinkdev, vf);
@@ -1571,7 +1572,7 @@ virNetDevRestoreVfConfig(const char *pfl
     int rc = -1;
     char *macstr = NULL;
     char *path = NULL;
-    unsigned char oldmac[6];
+    virMacAddr oldmac;
     int vlanid = -1;
     int ifindex = -1;
 
@@ -1585,7 +1586,7 @@ virNetDevRestoreVfConfig(const char *pfl
         goto cleanup;
     }
 
-    if (virMacAddrParse(macstr, &oldmac[0]) != 0) {
+    if (virMacAddrParse(macstr, &oldmac) != 0) {
         virNetDevError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot parse MAC address from '%s'"),
                        macstr);
@@ -1594,7 +1595,7 @@ virNetDevRestoreVfConfig(const char *pfl
 
     /*reset mac and remove file-ignore results*/
     rc = virNetDevSetVfConfig(pflinkdev, ifindex, vf, true,
-                              oldmac, vlanid, NULL);
+                              &oldmac, vlanid, NULL);
     ignore_value(unlink(path));
 
 cleanup:
@@ -1617,7 +1618,7 @@ cleanup:
  */
 int
 virNetDevReplaceNetConfig(char *linkdev, int vf,
-                          const unsigned char *macaddress, int vlanid,
+                          const virMacAddrPtr macaddress, int vlanid,
                           char *stateDir)
 {
     if (vf == -1)
Index: libvirt-acl/src/util/virnetdev.h
===================================================================
--- libvirt-acl.orig/src/util/virnetdev.h
+++ libvirt-acl/src/util/virnetdev.h
@@ -25,6 +25,7 @@
 
 # include "virsocketaddr.h"
 # include "virnetlink.h"
+# include "virmacaddr.h"
 
 int virNetDevExists(const char *brname)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
@@ -49,14 +50,14 @@ int virNetDevGetIPv4Address(const char *
 
 
 int virNetDevSetMAC(const char *ifname,
-                    const unsigned char *macaddr)
+                    const virMacAddrPtr macaddr)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 int virNetDevGetMAC(const char *ifname,
-                    unsigned char *macaddr)
+                    virMacAddrPtr macaddr)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevReplaceMacAddress(const char *linkdev,
-                               const unsigned char *macaddress,
+                               const virMacAddrPtr macaddress,
                                const char *stateDir)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
     ATTRIBUTE_RETURN_CHECK;
@@ -86,7 +87,7 @@ int virNetDevGetVLanID(const char *ifnam
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevValidateConfig(const char *ifname,
-                            const unsigned char *macaddr, int ifindex)
+                            const virMacAddrPtr macaddr, int ifindex)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevIsVirtualFunction(const char *ifname)
@@ -113,7 +114,7 @@ int virNetDevLinkDump(const char *ifname
     ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevReplaceNetConfig(char *linkdev, int vf,
-                              const unsigned char *macaddress, int vlanid,
+                              const virMacAddrPtr macaddress, int vlanid,
                               char *stateDir)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(5);
 
Index: libvirt-acl/src/util/virnetdevmacvlan.c
===================================================================
--- libvirt-acl.orig/src/util/virnetdevmacvlan.c
+++ libvirt-acl/src/util/virnetdevmacvlan.c
@@ -95,7 +95,7 @@ VIR_ENUM_IMPL(virNetDevMacVLanMode, VIR_
 int
 virNetDevMacVLanCreate(const char *ifname,
                        const char *type,
-                       const unsigned char *macaddress,
+                       const virMacAddrPtr macaddress,
                        const char *srcdev,
                        uint32_t macvlan_mode,
                        int *retry)
@@ -435,7 +435,7 @@ static const uint32_t modeMap[VIR_NETDEV
 struct virNetlinkCallbackData {
     char *cr_ifname;
     virNetDevVPortProfilePtr virtPortProfile;
-    unsigned char macaddress[VIR_MAC_BUFLEN];
+    virMacAddr macaddress;
     char *linkdev;
     int vf;
     unsigned char vmuuid[VIR_UUID_BUFLEN];
@@ -589,13 +589,13 @@ virNetDevMacVLanVPortProfileCallback(uns
             VIR_DEBUG("IFLA_VF_MAC = %2x:%2x:%2x:%2x:%2x:%2x",
                       m[0], m[1], m[2], m[3], m[4], m[5]);
 
-            if (memcmp(calld->macaddress, m, VIR_MAC_BUFLEN))
+            if (virMacAddrCmpRaw(&calld->macaddress, mac->mac))
             {
                 /* Repeat the same check for a broadcast mac */
                 int i;
 
                 for (i = 0;i < VIR_MAC_BUFLEN; i++) {
-                    if (calld->macaddress[i] != 0xff) {
+                    if (calld->macaddress.addr[i] != 0xff) {
                         VIR_DEBUG("MAC address match failed (wasn't broadcast)");
                         return;
                     }
@@ -697,13 +697,13 @@ virNetDevMacVLanVPortProfileCallback(uns
     VIR_INFO("  if: %s", calld->cr_ifname);
     VIR_INFO("  lf: %s", calld->linkdev);
     VIR_INFO(" mac: %02x:%02x:%02x:%02x:%02x:%02x",
-             calld->macaddress[0], calld->macaddress[1],
-             calld->macaddress[2], calld->macaddress[3],
-             calld->macaddress[4], calld->macaddress[5]);
+             calld->macaddress.addr[0], calld->macaddress.addr[1],
+             calld->macaddress.addr[2], calld->macaddress.addr[3],
+             calld->macaddress.addr[4], calld->macaddress.addr[5]);
 
     ignore_value(virNetDevVPortProfileAssociate(calld->cr_ifname,
                                                 calld->virtPortProfile,
-                                                calld->macaddress,
+                                                &calld->macaddress,
                                                 calld->linkdev,
                                                 calld->vf,
                                                 calld->vmuuid,
@@ -746,7 +746,7 @@ virNetlinkCallbackDataFree(virNetlinkCal
  */
 static void
 virNetDevMacVLanVPortProfileDestroyCallback(int watch ATTRIBUTE_UNUSED,
-                                            const unsigned char *macaddr ATTRIBUTE_UNUSED,
+                                            const virMacAddrPtr macaddr ATTRIBUTE_UNUSED,
                                             void *opaque)
 {
     virNetlinkCallbackDataFree((virNetlinkCallbackDataPtr)opaque);
@@ -754,7 +754,7 @@ virNetDevMacVLanVPortProfileDestroyCallb
 
 int
 virNetDevMacVLanVPortProfileRegisterCallback(const char *ifname,
-                                             const unsigned char *macaddress,
+                                             const virMacAddrPtr macaddress,
                                              const char *linkdev,
                                              const unsigned char *vmuuid,
                                              virNetDevVPortProfilePtr virtPortProfile,
@@ -770,7 +770,7 @@ virNetDevMacVLanVPortProfileRegisterCall
         if (VIR_ALLOC(calld->virtPortProfile) < 0)
             goto memory_error;
         memcpy(calld->virtPortProfile, virtPortProfile, sizeof(*virtPortProfile));
-        memcpy(calld->macaddress, macaddress, sizeof(calld->macaddress));
+        virMacAddrSet(&calld->macaddress, macaddress);
         if ((calld->linkdev = strdup(linkdev)) == NULL)
             goto  memory_error;
         memcpy(calld->vmuuid, vmuuid, sizeof(calld->vmuuid));
@@ -813,7 +813,7 @@ error:
  * otherwise returns 0; returns -1 on error.
  */
 int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
-                                           const unsigned char *macaddress,
+                                           const virMacAddrPtr macaddress,
                                            const char *linkdev,
                                            enum virNetDevMacVLanMode mode,
                                            bool withTap,
@@ -980,7 +980,7 @@ link_del_exit:
  * were provided.
  */
 int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
-                                           const unsigned char *macaddr,
+                                           const virMacAddrPtr macaddr,
                                            const char *linkdev,
                                            int mode,
                                            virNetDevVPortProfilePtr virtPortProfile,
@@ -1025,7 +1025,7 @@ int virNetDevMacVLanDeleteWithVPortProfi
  * Returns 0; returns -1 on error.
  */
 int virNetDevMacVLanRestartWithVPortProfile(const char *cr_ifname,
-                                           const unsigned char *macaddress,
+                                           const virMacAddrPtr macaddress,
                                            const char *linkdev,
                                            const unsigned char *vmuuid,
                                            virNetDevVPortProfilePtr virtPortProfile,
@@ -1055,7 +1055,7 @@ error:
 #else /* ! WITH_MACVTAP */
 int virNetDevMacVLanCreate(const char *ifname ATTRIBUTE_UNUSED,
                            const char *type ATTRIBUTE_UNUSED,
-                           const unsigned char *macaddress ATTRIBUTE_UNUSED,
+                           const virMacAddrPtr macaddress ATTRIBUTE_UNUSED,
                            const char *srcdev ATTRIBUTE_UNUSED,
                            uint32_t macvlan_mode ATTRIBUTE_UNUSED,
                            int *retry ATTRIBUTE_UNUSED)
@@ -1073,7 +1073,7 @@ int virNetDevMacVLanDelete(const char *i
 }
 
 int virNetDevMacVLanCreateWithVPortProfile(const char *ifname ATTRIBUTE_UNUSED,
-                                           const unsigned char *macaddress ATTRIBUTE_UNUSED,
+                                           const virMacAddrPtr macaddress ATTRIBUTE_UNUSED,
                                            const char *linkdev ATTRIBUTE_UNUSED,
                                            enum virNetDevMacVLanMode mode ATTRIBUTE_UNUSED,
                                            bool withTap ATTRIBUTE_UNUSED,
@@ -1091,7 +1091,7 @@ int virNetDevMacVLanCreateWithVPortProfi
 }
 
 int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname ATTRIBUTE_UNUSED,
-                                           const unsigned char *macaddress ATTRIBUTE_UNUSED,
+                                           const virMacAddrPtr macaddress ATTRIBUTE_UNUSED,
                                            const char *linkdev ATTRIBUTE_UNUSED,
                                            int mode ATTRIBUTE_UNUSED,
                                            virNetDevVPortProfilePtr virtPortProfile ATTRIBUTE_UNUSED,
@@ -1103,7 +1103,7 @@ int virNetDevMacVLanDeleteWithVPortProfi
 }
 
 int virNetDevMacVLanRestartWithVPortProfile(const char *cr_ifname ATTRIBUTE_UNUSED,
-                                           const unsigned char *macaddress ATTRIBUTE_UNUSED,
+                                           const virMacAddrPtr macaddress ATTRIBUTE_UNUSED,
                                            const char *linkdev ATTRIBUTE_UNUSED,
                                            const unsigned char *vmuuid ATTRIBUTE_UNUSED,
                                            virNetDevVPortProfilePtr virtPortProfile ATTRIBUTE_UNUSED,
@@ -1115,7 +1115,7 @@ int virNetDevMacVLanRestartWithVPortProf
 }
 
 int virNetDevMacVLanVPortProfileRegisterCallback(const char *ifname ATTRIBUTE_UNUSED,
-                                             const unsigned char *macaddress ATTRIBUTE_UNUSED,
+                                             const virMacAddrPtr macaddress ATTRIBUTE_UNUSED,
                                              const char *linkdev ATTRIBUTE_UNUSED,
                                              const unsigned char *vmuuid ATTRIBUTE_UNUSED,
                                              virNetDevVPortProfilePtr virtPortProfile ATTRIBUTE_UNUSED,
Index: libvirt-acl/src/util/virnetdevmacvlan.h
===================================================================
--- libvirt-acl.orig/src/util/virnetdevmacvlan.h
+++ libvirt-acl/src/util/virnetdevmacvlan.h
@@ -24,6 +24,7 @@
 # define __UTIL_MACVTAP_H__
 
 # include "internal.h"
+# include "virmacaddr.h"
 # include "virsocketaddr.h"
 # include "virnetdevbandwidth.h"
 # include "virnetdevvportprofile.h"
@@ -41,7 +42,7 @@ VIR_ENUM_DECL(virNetDevMacVLanMode)
 
 int virNetDevMacVLanCreate(const char *ifname,
                            const char *type,
-                           const unsigned char *macaddress,
+                           const virMacAddrPtr macaddress,
                            const char *srcdev,
                            uint32_t macvlan_mode,
                            int *retry)
@@ -52,7 +53,7 @@ int virNetDevMacVLanDelete(const char *i
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevMacVLanCreateWithVPortProfile(const char *ifname,
-                                           const unsigned char *macaddress,
+                                           const virMacAddrPtr macaddress,
                                            const char *linkdev,
                                            enum virNetDevMacVLanMode mode,
                                            bool withTap,
@@ -67,7 +68,7 @@ int virNetDevMacVLanCreateWithVPortProfi
     ATTRIBUTE_NONNULL(9) ATTRIBUTE_NONNULL(11) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
-                                           const unsigned char *macaddress,
+                                           const virMacAddrPtr macaddress,
                                            const char *linkdev,
                                            int mode,
                                            virNetDevVPortProfilePtr virtPortProfile,
@@ -76,7 +77,7 @@ int virNetDevMacVLanDeleteWithVPortProfi
     ATTRIBUTE_NONNULL(6) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevMacVLanRestartWithVPortProfile(const char *cr_ifname,
-                                           const unsigned char *macaddress,
+                                           const virMacAddrPtr macaddress,
                                            const char *linkdev,
                                            const unsigned char *vmuuid,
                                            virNetDevVPortProfilePtr virtPortProfile,
@@ -85,7 +86,7 @@ int virNetDevMacVLanRestartWithVPortProf
     ATTRIBUTE_NONNULL(4) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevMacVLanVPortProfileRegisterCallback(const char *ifname,
-                                             const unsigned char *macaddress ,
+                                             const virMacAddrPtr macaddress ,
                                              const char *linkdev,
                                              const unsigned char *vmuuid,
                                              virNetDevVPortProfilePtr virtPortProfile,
Index: libvirt-acl/src/util/virnetdevvportprofile.h
===================================================================
--- libvirt-acl.orig/src/util/virnetdevvportprofile.h
+++ libvirt-acl/src/util/virnetdevvportprofile.h
@@ -28,6 +28,7 @@
 # include "internal.h"
 # include "uuid.h"
 # include "util.h"
+# include "virmacaddr.h"
 
 # define LIBVIRT_IFLA_VF_PORT_PROFILE_MAX 40
 
@@ -83,7 +84,7 @@ bool virNetDevVPortProfileEqual(virNetDe
 
 int virNetDevVPortProfileAssociate(const char *ifname,
                                    const virNetDevVPortProfilePtr virtPort,
-                                   const unsigned char *macaddr,
+                                   const virMacAddrPtr macaddr,
                                    const char *linkdev,
                                    int vf,
                                    const unsigned char *vmuuid,
@@ -94,7 +95,7 @@ int virNetDevVPortProfileAssociate(const
 
 int virNetDevVPortProfileDisassociate(const char *ifname,
                                       const virNetDevVPortProfilePtr virtPort,
-                                      const unsigned char *macaddr,
+                                      const virMacAddrPtr macaddr,
                                       const char *linkdev,
                                       int vf,
                                       enum virNetDevVPortProfileOp vmOp)
Index: libvirt-acl/src/util/virnetlink.c
===================================================================
--- libvirt-acl.orig/src/util/virnetlink.c
+++ libvirt-acl/src/util/virnetlink.c
@@ -56,7 +56,7 @@ struct virNetlinkEventHandle {
     virNetlinkEventHandleCallback handleCB;
     virNetlinkEventRemoveCallback removeCB;
     void *opaque;
-    unsigned char macaddr[VIR_MAC_BUFLEN];
+    virMacAddr macaddr;
     int deleted;
 };
 
@@ -278,7 +278,7 @@ virNetlinkEventRemoveClientPrimitive(siz
 
     if (removeCB) {
         (removeCB)(server->handles[i].watch,
-                   server->handles[i].macaddr,
+                   &server->handles[i].macaddr,
                    server->handles[i].opaque);
     }
     server->handles[i].deleted = VIR_NETLINK_HANDLE_DELETED;
@@ -506,7 +506,7 @@ error_locked:
 int
 virNetlinkEventAddClient(virNetlinkEventHandleCallback handleCB,
                          virNetlinkEventRemoveCallback removeCB,
-                         void *opaque, const unsigned char *macaddr)
+                         void *opaque, const virMacAddrPtr macaddr)
 {
     int i, r, ret = -1;
     virNetlinkEventSrvPrivatePtr srv = server;
@@ -548,9 +548,10 @@ addentry:
     srv->handles[r].opaque   = opaque;
     srv->handles[r].deleted  = VIR_NETLINK_HANDLE_VALID;
     if (macaddr)
-        memcpy(srv->handles[r].macaddr, macaddr, VIR_MAC_BUFLEN);
+        virMacAddrSet(&srv->handles[r].macaddr, macaddr);
     else
-        memset(srv->handles[r].macaddr, 0, VIR_MAC_BUFLEN);
+        virMacAddrSetRaw(&srv->handles[r].macaddr,
+                         (unsigned char[VIR_MAC_BUFLEN]){0,0,0,0,0,0});
 
     VIR_DEBUG("added client to loop slot: %d. with macaddr ptr=%p", r, macaddr);
 
@@ -573,7 +574,7 @@ error:
  * Returns -1 if the file handle was not registered, 0 upon success
  */
 int
-virNetlinkEventRemoveClient(int watch, const unsigned char *macaddr)
+virNetlinkEventRemoveClient(int watch, const virMacAddrPtr macaddr)
 {
     int i;
     int ret = -1;
@@ -594,7 +595,7 @@ virNetlinkEventRemoveClient(int watch, c
 
         if ((watch && srv->handles[i].watch == watch) ||
             (!watch &&
-             memcmp(macaddr, srv->handles[i].macaddr, VIR_MAC_BUFLEN) == 0)) {
+             virMacAddrCmp(macaddr, &srv->handles[i].macaddr) == 0)) {
 
             VIR_DEBUG("removed client: %d by %s.",
                       srv->handles[i].watch, watch ? "index" : "mac");
Index: libvirt-acl/src/util/virnetlink.h
===================================================================
--- libvirt-acl.orig/src/util/virnetlink.h
+++ libvirt-acl/src/util/virnetlink.h
@@ -22,6 +22,7 @@
 
 # include "config.h"
 # include "internal.h"
+# include "virmacaddr.h"
 
 # include <stdint.h>
 
@@ -46,7 +47,7 @@ int virNetlinkCommand(struct nl_msg *nl_
 
 typedef void (*virNetlinkEventHandleCallback)(unsigned char *msg, int length, struct sockaddr_nl *peer, bool *handled, void *opaque);
 
-typedef void (*virNetlinkEventRemoveCallback)(int watch, const unsigned char *macaddr, void *opaque);
+typedef void (*virNetlinkEventRemoveCallback)(int watch, const virMacAddrPtr macaddr, void *opaque);
 
 /**
  * stopNetlinkEventServer: stop the monitor to receive netlink messages for libvirtd
@@ -73,11 +74,11 @@ int virNetlinkEventServiceLocalPid(void)
  */
 int virNetlinkEventAddClient(virNetlinkEventHandleCallback handleCB,
                              virNetlinkEventRemoveCallback removeCB,
-                             void *opaque, const unsigned char *macaddr);
+                             void *opaque, const virMacAddrPtr macaddr);
 
 /**
  * virNetlinkEventRemoveClient: unregister a callback from a netlink monitor
  */
-int virNetlinkEventRemoveClient(int watch, const unsigned char *macaddr);
+int virNetlinkEventRemoveClient(int watch, const virMacAddrPtr macaddr);
 
 #endif /* __VIR_NETLINK_H__ */
Index: libvirt-acl/src/conf/capabilities.c
===================================================================
--- libvirt-acl.orig/src/conf/capabilities.c
+++ libvirt-acl/src/conf/capabilities.c
@@ -859,14 +859,14 @@ virCapabilitiesFormatXML(virCapsPtr caps
 
 extern void
 virCapabilitiesSetMacPrefix(virCapsPtr caps,
-                            unsigned char *prefix)
+                            const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN])
 {
     memcpy(caps->macPrefix, prefix, sizeof(caps->macPrefix));
 }
 
 extern void
 virCapabilitiesGenerateMac(virCapsPtr caps,
-                           unsigned char *mac)
+                           virMacAddrPtr mac)
 {
     virMacAddrGenerate(caps->macPrefix, mac);
 }
Index: libvirt-acl/src/conf/capabilities.h
===================================================================
--- libvirt-acl.orig/src/conf/capabilities.h
+++ libvirt-acl/src/conf/capabilities.h
@@ -172,11 +172,11 @@ virCapabilitiesFreeNUMAInfo(virCapsPtr c
 
 extern void
 virCapabilitiesSetMacPrefix(virCapsPtr caps,
-                            unsigned char *prefix);
+                            const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN]);
 
 extern void
 virCapabilitiesGenerateMac(virCapsPtr caps,
-                           unsigned char *mac);
+                           virMacAddrPtr mac);
 
 extern void
 virCapabilitiesSetEmulatorRequired(virCapsPtr caps);
Index: libvirt-acl/src/conf/domain_audit.c
===================================================================
--- libvirt-acl.orig/src/conf/domain_audit.c
+++ libvirt-acl/src/conf/domain_audit.c
@@ -160,9 +160,9 @@ virDomainAuditNet(virDomainObjPtr vm,
 
     virUUIDFormat(vm->def->uuid, uuidstr);
     if (oldDef)
-        virMacAddrFormat(oldDef->mac, oldMacstr);
+        virMacAddrFormat(&oldDef->mac, oldMacstr);
     if (newDef)
-        virMacAddrFormat(newDef->mac, newMacstr);
+        virMacAddrFormat(&newDef->mac, newMacstr);
     if (!(vmname = virAuditEncode("vm", vm->def->name))) {
         VIR_WARN("OOM while encoding audit message");
         return;
@@ -206,7 +206,7 @@ virDomainAuditNetDevice(virDomainDefPtr
     const char *virt;
 
     virUUIDFormat(vmDef->uuid, uuidstr);
-    virMacAddrFormat(netDef->mac, macstr);
+    virMacAddrFormat(&netDef->mac, macstr);
     rdev = virDomainAuditGetRdev(device);
 
     if (!(vmname = virAuditEncode("vm", vmDef->name)) ||
Index: libvirt-acl/src/conf/domain_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/domain_conf.c
+++ libvirt-acl/src/conf/domain_conf.c
@@ -4641,20 +4641,20 @@ virDomainNetDefParseXML(virCapsPtr caps,
     }
 
     if (macaddr) {
-        if (virMacAddrParse((const char *)macaddr, def->mac) < 0) {
+        if (virMacAddrParse((const char *)macaddr, &def->mac) < 0) {
             virDomainReportError(VIR_ERR_XML_ERROR,
                                  _("unable to parse mac address '%s'"),
                                  (const char *)macaddr);
             goto error;
         }
-        if (virMacAddrIsMulticast(def->mac)) {
+        if (virMacAddrIsMulticast(&def->mac)) {
             virDomainReportError(VIR_ERR_XML_ERROR,
                                  _("expected unicast mac address, found multicast '%s'"),
                                  (const char *)macaddr);
             goto error;
         }
     } else {
-        virCapabilitiesGenerateMac(caps, def->mac);
+        virCapabilitiesGenerateMac(caps, &def->mac);
     }
 
     if (devaddr) {
@@ -7443,12 +7443,12 @@ int virDomainNetInsert(virDomainDefPtr d
     return 0;
 }
 
-int virDomainNetIndexByMac(virDomainDefPtr def, const unsigned char *mac)
+int virDomainNetIndexByMac(virDomainDefPtr def, const virMacAddrPtr mac)
 {
     int i;
 
     for (i = 0; i < def->nnets; i++)
-        if (!memcmp(def->nets[i]->mac, mac, VIR_MAC_BUFLEN))
+        if (!virMacAddrCmp(&def->nets[i]->mac, mac))
             return i;
     return -1;
 }
@@ -7489,7 +7489,7 @@ virDomainNetRemove(virDomainDefPtr def,
 }
 
 virDomainNetDefPtr
-virDomainNetRemoveByMac(virDomainDefPtr def, const unsigned char *mac)
+virDomainNetRemoveByMac(virDomainDefPtr def, const virMacAddrPtr mac)
 {
     int i = virDomainNetIndexByMac(def, mac);
 
@@ -9712,14 +9712,14 @@ static bool virDomainNetDefCheckABIStabi
 {
     bool identical = false;
 
-    if (memcmp(src->mac, dst->mac, VIR_MAC_BUFLEN) != 0) {
+    if (virMacAddrCmp(&src->mac, &dst->mac) != 0) {
         virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                              _("Target network card mac %02x:%02x:%02x:%02x:%02x:%02x"
                                "does not match source %02x:%02x:%02x:%02x:%02x:%02x"),
-                             dst->mac[0], dst->mac[1], dst->mac[2],
-                             dst->mac[3], dst->mac[4], dst->mac[5],
-                             src->mac[0], src->mac[1], src->mac[2],
-                             src->mac[3], src->mac[4], src->mac[5]);
+                             dst->mac.addr[0], dst->mac.addr[1], dst->mac.addr[2],
+                             dst->mac.addr[3], dst->mac.addr[4], dst->mac.addr[5],
+                             src->mac.addr[0], src->mac.addr[1], src->mac.addr[2],
+                             src->mac.addr[3], src->mac.addr[4], src->mac.addr[5]);
         goto cleanup;
     }
 
@@ -11575,8 +11575,8 @@ virDomainNetDefFormat(virBufferPtr buf,
 
     virBufferAsprintf(buf,
                       "      <mac address='%02x:%02x:%02x:%02x:%02x:%02x'/>\n",
-                      def->mac[0], def->mac[1], def->mac[2],
-                      def->mac[3], def->mac[4], def->mac[5]);
+                      def->mac.addr[0], def->mac.addr[1], def->mac.addr[2],
+                      def->mac.addr[3], def->mac.addr[4], def->mac.addr[5]);
 
     switch (def->type) {
     case VIR_DOMAIN_NET_TYPE_NETWORK:
@@ -15146,15 +15146,15 @@ virDomainNetFind(virDomainDefPtr def, co
 {
     bool isMac = false;
     virDomainNetDefPtr net = NULL;
-    unsigned char mac[VIR_MAC_BUFLEN];
+    virMacAddr mac;
     int i;
 
-    if (virMacAddrParse(device, mac) == 0)
+    if (virMacAddrParse(device, &mac) == 0)
         isMac = true;
 
     if (isMac) {
         for (i = 0; i < def->nnets; i++) {
-            if (memcmp(mac, def->nets[i]->mac, VIR_MAC_BUFLEN) == 0) {
+            if (virMacAddrCmp(&mac, &def->nets[i]->mac) == 0) {
                 net = def->nets[i];
                 break;
             }
Index: libvirt-acl/src/conf/network_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/network_conf.c
+++ libvirt-acl/src/conf/network_conf.c
@@ -420,19 +420,19 @@ virNetworkDHCPRangeDefParseXML(const cha
         } else if (cur->type == XML_ELEMENT_NODE &&
             xmlStrEqual(cur->name, BAD_CAST "host")) {
             char *mac = NULL, *name = NULL, *ip;
-            unsigned char addr[6];
+            virMacAddr addr;
             virSocketAddr inaddr;
 
             mac = virXMLPropString(cur, "mac");
             if (mac != NULL) {
-                if (virMacAddrParse(mac, &addr[0]) < 0) {
+                if (virMacAddrParse(mac, &addr) < 0) {
                     virNetworkReportError(VIR_ERR_XML_ERROR,
                                           _("Cannot parse MAC address '%s' in network '%s'"),
                                           mac, networkName);
                     VIR_FREE(mac);
                     return -1;
                 }
-                if (virMacAddrIsMulticast(addr)) {
+                if (virMacAddrIsMulticast(&addr)) {
                     virNetworkReportError(VIR_ERR_XML_ERROR,
                                          _("expected unicast mac address, found multicast '%s' in network '%s'"),
                                          (const char *)mac, networkName);
@@ -989,14 +989,14 @@ virNetworkDefParseXML(xmlXPathContextPtr
 
     tmp = virXPathString("string(./mac[1]/@address)", ctxt);
     if (tmp) {
-        if (virMacAddrParse(tmp, def->mac) < 0) {
+        if (virMacAddrParse(tmp, &def->mac) < 0) {
             virNetworkReportError(VIR_ERR_XML_ERROR,
                                   _("Invalid bridge mac address '%s' in network '%s'"),
                                   tmp, def->name);
             VIR_FREE(tmp);
             goto error;
         }
-        if (virMacAddrIsMulticast(def->mac)) {
+        if (virMacAddrIsMulticast(&def->mac)) {
             virNetworkReportError(VIR_ERR_XML_ERROR,
                                  _("Invalid multicast bridge mac address '%s' in network '%s'"),
                                  tmp, def->name);
@@ -1520,7 +1520,7 @@ char *virNetworkDefFormat(const virNetwo
 
     if (def->mac_specified) {
         char macaddr[VIR_MAC_STRING_BUFLEN];
-        virMacAddrFormat(def->mac, macaddr);
+        virMacAddrFormat(&def->mac, macaddr);
         virBufferAsprintf(&buf, "  <mac address='%s'/>\n", macaddr);
     }
 
@@ -1848,7 +1848,7 @@ void virNetworkSetBridgeMacAddr(virNetwo
          * autogenerate a random one.
          */
         virMacAddrGenerate((unsigned char[]){ 0x52, 0x54, 0 },
-                           def->mac);
+                           &def->mac);
         def->mac_specified = true;
     }
 }
Index: libvirt-acl/src/conf/network_conf.h
===================================================================
--- libvirt-acl.orig/src/conf/network_conf.h
+++ libvirt-acl/src/conf/network_conf.h
@@ -154,7 +154,7 @@ struct _virNetworkDef {
     char *domain;
     unsigned long delay;   /* Bridge forward delay (ms) */
     unsigned int stp :1; /* Spanning tree protocol */
-    unsigned char mac[VIR_MAC_BUFLEN]; /* mac address of bridge device */
+    virMacAddr mac; /* mac address of bridge device */
     bool mac_specified;
 
     int forwardType;    /* One of virNetworkForwardType constants */
Index: libvirt-acl/src/conf/nwfilter_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/nwfilter_conf.c
+++ libvirt-acl/src/conf/nwfilter_conf.c
@@ -1775,15 +1775,6 @@ static const virAttributes virAttr[] = {
     PROTOCOL_ENTRY_LAST
 };
 
-
-static int
-virNWMACAddressParser(const char *input,
-                      nwMACAddressPtr output)
-{
-    return virMacAddrParse(input, &output->addr[0]);
-}
-
-
 static int
 virNWFilterRuleDetailsParse(xmlNodePtr node,
                             virNWFilterRuleDefPtr nwf,
@@ -1916,8 +1907,8 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
                         break;
 
                         case DATATYPE_MACADDR:
-                            if (virNWMACAddressParser(prop,
-                                                      &item->u.macaddr) < 0) {
+                            if (virMacAddrParse(prop,
+                                                &item->u.macaddr) < 0) {
                                 rc = -1;
                             }
                             found = 1;
@@ -1925,8 +1916,8 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
 
                         case DATATYPE_MACMASK:
                             validator = checkMACMask;
-                            if (virNWMACAddressParser(prop,
-                                                      &item->u.macaddr) < 0) {
+                            if (virMacAddrParse(prop,
+                                                &item->u.macaddr) < 0) {
                                 rc = -1;
                             }
                             data.v = &item->u.macaddr;
Index: libvirt-acl/src/conf/nwfilter_conf.h
===================================================================
--- libvirt-acl.orig/src/conf/nwfilter_conf.h
+++ libvirt-acl/src/conf/nwfilter_conf.h
@@ -36,6 +36,7 @@
 # include "xml.h"
 # include "buf.h"
 # include "virsocketaddr.h"
+# include "virmacaddr.h"
 
 /* XXX
  * The config parser/structs should not be using platform specific
@@ -113,13 +114,6 @@ enum attrDatatype {
 # define NWFILTER_MAC_BGA "01:80:c2:00:00:00"
 
 
-typedef struct _nwMACAddress nwMACAddress;
-typedef nwMACAddress *nwMACAddressPtr;
-struct _nwMACAddress {
-    unsigned char addr[6];
-};
-
-
 typedef struct _nwItemDesc nwItemDesc;
 typedef nwItemDesc *nwItemDescPtr;
 struct _nwItemDesc {
@@ -127,7 +121,7 @@ struct _nwItemDesc {
     virNWFilterVarAccessPtr varAccess;
     enum attrDatatype datatype;
     union {
-        nwMACAddress macaddr;
+        virMacAddr macaddr;
         virSocketAddr ipaddr;
         bool         boolean;
         uint8_t      u8;
@@ -633,10 +627,10 @@ typedef int (*virNWFilterRuleDisplayInst
 typedef int (*virNWFilterCanApplyBasicRules)(void);
 
 typedef int (*virNWFilterApplyBasicRules)(const char *ifname,
-                                          const unsigned char *macaddr);
+                                          const virMacAddrPtr macaddr);
 
 typedef int (*virNWFilterApplyDHCPOnlyRules)(const char *ifname,
-                                             const unsigned char *macaddr,
+                                             const virMacAddrPtr macaddr,
                                              virNWFilterVarValuePtr dhcpsrvs,
                                              bool leaveTemporary);
 
Index: libvirt-acl/src/conf/nwfilter_params.h
===================================================================
--- libvirt-acl.orig/src/conf/nwfilter_params.h
+++ libvirt-acl/src/conf/nwfilter_params.h
@@ -25,6 +25,7 @@
 
 # include "virhash.h"
 # include "buf.h"
+# include "virmacaddr.h"
 
 enum virNWFilterVarValueType {
     NWFILTER_VALUE_TYPE_SIMPLE,
Index: libvirt-acl/src/network/bridge_driver.c
===================================================================
--- libvirt-acl.orig/src/network/bridge_driver.c
+++ libvirt-acl/src/network/bridge_driver.c
@@ -1765,7 +1765,7 @@ networkStartNetworkVirtual(struct networ
             goto err0;
         }
         if (virNetDevTapCreateInBridgePort(network->def->bridge,
-                                           &macTapIfName, network->def->mac,
+                                           &macTapIfName, &network->def->mac,
                                            NULL, NULL, NULL,
                                            VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE) < 0) {
             VIR_FREE(macTapIfName);
Index: libvirt-acl/src/nwfilter/nwfilter_dhcpsnoop.c
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_dhcpsnoop.c
+++ libvirt-acl/src/nwfilter/nwfilter_dhcpsnoop.c
@@ -484,7 +484,7 @@ virNWFilterSnoopIPLeaseInstallRule(virNW
                                               req->ifindex,
                                               req->linkdev,
                                               req->nettype,
-                                              req->macaddr,
+                                              &req->macaddr,
                                               req->filtername,
                                               req->vars,
                                               req->driver);
@@ -875,7 +875,7 @@ virNWFilterSnoopReqLeaseDel(virNWFilterS
                                                req->ifindex,
                                                req->linkdev,
                                                req->nettype,
-                                               req->macaddr,
+                                               &req->macaddr,
                                                req->filtername,
                                                req->vars,
                                                req->driver);
@@ -884,7 +884,7 @@ virNWFilterSnoopReqLeaseDel(virNWFilterS
             virHashLookup(req->vars->hashTable, NWFILTER_VARNAME_DHCPSERVER);
 
         if (req->techdriver &&
-            req->techdriver->applyDHCPOnlyRules(req->ifname, req->macaddr,
+            req->techdriver->applyDHCPOnlyRules(req->ifname, &req->macaddr,
                                                 dhcpsrvrs, false) < 0) {
             virNWFilterReportError(VIR_ERR_INTERNAL_ERROR,
                                    _("virNWFilterSnoopListDel failed"));
@@ -1071,7 +1071,7 @@ virNWFilterSnoopDHCPOpen(const char *ifn
     char macaddr[VIR_MAC_STRING_BUFLEN];
     const char *ext;
 
-    virMacAddrFormat((unsigned char *)mac, macaddr);
+    virMacAddrFormat(mac, macaddr);
 
     if (dir == PCAP_D_IN /* from VM */) {
         /*
@@ -1560,7 +1560,7 @@ exit:
 
 static void
 virNWFilterSnoopIFKeyFMT(char *ifkey, const unsigned char *vmuuid,
-                         unsigned const char *macaddr)
+                         const virMacAddrPtr macaddr)
 {
     virUUIDFormat(vmuuid, ifkey);
     ifkey[VIR_UUID_STRING_BUFLEN - 1] = '-';
@@ -1573,7 +1573,7 @@ virNWFilterDHCPSnoopReq(virNWFilterTechD
                         const char *linkdev,
                         enum virDomainNetType nettype,
                         const unsigned char *vmuuid,
-                        const unsigned char *macaddr,
+                        const virMacAddrPtr macaddr,
                         const char *filtername,
                         virNWFilterHashTablePtr filterparams,
                         virNWFilterDriverStatePtr driver)
@@ -1609,7 +1609,7 @@ virNWFilterDHCPSnoopReq(virNWFilterTechD
     req->linkdev = linkdev ? strdup(linkdev) : NULL;
     req->nettype = nettype;
     req->ifname = strdup(ifname);
-    memcpy(req->macaddr, macaddr, sizeof(req->macaddr));
+    virMacAddrSet(&req->macaddr, macaddr);
     req->filtername = strdup(filtername);
     req->vars = virNWFilterHashTableCreate(0);
 
@@ -1631,7 +1631,7 @@ virNWFilterDHCPSnoopReq(virNWFilterTechD
     dhcpsrvrs = virHashLookup(filterparams->hashTable,
                               NWFILTER_VARNAME_DHCPSERVER);
 
-    if (techdriver->applyDHCPOnlyRules(req->ifname, req->macaddr,
+    if (techdriver->applyDHCPOnlyRules(req->ifname, &req->macaddr,
                                        dhcpsrvrs, false) < 0) {
         virNWFilterReportError(VIR_ERR_INTERNAL_ERROR, _("applyDHCPOnlyRules "
                                "failed - spoofing not protected!"));
Index: libvirt-acl/src/nwfilter/nwfilter_ebiptables_driver.c
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_ebiptables_driver.c
+++ libvirt-acl/src/nwfilter/nwfilter_ebiptables_driver.c
@@ -306,7 +306,7 @@ _printDataType(virNWFilterVarCombIterPtr
             return -1;
         }
 
-        virMacAddrFormat(item->u.macaddr.addr, buf);
+        virMacAddrFormat(&item->u.macaddr, buf);
     break;
 
     case DATATYPE_IPV6MASK:
@@ -3189,7 +3189,7 @@ ebiptablesCanApplyBasicRules(void) {
  */
 static int
 ebtablesApplyBasicRules(const char *ifname,
-                        const unsigned char *macaddr)
+                        const virMacAddrPtr macaddr)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     char chain[MAX_CHAINNAME_LENGTH];
@@ -3282,7 +3282,7 @@ tear_down_tmpebchains:
  */
 static int
 ebtablesApplyDHCPOnlyRules(const char *ifname,
-                           const unsigned char *macaddr,
+                           const virMacAddrPtr macaddr,
                            virNWFilterVarValuePtr dhcpsrvrs,
                            bool leaveTemporary)
 {
Index: libvirt-acl/src/nwfilter/nwfilter_gentech_driver.c
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_gentech_driver.c
+++ libvirt-acl/src/nwfilter/nwfilter_gentech_driver.c
@@ -656,7 +656,7 @@ virNWFilterInstantiate(const unsigned ch
                        virNWFilterHashTablePtr vars,
                        enum instCase useNewFilter, bool *foundNewFilter,
                        bool teardownOld,
-                       const unsigned char *macaddr,
+                       const virMacAddrPtr macaddr,
                        virNWFilterDriverStatePtr driver,
                        bool forceWithPendingReq)
 {
@@ -817,7 +817,7 @@ __virNWFilterInstantiateFilter(const uns
                                int ifindex,
                                const char *linkdev,
                                enum virDomainNetType nettype,
-                               const unsigned char *macaddr,
+                               const virMacAddrPtr macaddr,
                                const char *filtername,
                                virNWFilterHashTablePtr filterparams,
                                enum instCase useNewFilter,
@@ -967,7 +967,7 @@ _virNWFilterInstantiateFilter(virConnect
                                         ifindex,
                                         linkdev,
                                         net->type,
-                                        net->mac,
+                                        &net->mac,
                                         net->filter,
                                         net->filterparams,
                                         useNewFilter,
@@ -988,7 +988,7 @@ virNWFilterInstantiateFilterLate(const u
                                  int ifindex,
                                  const char *linkdev,
                                  enum virDomainNetType nettype,
-                                 const unsigned char *macaddr,
+                                 const virMacAddrPtr macaddr,
                                  const char *filtername,
                                  virNWFilterHashTablePtr filterparams,
                                  virNWFilterDriverStatePtr driver)
Index: libvirt-acl/src/nwfilter/nwfilter_gentech_driver.h
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_gentech_driver.h
+++ libvirt-acl/src/nwfilter/nwfilter_gentech_driver.h
@@ -50,7 +50,7 @@ int virNWFilterInstantiateFilterLate(con
                                      int ifindex,
                                      const char *linkdev,
                                      enum virDomainNetType nettype,
-                                     const unsigned char *macaddr,
+                                     const virMacAddrPtr macaddr,
                                      const char *filtername,
                                      virNWFilterHashTablePtr filterparams,
                                      virNWFilterDriverStatePtr driver);
Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.c
+++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
@@ -404,12 +404,12 @@ learnIPAddressThread(void *arg)
         goto done;
     }
 
-    virMacAddrFormat(req->macaddr, macaddr);
+    virMacAddrFormat(&req->macaddr, macaddr);
 
     switch (req->howDetect) {
     case DETECT_DHCP:
         if (techdriver->applyDHCPOnlyRules(req->ifname,
-                                           req->macaddr,
+                                           &req->macaddr,
                                            NULL, false) < 0) {
             req->status = EINVAL;
             goto done;
@@ -420,7 +420,7 @@ learnIPAddressThread(void *arg)
         break;
     default:
         if (techdriver->applyBasicRules(req->ifname,
-                                        req->macaddr) < 0) {
+                                        &req->macaddr) < 0) {
             req->status = EINVAL;
             goto done;
         }
@@ -493,9 +493,7 @@ learnIPAddressThread(void *arg)
                 continue;
             }
 
-            if (memcmp(ether_hdr->ether_shost,
-                       req->macaddr,
-                       VIR_MAC_BUFLEN) == 0) {
+            if (virMacAddrCmpRaw(&req->macaddr, ether_hdr->ether_shost) == 0) {
                 /* packets from the VM */
 
                 if (etherType == ETHERTYPE_IP &&
@@ -530,9 +528,8 @@ learnIPAddressThread(void *arg)
                     break;
                     }
                 }
-            } else if (memcmp(ether_hdr->ether_dhost,
-                              req->macaddr,
-                              VIR_MAC_BUFLEN) == 0) {
+            } else if (virMacAddrCmpRaw(&req->macaddr,
+                                        ether_hdr->ether_dhost) == 0) {
                 /* packets to the VM */
                 if (etherType == ETHERTYPE_IP &&
                     (header.len >= ethHdrSize +
@@ -554,9 +551,9 @@ learnIPAddressThread(void *arg)
                             struct dhcp *dhcp = (struct dhcp *)
                                         ((char *)udphdr + sizeof(udphdr));
                             if (dhcp->op == 2 /* BOOTREPLY */ &&
-                                !memcmp(&dhcp->chaddr[0],
-                                        req->macaddr,
-                                        6)) {
+                                virMacAddrCmpRaw(
+                                        &req->macaddr,
+                                        &dhcp->chaddr[0]) == 0) {
                                 dhcp_opts_len = header.len -
                                     (ethHdrSize + iphdr->ihl * 4 +
                                      sizeof(struct udphdr) +
@@ -602,7 +599,7 @@ learnIPAddressThread(void *arg)
                                                    req->ifindex,
                                                    req->linkdev,
                                                    req->nettype,
-                                                   req->macaddr,
+                                                   &req->macaddr,
                                                    req->filtername,
                                                    req->filterparams,
                                                    req->driver);
@@ -662,7 +659,7 @@ virNWFilterLearnIPAddress(virNWFilterTec
                           int ifindex,
                           const char *linkdev,
                           enum virDomainNetType nettype,
-                          const unsigned char *macaddr,
+                          const virMacAddrPtr macaddr,
                           const char *filtername,
                           virNWFilterHashTablePtr filterparams,
                           virNWFilterDriverStatePtr driver,
@@ -720,7 +717,7 @@ virNWFilterLearnIPAddress(virNWFilterTec
 
     req->ifindex = ifindex;
     req->nettype = nettype;
-    memcpy(req->macaddr, macaddr, sizeof(req->macaddr));
+    virMacAddrSet(&req->macaddr, macaddr);
     req->driver = driver;
     req->filterparams = ht;
     ht = NULL;
@@ -758,7 +755,7 @@ virNWFilterLearnIPAddress(virNWFilterTec
                           int ifindex ATTRIBUTE_UNUSED,
                           const char *linkdev ATTRIBUTE_UNUSED,
                           enum virDomainNetType nettype ATTRIBUTE_UNUSED,
-                          const unsigned char *macaddr ATTRIBUTE_UNUSED,
+                          const virMacAddrPtr macaddr ATTRIBUTE_UNUSED,
                           const char *filtername ATTRIBUTE_UNUSED,
                           virNWFilterHashTablePtr filterparams ATTRIBUTE_UNUSED,
                           virNWFilterDriverStatePtr driver ATTRIBUTE_UNUSED,
Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.h
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.h
+++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.h
@@ -40,7 +40,7 @@ struct _virNWFilterIPAddrLearnReq {
     int ifindex;
     char linkdev[IF_NAMESIZE];
     enum virDomainNetType nettype;
-    unsigned char macaddr[VIR_MAC_BUFLEN];
+    virMacAddr macaddr;
     char *filtername;
     virNWFilterHashTablePtr filterparams;
     virNWFilterDriverStatePtr driver;
@@ -56,7 +56,7 @@ int virNWFilterLearnIPAddress(virNWFilte
                               int ifindex,
                               const char *linkdev,
                               enum virDomainNetType nettype,
-                              const unsigned char *macaddr,
+                              const virMacAddrPtr macaddr,
                               const char *filtername,
                               virNWFilterHashTablePtr filterparams,
                               virNWFilterDriverStatePtr driver,
Index: libvirt-acl/src/openvz/openvz_conf.c
===================================================================
--- libvirt-acl.orig/src/openvz/openvz_conf.c
+++ libvirt-acl/src/openvz/openvz_conf.c
@@ -335,7 +335,7 @@ openvzReadNetworkConf(virDomainDefPtr de
                                     _("MAC address %s too long for destination"), p);
                         goto error;
                     }
-                    if (virMacAddrParse(cpy_temp, net->mac) < 0) {
+                    if (virMacAddrParse(cpy_temp, &net->mac) < 0) {
                         openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
                                     _("Wrong MAC address"));
                         goto error;
Index: libvirt-acl/src/openvz/openvz_driver.c
===================================================================
--- libvirt-acl.orig/src/openvz/openvz_driver.c
+++ libvirt-acl/src/openvz/openvz_driver.c
@@ -735,7 +735,7 @@ openvzDomainSetNetwork(virConnectPtr con
     int rc = 0, narg;
     const char *prog[OPENVZ_MAX_ARG];
     char macaddr[VIR_MAC_STRING_BUFLEN];
-    unsigned char host_mac[VIR_MAC_BUFLEN];
+    virMacAddr host_mac;
     char host_macaddr[VIR_MAC_STRING_BUFLEN];
     struct openvz_driver *driver =  conn->privateData;
     char *opt = NULL;
@@ -770,9 +770,9 @@ openvzDomainSetNetwork(virConnectPtr con
         ADD_ARG_LIT(vpsid);
     }
 
-    virMacAddrFormat(net->mac, macaddr);
-    virCapabilitiesGenerateMac(driver->caps, host_mac);
-    virMacAddrFormat(host_mac, host_macaddr);
+    virMacAddrFormat(&net->mac, macaddr);
+    virCapabilitiesGenerateMac(driver->caps, &host_mac);
+    virMacAddrFormat(&host_mac, host_macaddr);
 
     if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
         (net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
Index: libvirt-acl/src/qemu/qemu_bridge_filter.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_bridge_filter.c
+++ libvirt-acl/src/qemu/qemu_bridge_filter.c
@@ -66,7 +66,7 @@ networkDisableAllFrames(struct qemud_dri
 int
 networkAllowMacOnPort(struct qemud_driver *driver,
                       const char * ifname,
-                      const unsigned char * mac) {
+                      const virMacAddrPtr mac) {
 
     int err;
 
@@ -87,7 +87,7 @@ networkAllowMacOnPort(struct qemud_drive
 int
 networkDisallowMacOnPort(struct qemud_driver *driver,
                          const char * ifname,
-                         const unsigned char * mac) {
+                         const virMacAddrPtr mac) {
 
     int err;
 
Index: libvirt-acl/src/qemu/qemu_bridge_filter.h
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_bridge_filter.h
+++ libvirt-acl/src/qemu/qemu_bridge_filter.h
@@ -26,10 +26,10 @@
 
 int networkAllowMacOnPort(struct qemud_driver *driver,
                           const char * ifname,
-                          const unsigned char * mac);
+                          const virMacAddrPtr mac);
 int networkDisallowMacOnPort(struct qemud_driver *driver,
                              const char * ifname,
-                             const unsigned char * mac);
+                             const virMacAddrPtr mac);
 int networkDisableAllFrames(struct qemud_driver *driver);
 int networkAddEbtablesRules(struct qemud_driver *driver);
 
Index: libvirt-acl/src/qemu/qemu_command.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_command.c
+++ libvirt-acl/src/qemu/qemu_command.c
@@ -157,7 +157,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def
         vnet_hdr = 1;
 
     rc = virNetDevMacVLanCreateWithVPortProfile(
-        net->ifname, net->mac,
+        net->ifname, &net->mac,
         virDomainNetGetActualDirectDev(net),
         virDomainNetGetActualDirectMode(net),
         true, vnet_hdr, def->uuid,
@@ -251,7 +251,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr
         tap_create_flags |= VIR_NETDEV_TAP_CREATE_VNET_HDR;
     }
 
-    err = virNetDevTapCreateInBridgePort(brname, &net->ifname, net->mac,
+    err = virNetDevTapCreateInBridgePort(brname, &net->ifname, &net->mac,
                                          def->uuid, &tapfd,
                                          virDomainNetGetActualVirtPortProfile(net),
                                          tap_create_flags);
@@ -263,7 +263,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr
     }
 
     if (driver->macFilter) {
-        if ((err = networkAllowMacOnPort(driver, net->ifname, net->mac))) {
+        if ((err = networkAllowMacOnPort(driver, net->ifname, &net->mac))) {
             virReportSystemError(err,
                  _("failed to add ebtables rule to allow MAC address on  '%s'"),
                                  net->ifname);
@@ -2857,9 +2857,9 @@ qemuBuildNicStr(virDomainNetDefPtr net,
     if (virAsprintf(&str,
                     "%smacaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d%s%s%s%s",
                     prefix ? prefix : "",
-                    net->mac[0], net->mac[1],
-                    net->mac[2], net->mac[3],
-                    net->mac[4], net->mac[5],
+                    net->mac.addr[0], net->mac.addr[1],
+                    net->mac.addr[2], net->mac.addr[3],
+                    net->mac.addr[4], net->mac.addr[5],
                     vlan,
                     (net->model ? ",model=" : ""),
                     (net->model ? net->model : ""),
@@ -2937,9 +2937,9 @@ qemuBuildNicDevStr(virDomainNetDefPtr ne
         virBufferAsprintf(&buf, ",vlan=%d", vlan);
     virBufferAsprintf(&buf, ",id=%s", net->info.alias);
     virBufferAsprintf(&buf, ",mac=%02x:%02x:%02x:%02x:%02x:%02x",
-                      net->mac[0], net->mac[1],
-                      net->mac[2], net->mac[3],
-                      net->mac[4], net->mac[5]);
+                      net->mac.addr[0], net->mac.addr[1],
+                      net->mac.addr[2], net->mac.addr[3],
+                      net->mac.addr[4], net->mac.addr[5]);
     if (qemuBuildDeviceAddressStr(&buf, &net->info, qemuCaps) < 0)
         goto error;
     if (qemuBuildRomStr(&buf, &net->info, qemuCaps) < 0)
@@ -7038,7 +7038,7 @@ qemuParseCommandLineNet(virCapsPtr caps,
     for (i = 0 ; i < nkeywords ; i++) {
         if (STREQ(keywords[i], "macaddr")) {
             genmac = 0;
-            if (virMacAddrParse(values[i], def->mac) < 0) {
+            if (virMacAddrParse(values[i], &def->mac) < 0) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 _("unable to parse mac address '%s'"),
                                 values[i]);
@@ -7068,7 +7068,7 @@ qemuParseCommandLineNet(virCapsPtr caps,
     }
 
     if (genmac)
-        virCapabilitiesGenerateMac(caps, def->mac);
+        virCapabilitiesGenerateMac(caps, &def->mac);
 
 cleanup:
     for (i = 0 ; i < nkeywords ; i++) {
Index: libvirt-acl/src/qemu/qemu_driver.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_driver.c
+++ libvirt-acl/src/qemu/qemu_driver.c
@@ -443,7 +443,7 @@ static void qemuDomainNetsRestart(void *
             VIR_DEBUG("VEPA mode device %s active in domain %s. Reassociating.",
                       net->ifname, def->name);
             ignore_value(virNetDevMacVLanRestartWithVPortProfile(net->ifname,
-                                                                 net->mac,
+                                                                 &net->mac,
                                                                  virDomainNetGetActualDirectDev(net),
                                                                  def->uuid,
                                                                  virDomainNetGetActualVirtPortProfile(net),
@@ -5560,9 +5560,10 @@ qemuDomainAttachDeviceConfig(virDomainDe
 
     case VIR_DOMAIN_DEVICE_NET:
         net = dev->data.net;
-        if (virDomainNetIndexByMac(vmdef, net->mac) >= 0) {
+        if (virDomainNetIndexByMac(vmdef, &net->mac) >= 0) {
             char macbuf[VIR_MAC_STRING_BUFLEN];
-            virMacAddrFormat(net->mac, macbuf);
+
+            virMacAddrFormat(&net->mac, macbuf);
             qemuReportError(VIR_ERR_INVALID_ARG,
                             _("mac %s already exists"), macbuf);
             return -1;
@@ -5638,10 +5639,10 @@ qemuDomainDetachDeviceConfig(virDomainDe
 
     case VIR_DOMAIN_DEVICE_NET:
         net = dev->data.net;
-        if (!(det_net = virDomainNetRemoveByMac(vmdef, net->mac))) {
+        if (!(det_net = virDomainNetRemoveByMac(vmdef, &net->mac))) {
             char macbuf[VIR_MAC_STRING_BUFLEN];
 
-            virMacAddrFormat(net->mac, macbuf);
+            virMacAddrFormat(&net->mac, macbuf);
             qemuReportError(VIR_ERR_INVALID_ARG,
                             _("no nic of mac %s"), macbuf);
             return -1;
@@ -5729,9 +5730,10 @@ qemuDomainUpdateDeviceConfig(virDomainDe
 
     case VIR_DOMAIN_DEVICE_NET:
         net = dev->data.net;
-        if ((pos = virDomainNetIndexByMac(vmdef, net->mac)) < 0) {
+        if ((pos = virDomainNetIndexByMac(vmdef, &net->mac)) < 0) {
             char macbuf[VIR_MAC_STRING_BUFLEN];
-            virMacAddrFormat(net->mac, macbuf);
+
+            virMacAddrFormat(&net->mac, macbuf);
             qemuReportError(VIR_ERR_INVALID_ARG,
                             _("mac %s doesn't exist"), macbuf);
             return -1;
Index: libvirt-acl/src/qemu/qemu_hostdev.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_hostdev.c
+++ libvirt-acl/src/qemu/qemu_hostdev.c
@@ -257,7 +257,7 @@ cleanup:
 static int
 qemuDomainHostdevNetConfigVirtPortProfile(const char *linkdev, int vf,
                                           virNetDevVPortProfilePtr virtPort,
-                                          const unsigned char *macaddr,
+                                          const virMacAddrPtr macaddr,
                                           const unsigned char *uuid,
                                           int associate)
 {
@@ -320,12 +320,12 @@ qemuDomainHostdevNetConfigReplace(virDom
                                  hostdev->parent.data.net)
     if (virtPort)
         ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf,
-                            virtPort, hostdev->parent.data.net->mac, uuid,
+                            virtPort, &hostdev->parent.data.net->mac, uuid,
                             port_profile_associate);
     else
         /* Set only mac */
         ret = virNetDevReplaceNetConfig(linkdev, vf,
-                                        hostdev->parent.data.net->mac, vlanid,
+                                        &hostdev->parent.data.net->mac, vlanid,
                                         stateDir);
     VIR_FREE(linkdev);
 
@@ -358,7 +358,7 @@ qemuDomainHostdevNetConfigRestore(virDom
                                  hostdev->parent.data.net)
     if (virtPort)
         ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort,
-                                          hostdev->parent.data.net->mac, NULL,
+                                          &hostdev->parent.data.net->mac, NULL,
                                           port_profile_associate);
     else
         ret = virNetDevRestoreNetConfig(linkdev, vf, stateDir);
Index: libvirt-acl/src/qemu/qemu_hotplug.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_hotplug.c
+++ libvirt-acl/src/qemu/qemu_hotplug.c
@@ -1226,7 +1226,7 @@ static virDomainNetDefPtr qemuDomainFind
     int i;
 
     for (i = 0; i < vm->def->nnets; i++) {
-        if (memcmp(vm->def->nets[i]->mac, dev->mac, VIR_MAC_BUFLEN) == 0)
+        if (virMacAddrCmp(&vm->def->nets[i]->mac, &dev->mac) == 0)
             return vm->def->nets[i];
     }
 
@@ -2190,7 +2190,7 @@ qemuDomainDetachNetDevice(struct qemud_d
     for (i = 0 ; i < vm->def->nnets ; i++) {
         virDomainNetDefPtr net = vm->def->nets[i];
 
-        if (!memcmp(net->mac, dev->data.net->mac,  sizeof(net->mac))) {
+        if (!virMacAddrCmp(&net->mac, &dev->data.net->mac)) {
             detach = net;
             break;
         }
@@ -2199,9 +2199,9 @@ qemuDomainDetachNetDevice(struct qemud_d
     if (!detach) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         _("network device %02x:%02x:%02x:%02x:%02x:%02x not found"),
-                        dev->data.net->mac[0], dev->data.net->mac[1],
-                        dev->data.net->mac[2], dev->data.net->mac[3],
-                        dev->data.net->mac[4], dev->data.net->mac[5]);
+                        dev->data.net->mac.addr[0], dev->data.net->mac.addr[1],
+                        dev->data.net->mac.addr[2], dev->data.net->mac.addr[3],
+                        dev->data.net->mac.addr[4], dev->data.net->mac.addr[5]);
         goto cleanup;
     }
 
@@ -2280,7 +2280,7 @@ qemuDomainDetachNetDevice(struct qemud_d
 
     if (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_DIRECT) {
         ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
-                         detach->ifname, detach->mac,
+                         detach->ifname, &detach->mac,
                          virDomainNetGetActualDirectDev(detach),
                          virDomainNetGetActualDirectMode(detach),
                          virDomainNetGetActualVirtPortProfile(detach),
@@ -2291,7 +2291,7 @@ qemuDomainDetachNetDevice(struct qemud_d
     if ((driver->macFilter) && (detach->ifname != NULL)) {
         if ((errno = networkDisallowMacOnPort(driver,
                                               detach->ifname,
-                                              detach->mac))) {
+                                              &detach->mac))) {
             virReportSystemError(errno,
              _("failed to remove ebtables rule on  '%s'"),
                                  detach->ifname);
Index: libvirt-acl/src/qemu/qemu_migration.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_migration.c
+++ libvirt-acl/src/qemu/qemu_migration.c
@@ -2857,7 +2857,7 @@ qemuMigrationVPAssociatePortProfiles(vir
         if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
             if (virNetDevVPortProfileAssociate(net->ifname,
                                                virDomainNetGetActualVirtPortProfile(net),
-                                               net->mac,
+                                               &net->mac,
                                                virDomainNetGetActualDirectDev(net),
                                                -1,
                                                def->uuid,
@@ -2870,7 +2870,7 @@ qemuMigrationVPAssociatePortProfiles(vir
             }
             VIR_DEBUG("Port profile Associate succeeded for %s", net->ifname);
 
-            if (virNetDevMacVLanVPortProfileRegisterCallback(net->ifname, net->mac,
+            if (virNetDevMacVLanVPortProfileRegisterCallback(net->ifname, &net->mac,
                                                              virDomainNetGetActualDirectDev(net), def->uuid,
                                                              virDomainNetGetActualVirtPortProfile(net),
                                                              VIR_NETDEV_VPORT_PROFILE_OP_CREATE))
@@ -2887,7 +2887,7 @@ err_exit:
         if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
             ignore_value(virNetDevVPortProfileDisassociate(net->ifname,
                                                            virDomainNetGetActualVirtPortProfile(net),
-                                                           net->mac,
+                                                           &net->mac,
                                                            virDomainNetGetActualDirectDev(net),
                                                            -1,
                                                            VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH));
Index: libvirt-acl/src/qemu/qemu_process.c
===================================================================
--- libvirt-acl.orig/src/qemu/qemu_process.c
+++ libvirt-acl/src/qemu/qemu_process.c
@@ -4027,7 +4027,7 @@ void qemuProcessStop(struct qemud_driver
             if (net->ifname == NULL)
                 continue;
             if ((errno = networkDisallowMacOnPort(driver, net->ifname,
-                                                  net->mac))) {
+                                                  &net->mac))) {
                 virReportSystemError(errno,
              _("failed to remove ebtables rule to allow MAC address on  '%s'"),
                                      net->ifname);
@@ -4100,7 +4100,7 @@ void qemuProcessStop(struct qemud_driver
         virDomainNetDefPtr net = def->nets[i];
         if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
             ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
-                             net->ifname, net->mac,
+                             net->ifname, &net->mac,
                              virDomainNetGetActualDirectDev(net),
                              virDomainNetGetActualDirectMode(net),
                              virDomainNetGetActualVirtPortProfile(net),
Index: libvirt-acl/src/uml/uml_conf.c
===================================================================
--- libvirt-acl.orig/src/uml/uml_conf.c
+++ libvirt-acl/src/uml/uml_conf.c
@@ -138,7 +138,7 @@ umlConnectTapDevice(virConnectPtr conn,
         template_ifname = true;
     }
 
-    if (virNetDevTapCreateInBridgePort(bridge, &net->ifname, net->mac,
+    if (virNetDevTapCreateInBridgePort(bridge, &net->ifname, &net->mac,
                                        vm->uuid, NULL,
                                        virDomainNetGetActualVirtPortProfile(net),
                                        VIR_NETDEV_TAP_CREATE_IFUP) < 0) {
@@ -271,8 +271,8 @@ umlBuildCommandLineNet(virConnectPtr con
     }
 
     virBufferAsprintf(&buf, ",%02x:%02x:%02x:%02x:%02x:%02x",
-                      def->mac[0], def->mac[1], def->mac[2],
-                      def->mac[3], def->mac[4], def->mac[5]);
+                      def->mac.addr[0], def->mac.addr[1], def->mac.addr[2],
+                      def->mac.addr[3], def->mac.addr[4], def->mac.addr[5]);
 
     if (def->type == VIR_DOMAIN_NET_TYPE_MCAST) {
         virBufferAsprintf(&buf, ",%s,%d",
Index: libvirt-acl/src/util/ebtables.c
===================================================================
--- libvirt-acl.orig/src/util/ebtables.c
+++ libvirt-acl/src/util/ebtables.c
@@ -392,15 +392,15 @@ ebtablesForwardAllowIn(ebtablesContext *
 int
 ebtablesAddForwardAllowIn(ebtablesContext *ctx,
                           const char *iface,
-                          const unsigned char *mac)
+                          const virMacAddrPtr mac)
 {
     char *macaddr;
 
     if (virAsprintf(&macaddr,
                     "%02x:%02x:%02x:%02x:%02x:%02x",
-                    mac[0], mac[1],
-                    mac[2], mac[3],
-                    mac[4], mac[5]) < 0) {
+                    mac->addr[0], mac->addr[1],
+                    mac->addr[2], mac->addr[3],
+                    mac->addr[4], mac->addr[5]) < 0) {
         return -1;
     }
     return ebtablesForwardAllowIn(ctx, iface, macaddr, ADD);
@@ -421,15 +421,15 @@ ebtablesAddForwardAllowIn(ebtablesContex
 int
 ebtablesRemoveForwardAllowIn(ebtablesContext *ctx,
                              const char *iface,
-                             const unsigned char *mac)
+                             const virMacAddrPtr mac)
 {
     char *macaddr;
 
     if (virAsprintf(&macaddr,
                     "%02x:%02x:%02x:%02x:%02x:%02x",
-                    mac[0], mac[1],
-                    mac[2], mac[3],
-                    mac[4], mac[5]) < 0) {
+                    mac->addr[0], mac->addr[1],
+                    mac->addr[2], mac->addr[3],
+                    mac->addr[4], mac->addr[5]) < 0) {
        return -1;
     }
     return ebtablesForwardAllowIn(ctx, iface, macaddr, REMOVE);
Index: libvirt-acl/src/util/ebtables.h
===================================================================
--- libvirt-acl.orig/src/util/ebtables.h
+++ libvirt-acl/src/util/ebtables.h
@@ -24,6 +24,8 @@
 #ifndef __QEMUD_EBTABLES_H__
 # define __QEMUD_EBTABLES_H__
 
+# include "virmacaddr.h"
+
 typedef struct
 {
     char  *rule;
@@ -50,10 +52,10 @@ void             ebtablesSaveRules
 
 int              ebtablesAddForwardAllowIn       (ebtablesContext *ctx,
                                                   const char *iface,
-                                                  const unsigned char *mac);
+                                                  const virMacAddrPtr mac);
 int              ebtablesRemoveForwardAllowIn    (ebtablesContext *ctx,
                                                   const char *iface,
-                                                  const unsigned char *mac);
+                                                  const virMacAddrPtr mac);
 
 int              ebtablesAddForwardPolicyReject(ebtablesContext *ctx);
 
Index: libvirt-acl/src/util/virnetdevopenvswitch.c
===================================================================
--- libvirt-acl.orig/src/util/virnetdevopenvswitch.c
+++ libvirt-acl/src/util/virnetdevopenvswitch.c
@@ -44,7 +44,7 @@
  * Returns 0 in case of success or -1 in case of failure.
  */
 int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
-                                   const unsigned char *macaddr,
+                                   const virMacAddrPtr macaddr,
                                    const unsigned char *vmuuid,
                                    virNetDevVPortProfilePtr ovsport)
 {
Index: libvirt-acl/src/util/virnetdevopenvswitch.h
===================================================================
--- libvirt-acl.orig/src/util/virnetdevopenvswitch.h
+++ libvirt-acl/src/util/virnetdevopenvswitch.h
@@ -31,7 +31,7 @@
 
 int virNetDevOpenvswitchAddPort(const char *brname,
                                 const char *ifname,
-                                const unsigned char *macaddr,
+                                const virMacAddrPtr macaddr,
                                 const unsigned char *vmuuid,
                                 virNetDevVPortProfilePtr ovsport)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
Index: libvirt-acl/src/util/virnetdevtap.c
===================================================================
--- libvirt-acl.orig/src/util/virnetdevtap.c
+++ libvirt-acl/src/util/virnetdevtap.c
@@ -256,7 +256,7 @@ int virNetDevTapDelete(const char *ifnam
  * virNetDevTapCreateInBridgePort:
  * @brname: the bridge name
  * @ifname: the interface name (or name template)
- * @macaddr: desired MAC address (VIR_MAC_BUFLEN long)
+ * @macaddr: desired MAC address
  * @tapfd: file descriptor return value for the new tap device
  * @virtPortProfile: bridge/port specific configuration
  * @flags: OR of virNetDevTapCreateFlags:
@@ -280,13 +280,13 @@ int virNetDevTapDelete(const char *ifnam
  */
 int virNetDevTapCreateInBridgePort(const char *brname,
                                    char **ifname,
-                                   const unsigned char *macaddr,
+                                   const virMacAddrPtr macaddr,
                                    const unsigned char *vmuuid,
                                    int *tapfd,
                                    virNetDevVPortProfilePtr virtPortProfile,
                                    unsigned int flags)
 {
-    unsigned char tapmac[VIR_MAC_BUFLEN];
+    virMacAddr tapmac;
 
     if (virNetDevTapCreate(ifname, tapfd, flags) < 0)
         return -1;
@@ -297,9 +297,9 @@ int virNetDevTapCreateInBridgePort(const
      * seeing the kernel allocate random MAC for the TAP
      * device before we set our static MAC.
      */
-    memcpy(tapmac, macaddr, VIR_MAC_BUFLEN);
+    virMacAddrSet(&tapmac, macaddr);
     if (!(flags & VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE)) {
-        if (macaddr[0] == 0xFE) {
+        if (macaddr->addr[0] == 0xFE) {
             /* For normal use, the tap device's MAC address cannot
              * match the MAC address used by the guest. This results
              * in "received packet on vnetX with own address as source
@@ -308,14 +308,15 @@ int virNetDevTapCreateInBridgePort(const
             virNetDevTapError(VIR_ERR_CONFIG_UNSUPPORTED,
                               "Unable to use MAC address starting with "
                               "reserved value 0xFE - '%02X:%02X:%02X:%02X:%02X:%02X' - ",
-                              macaddr[0], macaddr[1], macaddr[2],
-                              macaddr[3], macaddr[4], macaddr[5]);
+                              macaddr->addr[0], macaddr->addr[1],
+                              macaddr->addr[2], macaddr->addr[3],
+                              macaddr->addr[4], macaddr->addr[5]);
             goto error;
         }
-        tapmac[0] = 0xFE; /* Discourage bridge from using TAP dev MAC */
+        tapmac.addr[0] = 0xFE; /* Discourage bridge from using TAP dev MAC */
     }
 
-    if (virNetDevSetMAC(*ifname, tapmac) < 0)
+    if (virNetDevSetMAC(*ifname, &tapmac) < 0)
         goto error;
 
     /* We need to set the interface MTU before adding it
Index: libvirt-acl/src/util/virnetdevtap.h
===================================================================
--- libvirt-acl.orig/src/util/virnetdevtap.h
+++ libvirt-acl/src/util/virnetdevtap.h
@@ -46,7 +46,7 @@ typedef enum {
 
 int virNetDevTapCreateInBridgePort(const char *brname,
                                    char **ifname,
-                                   const unsigned char *macaddr,
+                                   const virMacAddrPtr macaddr,
                                    const unsigned char *vmuuid,
                                    int *tapfd,
                                    virNetDevVPortProfilePtr virtPortProfile,
Index: libvirt-acl/src/util/virnetdevvportprofile.c
===================================================================
--- libvirt-acl.orig/src/util/virnetdevvportprofile.c
+++ libvirt-acl/src/util/virnetdevvportprofile.c
@@ -264,7 +264,7 @@ cleanup:
 static int
 virNetDevVPortProfileOpSetLink(const char *ifname, int ifindex,
                                bool nltarget_kernel,
-                               const unsigned char *macaddr,
+                               const virMacAddrPtr macaddr,
                                int vlanid,
                                const char *profileId,
                                struct ifla_port_vsi *portVsi,
@@ -315,7 +315,7 @@ virNetDevVPortProfileOpSetLink(const cha
                 .mac = { 0, },
             };
 
-            memcpy(ifla_vf_mac.mac, macaddr, 6);
+            virMacAddrGetRaw(macaddr, ifla_vf_mac.mac);
 
             if (nla_put(nl_msg, IFLA_VF_MAC, sizeof(ifla_vf_mac),
                         &ifla_vf_mac) < 0)
@@ -515,7 +515,7 @@ virNetDevVPortProfileGetNthParent(const
 static int
 virNetDevVPortProfileOpCommon(const char *ifname, int ifindex,
                               bool nltarget_kernel,
-                              const unsigned char *macaddr,
+                              const virMacAddrPtr macaddr,
                               int vlanid,
                               const char *profileId,
                               struct ifla_port_vsi *portVsi,
@@ -633,7 +633,7 @@ virNetDevVPortProfileGetPhysdevAndVlan(c
 /* Returns 0 on success, -1 on general failure, and -2 on timeout */
 static int
 virNetDevVPortProfileOp8021Qbg(const char *ifname,
-                               const unsigned char *macaddr,
+                               const virMacAddrPtr macaddr,
                                int vf,
                                const virNetDevVPortProfilePtr virtPort,
                                enum virNetDevVPortProfileLinkOp virtPortOp,
@@ -701,7 +701,7 @@ cleanup:
 /* Returns 0 on success, -1 on general failure, and -2 on timeout */
 static int
 virNetDevVPortProfileOp8021Qbh(const char *ifname,
-                               const unsigned char *macaddr,
+                               const virMacAddrPtr macaddr,
                                int32_t vf,
                                const virNetDevVPortProfilePtr virtPort,
                                const unsigned char *vm_uuid,
@@ -825,7 +825,7 @@ cleanup:
 int
 virNetDevVPortProfileAssociate(const char *macvtap_ifname,
                                const virNetDevVPortProfilePtr virtPort,
-                               const unsigned char *macvtap_macaddr,
+                               const virMacAddrPtr macvtap_macaddr,
                                const char *linkdev,
                                int vf,
                                const unsigned char *vmuuid,
@@ -889,7 +889,7 @@ virNetDevVPortProfileAssociate(const cha
 int
 virNetDevVPortProfileDisassociate(const char *macvtap_ifname,
                                   const virNetDevVPortProfilePtr virtPort,
-                                  const unsigned char *macvtap_macaddr,
+                                  const virMacAddrPtr macvtap_macaddr,
                                   const char *linkdev,
                                   int vf,
                                   enum virNetDevVPortProfileOp vmOp)
@@ -933,7 +933,7 @@ virNetDevVPortProfileDisassociate(const
 #else /* ! WITH_VIRTUALPORT */
 int virNetDevVPortProfileAssociate(const char *macvtap_ifname ATTRIBUTE_UNUSED,
                                const virNetDevVPortProfilePtr virtPort ATTRIBUTE_UNUSED,
-                               const unsigned char *macvtap_macaddr ATTRIBUTE_UNUSED,
+                               const virMacAddrPtr macvtap_macaddr ATTRIBUTE_UNUSED,
                                const char *linkdev ATTRIBUTE_UNUSED,
                                int vf ATTRIBUTE_UNUSED,
                                const unsigned char *vmuuid ATTRIBUTE_UNUSED,
@@ -947,7 +947,7 @@ int virNetDevVPortProfileAssociate(const
 
 int virNetDevVPortProfileDisassociate(const char *macvtap_ifname ATTRIBUTE_UNUSED,
                                       const virNetDevVPortProfilePtr virtPort ATTRIBUTE_UNUSED,
-                                      const unsigned char *macvtap_macaddr ATTRIBUTE_UNUSED,
+                                      const virMacAddrPtr macvtap_macaddr ATTRIBUTE_UNUSED,
                                       const char *linkdev ATTRIBUTE_UNUSED,
                                       int vf ATTRIBUTE_UNUSED,
                                       enum virNetDevVPortProfileOp vmOp ATTRIBUTE_UNUSED)
Index: libvirt-acl/src/vbox/vbox_tmpl.c
===================================================================
--- libvirt-acl.orig/src/vbox/vbox_tmpl.c
+++ libvirt-acl/src/vbox/vbox_tmpl.c
@@ -3038,7 +3038,7 @@ sharedFoldersCleanup:
                                  MACAddress[8], MACAddress[9], MACAddress[10], MACAddress[11]);
 
                         /* XXX some real error handling here some day ... */
-                        if (virMacAddrParse(macaddr, def->nets[netAdpIncCnt]->mac) < 0)
+                        if (virMacAddrParse(macaddr, &def->nets[netAdpIncCnt]->mac) < 0)
                         {}
 
                         netAdpIncCnt++;
@@ -4387,15 +4387,15 @@ vboxAttachNetwork(virDomainDefPtr def, v
         char macaddr[VIR_MAC_STRING_BUFLEN] = {0};
         char macaddrvbox[VIR_MAC_STRING_BUFLEN - 5] = {0};
 
-        virMacAddrFormat(def->nets[i]->mac, macaddr);
+        virMacAddrFormat(&def->nets[i]->mac, macaddr);
         snprintf(macaddrvbox, VIR_MAC_STRING_BUFLEN - 5,
                  "%02X%02X%02X%02X%02X%02X",
-                 def->nets[i]->mac[0],
-                 def->nets[i]->mac[1],
-                 def->nets[i]->mac[2],
-                 def->nets[i]->mac[3],
-                 def->nets[i]->mac[4],
-                 def->nets[i]->mac[5]);
+                 def->nets[i]->mac.addr[0],
+                 def->nets[i]->mac.addr[1],
+                 def->nets[i]->mac.addr[2],
+                 def->nets[i]->mac.addr[3],
+                 def->nets[i]->mac.addr[4],
+                 def->nets[i]->mac.addr[5]);
         macaddrvbox[VIR_MAC_STRING_BUFLEN - 6] = '\0';
 
         VIR_DEBUG("NIC(%d): Type:   %d", i, def->nets[i]->type);
Index: libvirt-acl/src/vmx/vmx.c
===================================================================
--- libvirt-acl.orig/src/vmx/vmx.c
+++ libvirt-acl/src/vmx/vmx.c
@@ -2365,7 +2365,7 @@ virVMXParseEthernet(virConfPtr conf, int
     if (addressType == NULL || STRCASEEQ(addressType, "generated") ||
         STRCASEEQ(addressType, "vpx")) {
         if (generatedAddress != NULL) {
-            if (virMacAddrParse(generatedAddress, (*def)->mac) < 0) {
+            if (virMacAddrParse(generatedAddress, &(*def)->mac) < 0) {
                 VMX_ERROR(VIR_ERR_INTERNAL_ERROR,
                           _("Expecting VMX entry '%s' to be MAC address but "
                             "found '%s'"), generatedAddress_name,
@@ -2375,7 +2375,7 @@ virVMXParseEthernet(virConfPtr conf, int
         }
     } else if (STRCASEEQ(addressType, "static")) {
         if (address != NULL) {
-            if (virMacAddrParse(address, (*def)->mac) < 0) {
+            if (virMacAddrParse(address, &(*def)->mac) < 0) {
                 VMX_ERROR(VIR_ERR_INTERNAL_ERROR,
                           _("Expecting VMX entry '%s' to be MAC address but "
                             "found '%s'"), address_name, address);
@@ -3567,10 +3567,10 @@ virVMXFormatEthernet(virDomainNetDefPtr
     }
 
     /* def:mac -> vmx:addressType, vmx:(generated)Address, vmx:checkMACAddress */
-    virMacAddrFormat(def->mac, mac_string);
+    virMacAddrFormat(&def->mac, mac_string);
 
-    prefix = (def->mac[0] << 16) | (def->mac[1] << 8) | def->mac[2];
-    suffix = (def->mac[3] << 16) | (def->mac[4] << 8) | def->mac[5];
+    prefix = (def->mac.addr[0] << 16) | (def->mac.addr[1] << 8) | def->mac.addr[2];
+    suffix = (def->mac.addr[3] << 16) | (def->mac.addr[4] << 8) | def->mac.addr[5];
 
     if (prefix == 0x000c29) {
         virBufferAsprintf(buffer, "ethernet%d.addressType = \"generated\"\n",
Index: libvirt-acl/src/xen/xend_internal.c
===================================================================
--- libvirt-acl.orig/src/xen/xend_internal.c
+++ libvirt-acl/src/xen/xend_internal.c
@@ -2718,7 +2718,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr
             goto cleanup;
 
         char macStr[VIR_MAC_STRING_BUFLEN];
-        virMacAddrFormat(dev->data.net->mac, macStr);
+        virMacAddrFormat(&dev->data.net->mac, macStr);
 
         if (!(target = strdup(macStr))) {
             virReportOOMError();
@@ -3955,8 +3955,8 @@ virDomainXMLDevID(virDomainPtr domain,
         char mac[30];
         virDomainNetDefPtr def = dev->data.net;
         snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
-                 def->mac[0], def->mac[1], def->mac[2],
-                 def->mac[3], def->mac[4], def->mac[5]);
+                 def->mac.addr[0], def->mac.addr[1], def->mac.addr[2],
+                 def->mac.addr[3], def->mac.addr[4], def->mac.addr[5]);
 
         strcpy(class, "vif");
 
Index: libvirt-acl/src/xen/xm_internal.c
===================================================================
--- libvirt-acl.orig/src/xen/xm_internal.c
+++ libvirt-acl/src/xen/xm_internal.c
@@ -1533,9 +1533,7 @@ xenXMDomainDetachDeviceFlags(virDomainPt
     case VIR_DOMAIN_DEVICE_NET:
     {
         for (i = 0 ; i < def->nnets ; i++) {
-            if (!memcmp(def->nets[i]->mac,
-                        dev->data.net->mac,
-                        sizeof(def->nets[i]->mac))) {
+            if (!virMacAddrCmp(&def->nets[i]->mac, &dev->data.net->mac)) {
                 virDomainNetDefFree(def->nets[i]);
                 if (i < (def->nnets - 1))
                     memmove(def->nets + i,
Index: libvirt-acl/src/xenxs/xen_sxpr.c
===================================================================
--- libvirt-acl.orig/src/xenxs/xen_sxpr.c
+++ libvirt-acl/src/xenxs/xen_sxpr.c
@@ -600,7 +600,7 @@ xenParseSxprNets(virDomainDefPtr def,
 
             tmp = sexpr_node(node, "device/vif/mac");
             if (tmp) {
-                if (virMacAddrParse(tmp, net->mac) < 0) {
+                if (virMacAddrParse(tmp, &net->mac) < 0) {
                     XENXS_ERROR(VIR_ERR_INTERNAL_ERROR,
                                  _("malformed mac address '%s'"), tmp);
                     goto cleanup;
@@ -1932,8 +1932,8 @@ xenFormatSxprNet(virConnectPtr conn,
 
     virBufferAsprintf(buf,
                       "(mac '%02x:%02x:%02x:%02x:%02x:%02x')",
-                      def->mac[0], def->mac[1], def->mac[2],
-                      def->mac[3], def->mac[4], def->mac[5]);
+                      def->mac.addr[0], def->mac.addr[1], def->mac.addr[2],
+                      def->mac.addr[3], def->mac.addr[4], def->mac.addr[5]);
 
     switch (def->type) {
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
Index: libvirt-acl/src/xenxs/xen_xm.c
===================================================================
--- libvirt-acl.orig/src/xenxs/xen_xm.c
+++ libvirt-acl/src/xenxs/xen_xm.c
@@ -742,7 +742,7 @@ xenParseXM(virConfPtr conf, int xendConf
                 goto no_memory;
 
             if (mac[0]) {
-                if (virMacAddrParse(mac, net->mac) < 0) {
+                if (virMacAddrParse(mac, &net->mac) < 0) {
                     XENXS_ERROR(VIR_ERR_INTERNAL_ERROR,
                                _("malformed mac address '%s'"), mac);
                     goto cleanup;
@@ -1326,9 +1326,9 @@ static int xenFormatXMNet(virConnectPtr
     virConfValuePtr val, tmp;
 
     virBufferAsprintf(&buf, "mac=%02x:%02x:%02x:%02x:%02x:%02x",
-                      net->mac[0], net->mac[1],
-                      net->mac[2], net->mac[3],
-                      net->mac[4], net->mac[5]);
+                      net->mac.addr[0], net->mac.addr[1],
+                      net->mac.addr[2], net->mac.addr[3],
+                      net->mac.addr[4], net->mac.addr[5]);
 
     switch (net->type) {
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
Index: libvirt-acl/tools/virsh.c
===================================================================
--- libvirt-acl.orig/tools/virsh.c
+++ libvirt-acl/tools/virsh.c
@@ -1935,7 +1935,7 @@ cmdDomIfSetLink(vshControl *ctl, const v
     const char *state;
     const char *value;
     const char *desc;
-    unsigned char macaddr[VIR_MAC_BUFLEN];
+    virMacAddr macaddr;
     const char *element;
     const char *attr;
     bool config;
@@ -1997,7 +1997,7 @@ cmdDomIfSetLink(vshControl *ctl, const v
         goto cleanup;
     }
 
-    if (virMacAddrParse(iface, macaddr) == 0) {
+    if (virMacAddrParse(iface, &macaddr) == 0) {
         element = "mac";
         attr = "address";
     } else {
@@ -2111,7 +2111,7 @@ cmdDomIfGetLink(vshControl *ctl, const v
     int flags = 0;
     char *state = NULL;
     char *value = NULL;
-    unsigned char macaddr[VIR_MAC_BUFLEN];
+    virMacAddr macaddr;
     const char *element;
     const char *attr;
     bool ret = false;
@@ -2156,7 +2156,7 @@ cmdDomIfGetLink(vshControl *ctl, const v
         goto cleanup;
     }
 
-    if (virMacAddrParse(iface, macaddr) == 0) {
+    if (virMacAddrParse(iface, &macaddr) == 0) {
         element = "mac";
         attr = "address";
     } else {
Index: libvirt-acl/src/lxc/lxc_driver.c
===================================================================
--- libvirt-acl.orig/src/lxc/lxc_driver.c
+++ libvirt-acl/src/lxc/lxc_driver.c
@@ -1202,11 +1202,11 @@ static int lxcSetupInterfaceBridged(virC
     (*veths)[(*nveths)] = containerVeth;
     (*nveths)++;
 
-    if (virNetDevSetMAC(containerVeth, net->mac) < 0)
+    if (virNetDevSetMAC(containerVeth, &net->mac) < 0)
         goto cleanup;
 
     if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
-        ret = virNetDevOpenvswitchAddPort(brname, parentVeth, net->mac,
+        ret = virNetDevOpenvswitchAddPort(brname, parentVeth, &net->mac,
                                           vm->uuid, vport);
     else
         ret = virNetDevBridgeAddPort(brname, parentVeth);
@@ -1280,7 +1280,7 @@ static int lxcSetupInterfaceDirect(virCo
     (*veths)[(*nveths)] = NULL;
 
     if (virNetDevMacVLanCreateWithVPortProfile(
-            net->ifname, net->mac,
+            net->ifname, &net->mac,
             virDomainNetGetActualDirectDev(net),
             virDomainNetGetActualDirectMode(net),
             false, false, def->uuid,
Index: libvirt-acl/src/libvirt_private.syms
===================================================================
--- libvirt-acl.orig/src/libvirt_private.syms
+++ libvirt-acl/src/libvirt_private.syms
@@ -1277,12 +1277,17 @@ virKeyFileGetValueString;
 
 
 # virmacaddr.h
+virMacAddrCmp;
+virMacAddrCmpRaw;
 virMacAddrCompare;
 virMacAddrFormat;
 virMacAddrGenerate;
+virMacAddrGetRaw;
 virMacAddrIsMulticast;
 virMacAddrIsUnicast;
 virMacAddrParse;
+virMacAddrSet;
+virMacAddrSetRaw;
 
 
 # virnetclient.h
Index: libvirt-acl/src/libxl/libxl_conf.c
===================================================================
--- libvirt-acl.orig/src/libxl/libxl_conf.c
+++ libvirt-acl/src/libxl/libxl_conf.c
@@ -596,7 +596,7 @@ libxlMakeNic(virDomainDefPtr def, virDom
     //x_nics[i].mtu = 1492;
 
     x_nic->domid = def->id;
-    memcpy(x_nic->mac, l_nic->mac, sizeof(libxl_mac));
+    virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
 
     if (l_nic->model && !STREQ(l_nic->model, "netfront")) {
         if ((x_nic->model = strdup(l_nic->model)) == NULL) {
Index: libvirt-acl/src/nwfilter/nwfilter_dhcpsnoop.h
===================================================================
--- libvirt-acl.orig/src/nwfilter/nwfilter_dhcpsnoop.h
+++ libvirt-acl/src/nwfilter/nwfilter_dhcpsnoop.h
@@ -31,7 +31,7 @@ int virNWFilterDHCPSnoopReq(virNWFilterT
                             const char *linkdev,
                             enum virDomainNetType nettype,
                             const unsigned char *vmuuid,
-                            const unsigned char *macaddr,
+                            const virMacAddrPtr macaddr,
                             const char *filtername,
                             virNWFilterHashTablePtr filterparams,
                             virNWFilterDriverStatePtr driver);
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    17 Jul '12
                    
                        In trying to build libvirt 0.9.13 on F17, I'm hitting a link error:
  ...
  CCLD   libvirt_driver_nodedev.la
  CCLD   libvirt_driver_nwfilter.la
/usr/bin/ld: cannot find -lcrypto
Full log here:
http://kojipkgs.fedoraproject.org//work/tasks/3678/4233678/build.log
I think this comes from rbd support, from configure.ac:
LIBRBD_LIBS="-lrbd -lrados -lcrypto"
from this commit:
http://libvirt.org/git/?p=libvirt.git;a=commit;h=74951eadef85e2d100c7dc7bd9…
What's missing here? RPM BuildRequires, configure change, ...?
Thanks,
Cole
                    
                  
                  
                          
                            
                            4
                            
                          
                          
                            
                            6
                            
                          
                          
                            
    
                          
                        
                     
                        
                    17 Jul '12
                    
                        Hi All, 
I am trying to extend “iscsi” support for iSCSI driver, currently am stuck at getting iSCSI target list from the hypervisor. I am using hostSystem object (propertyNameList is set to “config.storageDevice.hostBusAdapter”) to retrieve list of “HostHostBusAdapter” from ESX, but the call fails to perform “CastFromAnyType”  from ObjectContent –> HostHostBusAdapter. The esx_vi_generator.input object definition looks like this:
object HostHostBusAdapter
    String                                   key                            o    
    String                                   device                         r    
    Int                                      bus                            r    
    String                                   status                         r    
    String                                   model                          r    
    String                                   driver                         o    
    String                                   pci                            o    
end
esx_vi_generaor.py is modified as follows:
"HostHostBusAdapter"         : Object.FEATURE__ANY_TYPE |
                               Object.FEATURE__LIST,
Using gdb, I see the failure occurs at: esx/esx_vi.c:esxVI_List_CastFromAnyType(..) line 1631:
..
if (esxVI_AnyType_Deserialize(childNode, &childAnyType) < 0 || 
    castFromAnyTypeFunc(childAnyType, &item) < 0 || 
    esxVI_List_Append(list, item) < 0) { 
    goto cleanup;
}
..
In one of my earlier patches (subject: Add routines to interface driver) I patched esx_vi_generator.py to deserialize “string list”; as the patch is still under review I manually applied the branch to this branch but no change (did not expect change as structure does not contain any list object). I am wondering what else is missing to make it work.
Any suggestion how to debug/fix this issue is highly appreciated.
Thanks!
Ata
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    