diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/checksum.c | 1 | ||||
| -rw-r--r-- | net/dump.c | 1 | ||||
| -rw-r--r-- | net/eth.c | 1 | ||||
| -rw-r--r-- | net/filter-buffer.c | 1 | ||||
| -rw-r--r-- | net/filter.c | 44 | ||||
| -rw-r--r-- | net/hub.c | 1 | ||||
| -rw-r--r-- | net/l2tpv3.c | 2 | ||||
| -rw-r--r-- | net/net.c | 54 | ||||
| -rw-r--r-- | net/netmap.c | 100 | ||||
| -rw-r--r-- | net/queue.c | 1 | ||||
| -rw-r--r-- | net/slirp.c | 5 | ||||
| -rw-r--r-- | net/socket.c | 2 | ||||
| -rw-r--r-- | net/tap-aix.c | 2 | ||||
| -rw-r--r-- | net/tap-bsd.c | 1 | ||||
| -rw-r--r-- | net/tap-haiku.c | 2 | ||||
| -rw-r--r-- | net/tap-linux.c | 1 | ||||
| -rw-r--r-- | net/tap-solaris.c | 2 | ||||
| -rw-r--r-- | net/tap-win32.c | 2 | ||||
| -rw-r--r-- | net/tap.c | 3 | ||||
| -rw-r--r-- | net/util.c | 3 | ||||
| -rw-r--r-- | net/vde.c | 2 | ||||
| -rw-r--r-- | net/vhost-user.c | 1 |
22 files changed, 120 insertions, 112 deletions
diff --git a/net/checksum.c b/net/checksum.c index 14c08550e0..b5016ab40c 100644 --- a/net/checksum.c +++ b/net/checksum.c @@ -15,6 +15,7 @@ * along with this program; if not, see <http://www.gnu.org/licenses/>. */ +#include "qemu/osdep.h" #include "qemu-common.h" #include "net/checksum.h" diff --git a/net/dump.c b/net/dump.c index 88d9582334..dc0f33948d 100644 --- a/net/dump.c +++ b/net/dump.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "clients.h" #include "qemu-common.h" #include "qemu/error-report.h" diff --git a/net/eth.c b/net/eth.c index 7c61132cbb..7e32d274c7 100644 --- a/net/eth.c +++ b/net/eth.c @@ -15,6 +15,7 @@ * */ +#include "qemu/osdep.h" #include "net/eth.h" #include "net/checksum.h" #include "qemu-common.h" diff --git a/net/filter-buffer.c b/net/filter-buffer.c index 57be149413..2353d5bc75 100644 --- a/net/filter-buffer.c +++ b/net/filter-buffer.c @@ -6,6 +6,7 @@ * later. See the COPYING file in the top-level directory. */ +#include "qemu/osdep.h" #include "net/filter.h" #include "net/queue.h" #include "qemu-common.h" diff --git a/net/filter.c b/net/filter.c index 5d90f83429..d2a514eb8d 100644 --- a/net/filter.c +++ b/net/filter.c @@ -6,6 +6,7 @@ * later. See the COPYING file in the top-level directory. */ +#include "qemu/osdep.h" #include "qemu-common.h" #include "qapi/qmp/qerror.h" #include "qemu/error-report.h" @@ -15,7 +16,6 @@ #include "net/vhost_net.h" #include "qom/object_interfaces.h" #include "qemu/iov.h" -#include "qapi/string-output-visitor.h" ssize_t qemu_netfilter_receive(NetFilterState *nf, NetFilterDirection direction, @@ -34,6 +34,22 @@ ssize_t qemu_netfilter_receive(NetFilterState *nf, return 0; } +static NetFilterState *netfilter_next(NetFilterState *nf, + NetFilterDirection dir) +{ + NetFilterState *next; + + if (dir == NET_FILTER_DIRECTION_TX) { + /* forward walk through filters */ + next = QTAILQ_NEXT(nf, next); + } else { + /* reverse order */ + next = QTAILQ_PREV(nf, NetFilterHead, next); + } + + return next; +} + ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, unsigned flags, const struct iovec *iov, @@ -43,7 +59,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, int ret = 0; int direction; NetFilterState *nf = opaque; - NetFilterState *next = QTAILQ_NEXT(nf, next); + NetFilterState *next = NULL; if (!sender || !sender->peer) { /* no receiver, or sender been deleted, no need to pass it further */ @@ -61,6 +77,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, direction = nf->direction; } + next = netfilter_next(nf, direction); while (next) { /* * if qemu_netfilter_pass_to_next been called, means that @@ -73,7 +90,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, if (ret) { return ret; } - next = QTAILQ_NEXT(next, next); + next = netfilter_next(next, direction); } /* @@ -135,10 +152,6 @@ static void netfilter_complete(UserCreatable *uc, Error **errp) NetFilterClass *nfc = NETFILTER_GET_CLASS(uc); int queues; Error *local_err = NULL; - char *str, *info; - ObjectProperty *prop; - ObjectPropertyIterator iter; - StringOutputVisitor *ov; if (!nf->netdev_id) { error_setg(errp, "Parameter 'netdev' is required"); @@ -172,23 +185,6 @@ static void netfilter_complete(UserCreatable *uc, Error **errp) } } QTAILQ_INSERT_TAIL(&nf->netdev->filters, nf, next); - - /* generate info str */ - object_property_iter_init(&iter, OBJECT(nf)); - while ((prop = object_property_iter_next(&iter))) { - if (!strcmp(prop->name, "type")) { - continue; - } - ov = string_output_visitor_new(false); - object_property_get(OBJECT(nf), string_output_get_visitor(ov), - prop->name, errp); - str = string_output_get_string(ov); - string_output_visitor_cleanup(ov); - info = g_strdup_printf(",%s=%s", prop->name, str); - g_strlcat(nf->info_str, info, sizeof(nf->info_str)); - g_free(str); - g_free(info); - } } static void netfilter_finalize(Object *obj) diff --git a/net/hub.c b/net/hub.c index 9ae9f012cb..b6d44fd75b 100644 --- a/net/hub.c +++ b/net/hub.c @@ -12,6 +12,7 @@ * */ +#include "qemu/osdep.h" #include "monitor/monitor.h" #include "net/net.h" #include "clients.h" diff --git a/net/l2tpv3.c b/net/l2tpv3.c index 21d6119ed4..824161c5b8 100644 --- a/net/l2tpv3.c +++ b/net/l2tpv3.c @@ -23,9 +23,9 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include <linux/ip.h> #include <netdb.h> -#include "config-host.h" #include "net/net.h" #include "clients.h" #include "qemu-common.h" diff --git a/net/net.c b/net/net.c index 87dd3568dc..c5e414fe3c 100644 --- a/net/net.c +++ b/net/net.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "config-host.h" +#include "qemu/osdep.h" #include "net/net.h" #include "clients.h" @@ -45,6 +45,7 @@ #include "qapi/dealloc-visitor.h" #include "sysemu/sysemu.h" #include "net/filter.h" +#include "qapi/string-output-visitor.h" /* Net bridge is currently not supported for W32. */ #if !defined(_WIN32) @@ -580,11 +581,21 @@ static ssize_t filter_receive_iov(NetClientState *nc, ssize_t ret = 0; NetFilterState *nf = NULL; - QTAILQ_FOREACH(nf, &nc->filters, next) { - ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, - iovcnt, sent_cb); - if (ret) { - return ret; + if (direction == NET_FILTER_DIRECTION_TX) { + QTAILQ_FOREACH(nf, &nc->filters, next) { + ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, + iovcnt, sent_cb); + if (ret) { + return ret; + } + } + } else { + QTAILQ_FOREACH_REVERSE(nf, &nc->filters, NetFilterHead, next) { + ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, + iovcnt, sent_cb); + if (ret) { + return ret; + } } } @@ -1185,6 +1196,30 @@ void qmp_netdev_del(const char *id, Error **errp) qemu_opts_del(opts); } +static void netfilter_print_info(Monitor *mon, NetFilterState *nf) +{ + char *str; + ObjectProperty *prop; + ObjectPropertyIterator iter; + StringOutputVisitor *ov; + + /* generate info str */ + object_property_iter_init(&iter, OBJECT(nf)); + while ((prop = object_property_iter_next(&iter))) { + if (!strcmp(prop->name, "type")) { + continue; + } + ov = string_output_visitor_new(false); + object_property_get(OBJECT(nf), string_output_get_visitor(ov), + prop->name, NULL); + str = string_output_get_string(ov); + string_output_visitor_cleanup(ov); + monitor_printf(mon, ",%s=%s", prop->name, str); + g_free(str); + } + monitor_printf(mon, "\n"); +} + void print_net_client(Monitor *mon, NetClientState *nc) { NetFilterState *nf; @@ -1198,9 +1233,10 @@ void print_net_client(Monitor *mon, NetClientState *nc) } QTAILQ_FOREACH(nf, &nc->filters, next) { char *path = object_get_canonical_path_component(OBJECT(nf)); - monitor_printf(mon, " - %s: type=%s%s\n", path, - object_get_typename(OBJECT(nf)), - nf->info_str); + + monitor_printf(mon, " - %s: type=%s", path, + object_get_typename(OBJECT(nf))); + netfilter_print_info(mon, nf); g_free(path); } } diff --git a/net/netmap.c b/net/netmap.c index 555836829e..971032120c 100644 --- a/net/netmap.c +++ b/net/netmap.c @@ -23,11 +23,10 @@ */ +#include "qemu/osdep.h" #include <sys/ioctl.h> #include <net/if.h> #include <sys/mman.h> -#include <stdint.h> -#include <stdio.h> #define NETMAP_WITH_LIBS #include <net/netmap.h> #include <net/netmap_user.h> @@ -39,21 +38,12 @@ #include "qemu/error-report.h" #include "qemu/iov.h" -/* Private netmap device info. */ -typedef struct NetmapPriv { - int fd; - size_t memsize; - void *mem; - struct netmap_if *nifp; - struct netmap_ring *rx; - struct netmap_ring *tx; - char fdname[PATH_MAX]; /* Normally "/dev/netmap". */ - char ifname[IFNAMSIZ]; -} NetmapPriv; - typedef struct NetmapState { NetClientState nc; - NetmapPriv me; + struct nm_desc *nmd; + char ifname[IFNAMSIZ]; + struct netmap_ring *tx; + struct netmap_ring *rx; bool read_poll; bool write_poll; struct iovec iov[IOV_MAX]; @@ -90,44 +80,23 @@ pkt_copy(const void *_src, void *_dst, int l) * Open a netmap device. We assume there is only one queue * (which is the case for the VALE bridge). */ -static void netmap_open(NetmapPriv *me, Error **errp) +static struct nm_desc *netmap_open(const NetdevNetmapOptions *nm_opts, + Error **errp) { - int fd; - int err; - size_t l; + struct nm_desc *nmd; struct nmreq req; - me->fd = fd = open(me->fdname, O_RDWR); - if (fd < 0) { - error_setg_file_open(errp, errno, me->fdname); - return; - } memset(&req, 0, sizeof(req)); - pstrcpy(req.nr_name, sizeof(req.nr_name), me->ifname); - req.nr_ringid = NETMAP_NO_TX_POLL; - req.nr_version = NETMAP_API; - err = ioctl(fd, NIOCREGIF, &req); - if (err) { - error_setg_errno(errp, errno, "Unable to register %s", me->ifname); - goto error; - } - l = me->memsize = req.nr_memsize; - me->mem = mmap(0, l, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); - if (me->mem == MAP_FAILED) { - error_setg_errno(errp, errno, "Unable to mmap netmap shared memory"); - me->mem = NULL; - goto error; + nmd = nm_open(nm_opts->ifname, &req, NETMAP_NO_TX_POLL, + NULL); + if (nmd == NULL) { + error_setg_errno(errp, errno, "Failed to nm_open() %s", + nm_opts->ifname); + return NULL; } - me->nifp = NETMAP_IF(me->mem, req.nr_offset); - me->tx = NETMAP_TXRING(me->nifp, 0); - me->rx = NETMAP_RXRING(me->nifp, 0); - - return; - -error: - close(me->fd); + return nmd; } static void netmap_send(void *opaque); @@ -136,7 +105,7 @@ static void netmap_writable(void *opaque); /* Set the event-loop handlers for the netmap backend. */ static void netmap_update_fd_handler(NetmapState *s) { - qemu_set_fd_handler(s->me.fd, + qemu_set_fd_handler(s->nmd->fd, s->read_poll ? netmap_send : NULL, s->write_poll ? netmap_writable : NULL, s); @@ -188,7 +157,7 @@ static ssize_t netmap_receive(NetClientState *nc, const uint8_t *buf, size_t size) { NetmapState *s = DO_UPCAST(NetmapState, nc, nc); - struct netmap_ring *ring = s->me.tx; + struct netmap_ring *ring = s->tx; uint32_t i; uint32_t idx; uint8_t *dst; @@ -218,7 +187,7 @@ static ssize_t netmap_receive(NetClientState *nc, ring->slot[i].flags = 0; pkt_copy(buf, dst, size); ring->cur = ring->head = nm_ring_next(ring, i); - ioctl(s->me.fd, NIOCTXSYNC, NULL); + ioctl(s->nmd->fd, NIOCTXSYNC, NULL); return size; } @@ -227,7 +196,7 @@ static ssize_t netmap_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) { NetmapState *s = DO_UPCAST(NetmapState, nc, nc); - struct netmap_ring *ring = s->me.tx; + struct netmap_ring *ring = s->tx; uint32_t last; uint32_t idx; uint8_t *dst; @@ -284,7 +253,7 @@ static ssize_t netmap_receive_iov(NetClientState *nc, /* Now update ring->cur and ring->head. */ ring->cur = ring->head = i; - ioctl(s->me.fd, NIOCTXSYNC, NULL); + ioctl(s->nmd->fd, NIOCTXSYNC, NULL); return iov_size(iov, iovcnt); } @@ -301,7 +270,7 @@ static void netmap_send_completed(NetClientState *nc, ssize_t len) static void netmap_send(void *opaque) { NetmapState *s = opaque; - struct netmap_ring *ring = s->me.rx; + struct netmap_ring *ring = s->rx; /* Keep sending while there are available packets into the netmap RX ring and the forwarding path towards the peer is open. */ @@ -349,10 +318,8 @@ static void netmap_cleanup(NetClientState *nc) qemu_purge_queued_packets(nc); netmap_poll(nc, false); - munmap(s->me.mem, s->me.memsize); - close(s->me.fd); - - s->me.fd = -1; + nm_close(s->nmd); + s->nmd = NULL; } /* Offloading manipulation support callbacks. */ @@ -383,17 +350,17 @@ static void netmap_set_vnet_hdr_len(NetClientState *nc, int len) struct nmreq req; /* Issue a NETMAP_BDG_VNET_HDR command to change the virtio-net header - * length for the netmap adapter associated to 'me->ifname'. + * length for the netmap adapter associated to 's->ifname'. */ memset(&req, 0, sizeof(req)); - pstrcpy(req.nr_name, sizeof(req.nr_name), s->me.ifname); + pstrcpy(req.nr_name, sizeof(req.nr_name), s->ifname); req.nr_version = NETMAP_API; req.nr_cmd = NETMAP_BDG_VNET_HDR; req.nr_arg1 = len; - err = ioctl(s->me.fd, NIOCREGIF, &req); + err = ioctl(s->nmd->fd, NIOCREGIF, &req); if (err) { error_report("Unable to execute NETMAP_BDG_VNET_HDR on %s: %s", - s->me.ifname, strerror(errno)); + s->ifname, strerror(errno)); } else { /* Keep track of the current length. */ s->vnet_hdr_len = len; @@ -437,16 +404,12 @@ int net_init_netmap(const NetClientOptions *opts, const char *name, NetClientState *peer, Error **errp) { const NetdevNetmapOptions *netmap_opts = opts->u.netmap; + struct nm_desc *nmd; NetClientState *nc; Error *err = NULL; - NetmapPriv me; NetmapState *s; - pstrcpy(me.fdname, sizeof(me.fdname), - netmap_opts->has_devname ? netmap_opts->devname : "/dev/netmap"); - /* Set default name for the port if not supplied. */ - pstrcpy(me.ifname, sizeof(me.ifname), netmap_opts->ifname); - netmap_open(&me, &err); + nmd = netmap_open(netmap_opts, &err); if (err) { error_propagate(errp, err); return -1; @@ -454,8 +417,11 @@ int net_init_netmap(const NetClientOptions *opts, /* Create the object. */ nc = qemu_new_net_client(&net_netmap_info, peer, "netmap", name); s = DO_UPCAST(NetmapState, nc, nc); - s->me = me; + s->nmd = nmd; + s->tx = NETMAP_TXRING(nmd->nifp, 0); + s->rx = NETMAP_RXRING(nmd->nifp, 0); s->vnet_hdr_len = 0; + pstrcpy(s->ifname, sizeof(s->ifname), netmap_opts->ifname); netmap_read_poll(s, true); /* Initially only poll for reads. */ return 0; diff --git a/net/queue.c b/net/queue.c index de8b9d31c6..9c32abdb8f 100644 --- a/net/queue.c +++ b/net/queue.c @@ -21,6 +21,7 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "net/queue.h" #include "qemu/queue.h" #include "net/net.h" diff --git a/net/slirp.c b/net/slirp.c index f505570adb..6b51fbc306 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -21,9 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "net/slirp.h" -#include "config-host.h" #ifndef _WIN32 #include <pwd.h> @@ -784,6 +784,9 @@ int net_slirp_parse_legacy(QemuOptsList *opts_list, const char *optarg, int *ret return 0; } + error_report("The '-net channel' option is deprecated. " + "Please use '-netdev user,guestfwd=...' instead."); + /* handle legacy -net channel,port:chr */ optarg += strlen("channel,"); diff --git a/net/socket.c b/net/socket.c index e8605d4ded..e32e3cb996 100644 --- a/net/socket.c +++ b/net/socket.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "config-host.h" +#include "qemu/osdep.h" #include "net/net.h" #include "clients.h" diff --git a/net/tap-aix.c b/net/tap-aix.c index e84fc39136..9d830b7a32 100644 --- a/net/tap-aix.c +++ b/net/tap-aix.c @@ -22,8 +22,8 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" -#include <stdio.h> int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required, int mq_required, Error **errp) diff --git a/net/tap-bsd.c b/net/tap-bsd.c index 0103a97bf6..83de19a646 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" #include "qemu-common.h" #include "sysemu/sysemu.h" diff --git a/net/tap-haiku.c b/net/tap-haiku.c index 2e738ec6a3..397e53235e 100644 --- a/net/tap-haiku.c +++ b/net/tap-haiku.c @@ -22,8 +22,8 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" -#include <stdio.h> int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required, int mq_required, Error **errp) diff --git a/net/tap-linux.c b/net/tap-linux.c index 5bd9d21898..0929cf76f5 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -23,6 +23,7 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" #include "tap-linux.h" #include "net/tap.h" diff --git a/net/tap-solaris.c b/net/tap-solaris.c index 0f60f78dd0..e3907a8218 100644 --- a/net/tap-solaris.c +++ b/net/tap-solaris.c @@ -22,10 +22,10 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" #include "sysemu/sysemu.h" -#include <sys/stat.h> #include <sys/ethernet.h> #include <sys/sockio.h> #include <netinet/arp.h> diff --git a/net/tap-win32.c b/net/tap-win32.c index 7fddb20b51..38bbac0cd9 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -26,6 +26,7 @@ * distribution); if not, see <http://www.gnu.org/licenses/>. */ +#include "qemu/osdep.h" #include "tap_int.h" #include "qemu-common.h" @@ -34,7 +35,6 @@ #include "net/tap.h" /* tap_has_ufo, ... */ #include "sysemu/sysemu.h" #include "qemu/error-report.h" -#include <stdio.h> #include <windows.h> #include <winioctl.h> diff --git a/net/tap.c b/net/tap.c index 85c4142d15..cfb6831988 100644 --- a/net/tap.c +++ b/net/tap.c @@ -23,12 +23,11 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "tap_int.h" -#include "config-host.h" #include <sys/ioctl.h> -#include <sys/stat.h> #include <sys/wait.h> #include <sys/socket.h> #include <net/if.h> diff --git a/net/util.c b/net/util.c index 7e9507679d..0b3dbfe5d3 100644 --- a/net/util.c +++ b/net/util.c @@ -22,9 +22,8 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "util.h" -#include <errno.h> -#include <stdlib.h> int net_parse_macaddr(uint8_t *macaddr, const char *p) { diff --git a/net/vde.c b/net/vde.c index 4475d929e6..973faf5090 100644 --- a/net/vde.c +++ b/net/vde.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "config-host.h" +#include "qemu/osdep.h" #include <libvdeplug.h> diff --git a/net/vhost-user.c b/net/vhost-user.c index e4dd089c5c..451dbbfb27 100644 --- a/net/vhost-user.c +++ b/net/vhost-user.c @@ -8,6 +8,7 @@ * */ +#include "qemu/osdep.h" #include "clients.h" #include "net/vhost_net.h" #include "net/vhost-user.h" |