Parav Pandit
2021-Feb-24 06:18 UTC
[PATCH linux-next 4/9] vdpa_sim_net: Enable user to set mac address and mtu
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. 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 <parav at nvidia.com> Reviewed-by: Eli Cohen <elic at nvidia.com> --- 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; @@ -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
Michael S. Tsirkin
2021-Feb-24 06:56 UTC
[PATCH linux-next 4/9] vdpa_sim_net: Enable user to set mac address and mtu
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 <parav at nvidia.com> > Reviewed-by: Eli Cohen <elic at nvidia.com> > --- > 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