diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-06-30 16:37:03 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-30 17:12:10 -0400 |
commit | f83ef8c0b58dac17211a4c0b6df0e2b1bd6637b1 (patch) | |
tree | 61661a587df97cb2a9f73b5d0d1cf30f09644051 /net/ipv6/tcp_ipv6.c | |
parent | bcd76111178ebccedd46a9b3eaff65c78e5a70af (diff) |
[IPV6]: Added GSO support for TCPv6
This patch adds GSO support for IPv6 and TCPv6. This is based on a patch
by Ananda Raju <Ananda.Raju@neterion.com>. His original description is:
This patch enables TSO over IPv6. Currently Linux network stacks
restricts TSO over IPv6 by clearing of the NETIF_F_TSO bit from
"dev->features". This patch will remove this restriction.
This patch will introduce a new flag NETIF_F_TSO6 which will be used
to check whether device supports TSO over IPv6. If device support TSO
over IPv6 then we don't clear of NETIF_F_TSO and which will make the
TCP layer to create TSO packets. Any device supporting TSO over IPv6
will set NETIF_F_TSO6 flag in "dev->features" along with NETIF_F_TSO.
In case when user disables TSO using ethtool, NETIF_F_TSO will get
cleared from "dev->features". So even if we have NETIF_F_TSO6 we don't
get TSO packets created by TCP layer.
SKB_GSO_TCPV4 renamed to SKB_GSO_TCP to make it generic GSO packet.
SKB_GSO_UDPV4 renamed to SKB_GSO_UDP as UFO is not a IPv4 feature.
UFO is supported over IPv6 also
The following table shows there is significant improvement in
throughput with normal frames and CPU usage for both normal and jumbo.
--------------------------------------------------
| | 1500 | 9600 |
| ------------------|-------------------|
| | thru CPU | thru CPU |
--------------------------------------------------
| TSO OFF | 2.00 5.5% id | 5.66 20.0% id |
--------------------------------------------------
| TSO ON | 2.63 78.0 id | 5.67 39.0% id |
--------------------------------------------------
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index bf7f8c26c488..7ea5bea49aa9 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -270,9 +270,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
270 | ipv6_addr_copy(&np->saddr, saddr); | 270 | ipv6_addr_copy(&np->saddr, saddr); |
271 | inet->rcv_saddr = LOOPBACK4_IPV6; | 271 | inet->rcv_saddr = LOOPBACK4_IPV6; |
272 | 272 | ||
273 | sk->sk_gso_type = SKB_GSO_TCPV6; | ||
273 | ip6_dst_store(sk, dst, NULL); | 274 | ip6_dst_store(sk, dst, NULL); |
274 | sk->sk_route_caps = dst->dev->features & | ||
275 | ~(NETIF_F_IP_CSUM | NETIF_F_TSO); | ||
276 | 275 | ||
277 | icsk->icsk_ext_hdr_len = 0; | 276 | icsk->icsk_ext_hdr_len = 0; |
278 | if (np->opt) | 277 | if (np->opt) |
@@ -930,9 +929,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
930 | * comment in that function for the gory details. -acme | 929 | * comment in that function for the gory details. -acme |
931 | */ | 930 | */ |
932 | 931 | ||
932 | sk->sk_gso_type = SKB_GSO_TCPV6; | ||
933 | ip6_dst_store(newsk, dst, NULL); | 933 | ip6_dst_store(newsk, dst, NULL); |
934 | newsk->sk_route_caps = dst->dev->features & | ||
935 | ~(NETIF_F_IP_CSUM | NETIF_F_TSO); | ||
936 | 934 | ||
937 | newtcp6sk = (struct tcp6_sock *)newsk; | 935 | newtcp6sk = (struct tcp6_sock *)newsk; |
938 | inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; | 936 | inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; |