diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 13:43:21 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 13:43:21 -0700 | 
| commit | 06f4e926d256d902dd9a53dcb400fd74974ce087 (patch) | |
| tree | 0b438b67f5f0eff6fd617bc497a9dace6164a488 /net/ipv4/af_inet.c | |
| parent | 8e7bfcbab3825d1b404d615cb1b54f44ff81f981 (diff) | |
| parent | d93515611bbc70c2fe4db232e5feb448ed8e4cc9 (diff) | |
| download | olio-linux-3.10-06f4e926d256d902dd9a53dcb400fd74974ce087.tar.xz olio-linux-3.10-06f4e926d256d902dd9a53dcb400fd74974ce087.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1446 commits)
  macvlan: fix panic if lowerdev in a bond
  tg3: Add braces around 5906 workaround.
  tg3: Fix NETIF_F_LOOPBACK error
  macvlan: remove one synchronize_rcu() call
  networking: NET_CLS_ROUTE4 depends on INET
  irda: Fix error propagation in ircomm_lmp_connect_response()
  irda: Kill set but unused variable 'bytes' in irlan_check_command_param()
  irda: Kill set but unused variable 'clen' in ircomm_connect_indication()
  rxrpc: Fix set but unused variable 'usage' in rxrpc_get_transport()
  be2net: Kill set but unused variable 'req' in lancer_fw_download()
  irda: Kill set but unused vars 'saddr' and 'daddr' in irlan_provider_connect_indication()
  atl1c: atl1c_resume() is only used when CONFIG_PM_SLEEP is defined.
  rxrpc: Fix set but unused variable 'usage' in rxrpc_get_peer().
  rxrpc: Kill set but unused variable 'local' in rxrpc_UDP_error_handler()
  rxrpc: Kill set but unused variable 'sp' in rxrpc_process_connection()
  rxrpc: Kill set but unused variable 'sp' in rxrpc_rotate_tx_window()
  pkt_sched: Kill set but unused variable 'protocol' in tc_classify()
  isdn: capi: Use pr_debug() instead of ifdefs.
  tg3: Update version to 3.119
  tg3: Apply rx_discards fix to 5719/5720
  ...
Fix up trivial conflicts in arch/x86/Kconfig and net/mac80211/agg-tx.c
as per Davem.
Diffstat (limited to 'net/ipv4/af_inet.c')
| -rw-r--r-- | net/ipv4/af_inet.c | 53 | 
1 files changed, 43 insertions, 10 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 807d83c02ef..cc1463156cd 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -105,6 +105,7 @@  #include <net/tcp.h>  #include <net/udp.h>  #include <net/udplite.h> +#include <net/ping.h>  #include <linux/skbuff.h>  #include <net/sock.h>  #include <net/raw.h> @@ -153,7 +154,7 @@ void inet_sock_destruct(struct sock *sk)  	WARN_ON(sk->sk_wmem_queued);  	WARN_ON(sk->sk_forward_alloc); -	kfree(inet->opt); +	kfree(rcu_dereference_protected(inet->inet_opt, 1));  	dst_release(rcu_dereference_check(sk->sk_dst_cache, 1));  	sk_refcnt_debug_dec(sk);  } @@ -1008,6 +1009,14 @@ static struct inet_protosw inetsw_array[] =  		.flags =      INET_PROTOSW_PERMANENT,         }, +       { +		.type =       SOCK_DGRAM, +		.protocol =   IPPROTO_ICMP, +		.prot =       &ping_prot, +		.ops =        &inet_dgram_ops, +		.no_check =   UDP_CSUM_DEFAULT, +		.flags =      INET_PROTOSW_REUSE, +       },         {  	       .type =       SOCK_RAW, @@ -1103,14 +1112,19 @@ static int inet_sk_reselect_saddr(struct sock *sk)  	struct inet_sock *inet = inet_sk(sk);  	__be32 old_saddr = inet->inet_saddr;  	__be32 daddr = inet->inet_daddr; +	struct flowi4 *fl4;  	struct rtable *rt;  	__be32 new_saddr; +	struct ip_options_rcu *inet_opt; -	if (inet->opt && inet->opt->srr) -		daddr = inet->opt->faddr; +	inet_opt = rcu_dereference_protected(inet->inet_opt, +					     sock_owned_by_user(sk)); +	if (inet_opt && inet_opt->opt.srr) +		daddr = inet_opt->opt.faddr;  	/* Query new route. */ -	rt = ip_route_connect(daddr, 0, RT_CONN_FLAGS(sk), +	fl4 = &inet->cork.fl.u.ip4; +	rt = ip_route_connect(fl4, daddr, 0, RT_CONN_FLAGS(sk),  			      sk->sk_bound_dev_if, sk->sk_protocol,  			      inet->inet_sport, inet->inet_dport, sk, false);  	if (IS_ERR(rt)) @@ -1118,7 +1132,7 @@ static int inet_sk_reselect_saddr(struct sock *sk)  	sk_setup_caps(sk, &rt->dst); -	new_saddr = rt->rt_src; +	new_saddr = fl4->saddr;  	if (new_saddr == old_saddr)  		return 0; @@ -1147,6 +1161,8 @@ int inet_sk_rebuild_header(struct sock *sk)  	struct inet_sock *inet = inet_sk(sk);  	struct rtable *rt = (struct rtable *)__sk_dst_check(sk, 0);  	__be32 daddr; +	struct ip_options_rcu *inet_opt; +	struct flowi4 *fl4;  	int err;  	/* Route is OK, nothing to do. */ @@ -1154,10 +1170,14 @@ int inet_sk_rebuild_header(struct sock *sk)  		return 0;  	/* Reroute. */ +	rcu_read_lock(); +	inet_opt = rcu_dereference(inet->inet_opt);  	daddr = inet->inet_daddr; -	if (inet->opt && inet->opt->srr) -		daddr = inet->opt->faddr; -	rt = ip_route_output_ports(sock_net(sk), sk, daddr, inet->inet_saddr, +	if (inet_opt && inet_opt->opt.srr) +		daddr = inet_opt->opt.faddr; +	rcu_read_unlock(); +	fl4 = &inet->cork.fl.u.ip4; +	rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr, inet->inet_saddr,  				   inet->inet_dport, inet->inet_sport,  				   sk->sk_protocol, RT_CONN_FLAGS(sk),  				   sk->sk_bound_dev_if); @@ -1186,7 +1206,7 @@ EXPORT_SYMBOL(inet_sk_rebuild_header);  static int inet_gso_send_check(struct sk_buff *skb)  { -	struct iphdr *iph; +	const struct iphdr *iph;  	const struct net_protocol *ops;  	int proto;  	int ihl; @@ -1293,7 +1313,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,  	const struct net_protocol *ops;  	struct sk_buff **pp = NULL;  	struct sk_buff *p; -	struct iphdr *iph; +	const struct iphdr *iph;  	unsigned int hlen;  	unsigned int off;  	unsigned int id; @@ -1516,6 +1536,7 @@ static const struct net_protocol udp_protocol = {  static const struct net_protocol icmp_protocol = {  	.handler =	icmp_rcv, +	.err_handler =	ping_err,  	.no_policy =	1,  	.netns_ok =	1,  }; @@ -1631,6 +1652,10 @@ static int __init inet_init(void)  	if (rc)  		goto out_unregister_udp_proto; +	rc = proto_register(&ping_prot, 1); +	if (rc) +		goto out_unregister_raw_proto; +  	/*  	 *	Tell SOCKET that we are alive...  	 */ @@ -1686,6 +1711,8 @@ static int __init inet_init(void)  	/* Add UDP-Lite (RFC 3828) */  	udplite4_register(); +	ping_init(); +  	/*  	 *	Set the ICMP layer up  	 */ @@ -1716,6 +1743,8 @@ static int __init inet_init(void)  	rc = 0;  out:  	return rc; +out_unregister_raw_proto: +	proto_unregister(&raw_prot);  out_unregister_udp_proto:  	proto_unregister(&udp_prot);  out_unregister_tcp_proto: @@ -1740,11 +1769,15 @@ static int __init ipv4_proc_init(void)  		goto out_tcp;  	if (udp4_proc_init())  		goto out_udp; +	if (ping_proc_init()) +		goto out_ping;  	if (ip_misc_proc_init())  		goto out_misc;  out:  	return rc;  out_misc: +	ping_proc_exit(); +out_ping:  	udp4_proc_exit();  out_udp:  	tcp4_proc_exit();  |