On Wed, Feb 24, 2021 at 08:18:39AM +0200, Parav Pandit wrote:
> Enable user to set the mac address and mtu so that each vdpa device
> can have its own user specified mac address and mtu.
> This is done by implementing the management device's configuration
> layout fields setting callback routine.
> 
> Now that user is enabled to set the mac address, remove the module
> parameter for same.

Will likely break some testing setups ...
Not too hard to keep it around, is it?

> 
> And example of setting mac addr and mtu:
> $ vdpa mgmtdev show
> 
> $ vdpa dev add name bar mgmtdev vdpasim_net
> $ vdpa dev config set bar mac 00:11:22:33:44:55 mtu 9000
> 
> View the config after setting:
> $ vdpa dev config show
> bar: mac 00:11:22:33:44:55 link up link_announce false mtu 9000 speed 0 
> duplex 0
> 
> Signed-off-by: Parav Pandit <[email protected]>
> Reviewed-by: Eli Cohen <[email protected]>
> ---
>  drivers/vdpa/vdpa_sim/vdpa_sim_net.c | 39 ++++++++++++++++------------
>  1 file changed, 22 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c 
> b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> index 240a5f1306b5..6e941b0e7935 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
> @@ -29,12 +29,6 @@
>  
>  #define VDPASIM_NET_VQ_NUM   2
>  
> -static char *macaddr;
> -module_param(macaddr, charp, 0);
> -MODULE_PARM_DESC(macaddr, "Ethernet MAC address");
> -
> -static u8 macaddr_buf[ETH_ALEN];
> -
>  static void vdpasim_net_work(struct work_struct *work)
>  {
>       struct vdpasim *vdpasim = container_of(work, struct vdpasim, work);
> @@ -113,9 +107,7 @@ static void vdpasim_net_get_config(struct vdpasim 
> *vdpasim, void *config)
>       struct virtio_net_config *net_config =
>               (struct virtio_net_config *)config;
>  
> -     net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
>       net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
> -     memcpy(net_config->mac, macaddr_buf, ETH_ALEN);
>  }
>  
>  static void vdpasim_net_mgmtdev_release(struct device *dev)
> @@ -134,6 +126,7 @@ static struct device vdpasim_net_mgmtdev_dummy = {
>  
>  static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
>  {
> +     struct virtio_net_config *cfg;
>       struct vdpasim_dev_attr dev_attr = {};
>       struct vdpasim *simdev;
>       int ret;
> @@ -152,6 +145,10 @@ static int vdpasim_net_dev_add(struct vdpa_mgmt_dev 
> *mdev, const char *name)
>       if (IS_ERR(simdev))
>               return PTR_ERR(simdev);
>  
> +     cfg = simdev->config;
> +     eth_random_addr(cfg->mac);
> +     cfg->mtu = cpu_to_vdpasim16(simdev, 1500);
> +
>       ret = _vdpa_register_device(&simdev->vdpa);
>       if (ret)
>               goto reg_err;

Hmm moving it here is problematic:
this part happens before set_features so I suspect
endian-ness will be wrong for BE hosts ...


> @@ -171,9 +168,25 @@ static void vdpasim_net_dev_del(struct vdpa_mgmt_dev 
> *mdev,
>       _vdpa_unregister_device(&simdev->vdpa);
>  }
>  
> +static int
> +vdpasim_net_dev_config_set(struct vdpa_mgmt_dev *mdev,
> +                        struct vdpa_device *dev,
> +                        const struct vdpa_dev_config_set_attr *attrs)
> +{
> +     struct vdpasim *simdev = container_of(dev, struct vdpasim, vdpa);
> +     struct virtio_net_config *dev_cfg = simdev->config;
> +
> +     if (attrs->mask.mac_valid)
> +             memcpy(dev_cfg->mac, attrs->cfg.mac, sizeof(dev_cfg->mac));
> +     if (attrs->mask.mtu_valid)
> +             dev_cfg->mtu = cpu_to_vdpasim16(simdev, attrs->cfg.mtu);
> +     return 0;
> +}
> +
>  static const struct vdpa_mgmtdev_ops vdpasim_net_mgmtdev_ops = {
>       .dev_add = vdpasim_net_dev_add,
> -     .dev_del = vdpasim_net_dev_del
> +     .dev_del = vdpasim_net_dev_del,
> +     .dev_config_set = vdpasim_net_dev_config_set,
>  };
>  
>  static struct virtio_device_id id_table[] = {
> @@ -198,14 +211,6 @@ static int __init vdpasim_net_init(void)
>  {
>       int ret;
>  
> -     if (macaddr) {
> -             mac_pton(macaddr, macaddr_buf);
> -             if (!is_valid_ether_addr(macaddr_buf))
> -                     return -EADDRNOTAVAIL;
> -     } else {
> -             eth_random_addr(macaddr_buf);
> -     }
> -
>       ret = device_register(&vdpasim_net_mgmtdev);
>       if (ret)
>               return ret;
> -- 
> 2.26.2

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to