Commit f8d1f5ed authored by David S. Miller's avatar David S. Miller

[TCP]: When socket route changes, do not forget to update ext2_header_len and sk_route_caps.

Based upon a patch from Herbert Xu (herbert@gondor.apana.org.au).
parent 4c26d765
...@@ -1884,6 +1884,7 @@ static int tcp_v4_reselect_saddr(struct sock *sk) ...@@ -1884,6 +1884,7 @@ static int tcp_v4_reselect_saddr(struct sock *sk)
__sk_dst_set(sk, &rt->u.dst); __sk_dst_set(sk, &rt->u.dst);
tcp_v4_setup_caps(sk, &rt->u.dst); tcp_v4_setup_caps(sk, &rt->u.dst);
tcp_sk(sk)->ext2_header_len = rt->u.dst.header_len;
new_saddr = rt->rt_src; new_saddr = rt->rt_src;
...@@ -1943,6 +1944,7 @@ int tcp_v4_rebuild_header(struct sock *sk) ...@@ -1943,6 +1944,7 @@ int tcp_v4_rebuild_header(struct sock *sk)
if (!err) { if (!err) {
__sk_dst_set(sk, &rt->u.dst); __sk_dst_set(sk, &rt->u.dst);
tcp_v4_setup_caps(sk, &rt->u.dst); tcp_v4_setup_caps(sk, &rt->u.dst);
tcp_sk(sk)->ext2_header_len = rt->u.dst.header_len;
return 0; return 0;
} }
......
...@@ -686,7 +686,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, ...@@ -686,7 +686,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
ip6_dst_store(sk, dst, NULL); ip6_dst_store(sk, dst, NULL);
sk->sk_route_caps = dst->dev->features & sk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO); ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
tp->ext_header_len = 0; tp->ext_header_len = 0;
if (np->opt) if (np->opt)
...@@ -1347,8 +1347,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, ...@@ -1347,8 +1347,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
#endif #endif
ip6_dst_store(newsk, dst, NULL); ip6_dst_store(newsk, dst, NULL);
sk->sk_route_caps = dst->dev->features & newsk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO); ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
newtcp6sk = (struct tcp6_sock *)newsk; newtcp6sk = (struct tcp6_sock *)newsk;
newtcp6sk->pinet6 = &newtcp6sk->inet6; newtcp6sk->pinet6 = &newtcp6sk->inet6;
...@@ -1741,7 +1741,8 @@ static int tcp_v6_rebuild_header(struct sock *sk) ...@@ -1741,7 +1741,8 @@ static int tcp_v6_rebuild_header(struct sock *sk)
ip6_dst_store(sk, dst, NULL); ip6_dst_store(sk, dst, NULL);
sk->sk_route_caps = dst->dev->features & sk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO); ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
tcp_sk(sk)->ext2_header_len = dst->header_len;
} }
return 0; return 0;
...@@ -1782,6 +1783,9 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok) ...@@ -1782,6 +1783,9 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
} }
ip6_dst_store(sk, dst, NULL); ip6_dst_store(sk, dst, NULL);
sk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO);
tcp_sk(sk)->ext2_header_len = dst->header_len;
} }
skb->dst = dst_clone(dst); skb->dst = dst_clone(dst);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment