return dev_type;
 }
 
-static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+                             const struct vdpa_dev_set_config *config)
 {
        struct ifcvf_vdpa_mgmt_dev *ifcvf_mgmt_dev;
        struct ifcvf_adapter *adapter;
 
        return ret;
 }
 
-static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
+static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
+                            const struct vdpa_dev_set_config *add_config)
 {
        struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
        struct virtio_net_config *config;
 
 #include <uapi/linux/vdpa.h>
 #include <net/genetlink.h>
 #include <linux/mod_devicetable.h>
-#include <linux/virtio_net.h>
 #include <linux/virtio_ids.h>
 
 static LIST_HEAD(mdev_head);
        return msg->len;
 }
 
+#define VDPA_DEV_NET_ATTRS_MASK ((1 << VDPA_ATTR_DEV_NET_CFG_MACADDR) | \
+                                (1 << VDPA_ATTR_DEV_NET_CFG_MTU))
+
 static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *info)
 {
+       struct vdpa_dev_set_config config = {};
+       struct nlattr **nl_attrs = info->attrs;
        struct vdpa_mgmt_dev *mdev;
+       const u8 *macaddr;
        const char *name;
        int err = 0;
 
 
        name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 
+       if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
+               macaddr = nla_data(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
+               memcpy(config.net.mac, macaddr, sizeof(config.net.mac));
+               config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR);
+       }
+       if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]) {
+               config.net.mtu =
+                       nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]);
+               config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MTU);
+       }
+
+       /* Skip checking capability if user didn't prefer to configure any
+        * device networking attributes. It is likely that user might have used
+        * a device specific method to configure such attributes or using device
+        * default attributes.
+        */
+       if ((config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
+           !netlink_capable(skb, CAP_NET_ADMIN))
+               return -EPERM;
+
        mutex_lock(&vdpa_dev_mutex);
        mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
        if (IS_ERR(mdev)) {
                err = PTR_ERR(mdev);
                goto err;
        }
+       if ((config.mask & mdev->config_attr_mask) != config.mask) {
+               NL_SET_ERR_MSG_MOD(info->extack,
+                                  "All provided attributes are not supported");
+               err = -EOPNOTSUPP;
+               goto err;
+       }
 
-       err = mdev->ops->dev_add(mdev, name);
+       err = mdev->ops->dev_add(mdev, name, &config);
 err:
        mutex_unlock(&vdpa_dev_mutex);
        return err;
        [VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
        [VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
        [VDPA_ATTR_DEV_NAME] = { .type = NLA_STRING },
+       [VDPA_ATTR_DEV_NET_CFG_MACADDR] = NLA_POLICY_ETH_ADDR,
+       /* virtio spec 1.1 section 5.1.4.1 for valid MTU range */
+       [VDPA_ATTR_DEV_NET_CFG_MTU] = NLA_POLICY_MIN(NLA_U16, 68),
 };
 
 static const struct genl_ops vdpa_nl_ops[] = {
 
        .release = vdpasim_blk_mgmtdev_release,
 };
 
-static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+                              const struct vdpa_dev_set_config *config)
 {
        struct vdpasim_dev_attr dev_attr = {};
        struct vdpasim *simdev;
 
        .release = vdpasim_net_mgmtdev_release,
 };
 
-static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+                              const struct vdpa_dev_set_config *config)
 {
        struct vdpasim_dev_attr dev_attr = {};
        struct vdpasim *simdev;
 
        return 0;
 }
 
-static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
+static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
+                       const struct vdpa_dev_set_config *config)
 {
        struct vduse_dev *dev;
        int ret;
 
 #include <linux/device.h>
 #include <linux/interrupt.h>
 #include <linux/vhost_iotlb.h>
+#include <linux/virtio_net.h>
+#include <linux/if_ether.h>
 
 /**
  * struct vdpa_calllback - vDPA callback definition.
        u64 last;
 };
 
+struct vdpa_dev_set_config {
+       struct {
+               u8 mac[ETH_ALEN];
+               u16 mtu;
+       } net;
+       u64 mask;
+};
+
 /**
  * Corresponding file area for device memory mapping
  * @file: vma->vm_file for the mapping
  * @dev_add: Add a vdpa device using alloc and register
  *          @mdev: parent device to use for device addition
  *          @name: name of the new vdpa device
+ *          @config: config attributes to apply to the device under creation
  *          Driver need to add a new device using _vdpa_register_device()
  *          after fully initializing the vdpa device. Driver must return 0
  *          on success or appropriate error code.
  *          _vdpa_unregister_device().
  */
 struct vdpa_mgmtdev_ops {
-       int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name);
+       int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name,
+                      const struct vdpa_dev_set_config *config);
        void (*dev_del)(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev);
 };
 
  * @device: Management parent device
  * @ops: operations supported by management device
  * @id_table: Pointer to device id table of supported ids
+ * @config_attr_mask: bit mask of attributes of type enum vdpa_attr that
+ *                   management device support during dev_add callback
  * @list: list entry
  */
 struct vdpa_mgmt_dev {
        struct device *device;
        const struct vdpa_mgmtdev_ops *ops;
        const struct virtio_device_id *id_table;
+       u64 config_attr_mask;
        struct list_head list;
 };