diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2010-02-18 00:46:50 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-02-18 17:08:38 -0500 |
| commit | 501c774cb13c3ef8fb7fc5f08fa19473f7d9a0db (patch) | |
| tree | 65db25ce76a5c038d69c304d9b6456e4f68e9f47 /drivers/vhost | |
| parent | 02df55d28c6001a3cdb7a997a34a0b01f01d015e (diff) | |
net/macvtap: add vhost support
This adds support for passing a macvtap file descriptor into
vhost-net, much like we already do for tun/tap.
Most of the new code is taken from the respective patch
in the tun driver and may get consolidated in the future.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/vhost')
| -rw-r--r-- | drivers/vhost/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/vhost/net.c | 8 |
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig index 9e9355367bb3..e4e2fd1b5107 100644 --- a/drivers/vhost/Kconfig +++ b/drivers/vhost/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VHOST_NET | 1 | config VHOST_NET |
| 2 | tristate "Host kernel accelerator for virtio net (EXPERIMENTAL)" | 2 | tristate "Host kernel accelerator for virtio net (EXPERIMENTAL)" |
| 3 | depends on NET && EVENTFD && (TUN || !TUN) && EXPERIMENTAL | 3 | depends on NET && EVENTFD && (TUN || !TUN) && (MACVTAP || !MACVTAP) && EXPERIMENTAL |
| 4 | ---help--- | 4 | ---help--- |
| 5 | This kernel module can be loaded in host kernel to accelerate | 5 | This kernel module can be loaded in host kernel to accelerate |
| 6 | guest networking with virtio_net. Not to be confused with virtio_net | 6 | guest networking with virtio_net. Not to be confused with virtio_net |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 4c8928319e1d..91a324cc2298 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/if_packet.h> | 22 | #include <linux/if_packet.h> |
| 23 | #include <linux/if_arp.h> | 23 | #include <linux/if_arp.h> |
| 24 | #include <linux/if_tun.h> | 24 | #include <linux/if_tun.h> |
| 25 | #include <linux/if_macvlan.h> | ||
| 25 | 26 | ||
| 26 | #include <net/sock.h> | 27 | #include <net/sock.h> |
| 27 | 28 | ||
| @@ -452,13 +453,16 @@ err: | |||
| 452 | return ERR_PTR(r); | 453 | return ERR_PTR(r); |
| 453 | } | 454 | } |
| 454 | 455 | ||
| 455 | static struct socket *get_tun_socket(int fd) | 456 | static struct socket *get_tap_socket(int fd) |
| 456 | { | 457 | { |
| 457 | struct file *file = fget(fd); | 458 | struct file *file = fget(fd); |
| 458 | struct socket *sock; | 459 | struct socket *sock; |
| 459 | if (!file) | 460 | if (!file) |
| 460 | return ERR_PTR(-EBADF); | 461 | return ERR_PTR(-EBADF); |
| 461 | sock = tun_get_socket(file); | 462 | sock = tun_get_socket(file); |
| 463 | if (!IS_ERR(sock)) | ||
| 464 | return sock; | ||
| 465 | sock = macvtap_get_socket(file); | ||
| 462 | if (IS_ERR(sock)) | 466 | if (IS_ERR(sock)) |
| 463 | fput(file); | 467 | fput(file); |
| 464 | return sock; | 468 | return sock; |
| @@ -473,7 +477,7 @@ static struct socket *get_socket(int fd) | |||
| 473 | sock = get_raw_socket(fd); | 477 | sock = get_raw_socket(fd); |
| 474 | if (!IS_ERR(sock)) | 478 | if (!IS_ERR(sock)) |
| 475 | return sock; | 479 | return sock; |
| 476 | sock = get_tun_socket(fd); | 480 | sock = get_tap_socket(fd); |
| 477 | if (!IS_ERR(sock)) | 481 | if (!IS_ERR(sock)) |
| 478 | return sock; | 482 | return sock; |
| 479 | return ERR_PTR(-ENOTSOCK); | 483 | return ERR_PTR(-ENOTSOCK); |
