Lines Matching +full:- +full:- +full:enable +full:-
4 * Copyright (c) 2012-2013 Luigi Rizzo
36 #include "qemu/error-report.h"
40 #include "qemu/main-loop.h"
51 int vnet_hdr_len; /* Current virtio-net header length. */
67 for (; l > 0; l -= 64) { in pkt_copy()
92 nmd = nm_open(nm_opts->ifname, &req, NETMAP_NO_TX_POLL, in netmap_open()
96 nm_opts->ifname); in netmap_open()
106 /* Set the event-loop handlers for the netmap backend. */
109 qemu_set_fd_handler(s->nmd->fd, in netmap_update_fd_handler()
110 s->read_poll ? netmap_send : NULL, in netmap_update_fd_handler()
111 s->write_poll ? netmap_writable : NULL, in netmap_update_fd_handler()
116 static void netmap_read_poll(NetmapState *s, bool enable) in netmap_read_poll() argument
118 if (s->read_poll != enable) { /* Do nothing if not changed. */ in netmap_read_poll()
119 s->read_poll = enable; in netmap_read_poll()
125 static void netmap_write_poll(NetmapState *s, bool enable) in netmap_write_poll() argument
127 if (s->write_poll != enable) { in netmap_write_poll()
128 s->write_poll = enable; in netmap_write_poll()
133 static void netmap_poll(NetClientState *nc, bool enable) in netmap_poll() argument
137 if (s->read_poll != enable || s->write_poll != enable) { in netmap_poll()
138 s->write_poll = enable; in netmap_poll()
139 s->read_poll = enable; in netmap_poll()
154 qemu_flush_queued_packets(&s->nc); in netmap_writable()
161 struct netmap_ring *ring = s->tx; in netmap_receive_iov()
162 unsigned int tail = ring->tail; in netmap_receive_iov()
170 last = i = ring->head; in netmap_receive_iov()
176 * (e.g., we don't advance ring->head). */ in netmap_receive_iov()
177 ring->cur = tail; in netmap_receive_iov()
192 nm_frag_size = MIN(iov_frag_size, ring->nr_buf_size); in netmap_receive_iov()
197 ring->cur = tail; in netmap_receive_iov()
202 idx = ring->slot[i].buf_idx; in netmap_receive_iov()
205 ring->slot[i].len = nm_frag_size; in netmap_receive_iov()
206 ring->slot[i].flags = NS_MOREFRAG; in netmap_receive_iov()
213 iov_frag_size -= nm_frag_size; in netmap_receive_iov()
217 ring->slot[last].flags &= ~NS_MOREFRAG; in netmap_receive_iov()
219 /* Now update ring->head and ring->cur to publish the new slots and in netmap_receive_iov()
221 ring->head = ring->cur = i; in netmap_receive_iov()
223 ioctl(s->nmd->fd, NIOCTXSYNC, NULL); in netmap_receive_iov()
239 /* Complete a previous send (backend --> guest) and enable the
251 struct netmap_ring *ring = s->rx; in netmap_send()
252 unsigned int tail = ring->tail; in netmap_send()
256 while (ring->head != tail) { in netmap_send()
257 uint32_t i = ring->head; in netmap_send()
263 /* Get a (possibly multi-slot) packet. */ in netmap_send()
265 idx = ring->slot[i].buf_idx; in netmap_send()
266 morefrag = (ring->slot[i].flags & NS_MOREFRAG); in netmap_send()
267 s->iov[iovcnt].iov_base = (void *)NETMAP_BUF(ring, idx); in netmap_send()
268 s->iov[iovcnt].iov_len = ring->slot[i].len; in netmap_send()
273 /* Advance ring->cur to tell the kernel that we have seen the slots. */ in netmap_send()
274 ring->cur = i; in netmap_send()
278 * incomplete slots by updating ring->head. We will hopefully in netmap_send()
279 * re-read the complete packet the next time we are called. */ in netmap_send()
283 iovsize = qemu_sendv_packet_async(&s->nc, s->iov, iovcnt, in netmap_send()
287 ring->head = i; in netmap_send()
306 nm_close(s->nmd); in netmap_cleanup()
307 s->nmd = NULL; in netmap_cleanup()
315 /* Issue a NETMAP_BDG_VNET_HDR command to change the virtio-net header in netmap_fd_set_vnet_hdr_len()
316 * length for the netmap adapter associated to 's->ifname'. in netmap_fd_set_vnet_hdr_len()
319 pstrcpy(req.nr_name, sizeof(req.nr_name), s->ifname); in netmap_fd_set_vnet_hdr_len()
324 return ioctl(s->nmd->fd, NIOCREGIF, &req); in netmap_fd_set_vnet_hdr_len()
330 int prev_len = s->vnet_hdr_len; in netmap_has_vnet_hdr_len()
339 error_report("Failed to restore vnet-hdr length %d on %s: %s", in netmap_has_vnet_hdr_len()
340 prev_len, s->ifname, strerror(errno)); in netmap_has_vnet_hdr_len()
347 /* A netmap interface that supports virtio-net headers always
361 error_report("Unable to set vnet-hdr length %d on %s: %s", in netmap_set_vnet_hdr_len()
362 len, s->ifname, strerror(errno)); in netmap_set_vnet_hdr_len()
365 s->vnet_hdr_len = len; in netmap_set_vnet_hdr_len()
374 /* Setting a virtio-net header length greater than zero automatically in netmap_set_offload()
376 if (!s->vnet_hdr_len) { in netmap_set_offload()
398 * ... -net netmap,ifname="..."
403 const NetdevNetmapOptions *netmap_opts = &netdev->u.netmap; in net_init_netmap()
412 return -1; in net_init_netmap()
417 s->nmd = nmd; in net_init_netmap()
418 s->tx = NETMAP_TXRING(nmd->nifp, 0); in net_init_netmap()
419 s->rx = NETMAP_RXRING(nmd->nifp, 0); in net_init_netmap()
420 s->vnet_hdr_len = 0; in net_init_netmap()
421 pstrcpy(s->ifname, sizeof(s->ifname), netmap_opts->ifname); in net_init_netmap()