Lines Matching +full:recv +full:- +full:not +full:- +full:empty

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
30 * to be used by network frontends such as virtio-net and e1000.
71 #define NET_BE_SIZE(be) (sizeof(*be) + (be)->priv_size)
78 if (priv->mevp) { in tap_cleanup()
79 mevent_delete(priv->mevp); in tap_cleanup()
81 if (be->fd != -1) { in tap_cleanup()
82 close(be->fd); in tap_cleanup()
83 be->fd = -1; in tap_cleanup()
100 EPRINTLN("TAP backend requires non-NULL callback"); in tap_init()
101 return (-1); in tap_init()
107 be->fd = open(tbuf, O_RDWR); in tap_init()
108 if (be->fd == -1) { in tap_init()
114 * Set non-blocking and register for read in tap_init()
117 if (ioctl(be->fd, FIONBIO, &opt) < 0) { in tap_init()
122 if (strncmp("ngd", be->prefix, 3) && in tap_init()
123 ioctl(be->fd, VMIO_SIOCSIFFLAGS, up)) { in tap_init()
130 if (caph_rights_limit(be->fd, &rights) == -1) in tap_init()
134 memset(priv->bbuf, 0, sizeof(priv->bbuf)); in tap_init()
135 priv->bbuflen = 0; in tap_init()
137 priv->mevp = mevent_add_disabled(be->fd, EVF_READ, cb, param); in tap_init()
138 if (priv->mevp == NULL) { in tap_init()
139 EPRINTLN("Could not register event"); in tap_init()
147 return (-1); in tap_init()
156 return (writev(be->fd, iov, iovcnt)); in tap_send()
165 if (priv->bbuflen > 0) { in tap_peek_recvlen()
170 return priv->bbuflen; in tap_peek_recvlen()
178 ret = read(be->fd, priv->bbuf, sizeof(priv->bbuf)); in tap_peek_recvlen()
184 priv->bbuflen = ret; in tap_peek_recvlen()
195 if (priv->bbuflen > 0) { in tap_recv()
200 ret = buf_to_iov(priv->bbuf, priv->bbuflen, in tap_recv()
203 /* Mark the bounce buffer as empty. */ in tap_recv()
204 priv->bbuflen = 0; in tap_recv()
209 ret = readv(be->fd, iov, iovcnt); in tap_recv()
222 mevent_enable(priv->mevp); in tap_recv_enable()
230 mevent_disable(priv->mevp); in tap_recv_disable()
245 return ((features || vnet_hdr_len) ? -1 : 0); in tap_set_cap()
255 .recv = tap_recv,
270 .recv = tap_recv,
285 .recv = tap_recv,
309 backend = strndup(opts, cp - opts); in netbe_legacy_config()
319 * @devname is the backend-name as supplied on the command line,
320 * e.g. -s 2:0,frontend-name,backend-name[,other-args]
338 return (-1); in netbe_init()
351 * Find the network backend that matches the user-provided in netbe_init()
355 if (strncmp(type, (*pbe)->prefix, in netbe_init()
356 strlen((*pbe)->prefix)) == 0) { in netbe_init()
358 assert(tbe->init != NULL); in netbe_init()
359 assert(tbe->cleanup != NULL); in netbe_init()
360 assert(tbe->send != NULL); in netbe_init()
361 assert(tbe->recv != NULL); in netbe_init()
362 assert(tbe->get_cap != NULL); in netbe_init()
363 assert(tbe->set_cap != NULL); in netbe_init()
376 nbe->fd = -1; in netbe_init()
377 nbe->sc = param; in netbe_init()
378 nbe->be_vnet_hdr_len = 0; in netbe_init()
379 nbe->fe_vnet_hdr_len = 0; in netbe_init()
382 err = nbe->init(nbe, devname, nvl, cb, param); in netbe_init()
400 be->cleanup(be); in netbe_cleanup()
410 return (be->get_cap(be)); in netbe_get_cap()
423 && vnet_hdr_len != (VNET_HDR_LEN - sizeof(uint16_t))) in netbe_set_cap()
424 return (-1); in netbe_set_cap()
426 be->fe_vnet_hdr_len = vnet_hdr_len; in netbe_set_cap()
428 ret = be->set_cap(be, features, vnet_hdr_len); in netbe_set_cap()
429 assert(be->be_vnet_hdr_len == 0 || in netbe_set_cap()
430 be->be_vnet_hdr_len == be->fe_vnet_hdr_len); in netbe_set_cap()
439 return (be->send(be, iov, iovcnt)); in netbe_send()
446 return (be->peek_recvlen(be)); in netbe_peek_recvlen()
452 * the length of the packet just read. Return -1 in case of errors.
458 return (be->recv(be, iov, iovcnt)); in netbe_recv()
471 * so there is no need for it to be per-vtnet or locked. in netbe_rx_discard()
472 * We only make it large enough for TSO-sized segment. in netbe_rx_discard()
487 return be->recv_disable(be); in netbe_rx_disable()
494 return be->recv_enable(be); in netbe_rx_enable()
501 return (be->be_vnet_hdr_len); in netbe_get_vnet_hdr_len()