]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/bhyve/net_backends.h
bhyve: abstraction for network backends
[FreeBSD/FreeBSD.git] / usr.sbin / bhyve / net_backends.h
1 /*-
2  * Copyright (c) 2019 Vincenzo Maffione <vmaffione@FreeBSD.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
18  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
19  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
20  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
23  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27
28 #ifndef __NET_BACKENDS_H__
29 #define __NET_BACKENDS_H__
30
31 #include <stdint.h>
32
33 /* Opaque type representing a network backend. */
34 typedef struct net_backend net_backend_t;
35
36 /* Interface between network frontends and the network backends. */
37 typedef void (*net_be_rxeof_t)(int, enum ev_type, void *param);
38 int     netbe_init(net_backend_t **be, const char *devname, net_be_rxeof_t cb,
39             void *param);
40 void    netbe_cleanup(net_backend_t *be);
41 uint64_t netbe_get_cap(net_backend_t *be);
42 int      netbe_set_cap(net_backend_t *be, uint64_t cap,
43              unsigned vnet_hdr_len);
44 ssize_t netbe_send(net_backend_t *be, struct iovec *iov, int iovcnt);
45 ssize_t netbe_recv(net_backend_t *be, struct iovec *iov, int iovcnt);
46 ssize_t netbe_rx_discard(net_backend_t *be);
47
48
49 /*
50  * Network device capabilities taken from the VirtIO standard.
51  * Despite the name, these capabilities can be used by different frontents
52  * (virtio-net, ptnet) and supported by different backends (netmap, tap, ...).
53  */
54 #define VIRTIO_NET_F_CSUM       (1 <<  0) /* host handles partial cksum */
55 #define VIRTIO_NET_F_GUEST_CSUM (1 <<  1) /* guest handles partial cksum */
56 #define VIRTIO_NET_F_MAC        (1 <<  5) /* host supplies MAC */
57 #define VIRTIO_NET_F_GSO_DEPREC (1 <<  6) /* deprecated: host handles GSO */
58 #define VIRTIO_NET_F_GUEST_TSO4 (1 <<  7) /* guest can rcv TSOv4 */
59 #define VIRTIO_NET_F_GUEST_TSO6 (1 <<  8) /* guest can rcv TSOv6 */
60 #define VIRTIO_NET_F_GUEST_ECN  (1 <<  9) /* guest can rcv TSO with ECN */
61 #define VIRTIO_NET_F_GUEST_UFO  (1 << 10) /* guest can rcv UFO */
62 #define VIRTIO_NET_F_HOST_TSO4  (1 << 11) /* host can rcv TSOv4 */
63 #define VIRTIO_NET_F_HOST_TSO6  (1 << 12) /* host can rcv TSOv6 */
64 #define VIRTIO_NET_F_HOST_ECN   (1 << 13) /* host can rcv TSO with ECN */
65 #define VIRTIO_NET_F_HOST_UFO   (1 << 14) /* host can rcv UFO */
66 #define VIRTIO_NET_F_MRG_RXBUF  (1 << 15) /* host can merge RX buffers */
67 #define VIRTIO_NET_F_STATUS     (1 << 16) /* config status field available */
68 #define VIRTIO_NET_F_CTRL_VQ    (1 << 17) /* control channel available */
69 #define VIRTIO_NET_F_CTRL_RX    (1 << 18) /* control channel RX mode support */
70 #define VIRTIO_NET_F_CTRL_VLAN  (1 << 19) /* control channel VLAN filtering */
71 #define VIRTIO_NET_F_GUEST_ANNOUNCE \
72                                 (1 << 21) /* guest can send gratuitous pkts */
73
74 /*
75  * Fixed network header size
76  */
77 struct virtio_net_rxhdr {
78         uint8_t         vrh_flags;
79         uint8_t         vrh_gso_type;
80         uint16_t        vrh_hdr_len;
81         uint16_t        vrh_gso_size;
82         uint16_t        vrh_csum_start;
83         uint16_t        vrh_csum_offset;
84         uint16_t        vrh_bufs;
85 } __packed;
86
87 #endif /* __NET_BACKENDS_H__ */