diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-06-30 16:36:35 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-30 17:12:08 -0400 |
commit | bcd76111178ebccedd46a9b3eaff65c78e5a70af (patch) | |
tree | b0f059f3cb19d425d30cf42b2088aca4cae12a0a /net/ipv4 | |
parent | adcfc7d0b4d7bc3c7edac6fdde9f3ae510bd6054 (diff) |
[NET]: Generalise TSO-specific bits from skb_setup_caps
This patch generalises the TSO-specific bits from sk_setup_caps by adding
the sk_gso_type member to struct sock. This makes sk_setup_caps generic
so that it can be used by TCPv6 or UFO.
The only catch is that whoever uses this must provide a GSO implementation
for their protocol which I think is a fair deal :) For now UFO continues to
live without a GSO implementation which is OK since it doesn't use the sock
caps field at the moment.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/tcp.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 9 |
3 files changed, 6 insertions, 7 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index b7cf26e0e5c2..59e30bab0606 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -643,7 +643,7 @@ static inline int select_size(struct sock *sk, struct tcp_sock *tp) | |||
643 | int tmp = tp->mss_cache; | 643 | int tmp = tp->mss_cache; |
644 | 644 | ||
645 | if (sk->sk_route_caps & NETIF_F_SG) { | 645 | if (sk->sk_route_caps & NETIF_F_SG) { |
646 | if (sk->sk_route_caps & NETIF_F_TSO) | 646 | if (sk_can_gso(sk)) |
647 | tmp = 0; | 647 | tmp = 0; |
648 | else { | 648 | else { |
649 | int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER); | 649 | int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER); |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 4c6ef47eb1c3..38e001076a5f 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -242,6 +242,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
242 | goto failure; | 242 | goto failure; |
243 | 243 | ||
244 | /* OK, now commit destination to socket. */ | 244 | /* OK, now commit destination to socket. */ |
245 | sk->sk_gso_type = SKB_GSO_TCPV4; | ||
245 | sk_setup_caps(sk, &rt->u.dst); | 246 | sk_setup_caps(sk, &rt->u.dst); |
246 | 247 | ||
247 | if (!tp->write_seq) | 248 | if (!tp->write_seq) |
@@ -884,6 +885,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
884 | if (!newsk) | 885 | if (!newsk) |
885 | goto exit; | 886 | goto exit; |
886 | 887 | ||
888 | newsk->sk_gso_type = SKB_GSO_TCPV4; | ||
887 | sk_setup_caps(newsk, dst); | 889 | sk_setup_caps(newsk, dst); |
888 | 890 | ||
889 | newtp = tcp_sk(newsk); | 891 | newtp = tcp_sk(newsk); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 5a7cb4a9c867..5c08ea20a18d 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -510,8 +510,7 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb) | |||
510 | 510 | ||
511 | static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned int mss_now) | 511 | static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned int mss_now) |
512 | { | 512 | { |
513 | if (skb->len <= mss_now || | 513 | if (skb->len <= mss_now || !sk_can_gso(sk)) { |
514 | !(sk->sk_route_caps & NETIF_F_TSO)) { | ||
515 | /* Avoid the costly divide in the normal | 514 | /* Avoid the costly divide in the normal |
516 | * non-TSO case. | 515 | * non-TSO case. |
517 | */ | 516 | */ |
@@ -525,7 +524,7 @@ static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned | |||
525 | factor /= mss_now; | 524 | factor /= mss_now; |
526 | skb_shinfo(skb)->gso_segs = factor; | 525 | skb_shinfo(skb)->gso_segs = factor; |
527 | skb_shinfo(skb)->gso_size = mss_now; | 526 | skb_shinfo(skb)->gso_size = mss_now; |
528 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 527 | skb_shinfo(skb)->gso_type = sk->sk_gso_type; |
529 | } | 528 | } |
530 | } | 529 | } |
531 | 530 | ||
@@ -824,9 +823,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed) | |||
824 | 823 | ||
825 | mss_now = tp->mss_cache; | 824 | mss_now = tp->mss_cache; |
826 | 825 | ||
827 | if (large_allowed && | 826 | if (large_allowed && sk_can_gso(sk) && !tp->urg_mode) |
828 | (sk->sk_route_caps & NETIF_F_TSO) && | ||
829 | !tp->urg_mode) | ||
830 | doing_tso = 1; | 827 | doing_tso = 1; |
831 | 828 | ||
832 | if (dst) { | 829 | if (dst) { |