From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58037) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrRYC-0003Fj-1t for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:09:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VrRY3-00049B-KP for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:08:59 -0500 Received: from mail-ee0-x22b.google.com ([2a00:1450:4013:c00::22b]:43137) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrRY3-00048x-9c for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:08:51 -0500 Received: by mail-ee0-f43.google.com with SMTP id c13so815848eek.16 for ; Fri, 13 Dec 2013 04:08:50 -0800 (PST) From: Vincenzo Maffione Date: Fri, 13 Dec 2013 13:04:59 +0100 Message-Id: <1386936303-7697-2-git-send-email-v.maffione@gmail.com> In-Reply-To: <1386936303-7697-1-git-send-email-v.maffione@gmail.com> References: <1386936303-7697-1-git-send-email-v.maffione@gmail.com> Subject: [Qemu-devel] [PATCH 1/5] 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 | 19 +++++++++++++++++++ net/net.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/include/net/net.h b/include/net/net.h index 11e1468..f5b5bae 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 int (HasVnetHdr)(NetClientState *); +typedef int (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); +int qemu_peer_has_vnet_hdr(NetClientState *nc); +int 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 9db88cc..96f05d9 100644 --- a/net/net.c +++ b/net/net.c @@ -381,6 +381,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); +} + +int 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); +} + +int 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) { -- 1.8.5.1