diff options
author | Vincenzo Maffione <v.maffione@gmail.com> | 2018-12-06 17:59:06 +0100 |
---|---|---|
committer | Jason Wang <jasowang@redhat.com> | 2019-03-05 11:27:40 +0800 |
commit | c7cbb6b48fc2dbfeeb4c126ee4b909220a418fb0 (patch) | |
tree | d3fe84679988019fb59da870da44d998112ecf66 | |
parent | cc599ed6d46250b2178eca1a06a4602acd83b706 (diff) | |
download | qemu-c7cbb6b48fc2dbfeeb4c126ee4b909220a418fb0.zip qemu-c7cbb6b48fc2dbfeeb4c126ee4b909220a418fb0.tar.gz qemu-c7cbb6b48fc2dbfeeb4c126ee4b909220a418fb0.tar.bz2 |
net: netmap: simplify netmap_receive()
Improve code reuse by implementing netmap_receive() with a call
to netmap_receive_iov().
Signed-off-by: Vincenzo Maffione <v.maffione@gmail.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
-rw-r--r-- | net/netmap.c | 50 |
1 files changed, 11 insertions, 39 deletions
diff --git a/net/netmap.c b/net/netmap.c index 71a8122..852106a 100644 --- a/net/netmap.c +++ b/net/netmap.c @@ -154,45 +154,6 @@ static void netmap_writable(void *opaque) qemu_flush_queued_packets(&s->nc); } -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->tx; - uint32_t i; - uint32_t idx; - uint8_t *dst; - - if (unlikely(!ring)) { - /* Drop. */ - return size; - } - - if (unlikely(size > ring->nr_buf_size)) { - RD(5, "[netmap_receive] drop packet of size %d > %d\n", - (int)size, ring->nr_buf_size); - return size; - } - - if (nm_ring_empty(ring)) { - /* No available slots in the netmap TX ring. */ - netmap_write_poll(s, true); - return 0; - } - - i = ring->cur; - idx = ring->slot[i].buf_idx; - dst = (uint8_t *)NETMAP_BUF(ring, idx); - - ring->slot[i].len = size; - ring->slot[i].flags = 0; - pkt_copy(buf, dst, size); - ring->cur = ring->head = nm_ring_next(ring, i); - ioctl(s->nmd->fd, NIOCTXSYNC, NULL); - - return size; -} - static ssize_t netmap_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) { @@ -259,6 +220,17 @@ static ssize_t netmap_receive_iov(NetClientState *nc, return iov_size(iov, iovcnt); } +static ssize_t netmap_receive(NetClientState *nc, + const uint8_t *buf, size_t size) +{ + struct iovec iov; + + iov.iov_base = (void *)buf; + iov.iov_len = size; + + return netmap_receive_iov(nc, &iov, 1); +} + /* Complete a previous send (backend --> guest) and enable the fd_read callback. */ static void netmap_send_completed(NetClientState *nc, ssize_t len) |