浏览代码

net: Consistently use qemu_macaddr_default_if_unset

Drop the open-coded MAC assignment from net_init_nic and replace it with
standard qemu_macaddr_default_if_unset which is also used by qdev. That
avoid creating colliding MACs when instantiating NICs via different
mechanisms.

This change requires to store the MAC as MACAddr in NICInfo, and the
remaining nd_table users need to be updated.

Based on suggestion by Peter Maydell.

CC: Markus Armbruster <armbru@redhat.com>
CC: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Jan Kiszka 14 年之前
父节点
当前提交
6eed18568d
共有 9 个文件被更改,包括 11 次插入17 次删除
  1. 1 1
      hw/dp8393x.c
  2. 1 1
      hw/etraxfs_eth.c
  3. 1 1
      hw/mcf_fec.c
  4. 1 1
      hw/mipsnet.c
  5. 1 1
      hw/qdev.c
  6. 1 1
      hw/stellaris.c
  7. 2 2
      hw/xen_devconfig.c
  8. 2 8
      net.c
  9. 1 1
      net.h

+ 1 - 1
hw/dp8393x.c

@@ -898,7 +898,7 @@ void dp83932_init(NICInfo *nd, target_phys_addr_t base, int it_shift,
     s->watchdog = qemu_new_timer_ns(vm_clock, dp8393x_watchdog, s);
     s->watchdog = qemu_new_timer_ns(vm_clock, dp8393x_watchdog, s);
     s->regs[SONIC_SR] = 0x0004; /* only revision recognized by Linux */
     s->regs[SONIC_SR] = 0x0004; /* only revision recognized by Linux */
 
 
-    memcpy(s->conf.macaddr.a, nd->macaddr, sizeof(s->conf.macaddr));
+    s->conf.macaddr = nd->macaddr;
     s->conf.vlan = nd->vlan;
     s->conf.vlan = nd->vlan;
     s->conf.peer = nd->netdev;
     s->conf.peer = nd->netdev;
 
 

+ 1 - 1
hw/etraxfs_eth.c

@@ -602,7 +602,7 @@ void *etraxfs_eth_init(NICInfo *nd, target_phys_addr_t base, int phyaddr)
                                               DEVICE_NATIVE_ENDIAN);
                                               DEVICE_NATIVE_ENDIAN);
 	cpu_register_physical_memory (base, 0x5c, eth->ethregs);
 	cpu_register_physical_memory (base, 0x5c, eth->ethregs);
 
 
-	memcpy(eth->conf.macaddr.a, nd->macaddr, sizeof(nd->macaddr));
+	eth->conf.macaddr = nd->macaddr;
 	eth->conf.vlan = nd->vlan;
 	eth->conf.vlan = nd->vlan;
 	eth->conf.peer = nd->netdev;
 	eth->conf.peer = nd->netdev;
 
 

+ 1 - 1
hw/mcf_fec.c

@@ -471,7 +471,7 @@ void mcf_fec_init(NICInfo *nd, target_phys_addr_t base, qemu_irq *irq)
                                            DEVICE_NATIVE_ENDIAN);
                                            DEVICE_NATIVE_ENDIAN);
     cpu_register_physical_memory(base, 0x400, s->mmio_index);
     cpu_register_physical_memory(base, 0x400, s->mmio_index);
 
 
-    memcpy(s->conf.macaddr.a, nd->macaddr, sizeof(nd->macaddr));
+    s->conf.macaddr = nd->macaddr;
     s->conf.vlan = nd->vlan;
     s->conf.vlan = nd->vlan;
     s->conf.peer = nd->netdev;
     s->conf.peer = nd->netdev;
 
 

+ 1 - 1
hw/mipsnet.c

@@ -258,7 +258,7 @@ void mipsnet_init (int base, qemu_irq irq, NICInfo *nd)
     s->irq = irq;
     s->irq = irq;
 
 
     if (nd) {
     if (nd) {
-        memcpy(s->conf.macaddr.a, nd->macaddr, sizeof(nd->macaddr));
+        s->conf.macaddr = nd->macaddr;
         s->conf.vlan = nd->vlan;
         s->conf.vlan = nd->vlan;
         s->conf.peer = nd->netdev;
         s->conf.peer = nd->netdev;
 
 

+ 1 - 1
hw/qdev.c

@@ -459,7 +459,7 @@ void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
 
 
 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
 {
 {
-    qdev_prop_set_macaddr(dev, "mac", nd->macaddr);
+    qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
     if (nd->vlan)
     if (nd->vlan)
         qdev_prop_set_vlan(dev, "vlan", nd->vlan);
         qdev_prop_set_vlan(dev, "vlan", nd->vlan);
     if (nd->netdev)
     if (nd->netdev)

+ 1 - 1
hw/stellaris.c

@@ -1230,7 +1230,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
         }
         }
     }
     }
 
 
-    stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr);
+    stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr.a);
 
 
     for (i = 0; i < 7; i++) {
     for (i = 0; i < 7; i++) {
         if (board->dc4 & (1 << i)) {
         if (board->dc4 & (1 << i)) {

+ 2 - 2
hw/xen_devconfig.c

@@ -126,8 +126,8 @@ int xen_config_dev_nic(NICInfo *nic)
     char mac[20];
     char mac[20];
 
 
     snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
     snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
-	     nic->macaddr[0], nic->macaddr[1], nic->macaddr[2],
-	     nic->macaddr[3], nic->macaddr[4], nic->macaddr[5]);
+             nic->macaddr.a[0], nic->macaddr.a[1], nic->macaddr.a[2],
+             nic->macaddr.a[3], nic->macaddr.a[4], nic->macaddr.a[5]);
     xen_be_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", nic->vlan->id, mac);
     xen_be_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", nic->vlan->id, mac);
     xen_config_dev_dirs("vif", "qnic", nic->vlan->id, fe, be, sizeof(fe));
     xen_config_dev_dirs("vif", "qnic", nic->vlan->id, fe, be, sizeof(fe));
 
 

+ 2 - 8
net.c

@@ -776,18 +776,12 @@ static int net_init_nic(QemuOpts *opts,
         nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
         nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
     }
     }
 
 
-    nd->macaddr[0] = 0x52;
-    nd->macaddr[1] = 0x54;
-    nd->macaddr[2] = 0x00;
-    nd->macaddr[3] = 0x12;
-    nd->macaddr[4] = 0x34;
-    nd->macaddr[5] = 0x56 + idx;
-
     if (qemu_opt_get(opts, "macaddr") &&
     if (qemu_opt_get(opts, "macaddr") &&
-        net_parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
+        net_parse_macaddr(nd->macaddr.a, qemu_opt_get(opts, "macaddr")) < 0) {
         error_report("invalid syntax for ethernet address");
         error_report("invalid syntax for ethernet address");
         return -1;
         return -1;
     }
     }
+    qemu_macaddr_default_if_unset(&nd->macaddr);
 
 
     nd->nvectors = qemu_opt_get_number(opts, "vectors",
     nd->nvectors = qemu_opt_get_number(opts, "vectors",
                                        DEV_NVECTORS_UNSPECIFIED);
                                        DEV_NVECTORS_UNSPECIFIED);

+ 1 - 1
net.h

@@ -129,7 +129,7 @@ int do_set_link(Monitor *mon, const QDict *qdict, QObject **ret_data);
 #define MAX_NICS 8
 #define MAX_NICS 8
 
 
 struct NICInfo {
 struct NICInfo {
-    uint8_t macaddr[6];
+    MACAddr macaddr;
     char *model;
     char *model;
     char *name;
     char *name;
     char *devaddr;
     char *devaddr;