[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 24/24] tap-bsd: use user-specified tap device if it a
From: |
Michael Tokarev |
Subject: |
[Qemu-devel] [PULL 24/24] tap-bsd: use user-specified tap device if it already exists |
Date: |
Fri, 6 Nov 2015 15:44:01 +0300 |
From: Ed Maste <address@hidden>
Acked-by: Roger Pau Monné <address@hidden>
Signed-off-by: Ed Maste <address@hidden>
Signed-off-by: Michael Tokarev <address@hidden>
---
net/tap-bsd.c | 38 +++++++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/net/tap-bsd.c b/net/tap-bsd.c
index 7028d9b..0103a97 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -109,8 +109,7 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
#define PATH_NET_TAP "/dev/tap"
-int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
- int vnet_hdr_required, int mq_required, Error **errp)
+static int tap_open_clone(char *ifname, int ifname_size, Error **errp)
{
int fd, s, ret;
struct ifreq ifr;
@@ -126,7 +125,8 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
ret = ioctl(fd, TAPGIFNAME, (void *)&ifr);
if (ret < 0) {
error_setg_errno(errp, errno, "could not get tap interface name");
- goto error;
+ close(fd);
+ return -1;
}
if (ifname[0] != '\0') {
@@ -135,19 +135,47 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
if (s < 0) {
error_setg_errno(errp, errno,
"could not open socket to set interface name");
- goto error;
+ close(fd);
+ return -1;
}
ifr.ifr_data = ifname;
ret = ioctl(s, SIOCSIFNAME, (void *)&ifr);
close(s);
if (ret < 0) {
error_setg(errp, "could not set tap interface name");
- goto error;
+ close(fd);
+ return -1;
}
} else {
pstrcpy(ifname, ifname_size, ifr.ifr_name);
}
+ return fd;
+}
+
+int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
+ int vnet_hdr_required, int mq_required, Error **errp)
+{
+ int fd = -1;
+
+ /* If the specified tap device already exists just use it. */
+ if (ifname[0] != '\0') {
+ char dname[100];
+ snprintf(dname, sizeof dname, "/dev/%s", ifname);
+ TFR(fd = open(dname, O_RDWR));
+ if (fd < 0 && errno != ENOENT) {
+ error_setg_errno(errp, errno, "could not open %s", dname);
+ return -1;
+ }
+ }
+
+ if (fd < 0) {
+ /* Tap device not specified or does not exist. */
+ if ((fd = tap_open_clone(ifname, ifname_size, errp)) < 0) {
+ return -1;
+ }
+ }
+
if (*vnet_hdr) {
/* BSD doesn't have IFF_VNET_HDR */
*vnet_hdr = 0;
--
2.1.4
- [Qemu-devel] [PULL 02/24] gdbstub: Fix buffer overflows in gdb_handle_packet(), (continued)
- [Qemu-devel] [PULL 16/24] configure: remove help string for 'vnc-tls' option, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 03/24] hw/display/tcx: Remove superfluous OBJECT() typecasts, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 13/24] ui: Use g_new() & friends where that makes obvious sense, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 24/24] tap-bsd: use user-specified tap device if it already exists,
Michael Tokarev <=
- [Qemu-devel] [PULL 14/24] qxl: Use g_new() & friends where that makes obvious sense, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 19/24] ivshmem-server: fix possible OVERRUN, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 07/24] xen: fix invalid assertion, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 05/24] fix bad indentation in pcie_cap_slot_write_config(), Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 12/24] bt: fix use of uninitialized variable seqlen, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 21/24] exec: avoid unnecessary cacheline bounce on ram_list.mru_block, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 22/24] taget-ppc: Fix read access to IBAT registers higher than IBAT3, Michael Tokarev, 2015/11/06
- [Qemu-devel] [PULL 18/24] pci-assign: do not test path with access() before opening, Michael Tokarev, 2015/11/06
- Re: [Qemu-devel] [PULL 00/24] Trivial patches for 2015-11-06, Peter Maydell, 2015/11/06
- [Qemu-devel] [PULL 15/24] usb: Use g_new() & friends where that makes obvious sense, Michael Tokarev, 2015/11/06