提交 c7cbb6b4 编写于 作者: V Vincenzo Maffione 提交者: Jason Wang

net: netmap: simplify netmap_receive()

Improve code reuse by implementing netmap_receive() with a call
to netmap_receive_iov().
Signed-off-by: NVincenzo Maffione <v.maffione@gmail.com>
Signed-off-by: NJason Wang <jasowang@redhat.com>
上级 cc599ed6
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册