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; |
