8
8
*
9
9
*/
10
10
11
+ #include "linux/virtio_net.h"
11
12
#include <linux/init.h>
12
13
#include <linux/module.h>
13
14
#include <linux/cdev.h>
28
29
#include <uapi/linux/virtio_config.h>
29
30
#include <uapi/linux/virtio_ids.h>
30
31
#include <uapi/linux/virtio_blk.h>
32
+ #include <uapi/linux/virtio_ring.h>
31
33
#include <linux/mod_devicetable.h>
32
34
33
35
#include "iova_domain.h"
@@ -141,6 +143,7 @@ static struct workqueue_struct *vduse_irq_bound_wq;
141
143
142
144
static u32 allowed_device_id [] = {
143
145
VIRTIO_ID_BLOCK ,
146
+ VIRTIO_ID_NET ,
144
147
};
145
148
146
149
static inline struct vduse_dev * vdpa_to_vduse (struct vdpa_device * vdpa )
@@ -1705,13 +1708,21 @@ static bool device_is_allowed(u32 device_id)
1705
1708
return false;
1706
1709
}
1707
1710
1708
- static bool features_is_valid (u64 features )
1711
+ static bool features_is_valid (struct vduse_dev_config * config )
1709
1712
{
1710
- if (!(features & ( 1ULL << VIRTIO_F_ACCESS_PLATFORM )))
1713
+ if (!(config -> features & BIT_ULL ( VIRTIO_F_ACCESS_PLATFORM )))
1711
1714
return false;
1712
1715
1713
1716
/* Now we only support read-only configuration space */
1714
- if (features & (1ULL << VIRTIO_BLK_F_CONFIG_WCE ))
1717
+ if ((config -> device_id == VIRTIO_ID_BLOCK ) &&
1718
+ (config -> features & BIT_ULL (VIRTIO_BLK_F_CONFIG_WCE )))
1719
+ return false;
1720
+ else if ((config -> device_id == VIRTIO_ID_NET ) &&
1721
+ (config -> features & BIT_ULL (VIRTIO_NET_F_CTRL_VQ )))
1722
+ return false;
1723
+
1724
+ if ((config -> device_id == VIRTIO_ID_NET ) &&
1725
+ !(config -> features & BIT_ULL (VIRTIO_F_VERSION_1 )))
1715
1726
return false;
1716
1727
1717
1728
return true;
@@ -1738,7 +1749,7 @@ static bool vduse_validate_config(struct vduse_dev_config *config)
1738
1749
if (!device_is_allowed (config -> device_id ))
1739
1750
return false;
1740
1751
1741
- if (!features_is_valid (config -> features ))
1752
+ if (!features_is_valid (config ))
1742
1753
return false;
1743
1754
1744
1755
return true;
@@ -1821,6 +1832,10 @@ static int vduse_create_dev(struct vduse_dev_config *config,
1821
1832
int ret ;
1822
1833
struct vduse_dev * dev ;
1823
1834
1835
+ ret = - EPERM ;
1836
+ if ((config -> device_id == VIRTIO_ID_NET ) && !capable (CAP_NET_ADMIN ))
1837
+ goto err ;
1838
+
1824
1839
ret = - EEXIST ;
1825
1840
if (vduse_find_dev (config -> name ))
1826
1841
goto err ;
@@ -2064,6 +2079,7 @@ static const struct vdpa_mgmtdev_ops vdpa_dev_mgmtdev_ops = {
2064
2079
2065
2080
static struct virtio_device_id id_table [] = {
2066
2081
{ VIRTIO_ID_BLOCK , VIRTIO_DEV_ANY_ID },
2082
+ { VIRTIO_ID_NET , VIRTIO_DEV_ANY_ID },
2067
2083
{ 0 },
2068
2084
};
2069
2085
0 commit comments