[libvirt] [PATCH 1/5] RPC: Allow HW address in remote_domain_interface struct to be NULL

Michal Privoznik mprivozn at redhat.com
Tue Mar 17 16:52:53 UTC 2015


Not all NICs (esp. the virtual ones like TUN) must have a hardware
address. Learn our RPC that it's possible.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 daemon/remote.c                  | 5 ++++-
 include/libvirt/libvirt-domain.h | 2 +-
 src/libvirt-domain.c             | 3 ++-
 src/remote/remote_driver.c       | 3 ++-
 src/remote/remote_protocol.x     | 2 +-
 src/remote_protocol-structs      | 2 +-
 6 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 1dca64a..b6ea236 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -6525,7 +6525,9 @@ remoteSerializeDomainInterface(virDomainInterfacePtr *ifaces,
         if ((VIR_STRDUP(iface_ret->name, iface->name)) < 0)
             goto cleanup;
 
-        if ((VIR_STRDUP(iface_ret->hwaddr, iface->hwaddr)) < 0)
+        if (iface->hwaddr &&
+            (VIR_ALLOC(iface_ret->hwaddr) < 0 ||
+             VIR_STRDUP(*iface_ret->hwaddr, iface->hwaddr) < 0))
             goto cleanup;
 
         if (iface->naddrs > REMOTE_DOMAIN_IP_ADDR_MAX) {
@@ -6561,6 +6563,7 @@ remoteSerializeDomainInterface(virDomainInterfacePtr *ifaces,
         for (i = 0; i < ifaces_count; i++) {
             remote_domain_interface *iface_ret = &(ret->ifaces.ifaces_val[i]);
             VIR_FREE(iface_ret->name);
+            VIR_FREE(*iface_ret->hwaddr);
             VIR_FREE(iface_ret->hwaddr);
             for (j = 0; j < iface_ret->addrs.addrs_len; j++) {
                 remote_domain_ip_addr *ip_addr =
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index a026b9a..79ba3d7 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -3760,7 +3760,7 @@ typedef struct _virDomainInterface virDomainInterface;
 typedef virDomainInterface *virDomainInterfacePtr;
 struct _virDomainInterface {
     char *name;                     /* interface name */
-    char *hwaddr;                   /* hardware address */
+    char *hwaddr;                   /* hardware address, may be NULL */
     unsigned int naddrs;            /* number of items in @addrs */
     virDomainIPAddressPtr addrs;    /* array of IP addresses */
 };
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index a3f179d..0bd9274 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -11460,7 +11460,8 @@ virDomainFSInfoFree(virDomainFSInfoPtr info)
  *  ... do something with returned values, for example:
  *  for (i = 0; i < ifaces_count; i++) {
  *      printf("name: %s", ifaces[i]->name);
- *      printf(" hwaddr: %s", ifaces[i]->hwaddr);
+ *      if (ifaces[i]->hwaddr)
+ *          printf(" hwaddr: %s", ifaces[i]->hwaddr);
  *
  *      for (j = 0; j < ifaces[i]->naddrs; j++) {
  *          virDomainIPAddressPtr ip_addr = ifaces[i]->addrs + j;
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index d89db47..e69f235 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -7963,7 +7963,8 @@ remoteDomainInterfaceAddresses(virDomainPtr dom,
         if (VIR_STRDUP(iface->name, iface_ret->name) < 0)
             goto cleanup;
 
-        if (VIR_STRDUP(iface->hwaddr, iface_ret->hwaddr) < 0)
+        if (iface_ret->hwaddr &&
+            VIR_STRDUP(iface->hwaddr, *iface_ret->hwaddr) < 0)
             goto cleanup;
 
         if (iface_ret->addrs.addrs_len > REMOTE_DOMAIN_IP_ADDR_MAX) {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index fe5fcdc..eb862e1 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3191,7 +3191,7 @@ struct remote_domain_ip_addr {
 
 struct remote_domain_interface {
     remote_nonnull_string name;
-    remote_nonnull_string hwaddr;
+    remote_string hwaddr;
     remote_domain_ip_addr addrs<REMOTE_DOMAIN_IP_ADDR_MAX>;
 };
 
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 5f4ebff..b3e2e40 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -2646,7 +2646,7 @@ struct remote_domain_ip_addr {
 };
 struct remote_domain_interface {
         remote_nonnull_string      name;
-        remote_nonnull_string      hwaddr;
+        remote_string              hwaddr;
         struct {
                 u_int              addrs_len;
                 remote_domain_ip_addr * addrs_val;
-- 
2.0.5




More information about the libvir-list mailing list