Files
xemu/include/net/net.h
T

259 lines
9.4 KiB
C
Raw Normal View History

2007-11-17 17:14:51 +00:00
#ifndef QEMU_NET_H
#define QEMU_NET_H
2012-12-17 18:20:00 +01:00
#include "qemu/queue.h"
#include "qapi/qapi-types-net.h"
2009-10-23 17:52:16 +01:00
#include "net/queue.h"
#include "hw/qdev-properties-system.h"
2008-12-17 19:13:11 +00:00
2016-06-01 11:23:37 +03:00
#define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X"
#define MAC_ARG(x) ((uint8_t *)(x))[0], ((uint8_t *)(x))[1], \
((uint8_t *)(x))[2], ((uint8_t *)(x))[3], \
((uint8_t *)(x))[4], ((uint8_t *)(x))[5]
2013-01-30 19:12:28 +08:00
#define MAX_QUEUE_NUM 1024
/* Maximum GSO packet size (64k) plus plenty of room for
* the ethernet and virtio_net headers
*/
#define NET_BUFSIZE (4096 + 65536)
2009-10-21 15:25:22 +02:00
struct MACAddr {
uint8_t a[6];
};
2009-10-21 15:25:26 +02:00
/* qdev nic properties */
2013-01-30 19:12:28 +08:00
typedef struct NICPeers {
NetClientState *ncs[MAX_QUEUE_NUM];
2014-05-26 12:04:08 +02:00
int32_t queues;
2013-01-30 19:12:28 +08:00
} NICPeers;
2009-10-21 15:25:26 +02:00
typedef struct NICConf {
MACAddr macaddr;
2013-01-30 19:12:28 +08:00
NICPeers peers;
int32_t bootindex;
2009-10-21 15:25:26 +02:00
} NICConf;
#define DEFINE_NIC_PROPERTIES(_state, _conf) \
DEFINE_PROP_MACADDR("mac", _state, _conf.macaddr), \
DEFINE_PROP_NETDEV("netdev", _state, _conf.peers)
2009-10-21 15:25:26 +02:00
2013-01-30 19:12:28 +08:00
/* Net clients */
2007-11-17 17:14:51 +00:00
typedef void (NetPoll)(NetClientState *, bool enable);
typedef bool (NetCanReceive)(NetClientState *);
typedef ssize_t (NetReceive)(NetClientState *, const uint8_t *, size_t);
typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
typedef void (NetCleanup) (NetClientState *);
typedef void (LinkStatusChanged)(NetClientState *);
2013-01-30 19:12:27 +08:00
typedef void (NetClientDestructor)(NetClientState *);
typedef RxFilterInfo *(QueryRxFilter)(NetClientState *);
2014-02-06 17:02:16 +01:00
typedef bool (HasUfo)(NetClientState *);
typedef bool (HasVnetHdr)(NetClientState *);
typedef bool (HasVnetHdrLen)(NetClientState *, int);
typedef void (UsingVnetHdr)(NetClientState *, bool);
typedef void (SetOffload)(NetClientState *, int, int, int, int, int);
typedef void (SetVnetHdrLen)(NetClientState *, int);
2015-06-17 15:23:44 +02:00
typedef int (SetVnetLE)(NetClientState *, bool);
typedef int (SetVnetBE)(NetClientState *, bool);
typedef struct SocketReadState SocketReadState;
typedef void (SocketReadStateFinalize)(SocketReadState *rs);
typedef void (NetAnnounce)(NetClientState *);
typedef bool (SetSteeringEBPF)(NetClientState *, int);
typedef bool (NetCheckPeerType)(NetClientState *, ObjectClass *, Error **);
2009-11-25 18:49:01 +00:00
typedef struct NetClientInfo {
2016-07-13 21:50:23 -06:00
NetClientDriver type;
2009-11-25 18:49:01 +00:00
size_t size;
NetReceive *receive;
NetReceive *receive_raw;
NetReceiveIOV *receive_iov;
NetCanReceive *can_receive;
NetCleanup *cleanup;
LinkStatusChanged *link_status_changed;
QueryRxFilter *query_rx_filter;
2009-12-24 14:46:29 +02:00
NetPoll *poll;
2014-02-06 17:02:16 +01:00
HasUfo *has_ufo;
HasVnetHdr *has_vnet_hdr;
HasVnetHdrLen *has_vnet_hdr_len;
UsingVnetHdr *using_vnet_hdr;
SetOffload *set_offload;
SetVnetHdrLen *set_vnet_hdr_len;
2015-06-17 15:23:44 +02:00
SetVnetLE *set_vnet_le;
SetVnetBE *set_vnet_be;
NetAnnounce *announce;
SetSteeringEBPF *set_steering_ebpf;
NetCheckPeerType *check_peer_type;
2009-11-25 18:49:01 +00:00
} NetClientInfo;
struct NetClientState {
NetClientInfo *info;
int link_down;
QTAILQ_ENTRY(NetClientState) next;
NetClientState *peer;
2013-08-02 21:47:08 +02:00
NetQueue *incoming_queue;
char *model;
char *name;
char info_str[256];
unsigned receive_disabled : 1;
2013-01-30 19:12:27 +08:00
NetClientDestructor *destructor;
2013-01-30 19:12:28 +08:00
unsigned int queue_index;
unsigned rxfilter_notify_enabled:1;
int vring_enable;
int vnet_hdr_len;
bool is_netdev;
2021-03-17 14:26:28 +08:00
bool do_not_pad; /* do not pad to the minimum ethernet frame length */
2021-10-20 12:55:55 +08:00
bool is_datapath;
QTAILQ_HEAD(, NetFilterState) filters;
2007-11-17 17:14:51 +00:00
};
2009-11-25 18:49:10 +00:00
typedef struct NICState {
NetClientState *ncs;
2009-11-25 18:49:10 +00:00
NICConf *conf;
void *opaque;
2010-09-20 18:08:41 +02:00
bool peer_deleted;
2009-11-25 18:49:10 +00:00
} NICState;
struct SocketReadState {
/* 0 = getting length, 1 = getting vnet header length, 2 = getting data */
int state;
/* This flag decide whether to read the vnet_hdr_len field */
bool vnet_hdr;
uint32_t index;
uint32_t packet_len;
uint32_t vnet_hdr_len;
uint8_t buf[NET_BUFSIZE];
SocketReadStateFinalize *finalize;
};
int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size);
2015-03-13 21:09:25 -07:00
char *qemu_mac_strdup_printf(const uint8_t *macaddr);
NetClientState *qemu_find_netdev(const char *id);
int qemu_find_net_clients_except(const char *id, NetClientState **ncs,
2016-07-13 21:50:23 -06:00
NetClientDriver type, int max);
NetClientState *qemu_new_net_client(NetClientInfo *info,
NetClientState *peer,
const char *model,
const char *name);
2021-10-20 12:55:55 +08:00
NetClientState *qemu_new_net_control_client(NetClientInfo *info,
NetClientState *peer,
const char *model,
const char *name);
2009-11-25 18:49:10 +00:00
NICState *qemu_new_nic(NetClientInfo *info,
NICConf *conf,
const char *model,
const char *name,
void *opaque);
2013-01-30 19:12:24 +08:00
void qemu_del_nic(NICState *nic);
2013-01-30 19:12:28 +08:00
NetClientState *qemu_get_subqueue(NICState *nic, int queue_index);
2013-01-30 19:12:22 +08:00
NetClientState *qemu_get_queue(NICState *nic);
2013-01-30 19:12:23 +08:00
NICState *qemu_get_nic(NetClientState *nc);
void *qemu_get_nic_opaque(NetClientState *nc);
void qemu_del_net_client(NetClientState *nc);
2009-11-25 18:49:31 +00:00
typedef void (*qemu_nic_foreach)(NICState *nic, void *opaque);
void qemu_foreach_nic(qemu_nic_foreach func, void *opaque);
2021-02-24 11:44:36 +08:00
int qemu_can_receive_packet(NetClientState *nc);
2012-07-24 16:35:14 +01:00
int qemu_can_send_packet(NetClientState *nc);
ssize_t qemu_sendv_packet(NetClientState *nc, const struct iovec *iov,
2008-12-17 19:13:11 +00:00
int iovcnt);
2012-07-24 16:35:14 +01:00
ssize_t qemu_sendv_packet_async(NetClientState *nc, const struct iovec *iov,
2009-04-29 12:15:26 +01:00
int iovcnt, NetPacketSent *sent_cb);
2019-01-17 15:43:54 +04:00
ssize_t qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size);
2021-02-24 11:44:36 +08:00
ssize_t qemu_receive_packet(NetClientState *nc, const uint8_t *buf, int size);
ssize_t qemu_receive_packet_iov(NetClientState *nc,
const struct iovec *iov,
int iovcnt);
2012-07-24 16:35:14 +01:00
ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size);
ssize_t qemu_send_packet_async(NetClientState *nc, const uint8_t *buf,
2009-04-29 12:15:26 +01:00
int size, NetPacketSent *sent_cb);
2012-07-24 16:35:14 +01:00
void qemu_purge_queued_packets(NetClientState *nc);
void qemu_flush_queued_packets(NetClientState *nc);
2018-03-20 11:44:56 +01:00
void qemu_flush_or_purge_queued_packets(NetClientState *nc, bool purge);
2012-07-24 16:35:14 +01:00
void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6]);
2014-02-20 12:14:07 +01:00
bool qemu_has_ufo(NetClientState *nc);
bool qemu_has_vnet_hdr(NetClientState *nc);
bool qemu_has_vnet_hdr_len(NetClientState *nc, int len);
void qemu_using_vnet_hdr(NetClientState *nc, bool enable);
void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
int ecn, int ufo);
void qemu_set_vnet_hdr_len(NetClientState *nc, int len);
2015-06-17 15:23:44 +02:00
int qemu_set_vnet_le(NetClientState *nc, bool is_le);
int qemu_set_vnet_be(NetClientState *nc, bool is_be);
2009-10-21 15:25:22 +02:00
void qemu_macaddr_default_if_unset(MACAddr *macaddr);
2009-09-25 03:53:51 +02:00
int qemu_show_nic_models(const char *arg, const char *const *models);
void qemu_check_nic_model(NICInfo *nd, const char *model);
2009-09-25 03:53:51 +02:00
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
const char *default_model);
2007-11-17 17:14:51 +00:00
void print_net_client(Monitor *mon, NetClientState *nc);
void hmp_info_network(Monitor *mon, const QDict *qdict);
void net_socket_rs_init(SocketReadState *rs,
SocketReadStateFinalize *finalize,
bool vnet_hdr);
2020-07-01 22:55:25 +08:00
NetClientState *qemu_get_peer(NetClientState *nc, int queue_index);
2007-11-17 17:14:51 +00:00
/* NIC info */
#define MAX_NICS 8
struct NICInfo {
MACAddr macaddr;
2009-10-06 12:16:53 +01:00
char *model;
char *name;
char *devaddr;
NetClientState *netdev;
int used; /* is this slot in nd_table[] being used? */
int instantiated; /* does this NICInfo correspond to an instantiated NIC? */
int nvectors;
2007-11-17 17:14:51 +00:00
};
extern int nb_nics;
extern NICInfo nd_table[MAX_NICS];
2014-05-27 23:39:33 +01:00
extern const char *host_net_devices[];
2007-11-17 17:14:51 +00:00
/* from net.c */
int net_client_parse(QemuOptsList *opts_list, const char *str);
void show_netdevs(void);
int net_init_clients(Error **errp);
void net_check_clients(void);
void net_cleanup(void);
void hmp_host_net_add(Monitor *mon, const QDict *qdict);
void hmp_host_net_remove(Monitor *mon, const QDict *qdict);
2012-04-18 17:34:15 -03:00
void netdev_add(QemuOpts *opts, Error **errp);
2012-10-24 08:43:34 +02:00
int net_hub_id_for_client(NetClientState *nc, int *id);
NetClientState *net_hub_port_find(int hub_id);
2020-08-18 11:56:16 +02:00
#define DEFAULT_NETWORK_SCRIPT CONFIG_SYSCONFDIR "/qemu-ifup"
#define DEFAULT_NETWORK_DOWN_SCRIPT CONFIG_SYSCONFDIR "/qemu-ifdown"
2012-01-26 09:42:27 -05:00
#define DEFAULT_BRIDGE_HELPER CONFIG_QEMU_HELPERDIR "/qemu-bridge-helper"
#define DEFAULT_BRIDGE_INTERFACE "br0"
2009-10-21 15:25:26 +02:00
void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd);
2009-05-14 22:35:07 +01:00
#define POLYNOMIAL_BE 0x04c11db6
2017-12-15 18:41:44 +00:00
#define POLYNOMIAL_LE 0xedb88320
uint32_t net_crc32(const uint8_t *p, int len);
2017-12-15 18:41:44 +00:00
uint32_t net_crc32_le(const uint8_t *p, int len);
2012-03-05 11:08:50 +08:00
#define vmstate_offset_macaddr(_state, _field) \
vmstate_offset_array(_state, _field.a, uint8_t, \
sizeof(typeof_field(_state, _field)))
#define VMSTATE_MACADDR(_field, _state) { \
.name = (stringify(_field)), \
.size = sizeof(MACAddr), \
.info = &vmstate_info_buffer, \
.flags = VMS_BUFFER, \
.offset = vmstate_offset_macaddr(_state, _field), \
}
static inline bool net_peer_needs_padding(NetClientState *nc)
{
return nc->peer && !nc->peer->do_not_pad;
}
2007-11-17 17:14:51 +00:00
#endif