diff mbox series

virtio-net : Add check for VIRTIO_NET_F_MAC

Message ID 20210929065215.21549-1-lulu@redhat.com (mailing list archive)
State New, archived
Headers show
Series virtio-net : Add check for VIRTIO_NET_F_MAC | expand

Commit Message

Cindy Lu Sept. 29, 2021, 6:52 a.m. UTC
For vdpa device, if the host support VIRTIO_NET_F_MAC
we need to read the mac address from hardware, so need
to check this bit, the logic is
1 if the host support VIRTIO_NET_F_MAC and the mac address
   is correct, qemu will use the mac address in hardware
2.if the host not support , qemu will use the mac from cmdline
3.if the cmdline not provide mac address, qemu will use radam mac
address

Signed-off-by: Cindy Lu <lulu@redhat.com>
---
 hw/net/virtio-net.c | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

Comments

Michael Tokarev Sept. 29, 2021, 10:01 a.m. UTC | #1
29.09.2021 09:52, Cindy Lu wrote:
> For vdpa device, if the host support VIRTIO_NET_F_MAC
> we need to read the mac address from hardware, so need
> to check this bit, the logic is
> 1 if the host support VIRTIO_NET_F_MAC and the mac address
>     is correct, qemu will use the mac address in hardware
> 2.if the host not support , qemu will use the mac from cmdline

So if hw supports NET_F_MAC, cmdline-provided parameter will
silently be ignored?

s/host not support/host does not support this feature/

> 3.if the cmdline not provide mac address, qemu will use radam mac
> address

s/not/does not/
s/radam/random/

Thanks,

/mjt
Cindy Lu Sept. 29, 2021, 12:08 p.m. UTC | #2
On Wed, Sep 29, 2021 at 6:07 PM Michael Tokarev <mjt@tls.msk.ru> wrote:
>
> 29.09.2021 09:52, Cindy Lu wrote:
> > For vdpa device, if the host support VIRTIO_NET_F_MAC
> > we need to read the mac address from hardware, so need
> > to check this bit, the logic is
> > 1 if the host support VIRTIO_NET_F_MAC and the mac address
> >     is correct, qemu will use the mac address in hardware
> > 2.if the host not support , qemu will use the mac from cmdline
>
> So if hw supports NET_F_MAC, cmdline-provided parameter will
> silently be ignored?
>
yes, this is based on the virtio spec, you can check this document in
5.1.5 Device Initialization
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html

Also, this check it only working for vdpa device
> s/host not support/host does not support this feature/
Thanks , will fix this
>
> > 3.if the cmdline not provide mac address, qemu will use radam mac
> > address
>
> s/not/does not/
> s/radam/random/
>
thanks, will fix this
> Thanks,
>
> /mjt
>
Michael S. Tsirkin Sept. 29, 2021, 1:36 p.m. UTC | #3
On Wed, Sep 29, 2021 at 08:08:40PM +0800, Cindy Lu wrote:
> On Wed, Sep 29, 2021 at 6:07 PM Michael Tokarev <mjt@tls.msk.ru> wrote:
> >
> > 29.09.2021 09:52, Cindy Lu wrote:
> > > For vdpa device, if the host support VIRTIO_NET_F_MAC
> > > we need to read the mac address from hardware, so need
> > > to check this bit, the logic is
> > > 1 if the host support VIRTIO_NET_F_MAC and the mac address
> > >     is correct, qemu will use the mac address in hardware
> > > 2.if the host not support , qemu will use the mac from cmdline
> >
> > So if hw supports NET_F_MAC, cmdline-provided parameter will
> > silently be ignored?
> >
> yes, this is based on the virtio spec, you can check this document in
> 5.1.5 Device Initialization
> https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html

Maybe use the hw mac if mac is not provided? If provided
make sure the command line matches the hardware, and fail
otherwise?

> Also, this check it only working for vdpa device
> > s/host not support/host does not support this feature/
> Thanks , will fix this
> >
> > > 3.if the cmdline not provide mac address, qemu will use radam mac
> > > address
> >
> > s/not/does not/
> > s/radam/random/
> >
> thanks, will fix this
> > Thanks,
> >
> > /mjt
> >
Cindy Lu Sept. 30, 2021, 1:35 a.m. UTC | #4
On Wed, Sep 29, 2021 at 9:36 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Wed, Sep 29, 2021 at 08:08:40PM +0800, Cindy Lu wrote:
> > On Wed, Sep 29, 2021 at 6:07 PM Michael Tokarev <mjt@tls.msk.ru> wrote:
> > >
> > > 29.09.2021 09:52, Cindy Lu wrote:
> > > > For vdpa device, if the host support VIRTIO_NET_F_MAC
> > > > we need to read the mac address from hardware, so need
> > > > to check this bit, the logic is
> > > > 1 if the host support VIRTIO_NET_F_MAC and the mac address
> > > >     is correct, qemu will use the mac address in hardware
> > > > 2.if the host not support , qemu will use the mac from cmdline
> > >
> > > So if hw supports NET_F_MAC, cmdline-provided parameter will
> > > silently be ignored?
> > >
> > yes, this is based on the virtio spec, you can check this document in
> > 5.1.5 Device Initialization
> > https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html
>
> Maybe use the hw mac if mac is not provided? If provided
> make sure the command line matches the hardware, and fail
> otherwise?
>

so here come to the final question. which mac address has the higher priority?
I think the NET_F_MAC bit means the hw mac address > command-line address.
if the hw drivers want to change this. they can simply remove this bit.


> > Also, this check it only working for vdpa device
> > > s/host not support/host does not support this feature/
> > Thanks , will fix this
> > >
> > > > 3.if the cmdline not provide mac address, qemu will use radam mac
> > > > address
> > >
> > > s/not/does not/
> > > s/radam/random/
> > >
> > thanks, will fix this
> > > Thanks,
> > >
> > > /mjt
> > >
>
Michael Tokarev Sept. 30, 2021, 10:46 a.m. UTC | #5
30.09.2021 04:35, Cindy Lu wrote:
[]
> so here come to the final question. which mac address has the higher priority?
> I think the NET_F_MAC bit means the hw mac address > command-line address.
> if the hw drivers want to change this. they can simply remove this bit.

At the very least, qemu should NEVER silently ignore stuff specified
on the command line. It should either warn the user or error out if
command-line parameter can not be applied for whatever reason.

I don't know the context, what NET_F_MAC is, but the general rule is
this: if the user specified something, it must not be ignored.

/mjt
diff mbox series

Patch

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 55aac06a0a..085daa28b0 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -127,9 +127,9 @@  static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
     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));
+
+    memset(&netcfg, 0, sizeof(struct virtio_net_config));
     virtio_stw_p(vdev, &netcfg.status, n->status);
     virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queues);
     virtio_stw_p(vdev, &netcfg.mtu, n->net_conf.mtu);
@@ -159,12 +159,21 @@  static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
              * address has been configured correctly elsewhere - just not
              * reported by the device.
              */
+
             if (memcmp(&netcfg.mac, &zero, sizeof(zero)) == 0) {
                 info_report("Zero hardware mac address detected. Ignoring.");
                 memcpy(netcfg.mac, n->mac, ETH_ALEN);
             }
-            memcpy(config, &netcfg, n->config_size);
+            /*
+             * If the host support VIRTIO_NET_F_MAC, That means hardware
+             * will provide the mac address, otherwise we don't need to use it.
+             * use  the mac address from qemu cfg
+             */
+            if (!(virtio_host_has_feature(vdev, VIRTIO_NET_F_MAC))) {
+                memcpy(netcfg.mac, n->mac, ETH_ALEN);
+            }
         }
+        memcpy(config, &netcfg, n->config_size);
     }
 }
 
@@ -3453,11 +3462,22 @@  static void virtio_net_device_realize(DeviceState *dev, Error **errp)
     nc = qemu_get_queue(n->nic);
     nc->rxfilter_notify_enabled = 1;
 
-   if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
+    if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
+
         struct virtio_net_config netcfg = {};
-        memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN);
-        vhost_net_set_config(get_vhost_net(nc->peer),
-            (uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_MASTER);
+        /*
+         * get the real mac address from hardware or qemu cmline
+         *
+         * If the host support VIRTIO_NET_F_MAC, That means hardware
+         * will provide the mac address, otherwise we don't need to use it.
+         * use  the mac address from qemu cfg
+         */
+        virtio_net_get_config(vdev, (uint8_t *)&netcfg);
+        /*
+         * for vdpa device qemu need to set the real mac back to hardware
+         */
+        vhost_net_set_config(get_vhost_net(nc->peer),  (uint8_t *)&netcfg, 0,
+                             ETH_ALEN, VHOST_SET_CONFIG_TYPE_MASTER);
     }
     QTAILQ_INIT(&n->rsc_chains);
     n->qdev = dev;