.I NAME
.B mgmtdev
.I MGMTDEV
+.RI "[ device_features " DEVICE_FEATURES " ]"
.RI "[ mac " MACADDR " ]"
.RI "[ mtu " MTU " ]"
.RI "[ max_vqp " MAX_VQ_PAIRS " ]"
Name of the management device to use for device addition.
.PP
+.BI device_features " DEVICE_FEATURES"
+Specifies the virtio device features bit-mask that is provisioned for the new vdpa device.
+
+The bits can be found under include/uapi/linux/virtio*h.
+
+see macros such as VIRTIO_F_ and VIRTIO_XXX(e.g NET)_F_ for specific bit values.
+
+This is optional.
+
.BI mac " MACADDR"
- specifies the mac address for the new vdpa device.
This is applicable only for the network type of vdpa device. This is optional.
Add the vdpa device named foo on the management device vdpa_sim_net.
.RE
.PP
+vdpa dev add name foo mgmtdev vdpa_sim_net device_features 0x300020000
+.RS 4
+Add the vdpa device named foo on the management device vdpa_sim_net with device_features of 0x300020000
+.RE
+.PP
vdpa dev add name foo mgmtdev vdpa_sim_net mac 00:11:22:33:44:55
.RS 4
Add the vdpa device named foo on the management device vdpa_sim_net with mac address of 00:11:22:33:44:55.
#define VDPA_OPT_VDEV_MTU BIT(5)
#define VDPA_OPT_MAX_VQP BIT(6)
#define VDPA_OPT_QUEUE_INDEX BIT(7)
+#define VDPA_OPT_VDEV_FEATURES BIT(8)
struct vdpa_opts {
uint64_t present; /* flags of present items */
uint16_t mtu;
uint16_t max_vqp;
uint32_t queue_idx;
+ uint64_t device_features;
};
struct vdpa {
return get_u32(result, *argv, 10);
}
+static int vdpa_argv_u64_hex(struct vdpa *vdpa, int argc, char **argv,
+ uint64_t *result)
+{
+ if (argc <= 0 || !*argv) {
+ fprintf(stderr, "number expected\n");
+ return -EINVAL;
+ }
+
+ return get_u64((__u64 *)result, *argv, 16);
+}
+
struct vdpa_args_metadata {
uint64_t o_flag;
const char *err_msg;
mnl_attr_put_u16(nlh, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, opts->max_vqp);
if (opts->present & VDPA_OPT_QUEUE_INDEX)
mnl_attr_put_u32(nlh, VDPA_ATTR_DEV_QUEUE_INDEX, opts->queue_idx);
+ if (opts->present & VDPA_OPT_VDEV_FEATURES) {
+ mnl_attr_put_u64(nlh, VDPA_ATTR_DEV_FEATURES,
+ opts->device_features);
+ }
}
static int vdpa_argv_parse(struct vdpa *vdpa, int argc, char **argv,
NEXT_ARG_FWD();
o_found |= VDPA_OPT_QUEUE_INDEX;
+ } else if (!strcmp(*argv, "device_features") &&
+ (o_optional & VDPA_OPT_VDEV_FEATURES)) {
+ NEXT_ARG_FWD();
+ err = vdpa_argv_u64_hex(vdpa, argc, argv,
+ &opts->device_features);
+ if (err)
+ return err;
+ o_found |= VDPA_OPT_VDEV_FEATURES;
} else {
fprintf(stderr, "Unknown option \"%s\"\n", *argv);
return -EINVAL;
static void cmd_dev_help(void)
{
fprintf(stderr, "Usage: vdpa dev show [ DEV ]\n");
- fprintf(stderr, " vdpa dev add name NAME mgmtdev MANAGEMENTDEV [ mac MACADDR ] [ mtu MTU ]\n");
+ fprintf(stderr, " vdpa dev add name NAME mgmtdev MANAGEMENTDEV [ device_features DEVICE_FEATURES]\n");
+ fprintf(stderr, " [ mac MACADDR ] [ mtu MTU ]\n");
fprintf(stderr, " [ max_vqp MAX_VQ_PAIRS ]\n");
fprintf(stderr, " vdpa dev del DEV\n");
fprintf(stderr, "Usage: vdpa dev config COMMAND [ OPTIONS ]\n");
err = vdpa_argv_parse_put(nlh, vdpa, argc, argv,
VDPA_OPT_VDEV_MGMTDEV_HANDLE | VDPA_OPT_VDEV_NAME,
VDPA_OPT_VDEV_MAC | VDPA_OPT_VDEV_MTU |
- VDPA_OPT_MAX_VQP);
+ VDPA_OPT_MAX_VQP | VDPA_OPT_VDEV_FEATURES);
if (err)
return err;