Consistently use qemu_macaddr_default_if_unset
PATCH 1/1 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.
--- hw/dp8393x.c | 2 +- hw/etraxfs_eth.c | 2 +- hw/mcf_fec.c | 2 +- hw/mipsnet.c | 2 +- hw/qdev.c | 2 +- hw/stellaris.c | 2 +- hw/xen_devconfig.c | 4 ++-- net.c | 10 ++-------- net.h | 2 +- 9 files changed, 11 insertions(+), 17 deletions(-)
hw/dp8393x.c +1 -1
@@ -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->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.peer = nd->netdev;
hw/etraxfs_eth.c +1 -1
@@ -602,7 +602,7 @@ void *etraxfs_eth_init(NICInfo *nd, target_phys_addr_t base, int phyaddr) DEVICE_NATIVE_ENDIAN);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.peer = nd->netdev;
hw/mcf_fec.c +1 -1
@@ -471,7 +471,7 @@ void mcf_fec_init(NICInfo *nd, target_phys_addr_t base, qemu_irq *irq) DEVICE_NATIVE_ENDIAN);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.peer = nd->netdev;
hw/mipsnet.c +1 -1
@@ -258,7 +258,7 @@ void mipsnet_init (int base, qemu_irq irq, NICInfo *nd) s->irq = irq;if (nd) { -memcpy (s->conf.macaddr.a, nd->macaddr,sizeof (nd->macaddr)); + s->conf.macaddr = nd->macaddr; s->conf.vlan = nd->vlan; s->conf.peer = nd->netdev;
hw/qdev.c +1 -1
@@ -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) { -qdev_prop_set_macaddr (dev,"mac" , nd->macaddr); +qdev_prop_set_macaddr (dev,"mac" , nd->macaddr.a);if (nd->vlan)qdev_prop_set_vlan (dev,"vlan" , nd->vlan);if (nd->netdev)
hw/stellaris.c +1 -1
@@ -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++) {if (board->dc4 & (1 << i)) {
hw/xen_devconfig.c +2 -2
@@ -126,8 +126,8 @@ int xen_config_dev_nic(NICInfo *nic)char mac[20 ];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_config_dev_dirs ("vif" ,"qnic" , nic->vlan->id, fe, be,sizeof (fe));
net.c +2 -8
@@ -776,18 +776,12 @@ static int net_init_nic(QemuOpts *opts, 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" ) && -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" );return -1 ; } +qemu_macaddr_default_if_unset (&nd->macaddr); nd->nvectors =qemu_opt_get_number (opts,"vectors" ,DEV_NVECTORS_UNSPECIFIED );
net.h +1 -1
@@ -127,7 +127,7 @@ int do_set_link(Monitor *mon, const QDict *qdict, QObject **ret_data);#define MAX_NICS 8struct NICInfo { -uint8_t macaddr[6 ]; +MACAddr macaddr;char *model;char *name;char *devaddr;
Signature · 1 line
1.7.1
Quoted 4 lines · Jan Kiszka
Drop the open-coded MAC assignment from
net_init_nicand replace it with standardqemu_macaddr_default_if_unsetwhich is also used by qdev. That avoid creating colliding MACs when instantiating NICs via different mechanisms.
Should we explicitly mention that this may change default MAC addresses?
Quoted 4 lines
This change requires to store the MAC as MACAddr in NICInfo, and the remaining
nd_tableusers need to be updated.Based on suggestion by Peter Maydell.
Patch looks fine to me.
Quoted 8 lines · Markus Armbruster
Quoted 4 lines · Jan Kiszka
Drop the open-coded MAC assignment from
net_init_nicand replace it with standardqemu_macaddr_default_if_unsetwhich is also used by qdev. That avoid creating colliding MACs when instantiating NICs via different mechanisms.Should we explicitly mention that this may change default MAC addresses?
Only if mixing old (-net) and new (-device) mechanisms.
Quoted 7 lines
Quoted 5 lines
This change requires to store the MAC as MACAddr in NICInfo, and the remaining
nd_tableusers need to be updated.Based on suggestion by Peter Maydell.
Patch looks fine to me.
Thanks,
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux