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>
This commit is contained in:
Vincenzo Maffione 2018-12-06 17:59:06 +01:00 committed by Jason Wang
parent cc599ed6d4
commit c7cbb6b48f

View File

@ -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)