From e96dfd110ee1ad70e7ddbfae01ca95c66f70dac0 Mon Sep 17 00:00:00 2001 From: Vincenzo Maffione Date: Thu, 6 Feb 2014 17:02:15 +0100 Subject: net: change vnet-hdr TAP prototypes The tap_has_vnet_hdr() and tap_has_vnet_hdr_len() functions used to return int, even though they only return true/false values. This patch changes the prototypes to return bool. Signed-off-by: Vincenzo Maffione Signed-off-by: Stefan Hajnoczi --- include/net/tap.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/net/tap.h b/include/net/tap.h index a994f20447..a3490a96ab 100644 --- a/include/net/tap.h +++ b/include/net/tap.h @@ -30,8 +30,8 @@ #include "qapi-types.h" bool tap_has_ufo(NetClientState *nc); -int tap_has_vnet_hdr(NetClientState *nc); -int tap_has_vnet_hdr_len(NetClientState *nc, int len); +bool tap_has_vnet_hdr(NetClientState *nc); +bool tap_has_vnet_hdr_len(NetClientState *nc, int len); void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr); void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo); void tap_set_vnet_hdr_len(NetClientState *nc, int len); -- cgit v1.2.3-55-g7522 From 1f55ac4586bfae81b1e805fb2f0713cb21501ae2 Mon Sep 17 00:00:00 2001 From: Vincenzo Maffione Date: Thu, 6 Feb 2014 17:02:16 +0100 Subject: 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(+) (limited to 'include') 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) { -- cgit v1.2.3-55-g7522 From 3bac80d31af9d38d02e80d1541a1ea8e70067bad Mon Sep 17 00:00:00 2001 From: Vincenzo Maffione Date: Thu, 6 Feb 2014 17:02:19 +0100 Subject: net: make tap offloading callbacks static Since TAP offloadings are manipulated through a new API, it's not necessary to export them in include/net/tap.h anymore. Signed-off-by: Vincenzo Maffione Signed-off-by: Stefan Hajnoczi --- include/net/tap.h | 6 ------ net/tap-win32.c | 12 ++++++------ net/tap.c | 12 ++++++------ 3 files changed, 12 insertions(+), 18 deletions(-) (limited to 'include') diff --git a/include/net/tap.h b/include/net/tap.h index a3490a96ab..6daeb42b0f 100644 --- a/include/net/tap.h +++ b/include/net/tap.h @@ -29,12 +29,6 @@ #include "qemu-common.h" #include "qapi-types.h" -bool tap_has_ufo(NetClientState *nc); -bool tap_has_vnet_hdr(NetClientState *nc); -bool tap_has_vnet_hdr_len(NetClientState *nc, int len); -void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr); -void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo); -void tap_set_vnet_hdr_len(NetClientState *nc, int len); int tap_enable(NetClientState *nc); int tap_disable(NetClientState *nc); diff --git a/net/tap-win32.c b/net/tap-win32.c index 924ca55bd4..8aee611f7d 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -669,12 +669,12 @@ static void tap_win32_send(void *opaque) } } -bool tap_has_ufo(NetClientState *nc) +static bool tap_has_ufo(NetClientState *nc) { return false; } -bool tap_has_vnet_hdr(NetClientState *nc) +static bool tap_has_vnet_hdr(NetClientState *nc) { return false; } @@ -688,11 +688,11 @@ void tap_fd_set_vnet_hdr_len(int fd, int len) { } -void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr) +static void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr) { } -void tap_set_offload(NetClientState *nc, int csum, int tso4, +static void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo) { } @@ -702,12 +702,12 @@ struct vhost_net *tap_get_vhost_net(NetClientState *nc) return NULL; } -bool tap_has_vnet_hdr_len(NetClientState *nc, int len) +static bool tap_has_vnet_hdr_len(NetClientState *nc, int len) { return false; } -void tap_set_vnet_hdr_len(NetClientState *nc, int len) +static void tap_set_vnet_hdr_len(NetClientState *nc, int len) { abort(); } diff --git a/net/tap.c b/net/tap.c index d34ec8802a..2d5099b9be 100644 --- a/net/tap.c +++ b/net/tap.c @@ -210,7 +210,7 @@ static void tap_send(void *opaque) } while (size > 0 && qemu_can_send_packet(&s->nc)); } -bool tap_has_ufo(NetClientState *nc) +static bool tap_has_ufo(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -219,7 +219,7 @@ bool tap_has_ufo(NetClientState *nc) return s->has_ufo; } -bool tap_has_vnet_hdr(NetClientState *nc) +static bool tap_has_vnet_hdr(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -228,7 +228,7 @@ bool tap_has_vnet_hdr(NetClientState *nc) return !!s->host_vnet_hdr_len; } -bool tap_has_vnet_hdr_len(NetClientState *nc, int len) +static bool tap_has_vnet_hdr_len(NetClientState *nc, int len) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -237,7 +237,7 @@ bool tap_has_vnet_hdr_len(NetClientState *nc, int len) return !!tap_probe_vnet_hdr_len(s->fd, len); } -void tap_set_vnet_hdr_len(NetClientState *nc, int len) +static void tap_set_vnet_hdr_len(NetClientState *nc, int len) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -249,7 +249,7 @@ void tap_set_vnet_hdr_len(NetClientState *nc, int len) s->host_vnet_hdr_len = len; } -void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr) +static void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -259,7 +259,7 @@ void tap_using_vnet_hdr(NetClientState *nc, bool using_vnet_hdr) s->using_vnet_hdr = using_vnet_hdr; } -void tap_set_offload(NetClientState *nc, int csum, int tso4, +static void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo) { TAPState *s = DO_UPCAST(TAPState, nc, nc); -- cgit v1.2.3-55-g7522 From d6085e3ace20bc9b0fa625d8d79b22668710e217 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Thu, 20 Feb 2014 12:14:07 +0100 Subject: net: remove implicit peer from offload API The virtio_net offload APIs are used on the NIC's peer (i.e. the tap device). The API was defined to implicitly use nc->peer, saving the caller the trouble. This wasn't ideal because: 1. There are callers who have the peer but not the NIC. Currently they are forced to bypass the API and access peer->info->... directly. 2. The rest of the net.h API uses nc, not nc->peer, so it is inconsistent. This patch pushes nc->peer back up to callers. Signed-off-by: Stefan Hajnoczi --- hw/net/virtio-net.c | 12 ++++++------ hw/net/vmxnet3.c | 18 +++++++++--------- include/net/net.h | 14 +++++++------- net/net.c | 36 ++++++++++++++++++------------------ 4 files changed, 40 insertions(+), 40 deletions(-) (limited to 'include') diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index cda8c7549e..9218a09ffc 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -325,7 +325,7 @@ static void peer_test_vnet_hdr(VirtIONet *n) return; } - n->has_vnet_hdr = qemu_peer_has_vnet_hdr(nc); + n->has_vnet_hdr = qemu_has_vnet_hdr(nc->peer); } static int peer_has_vnet_hdr(VirtIONet *n) @@ -338,7 +338,7 @@ static int peer_has_ufo(VirtIONet *n) if (!peer_has_vnet_hdr(n)) return 0; - n->has_ufo = qemu_peer_has_ufo(qemu_get_queue(n->nic)); + n->has_ufo = qemu_has_ufo(qemu_get_queue(n->nic)->peer); return n->has_ufo; } @@ -357,8 +357,8 @@ static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs) nc = qemu_get_subqueue(n->nic, i); if (peer_has_vnet_hdr(n) && - qemu_peer_has_vnet_hdr_len(nc, n->guest_hdr_len)) { - qemu_peer_set_vnet_hdr_len(nc, n->guest_hdr_len); + qemu_has_vnet_hdr_len(nc->peer, n->guest_hdr_len)) { + qemu_set_vnet_hdr_len(nc->peer, n->guest_hdr_len); n->host_hdr_len = n->guest_hdr_len; } } @@ -459,7 +459,7 @@ static uint32_t virtio_net_bad_features(VirtIODevice *vdev) static void virtio_net_apply_guest_offloads(VirtIONet *n) { - qemu_peer_set_offload(qemu_get_subqueue(n->nic, 0), + qemu_set_offload(qemu_get_subqueue(n->nic, 0)->peer, !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_CSUM)), !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO4)), !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO6)), @@ -1540,7 +1540,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) peer_test_vnet_hdr(n); if (peer_has_vnet_hdr(n)) { for (i = 0; i < n->max_queues; i++) { - qemu_peer_using_vnet_hdr(qemu_get_subqueue(n->nic, i), true); + qemu_using_vnet_hdr(qemu_get_subqueue(n->nic, i)->peer, true); } n->host_hdr_len = sizeof(struct virtio_net_hdr); } else { diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c index 0524684923..5be807ce82 100644 --- a/hw/net/vmxnet3.c +++ b/hw/net/vmxnet3.c @@ -1290,12 +1290,12 @@ static void vmxnet3_update_features(VMXNET3State *s) s->lro_supported, rxcso_supported, s->rx_vlan_stripping); if (s->peer_has_vhdr) { - qemu_peer_set_offload(qemu_get_queue(s->nic), - rxcso_supported, - s->lro_supported, - s->lro_supported, - 0, - 0); + qemu_set_offload(qemu_get_queue(s->nic)->peer, + rxcso_supported, + s->lro_supported, + s->lro_supported, + 0, + 0); } } @@ -1885,7 +1885,7 @@ static bool vmxnet3_peer_has_vnet_hdr(VMXNET3State *s) { NetClientState *nc = qemu_get_queue(s->nic); - if (qemu_peer_has_vnet_hdr(nc)) { + if (qemu_has_vnet_hdr(nc->peer)) { return true; } @@ -1933,10 +1933,10 @@ static void vmxnet3_net_init(VMXNET3State *s) s->lro_supported = false; if (s->peer_has_vhdr) { - qemu_peer_set_vnet_hdr_len(qemu_get_queue(s->nic), + qemu_set_vnet_hdr_len(qemu_get_queue(s->nic)->peer, sizeof(struct virtio_net_hdr)); - qemu_peer_using_vnet_hdr(qemu_get_queue(s->nic), 1); + qemu_using_vnet_hdr(qemu_get_queue(s->nic)->peer, 1); } qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a); diff --git a/include/net/net.h b/include/net/net.h index 7b2539433b..8166345a13 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -132,13 +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); +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); 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 06d690aa4a..e3ef1e4f1d 100644 --- a/net/net.c +++ b/net/net.c @@ -378,59 +378,59 @@ void qemu_foreach_nic(qemu_nic_foreach func, void *opaque) } } -bool qemu_peer_has_ufo(NetClientState *nc) +bool qemu_has_ufo(NetClientState *nc) { - if (!nc->peer || !nc->peer->info->has_ufo) { + if (!nc || !nc->info->has_ufo) { return false; } - return nc->peer->info->has_ufo(nc->peer); + return nc->info->has_ufo(nc); } -bool qemu_peer_has_vnet_hdr(NetClientState *nc) +bool qemu_has_vnet_hdr(NetClientState *nc) { - if (!nc->peer || !nc->peer->info->has_vnet_hdr) { + if (!nc || !nc->info->has_vnet_hdr) { return false; } - return nc->peer->info->has_vnet_hdr(nc->peer); + return nc->info->has_vnet_hdr(nc); } -bool qemu_peer_has_vnet_hdr_len(NetClientState *nc, int len) +bool qemu_has_vnet_hdr_len(NetClientState *nc, int len) { - if (!nc->peer || !nc->peer->info->has_vnet_hdr_len) { + if (!nc || !nc->info->has_vnet_hdr_len) { return false; } - return nc->peer->info->has_vnet_hdr_len(nc->peer, len); + return nc->info->has_vnet_hdr_len(nc, len); } -void qemu_peer_using_vnet_hdr(NetClientState *nc, bool enable) +void qemu_using_vnet_hdr(NetClientState *nc, bool enable) { - if (!nc->peer || !nc->peer->info->using_vnet_hdr) { + if (!nc || !nc->info->using_vnet_hdr) { return; } - nc->peer->info->using_vnet_hdr(nc->peer, enable); + nc->info->using_vnet_hdr(nc, enable); } -void qemu_peer_set_offload(NetClientState *nc, int csum, int tso4, int tso6, +void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo) { - if (!nc->peer || !nc->peer->info->set_offload) { + if (!nc || !nc->info->set_offload) { return; } - nc->peer->info->set_offload(nc->peer, csum, tso4, tso6, ecn, ufo); + nc->info->set_offload(nc, csum, tso4, tso6, ecn, ufo); } -void qemu_peer_set_vnet_hdr_len(NetClientState *nc, int len) +void qemu_set_vnet_hdr_len(NetClientState *nc, int len) { - if (!nc->peer || !nc->peer->info->set_vnet_hdr_len) { + if (!nc || !nc->info->set_vnet_hdr_len) { return; } - nc->peer->info->set_vnet_hdr_len(nc->peer, len); + nc->info->set_vnet_hdr_len(nc, len); } int qemu_can_send_packet(NetClientState *sender) -- cgit v1.2.3-55-g7522