From 1f55ac4586bfae81b1e805fb2f0713cb21501ae2 Mon Sep 17 00:00:00 2001 From: Vincenzo Maffione Date: Thu, 6 Feb 2014 17:02:16 +0100 Subject: [PATCH] net: extend NetClientInfo for offloading Some new callbacks have been added to generalize the operations done by virtio-net and vmxnet3 frontends to manipulate TAP offloadings. Signed-off-by: Vincenzo Maffione Signed-off-by: Stefan Hajnoczi --- include/net/net.h | 19 ++++++++++++++++ net/net.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/include/net/net.h b/include/net/net.h index 11e146888b..7b2539433b 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -50,6 +50,12 @@ typedef void (NetCleanup) (NetClientState *); typedef void (LinkStatusChanged)(NetClientState *); typedef void (NetClientDestructor)(NetClientState *); typedef RxFilterInfo *(QueryRxFilter)(NetClientState *); +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); typedef struct NetClientInfo { NetClientOptionsKind type; @@ -62,6 +68,12 @@ typedef struct NetClientInfo { LinkStatusChanged *link_status_changed; QueryRxFilter *query_rx_filter; NetPoll *poll; + HasUfo *has_ufo; + HasVnetHdr *has_vnet_hdr; + HasVnetHdrLen *has_vnet_hdr_len; + UsingVnetHdr *using_vnet_hdr; + SetOffload *set_offload; + SetVnetHdrLen *set_vnet_hdr_len; } NetClientInfo; struct NetClientState { @@ -120,6 +132,13 @@ ssize_t qemu_send_packet_async(NetClientState *nc, const uint8_t *buf, void qemu_purge_queued_packets(NetClientState *nc); void qemu_flush_queued_packets(NetClientState *nc); void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6]); +bool qemu_peer_has_ufo(NetClientState *nc); +bool qemu_peer_has_vnet_hdr(NetClientState *nc); +bool qemu_peer_has_vnet_hdr_len(NetClientState *nc, int len); +void qemu_peer_using_vnet_hdr(NetClientState *nc, bool enable); +void qemu_peer_set_offload(NetClientState *nc, int csum, int tso4, int tso6, + int ecn, int ufo); +void qemu_peer_set_vnet_hdr_len(NetClientState *nc, int len); void qemu_macaddr_default_if_unset(MACAddr *macaddr); int qemu_show_nic_models(const char *arg, const char *const *models); void qemu_check_nic_model(NICInfo *nd, const char *model); diff --git a/net/net.c b/net/net.c index 41b38830ea..06d690aa4a 100644 --- a/net/net.c +++ b/net/net.c @@ -378,6 +378,61 @@ void qemu_foreach_nic(qemu_nic_foreach func, void *opaque) } } +bool qemu_peer_has_ufo(NetClientState *nc) +{ + if (!nc->peer || !nc->peer->info->has_ufo) { + return false; + } + + return nc->peer->info->has_ufo(nc->peer); +} + +bool qemu_peer_has_vnet_hdr(NetClientState *nc) +{ + if (!nc->peer || !nc->peer->info->has_vnet_hdr) { + return false; + } + + return nc->peer->info->has_vnet_hdr(nc->peer); +} + +bool qemu_peer_has_vnet_hdr_len(NetClientState *nc, int len) +{ + if (!nc->peer || !nc->peer->info->has_vnet_hdr_len) { + return false; + } + + return nc->peer->info->has_vnet_hdr_len(nc->peer, len); +} + +void qemu_peer_using_vnet_hdr(NetClientState *nc, bool enable) +{ + if (!nc->peer || !nc->peer->info->using_vnet_hdr) { + return; + } + + nc->peer->info->using_vnet_hdr(nc->peer, enable); +} + +void qemu_peer_set_offload(NetClientState *nc, int csum, int tso4, int tso6, + int ecn, int ufo) +{ + if (!nc->peer || !nc->peer->info->set_offload) { + return; + } + + nc->peer->info->set_offload(nc->peer, csum, tso4, tso6, ecn, ufo); +} + +void qemu_peer_set_vnet_hdr_len(NetClientState *nc, int len) +{ + if (!nc->peer || !nc->peer->info->set_vnet_hdr_len) { + return; + } + + nc->peer->info->set_vnet_hdr_len(nc->peer, len); +} + int qemu_can_send_packet(NetClientState *sender) { if (!sender->peer) {