qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Lin Ma <lma@suse.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, Lin Ma <lma@suse.com>
Subject: [Qemu-devel] [PATCH] add mac address collision checking for device_add & pci_add
Date: Mon, 12 Nov 2012 19:12:46 +0800	[thread overview]
Message-ID: <1352718766-5663-1-git-send-email-lma@suse.com> (raw)

QEMU doesn't check if there are mac collisions when adding nics.
It causes mac address collisions in guest if adding the nics which include existing physical address.
This patch fixes the issue.

Signed-off-by: Lin Ma <lma@suse.com>
---
 hw/qdev-properties.c |    9 +++++++++
 net.c                |   28 ++++++++++++++++++++++++++++
 net.h                |    1 +
 3 files changed, 38 insertions(+)

diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index 8aca0d4..23318af 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -761,6 +761,15 @@ static void set_mac(Object *obj, Visitor *v, void *opaque,
         }
         mac->a[i] = strtol(str+pos, &p, 16);
     }
+
+    if (qemu_check_macaddr_uniqueness(mac->a) < 0) {
+        goto collision;
+    }
+    g_free(str);
+    return;
+
+collision:
+    error_set_from_qdev_prop_error(errp, -EEXIST, dev, prop, str);
     g_free(str);
     return;
 
diff --git a/net.c b/net.c
index e8ae13e..3077405 100644
--- a/net.c
+++ b/net.c
@@ -535,6 +535,29 @@ int qemu_find_nic_model(NICInfo *nd, const char * const *models,
     return -1;
 }
 
+int qemu_check_macaddr_uniqueness(uint8_t *macaddr)
+{
+    NetClientState *nc;
+    uint8_t existing_mac[6];
+    char *mac_str;
+    int i;
+
+    QTAILQ_FOREACH(nc, &net_clients, next) {
+        if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
+            mac_str = strstr(nc->info_str, "macaddr=") + strlen("macaddr=");
+            for (i = 0; i < 6; i++) {
+                existing_mac[i] = strtol(mac_str, (char **)&mac_str, 16);
+                mac_str++;
+            }
+            if (memcmp(macaddr, &existing_mac, sizeof(existing_mac)) == 0) {
+                return -1;
+            }
+        }
+    }
+
+    return 0;
+}
+
 static int net_init_nic(const NetClientOptions *opts, const char *name,
                         NetClientState *peer)
 {
@@ -582,6 +605,11 @@ static int net_init_nic(const NetClientOptions *opts, const char *name,
     }
     qemu_macaddr_default_if_unset(&nd->macaddr);
 
+    if (qemu_check_macaddr_uniqueness(nd->macaddr.a) < 0) {
+        error_report("ethernet address collision");
+        return -1;
+    }
+
     if (nic->has_vectors) {
         if (nic->vectors > 0x7ffffff) {
             error_report("invalid # of vectors: %"PRIu32, nic->vectors);
diff --git a/net.h b/net.h
index 04fda1d..227e47d 100644
--- a/net.h
+++ b/net.h
@@ -99,6 +99,7 @@ int qemu_show_nic_models(const char *arg, const char *const *models);
 void qemu_check_nic_model(NICInfo *nd, const char *model);
 int qemu_find_nic_model(NICInfo *nd, const char * const *models,
                         const char *default_model);
+int qemu_check_macaddr_uniqueness(uint8_t *macaddr);
 
 ssize_t qemu_deliver_packet(NetClientState *sender,
                             unsigned flags,
-- 
1.7.10.4

             reply	other threads:[~2012-11-12 11:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-12 11:12 Lin Ma [this message]
2012-11-12 11:18 ` [Qemu-devel] [PATCH] add mac address collision checking for device_add & pci_add Daniel P. Berrange
2012-11-12 11:26   ` Paolo Bonzini
2012-11-12 11:49     ` Lin Ma
2012-11-12 12:28       ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1352718766-5663-1-git-send-email-lma@suse.com \
    --to=lma@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).