diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 43 | 
1 files changed, 21 insertions, 22 deletions
| diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 3c23e70885f4..202cf09c4cd4 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -519,26 +519,31 @@ out:  	sock_put(sk);  } -/* This routine computes an IPv4 TCP checksum. */ -void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) +static void __tcp_v4_send_check(struct sk_buff *skb, +				__be32 saddr, __be32 daddr)  { -	struct inet_sock *inet = inet_sk(sk);  	struct tcphdr *th = tcp_hdr(skb);  	if (skb->ip_summed == CHECKSUM_PARTIAL) { -		th->check = ~tcp_v4_check(len, inet->inet_saddr, -					  inet->inet_daddr, 0); +		th->check = ~tcp_v4_check(skb->len, saddr, daddr, 0);  		skb->csum_start = skb_transport_header(skb) - skb->head;  		skb->csum_offset = offsetof(struct tcphdr, check);  	} else { -		th->check = tcp_v4_check(len, inet->inet_saddr, -					 inet->inet_daddr, +		th->check = tcp_v4_check(skb->len, saddr, daddr,  					 csum_partial(th,  						      th->doff << 2,  						      skb->csum));  	}  } +/* This routine computes an IPv4 TCP checksum. */ +void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb) +{ +	struct inet_sock *inet = inet_sk(sk); + +	__tcp_v4_send_check(skb, inet->inet_saddr, inet->inet_daddr); +} +  int tcp_v4_gso_send_check(struct sk_buff *skb)  {  	const struct iphdr *iph; @@ -551,10 +556,8 @@ int tcp_v4_gso_send_check(struct sk_buff *skb)  	th = tcp_hdr(skb);  	th->check = 0; -	th->check = ~tcp_v4_check(skb->len, iph->saddr, iph->daddr, 0); -	skb->csum_start = skb_transport_header(skb) - skb->head; -	skb->csum_offset = offsetof(struct tcphdr, check);  	skb->ip_summed = CHECKSUM_PARTIAL; +	__tcp_v4_send_check(skb, iph->saddr, iph->daddr);  	return 0;  } @@ -763,13 +766,7 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,  	skb = tcp_make_synack(sk, dst, req, rvp);  	if (skb) { -		struct tcphdr *th = tcp_hdr(skb); - -		th->check = tcp_v4_check(skb->len, -					 ireq->loc_addr, -					 ireq->rmt_addr, -					 csum_partial(th, skb->len, -						      skb->csum)); +		__tcp_v4_send_check(skb, ireq->loc_addr, ireq->rmt_addr);  		err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr,  					    ireq->rmt_addr, @@ -894,7 +891,7 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,  				kfree(newkey);  				return -ENOMEM;  			} -			sk->sk_route_caps &= ~NETIF_F_GSO_MASK; +			sk_nocaps_add(sk, NETIF_F_GSO_MASK);  		}  		if (tcp_alloc_md5sig_pool(sk) == NULL) {  			kfree(newkey); @@ -1024,7 +1021,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,  			return -EINVAL;  		tp->md5sig_info = p; -		sk->sk_route_caps &= ~NETIF_F_GSO_MASK; +		sk_nocaps_add(sk, NETIF_F_GSO_MASK);  	}  	newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, sk->sk_allocation); @@ -1289,8 +1286,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)  			goto drop_and_release;  		/* Secret recipe starts with IP addresses */ -		*mess++ ^= daddr; -		*mess++ ^= saddr; +		*mess++ ^= (__force u32)daddr; +		*mess++ ^= (__force u32)saddr;  		/* plus variable length Initiator Cookie */  		c = (u8 *)mess; @@ -1465,7 +1462,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,  		if (newkey != NULL)  			tcp_v4_md5_do_add(newsk, newinet->inet_daddr,  					  newkey, key->keylen); -		newsk->sk_route_caps &= ~NETIF_F_GSO_MASK; +		sk_nocaps_add(newsk, NETIF_F_GSO_MASK);  	}  #endif @@ -1675,6 +1672,8 @@ process:  	skb->dev = NULL; +	sock_rps_save_rxhash(sk, skb->rxhash); +  	bh_lock_sock_nested(sk);  	ret = 0;  	if (!sock_owned_by_user(sk)) { | 
