diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-08-15 18:15:17 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-08-15 18:15:17 +0200 | 
| commit | f3efbe582b5396d134024c03a5fa253f2a85d9a6 (patch) | |
| tree | e4e15b7567b82d24cb1e7327398286a2b88df04c /net/ipv6/tcp_ipv6.c | |
| parent | 05d3ed0a1fe3ea05ab9f3b8d32576a0bc2e19660 (diff) | |
| parent | b635acec48bcaa9183fcbf4e3955616b0d4119b5 (diff) | |
Merge branch 'linus' into x86/gart
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 43 | 
1 files changed, 17 insertions, 26 deletions
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index ae45f9835014..5b90b369ccb2 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -69,7 +69,8 @@  #include <linux/scatterlist.h>  static void	tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb); -static void	tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req); +static void	tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb, +				      struct request_sock *req);  static int	tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); @@ -421,7 +422,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  		/* ICMPs are not backlogged, hence we cannot get  		 * an established socket here.  		 */ -		BUG_TRAP(req->sk == NULL); +		WARN_ON(req->sk != NULL);  		if (seq != tcp_rsk(req)->snt_isn) {  			NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS); @@ -748,7 +749,7 @@ static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,  	ipv6_addr_copy(&bp->saddr, saddr);  	ipv6_addr_copy(&bp->daddr, daddr);  	bp->protocol = cpu_to_be32(IPPROTO_TCP); -	bp->len = cpu_to_be16(nbytes); +	bp->len = cpu_to_be32(nbytes);  	sg_init_one(&sg, bp, sizeof(*bp));  	return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp)); @@ -849,28 +850,17 @@ static int tcp_v6_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)  	hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);  	hash_location = tcp_parse_md5sig_option(th); -	/* do we have a hash as expected? */ -	if (!hash_expected) { -		if (!hash_location) -			return 0; -		if (net_ratelimit()) { -			printk(KERN_INFO "MD5 Hash NOT expected but found " -			       "(" NIP6_FMT ", %u)->" -			       "(" NIP6_FMT ", %u)\n", -			       NIP6(ip6h->saddr), ntohs(th->source), -			       NIP6(ip6h->daddr), ntohs(th->dest)); -		} +	/* We've parsed the options - do we have a hash? */ +	if (!hash_expected && !hash_location) +		return 0; + +	if (hash_expected && !hash_location) { +		NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);  		return 1;  	} -	if (!hash_location) { -		if (net_ratelimit()) { -			printk(KERN_INFO "MD5 Hash expected but NOT found " -			       "(" NIP6_FMT ", %u)->" -			       "(" NIP6_FMT ", %u)\n", -			       NIP6(ip6h->saddr), ntohs(th->source), -			       NIP6(ip6h->daddr), ntohs(th->dest)); -		} +	if (!hash_expected && hash_location) { +		NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);  		return 1;  	} @@ -1105,8 +1095,8 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32  		*topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |  				(TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);  		tcp_v6_md5_hash_hdr((__u8 *)topt, key, -				    &ipv6_hdr(skb)->daddr, -				    &ipv6_hdr(skb)->saddr, t1); +				    &ipv6_hdr(skb)->saddr, +				    &ipv6_hdr(skb)->daddr, t1);  	}  #endif @@ -1149,10 +1139,11 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)  	inet_twsk_put(tw);  } -static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req) +static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb, +				  struct request_sock *req)  {  	tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent, -			tcp_v6_md5_do_lookup(skb->sk, &ipv6_hdr(skb)->daddr)); +			tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr));  } | 
