From: Roger Pau Monne <roger.pau@citrix.com> To: qemu-devel@nongnu.org, xen-devel@lists.xenproject.org Cc: Anthony Liguori <aliguori@us.ibm.com>, Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Stefan Hajnoczi <stefanha@redhat.com>, Roger Pau Monne <roger.pau@citrix.com> Subject: [Qemu-devel] [PATCH v2 2/3] tap-bsd: implement a FreeBSD only version of tap_open Date: Fri, 23 May 2014 17:57:48 +0200 [thread overview] Message-ID: <1400860669-21593-3-git-send-email-roger.pau@citrix.com> (raw) In-Reply-To: <1400860669-21593-1-git-send-email-roger.pau@citrix.com> The current behaviour of tap_open for BSD systems differ greatly from it's Linux counterpart. Since FreeBSD supports interface renaming and tap device cloning by opening /dev/tap, implement a FreeBSD specific version of tap_open that behaves like it's Linux counterpart. This is specially important for toolstacks that use Qemu (like Xen libxl), in order to have a unified behaviour across suported platforms. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Cc: xen-devel@lists.xenproject.org Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Cc: Anthony Liguori <aliguori@us.ibm.com> Cc: Stefan Hajnoczi <stefanha@redhat.com> --- net/tap-bsd.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 69 insertions(+), 1 deletions(-) diff --git a/net/tap-bsd.c b/net/tap-bsd.c index 90f8a02..bf91bd0 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -27,12 +27,13 @@ #include "sysemu/sysemu.h" #include "qemu/error-report.h" -#ifdef __NetBSD__ +#if defined(__NetBSD__) || defined(__FreeBSD__) #include <sys/ioctl.h> #include <net/if.h> #include <net/if_tap.h> #endif +#ifndef __FreeBSD__ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required, int mq_required) { @@ -108,6 +109,73 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, return fd; } +#else /* __FreeBSD__ */ + +#define PATH_NET_TAP "/dev/tap" + +int tap_open(char *ifname, int ifname_size, int *vnet_hdr, + int vnet_hdr_required, int mq_required) +{ + int fd, s, ret; + struct ifreq ifr; + + TFR(fd = open(PATH_NET_TAP, O_RDWR)); + if (fd < 0) { + error_report("could not open %s: %s", PATH_NET_TAP, strerror(errno)); + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + + ret = ioctl(fd, TAPGIFNAME, (void *)&ifr); + if (ret < 0) { + error_report("could not get tap interface name"); + goto error; + } + + if (ifname[0] != '\0') { + /* User requested the interface to have a specific name */ + s = socket(AF_LOCAL, SOCK_DGRAM, 0); + if (s < 0) { + error_report("could not open socket to set interface name"); + goto error; + } + ifr.ifr_data = ifname; + ret = ioctl(s, SIOCSIFNAME, (void *)&ifr); + close(s); + if (ret < 0) { + error_report("could not set tap interface name"); + goto error; + } + } else { + pstrcpy(ifname, ifname_size, ifr.ifr_name); + } + + if (*vnet_hdr) { + /* BSD doesn't have IFF_VNET_HDR */ + *vnet_hdr = 0; + + if (vnet_hdr_required && !*vnet_hdr) { + error_report("vnet_hdr=1 requested, but no kernel " + "support for IFF_VNET_HDR available"); + goto error; + } + } + if (mq_required) { + error_report("mq_required requested, but not kernel support" + "for IFF_MULTI_QUEUE available"); + goto error; + } + + fcntl(fd, F_SETFL, O_NONBLOCK); + return fd; + +error: + close(fd); + return -1; +} +#endif /* __FreeBSD__ */ + int tap_set_sndbuf(int fd, const NetdevTapOptions *tap) { return 0; -- 1.7.7.5 (Apple Git-26)
WARNING: multiple messages have this Message-ID (diff)
From: Roger Pau Monne <roger.pau@citrix.com> To: qemu-devel@nongnu.org, xen-devel@lists.xenproject.org Cc: Anthony Liguori <aliguori@us.ibm.com>, Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Stefan Hajnoczi <stefanha@redhat.com>, Roger Pau Monne <roger.pau@citrix.com> Subject: [PATCH v2 2/3] tap-bsd: implement a FreeBSD only version of tap_open Date: Fri, 23 May 2014 17:57:48 +0200 [thread overview] Message-ID: <1400860669-21593-3-git-send-email-roger.pau@citrix.com> (raw) In-Reply-To: <1400860669-21593-1-git-send-email-roger.pau@citrix.com> The current behaviour of tap_open for BSD systems differ greatly from it's Linux counterpart. Since FreeBSD supports interface renaming and tap device cloning by opening /dev/tap, implement a FreeBSD specific version of tap_open that behaves like it's Linux counterpart. This is specially important for toolstacks that use Qemu (like Xen libxl), in order to have a unified behaviour across suported platforms. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Cc: xen-devel@lists.xenproject.org Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Cc: Anthony Liguori <aliguori@us.ibm.com> Cc: Stefan Hajnoczi <stefanha@redhat.com> --- net/tap-bsd.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 69 insertions(+), 1 deletions(-) diff --git a/net/tap-bsd.c b/net/tap-bsd.c index 90f8a02..bf91bd0 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -27,12 +27,13 @@ #include "sysemu/sysemu.h" #include "qemu/error-report.h" -#ifdef __NetBSD__ +#if defined(__NetBSD__) || defined(__FreeBSD__) #include <sys/ioctl.h> #include <net/if.h> #include <net/if_tap.h> #endif +#ifndef __FreeBSD__ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required, int mq_required) { @@ -108,6 +109,73 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, return fd; } +#else /* __FreeBSD__ */ + +#define PATH_NET_TAP "/dev/tap" + +int tap_open(char *ifname, int ifname_size, int *vnet_hdr, + int vnet_hdr_required, int mq_required) +{ + int fd, s, ret; + struct ifreq ifr; + + TFR(fd = open(PATH_NET_TAP, O_RDWR)); + if (fd < 0) { + error_report("could not open %s: %s", PATH_NET_TAP, strerror(errno)); + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + + ret = ioctl(fd, TAPGIFNAME, (void *)&ifr); + if (ret < 0) { + error_report("could not get tap interface name"); + goto error; + } + + if (ifname[0] != '\0') { + /* User requested the interface to have a specific name */ + s = socket(AF_LOCAL, SOCK_DGRAM, 0); + if (s < 0) { + error_report("could not open socket to set interface name"); + goto error; + } + ifr.ifr_data = ifname; + ret = ioctl(s, SIOCSIFNAME, (void *)&ifr); + close(s); + if (ret < 0) { + error_report("could not set tap interface name"); + goto error; + } + } else { + pstrcpy(ifname, ifname_size, ifr.ifr_name); + } + + if (*vnet_hdr) { + /* BSD doesn't have IFF_VNET_HDR */ + *vnet_hdr = 0; + + if (vnet_hdr_required && !*vnet_hdr) { + error_report("vnet_hdr=1 requested, but no kernel " + "support for IFF_VNET_HDR available"); + goto error; + } + } + if (mq_required) { + error_report("mq_required requested, but not kernel support" + "for IFF_MULTI_QUEUE available"); + goto error; + } + + fcntl(fd, F_SETFL, O_NONBLOCK); + return fd; + +error: + close(fd); + return -1; +} +#endif /* __FreeBSD__ */ + int tap_set_sndbuf(int fd, const NetdevTapOptions *tap) { return 0; -- 1.7.7.5 (Apple Git-26) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2014-05-23 16:05 UTC|newest] Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-05-23 15:57 [Qemu-devel] [PATCH v2 0/3] qemu-freebsd: fixes for running Xen guests Roger Pau Monne 2014-05-23 15:57 ` [Qemu-devel] [PATCH v2 1/3] xen: fix usage of ENODATA Roger Pau Monne 2014-05-27 17:18 ` Stefano Stabellini [not found] ` <alpine.DEB.2.02.1405271816100.4779@kaball.uk.xensource.com> 2014-05-27 17:26 ` Roger Pau Monné [not found] ` <5384CADF.8020003@citrix.com> 2014-05-28 11:28 ` [Qemu-devel] " Stefano Stabellini 2014-05-23 15:57 ` Roger Pau Monne 2014-05-23 15:57 ` Roger Pau Monne [this message] 2014-05-23 15:57 ` [PATCH v2 2/3] tap-bsd: implement a FreeBSD only version of tap_open Roger Pau Monne 2014-05-27 13:29 ` Stefan Hajnoczi 2014-07-22 11:46 ` [Qemu-devel] " Roger Pau Monné 2014-07-22 11:46 ` Roger Pau Monné 2014-07-22 12:26 ` Stefano Stabellini 2014-07-22 12:26 ` [Qemu-devel] " Stefano Stabellini 2014-07-23 10:38 ` Stefan Hajnoczi 2014-07-23 10:38 ` Stefan Hajnoczi 2014-07-23 14:00 ` Roger Pau Monné 2014-07-23 14:03 ` Stefano Stabellini 2014-07-23 14:03 ` Stefano Stabellini 2014-07-23 14:00 ` Roger Pau Monné 2014-05-23 15:57 ` [PATCH v2 3/3] serial: poll the serial console with G_IO_HUP Roger Pau Monne 2014-05-23 15:57 ` [Qemu-devel] " Roger Pau Monne 2014-06-13 15:35 ` Roger Pau Monné 2014-06-13 15:35 ` [Qemu-devel] " Roger Pau Monné 2014-06-30 11:00 ` Roger Pau Monné 2014-06-30 11:00 ` Roger Pau Monné 2014-06-30 12:23 ` Paolo Bonzini 2014-06-30 12:23 ` Paolo Bonzini
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1400860669-21593-3-git-send-email-roger.pau@citrix.com \ --to=roger.pau@citrix.com \ --cc=aliguori@us.ibm.com \ --cc=qemu-devel@nongnu.org \ --cc=stefanha@redhat.com \ --cc=stefano.stabellini@eu.citrix.com \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.