pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 1 | #ifndef QEMU_NET_H |
| 2 | #define QEMU_NET_H |
| 3 | |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 4 | #include "qemu/queue.h" |
Markus Armbruster | 9af2398 | 2018-02-11 10:36:01 +0100 | [diff] [blame] | 5 | #include "qapi/qapi-types-net.h" |
Mark McLoughlin | e1144d0 | 2009-10-23 17:52:16 +0100 | [diff] [blame] | 6 | #include "net/queue.h" |
Eduardo Habkost | ce35e22 | 2020-12-11 17:05:12 -0500 | [diff] [blame] | 7 | #include "hw/qdev-properties-system.h" |
aliguori | fbe78f4 | 2008-12-17 19:13:11 +0000 | [diff] [blame] | 8 | |
Dmitry Fleytman | 6d1d493 | 2016-06-01 11:23:37 +0300 | [diff] [blame] | 9 | #define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X" |
| 10 | #define MAC_ARG(x) ((uint8_t *)(x))[0], ((uint8_t *)(x))[1], \ |
| 11 | ((uint8_t *)(x))[2], ((uint8_t *)(x))[3], \ |
| 12 | ((uint8_t *)(x))[4], ((uint8_t *)(x))[5] |
| 13 | |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 14 | #define MAX_QUEUE_NUM 1024 |
| 15 | |
Scott Feldman | d32fcad | 2013-03-18 11:43:44 -0700 | [diff] [blame] | 16 | /* Maximum GSO packet size (64k) plus plenty of room for |
| 17 | * the ethernet and virtio_net headers |
| 18 | */ |
| 19 | #define NET_BUFSIZE (4096 + 65536) |
| 20 | |
Gerd Hoffmann | 76d32cb | 2009-10-21 15:25:22 +0200 | [diff] [blame] | 21 | struct MACAddr { |
| 22 | uint8_t a[6]; |
| 23 | }; |
| 24 | |
Gerd Hoffmann | ed16ab5 | 2009-10-21 15:25:26 +0200 | [diff] [blame] | 25 | /* qdev nic properties */ |
| 26 | |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 27 | typedef struct NICPeers { |
| 28 | NetClientState *ncs[MAX_QUEUE_NUM]; |
Jiri Pirko | 575a1c0 | 2014-05-26 12:04:08 +0200 | [diff] [blame] | 29 | int32_t queues; |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 30 | } NICPeers; |
| 31 | |
Gerd Hoffmann | ed16ab5 | 2009-10-21 15:25:26 +0200 | [diff] [blame] | 32 | typedef struct NICConf { |
| 33 | MACAddr macaddr; |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 34 | NICPeers peers; |
Gleb Natapov | 1ca4d09 | 2010-12-08 13:35:05 +0200 | [diff] [blame] | 35 | int32_t bootindex; |
Gerd Hoffmann | ed16ab5 | 2009-10-21 15:25:26 +0200 | [diff] [blame] | 36 | } NICConf; |
| 37 | |
| 38 | #define DEFINE_NIC_PROPERTIES(_state, _conf) \ |
| 39 | DEFINE_PROP_MACADDR("mac", _state, _conf.macaddr), \ |
Gonglei | 45e8a9e | 2014-10-07 16:00:21 +0800 | [diff] [blame] | 40 | DEFINE_PROP_NETDEV("netdev", _state, _conf.peers) |
Gerd Hoffmann | ed16ab5 | 2009-10-21 15:25:26 +0200 | [diff] [blame] | 41 | |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 42 | |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 43 | /* Net clients */ |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 44 | |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 45 | typedef void (NetPoll)(NetClientState *, bool enable); |
Philippe Mathieu-Daudé | b8c4b67 | 2020-03-05 18:56:49 +0100 | [diff] [blame] | 46 | typedef bool (NetCanReceive)(NetClientState *); |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 47 | typedef ssize_t (NetReceive)(NetClientState *, const uint8_t *, size_t); |
| 48 | typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int); |
| 49 | typedef void (NetCleanup) (NetClientState *); |
| 50 | typedef void (LinkStatusChanged)(NetClientState *); |
Jason Wang | f786045 | 2013-01-30 19:12:27 +0800 | [diff] [blame] | 51 | typedef void (NetClientDestructor)(NetClientState *); |
Amos Kong | b1be428 | 2013-06-14 15:45:52 +0800 | [diff] [blame] | 52 | typedef RxFilterInfo *(QueryRxFilter)(NetClientState *); |
Vincenzo Maffione | 1f55ac4 | 2014-02-06 17:02:16 +0100 | [diff] [blame] | 53 | typedef bool (HasUfo)(NetClientState *); |
| 54 | typedef bool (HasVnetHdr)(NetClientState *); |
| 55 | typedef bool (HasVnetHdrLen)(NetClientState *, int); |
| 56 | typedef void (UsingVnetHdr)(NetClientState *, bool); |
| 57 | typedef void (SetOffload)(NetClientState *, int, int, int, int, int); |
| 58 | typedef void (SetVnetHdrLen)(NetClientState *, int); |
Greg Kurz | c80cd6b | 2015-06-17 15:23:44 +0200 | [diff] [blame] | 59 | typedef int (SetVnetLE)(NetClientState *, bool); |
| 60 | typedef int (SetVnetBE)(NetClientState *, bool); |
Zhang Chen | 16a3df4 | 2016-05-13 15:35:19 +0800 | [diff] [blame] | 61 | typedef struct SocketReadState SocketReadState; |
| 62 | typedef void (SocketReadStateFinalize)(SocketReadState *rs); |
Dr. David Alan Gilbert | 44b416a | 2019-02-27 13:24:09 +0000 | [diff] [blame] | 63 | typedef void (NetAnnounce)(NetClientState *); |
Andrew Melnychenko | 8f364e3 | 2021-05-14 14:48:30 +0300 | [diff] [blame] | 64 | typedef bool (SetSteeringEBPF)(NetClientState *, int); |
Kevin Wolf | e287bf7 | 2021-10-08 15:34:28 +0200 | [diff] [blame] | 65 | typedef bool (NetCheckPeerType)(NetClientState *, ObjectClass *, Error **); |
aliguori | 34b25ca | 2009-01-08 19:45:03 +0000 | [diff] [blame] | 66 | |
Mark McLoughlin | 3ed79cc | 2009-11-25 18:49:01 +0000 | [diff] [blame] | 67 | typedef struct NetClientInfo { |
Eric Blake | f394b2e | 2016-07-13 21:50:23 -0600 | [diff] [blame] | 68 | NetClientDriver type; |
Mark McLoughlin | 3ed79cc | 2009-11-25 18:49:01 +0000 | [diff] [blame] | 69 | size_t size; |
| 70 | NetReceive *receive; |
| 71 | NetReceive *receive_raw; |
| 72 | NetReceiveIOV *receive_iov; |
| 73 | NetCanReceive *can_receive; |
| 74 | NetCleanup *cleanup; |
| 75 | LinkStatusChanged *link_status_changed; |
Amos Kong | b1be428 | 2013-06-14 15:45:52 +0800 | [diff] [blame] | 76 | QueryRxFilter *query_rx_filter; |
Michael S. Tsirkin | ceb6961 | 2009-12-24 14:46:29 +0200 | [diff] [blame] | 77 | NetPoll *poll; |
Vincenzo Maffione | 1f55ac4 | 2014-02-06 17:02:16 +0100 | [diff] [blame] | 78 | HasUfo *has_ufo; |
| 79 | HasVnetHdr *has_vnet_hdr; |
| 80 | HasVnetHdrLen *has_vnet_hdr_len; |
| 81 | UsingVnetHdr *using_vnet_hdr; |
| 82 | SetOffload *set_offload; |
| 83 | SetVnetHdrLen *set_vnet_hdr_len; |
Greg Kurz | c80cd6b | 2015-06-17 15:23:44 +0200 | [diff] [blame] | 84 | SetVnetLE *set_vnet_le; |
| 85 | SetVnetBE *set_vnet_be; |
Dr. David Alan Gilbert | 44b416a | 2019-02-27 13:24:09 +0000 | [diff] [blame] | 86 | NetAnnounce *announce; |
Andrew Melnychenko | 8f364e3 | 2021-05-14 14:48:30 +0300 | [diff] [blame] | 87 | SetSteeringEBPF *set_steering_ebpf; |
Kevin Wolf | e287bf7 | 2021-10-08 15:34:28 +0200 | [diff] [blame] | 88 | NetCheckPeerType *check_peer_type; |
Mark McLoughlin | 3ed79cc | 2009-11-25 18:49:01 +0000 | [diff] [blame] | 89 | } NetClientInfo; |
| 90 | |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 91 | struct NetClientState { |
Mark McLoughlin | 665a3b0 | 2009-11-25 18:49:30 +0000 | [diff] [blame] | 92 | NetClientInfo *info; |
aliguori | 436e5e5 | 2009-01-08 19:44:06 +0000 | [diff] [blame] | 93 | int link_down; |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 94 | QTAILQ_ENTRY(NetClientState) next; |
| 95 | NetClientState *peer; |
Jan Kiszka | 067404b | 2013-08-02 21:47:08 +0200 | [diff] [blame] | 96 | NetQueue *incoming_queue; |
aliguori | bf38c1a | 2009-01-07 17:42:25 +0000 | [diff] [blame] | 97 | char *model; |
aliguori | 676cff2 | 2009-01-07 17:43:44 +0000 | [diff] [blame] | 98 | char *name; |
Jason Wang | 56e6f59 | 2021-04-02 11:03:33 +0800 | [diff] [blame] | 99 | char info_str[256]; |
Mark McLoughlin | 893379e | 2009-10-27 18:16:36 +0000 | [diff] [blame] | 100 | unsigned receive_disabled : 1; |
Jason Wang | f786045 | 2013-01-30 19:12:27 +0800 | [diff] [blame] | 101 | NetClientDestructor *destructor; |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 102 | unsigned int queue_index; |
Amos Kong | b1be428 | 2013-06-14 15:45:52 +0800 | [diff] [blame] | 103 | unsigned rxfilter_notify_enabled:1; |
Marc-André Lureau | bfc6cf3 | 2016-06-06 18:45:06 +0200 | [diff] [blame] | 104 | int vring_enable; |
Zhang Chen | d6b732e | 2017-07-04 14:53:45 +0800 | [diff] [blame] | 105 | int vnet_hdr_len; |
Eric Blake | 08712fc | 2020-03-17 15:17:11 -0500 | [diff] [blame] | 106 | bool is_netdev; |
Bin Meng | 935344b | 2021-03-17 14:26:28 +0800 | [diff] [blame] | 107 | bool do_not_pad; /* do not pad to the minimum ethernet frame length */ |
Jason Wang | 2f849db | 2021-10-20 12:55:55 +0800 | [diff] [blame] | 108 | bool is_datapath; |
Paolo Bonzini | eae3eb3 | 2018-12-06 13:10:34 +0100 | [diff] [blame] | 109 | QTAILQ_HEAD(, NetFilterState) filters; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 110 | }; |
| 111 | |
Mark McLoughlin | ebef2c0 | 2009-11-25 18:49:10 +0000 | [diff] [blame] | 112 | typedef struct NICState { |
Jason Wang | f6b26cf | 2013-02-22 23:15:06 +0800 | [diff] [blame] | 113 | NetClientState *ncs; |
Mark McLoughlin | ebef2c0 | 2009-11-25 18:49:10 +0000 | [diff] [blame] | 114 | NICConf *conf; |
| 115 | void *opaque; |
Michael S. Tsirkin | a083a89 | 2010-09-20 18:08:41 +0200 | [diff] [blame] | 116 | bool peer_deleted; |
Mark McLoughlin | ebef2c0 | 2009-11-25 18:49:10 +0000 | [diff] [blame] | 117 | } NICState; |
| 118 | |
Zhang Chen | 16a3df4 | 2016-05-13 15:35:19 +0800 | [diff] [blame] | 119 | struct SocketReadState { |
Zhang Chen | 3cde5ea | 2017-07-04 14:53:46 +0800 | [diff] [blame] | 120 | /* 0 = getting length, 1 = getting vnet header length, 2 = getting data */ |
| 121 | int state; |
| 122 | /* This flag decide whether to read the vnet_hdr_len field */ |
| 123 | bool vnet_hdr; |
Zhang Chen | 16a3df4 | 2016-05-13 15:35:19 +0800 | [diff] [blame] | 124 | uint32_t index; |
| 125 | uint32_t packet_len; |
Zhang Chen | 3cde5ea | 2017-07-04 14:53:46 +0800 | [diff] [blame] | 126 | uint32_t vnet_hdr_len; |
Zhang Chen | 16a3df4 | 2016-05-13 15:35:19 +0800 | [diff] [blame] | 127 | uint8_t buf[NET_BUFSIZE]; |
| 128 | SocketReadStateFinalize *finalize; |
| 129 | }; |
| 130 | |
| 131 | int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size); |
Scott Feldman | 890ee6a | 2015-03-13 21:09:25 -0700 | [diff] [blame] | 132 | char *qemu_mac_strdup_printf(const uint8_t *macaddr); |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 133 | NetClientState *qemu_find_netdev(const char *id); |
Jason Wang | 6c51ae7 | 2013-01-30 19:12:25 +0800 | [diff] [blame] | 134 | int qemu_find_net_clients_except(const char *id, NetClientState **ncs, |
Eric Blake | f394b2e | 2016-07-13 21:50:23 -0600 | [diff] [blame] | 135 | NetClientDriver type, int max); |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 136 | NetClientState *qemu_new_net_client(NetClientInfo *info, |
| 137 | NetClientState *peer, |
| 138 | const char *model, |
| 139 | const char *name); |
Jason Wang | 2f849db | 2021-10-20 12:55:55 +0800 | [diff] [blame] | 140 | NetClientState *qemu_new_net_control_client(NetClientInfo *info, |
| 141 | NetClientState *peer, |
| 142 | const char *model, |
| 143 | const char *name); |
Mark McLoughlin | ebef2c0 | 2009-11-25 18:49:10 +0000 | [diff] [blame] | 144 | NICState *qemu_new_nic(NetClientInfo *info, |
| 145 | NICConf *conf, |
| 146 | const char *model, |
| 147 | const char *name, |
| 148 | void *opaque); |
Jason Wang | 948ecf2 | 2013-01-30 19:12:24 +0800 | [diff] [blame] | 149 | void qemu_del_nic(NICState *nic); |
Jason Wang | 1ceef9f | 2013-01-30 19:12:28 +0800 | [diff] [blame] | 150 | NetClientState *qemu_get_subqueue(NICState *nic, int queue_index); |
Jason Wang | b356f76 | 2013-01-30 19:12:22 +0800 | [diff] [blame] | 151 | NetClientState *qemu_get_queue(NICState *nic); |
Jason Wang | cc1f0f4 | 2013-01-30 19:12:23 +0800 | [diff] [blame] | 152 | NICState *qemu_get_nic(NetClientState *nc); |
| 153 | void *qemu_get_nic_opaque(NetClientState *nc); |
Stefan Hajnoczi | b20c6b9 | 2012-07-24 16:35:15 +0100 | [diff] [blame] | 154 | void qemu_del_net_client(NetClientState *nc); |
Mark McLoughlin | 57f9ef1 | 2009-11-25 18:49:31 +0000 | [diff] [blame] | 155 | typedef void (*qemu_nic_foreach)(NICState *nic, void *opaque); |
| 156 | void qemu_foreach_nic(qemu_nic_foreach func, void *opaque); |
Jason Wang | 705df54 | 2021-02-24 11:44:36 +0800 | [diff] [blame] | 157 | int qemu_can_receive_packet(NetClientState *nc); |
Stefan Hajnoczi | 35277d1 | 2012-07-24 16:35:14 +0100 | [diff] [blame] | 158 | int qemu_can_send_packet(NetClientState *nc); |
| 159 | ssize_t qemu_sendv_packet(NetClientState *nc, const struct iovec *iov, |
aliguori | fbe78f4 | 2008-12-17 19:13:11 +0000 | [diff] [blame] | 160 | int iovcnt); |
Stefan Hajnoczi | 35277d1 | 2012-07-24 16:35:14 +0100 | [diff] [blame] | 161 | ssize_t qemu_sendv_packet_async(NetClientState *nc, const struct iovec *iov, |
Mark McLoughlin | f3b6c7f | 2009-04-29 12:15:26 +0100 | [diff] [blame] | 162 | int iovcnt, NetPacketSent *sent_cb); |
Marc-André Lureau | 625a526 | 2019-01-17 15:43:54 +0400 | [diff] [blame] | 163 | ssize_t qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size); |
Jason Wang | 705df54 | 2021-02-24 11:44:36 +0800 | [diff] [blame] | 164 | ssize_t qemu_receive_packet(NetClientState *nc, const uint8_t *buf, int size); |
| 165 | ssize_t qemu_receive_packet_iov(NetClientState *nc, |
| 166 | const struct iovec *iov, |
| 167 | int iovcnt); |
Stefan Hajnoczi | 35277d1 | 2012-07-24 16:35:14 +0100 | [diff] [blame] | 168 | ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size); |
| 169 | ssize_t qemu_send_packet_async(NetClientState *nc, const uint8_t *buf, |
Mark McLoughlin | f3b6c7f | 2009-04-29 12:15:26 +0100 | [diff] [blame] | 170 | int size, NetPacketSent *sent_cb); |
Stefan Hajnoczi | 35277d1 | 2012-07-24 16:35:14 +0100 | [diff] [blame] | 171 | void qemu_purge_queued_packets(NetClientState *nc); |
| 172 | void qemu_flush_queued_packets(NetClientState *nc); |
Greg Kurz | 94b5295 | 2018-03-20 11:44:56 +0100 | [diff] [blame] | 173 | void qemu_flush_or_purge_queued_packets(NetClientState *nc, bool purge); |
Stefan Hajnoczi | 35277d1 | 2012-07-24 16:35:14 +0100 | [diff] [blame] | 174 | void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6]); |
Stefan Hajnoczi | d6085e3 | 2014-02-20 12:14:07 +0100 | [diff] [blame] | 175 | bool qemu_has_ufo(NetClientState *nc); |
| 176 | bool qemu_has_vnet_hdr(NetClientState *nc); |
| 177 | bool qemu_has_vnet_hdr_len(NetClientState *nc, int len); |
| 178 | void qemu_using_vnet_hdr(NetClientState *nc, bool enable); |
| 179 | void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6, |
| 180 | int ecn, int ufo); |
| 181 | void qemu_set_vnet_hdr_len(NetClientState *nc, int len); |
Greg Kurz | c80cd6b | 2015-06-17 15:23:44 +0200 | [diff] [blame] | 182 | int qemu_set_vnet_le(NetClientState *nc, bool is_le); |
| 183 | int qemu_set_vnet_be(NetClientState *nc, bool is_be); |
Gerd Hoffmann | 76d32cb | 2009-10-21 15:25:22 +0200 | [diff] [blame] | 184 | void qemu_macaddr_default_if_unset(MACAddr *macaddr); |
Markus Armbruster | 07caea3 | 2009-09-25 03:53:51 +0200 | [diff] [blame] | 185 | int qemu_show_nic_models(const char *arg, const char *const *models); |
aliguori | d07f22c | 2009-01-13 19:03:57 +0000 | [diff] [blame] | 186 | void qemu_check_nic_model(NICInfo *nd, const char *model); |
Markus Armbruster | 07caea3 | 2009-09-25 03:53:51 +0200 | [diff] [blame] | 187 | int qemu_find_nic_model(NICInfo *nd, const char * const *models, |
| 188 | const char *default_model); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 189 | |
Zhi Yong Wu | 1a85959 | 2012-07-24 16:35:16 +0100 | [diff] [blame] | 190 | void print_net_client(Monitor *mon, NetClientState *nc); |
Markus Armbruster | 1ce6be2 | 2015-02-06 14:18:24 +0100 | [diff] [blame] | 191 | void hmp_info_network(Monitor *mon, const QDict *qdict); |
Zhang Chen | 16a3df4 | 2016-05-13 15:35:19 +0800 | [diff] [blame] | 192 | void net_socket_rs_init(SocketReadState *rs, |
Zhang Chen | 3cde5ea | 2017-07-04 14:53:46 +0800 | [diff] [blame] | 193 | SocketReadStateFinalize *finalize, |
| 194 | bool vnet_hdr); |
Cindy Lu | 0165daa | 2020-07-01 22:55:25 +0800 | [diff] [blame] | 195 | NetClientState *qemu_get_peer(NetClientState *nc, int queue_index); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 196 | |
| 197 | /* NIC info */ |
| 198 | |
| 199 | #define MAX_NICS 8 |
| 200 | |
| 201 | struct NICInfo { |
Jan Kiszka | 6eed185 | 2011-07-20 12:20:22 +0200 | [diff] [blame] | 202 | MACAddr macaddr; |
Mark McLoughlin | 9203f52 | 2009-10-06 12:16:53 +0100 | [diff] [blame] | 203 | char *model; |
| 204 | char *name; |
| 205 | char *devaddr; |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 206 | NetClientState *netdev; |
Peter Maydell | 48e2faf | 2011-05-20 16:50:01 +0100 | [diff] [blame] | 207 | int used; /* is this slot in nd_table[] being used? */ |
| 208 | int instantiated; /* does this NICInfo correspond to an instantiated NIC? */ |
Michael S. Tsirkin | ffe6370 | 2009-06-21 19:51:18 +0300 | [diff] [blame] | 209 | int nvectors; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 210 | }; |
| 211 | |
| 212 | extern int nb_nics; |
| 213 | extern NICInfo nd_table[MAX_NICS]; |
Hani Benhabiles | 84007e8 | 2014-05-27 23:39:33 +0100 | [diff] [blame] | 214 | extern const char *host_net_devices[]; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 215 | |
aliguori | 63a01ef | 2008-10-31 19:10:00 +0000 | [diff] [blame] | 216 | /* from net.c */ |
Mark McLoughlin | 7f161aa | 2009-10-08 19:58:25 +0100 | [diff] [blame] | 217 | int net_client_parse(QemuOptsList *opts_list, const char *str); |
Paolo Bonzini | ad6f932 | 2020-11-11 05:52:22 -0500 | [diff] [blame] | 218 | void show_netdevs(void); |
Thomas Huth | 34f708b | 2018-02-21 11:18:30 +0100 | [diff] [blame] | 219 | int net_init_clients(Error **errp); |
Markus Armbruster | 668680f | 2010-02-11 14:44:58 +0100 | [diff] [blame] | 220 | void net_check_clients(void); |
aliguori | 63a01ef | 2008-10-31 19:10:00 +0000 | [diff] [blame] | 221 | void net_cleanup(void); |
Markus Armbruster | 3e5a50d | 2015-02-06 13:55:43 +0100 | [diff] [blame] | 222 | void hmp_host_net_add(Monitor *mon, const QDict *qdict); |
| 223 | void hmp_host_net_remove(Monitor *mon, const QDict *qdict); |
Luiz Capitulino | 928059a | 2012-04-18 17:34:15 -0300 | [diff] [blame] | 224 | void netdev_add(QemuOpts *opts, Error **errp); |
aliguori | 63a01ef | 2008-10-31 19:10:00 +0000 | [diff] [blame] | 225 | |
Paolo Bonzini | 1422e32 | 2012-10-24 08:43:34 +0200 | [diff] [blame] | 226 | int net_hub_id_for_client(NetClientState *nc, int *id); |
| 227 | NetClientState *net_hub_port_find(int hub_id); |
| 228 | |
Paolo Bonzini | 63c4db4 | 2020-08-18 11:56:16 +0200 | [diff] [blame] | 229 | #define DEFAULT_NETWORK_SCRIPT CONFIG_SYSCONFDIR "/qemu-ifup" |
| 230 | #define DEFAULT_NETWORK_DOWN_SCRIPT CONFIG_SYSCONFDIR "/qemu-ifdown" |
Corey Bryant | a7c36ee | 2012-01-26 09:42:27 -0500 | [diff] [blame] | 231 | #define DEFAULT_BRIDGE_HELPER CONFIG_QEMU_HELPERDIR "/qemu-bridge-helper" |
| 232 | #define DEFAULT_BRIDGE_INTERFACE "br0" |
aurel32 | f54825c | 2008-12-18 22:43:48 +0000 | [diff] [blame] | 233 | |
Gerd Hoffmann | ed16ab5 | 2009-10-21 15:25:26 +0200 | [diff] [blame] | 234 | void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd); |
Paul Brook | 9d07d75 | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 235 | |
Mark Cave-Ayland | eaba8f3 | 2017-12-15 18:41:43 +0000 | [diff] [blame] | 236 | #define POLYNOMIAL_BE 0x04c11db6 |
Mark Cave-Ayland | f1a7deb | 2017-12-15 18:41:44 +0000 | [diff] [blame] | 237 | #define POLYNOMIAL_LE 0xedb88320 |
Mark Cave-Ayland | eaba8f3 | 2017-12-15 18:41:43 +0000 | [diff] [blame] | 238 | uint32_t net_crc32(const uint8_t *p, int len); |
Mark Cave-Ayland | f1a7deb | 2017-12-15 18:41:44 +0000 | [diff] [blame] | 239 | uint32_t net_crc32_le(const uint8_t *p, int len); |
Jason Wang | 7fc8d91 | 2012-03-05 11:08:50 +0800 | [diff] [blame] | 240 | |
Paolo Bonzini | 701a8f7 | 2012-01-13 17:07:20 +0100 | [diff] [blame] | 241 | #define vmstate_offset_macaddr(_state, _field) \ |
| 242 | vmstate_offset_array(_state, _field.a, uint8_t, \ |
| 243 | sizeof(typeof_field(_state, _field))) |
| 244 | |
| 245 | #define VMSTATE_MACADDR(_field, _state) { \ |
| 246 | .name = (stringify(_field)), \ |
| 247 | .size = sizeof(MACAddr), \ |
| 248 | .info = &vmstate_info_buffer, \ |
| 249 | .flags = VMS_BUFFER, \ |
| 250 | .offset = vmstate_offset_macaddr(_state, _field), \ |
| 251 | } |
| 252 | |
Jason Wang | bc38e31 | 2021-04-23 11:18:03 +0800 | [diff] [blame] | 253 | static inline bool net_peer_needs_padding(NetClientState *nc) |
| 254 | { |
| 255 | return nc->peer && !nc->peer->do_not_pad; |
| 256 | } |
| 257 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 258 | #endif |