From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W31ll-00066T-T3 for qemu-devel@nongnu.org; Tue, 14 Jan 2014 06:03:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W31lW-0006vU-3t for qemu-devel@nongnu.org; Tue, 14 Jan 2014 06:02:53 -0500 Received: from mail-ee0-x22e.google.com ([2a00:1450:4013:c00::22e]:61288) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W31lV-0006vG-P7 for qemu-devel@nongnu.org; Tue, 14 Jan 2014 06:02:38 -0500 Received: by mail-ee0-f46.google.com with SMTP id c13so49683eek.5 for ; Tue, 14 Jan 2014 03:02:37 -0800 (PST) From: Vincenzo Maffione Date: Tue, 14 Jan 2014 11:59:47 +0100 Message-Id: <1389697190-6198-4-git-send-email-v.maffione@gmail.com> In-Reply-To: <1389697190-6198-1-git-send-email-v.maffione@gmail.com> References: <1389697190-6198-1-git-send-email-v.maffione@gmail.com> Subject: [Qemu-devel] [PATCH v2 3/6] net: extend NetClientInfo for offloading manipulations List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@amazon.com, marcel.a@redhat.com, jasowang@redhat.com, Vincenzo Maffione , lcapitulino@redhat.com, stefanha@redhat.com, dmitry@daynix.com, pbonzini@redhat.com, g.lettieri@iet.unipi.it, rizzo@iet.unipi.it A set of new callbacks has been added to the NetClientInfo struct in order to abstract the operations done by virtio-net and vmxnet3 frontends to manipulate TAP offloadings. The net.h API has been extended with functions that access those abstract operations, providing frontends with a way to manipulate backend offloadings. Signed-off-by: Vincenzo Maffione --- include/net/net.h | 17 +++++++++++++++++ net/net.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/include/net/net.h b/include/net/net.h index 11e1468..29a0698 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -50,6 +50,11 @@ 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 (SetOffload)(NetClientState *, int, int, int, int, int); +typedef void (SetVnetHdrLen)(NetClientState *, int); typedef struct NetClientInfo { NetClientOptionsKind type; @@ -62,6 +67,11 @@ 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; + SetOffload *set_offload; + SetVnetHdrLen *set_vnet_hdr_len; } NetClientInfo; struct NetClientState { @@ -120,6 +130,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 f8db85f..bc90a27 100644 --- a/net/net.c +++ b/net/net.c @@ -381,6 +381,52 @@ 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_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) { -- 1.8.5.2