While peer is vdpa, sometime qemu get an all zero mac address from the hardware, This is not a legal value. Add the check for this.if we get an zero mac address. qemu will use the default mac address or the mac address from qemu cmdline
Signed-off-by: Cindy Lu <[email protected]> --- hw/net/virtio-net.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9179013ac4..8f36ca5066 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -126,6 +126,7 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config) VirtIONet *n = VIRTIO_NET(vdev); struct virtio_net_config netcfg; NetClientState *nc = qemu_get_queue(n->nic); + static const MACAddr zero = { .a = { 0, 0, 0, 0, 0, 0 } }; int ret = 0; memset(&netcfg, 0 , sizeof(struct virtio_net_config)); @@ -151,6 +152,15 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config) ret = vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg, n->config_size); if (ret != -1) { + /* + * Here is a work around, the 0 mac address is not a legal value. + * if we got this from hardware, qemu will use the mac address + * saved in VirtIONet->mac. + */ + if (memcmp(&netcfg.mac, &zero, sizeof(zero)) == 0) { + info_report("Get an all zero mac address from hardware"); + memcpy(netcfg.mac, n->mac, ETH_ALEN); + } memcpy(config, &netcfg, n->config_size); } } -- 2.21.3
