diff options
Diffstat (limited to 'net/ipv6/ping.c')
| -rw-r--r-- | net/ipv6/ping.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index 18f19df4189..5b7a1ed2aba 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c @@ -31,7 +31,7 @@ struct proto pingv6_prot = {  	.owner =	THIS_MODULE,  	.init =		ping_init_sock,  	.close =	ping_close, -	.connect =	ip6_datagram_connect, +	.connect =	ip6_datagram_connect_v6_only,  	.disconnect =	udp_disconnect,  	.setsockopt =	ipv6_setsockopt,  	.getsockopt =	ipv6_getsockopt, @@ -51,20 +51,19 @@ static struct inet_protosw pingv6_protosw = {  	.protocol =  IPPROTO_ICMPV6,  	.prot =      &pingv6_prot,  	.ops =       &inet6_dgram_ops, -	.no_check =  UDP_CSUM_DEFAULT,  	.flags =     INET_PROTOSW_REUSE,  };  /* Compatibility glue so we can support IPv6 when it's compiled as a module */ -static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) +static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, +				 int *addr_len)  {  	return -EAFNOSUPPORT;  } -static int dummy_ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg, +static void dummy_ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg,  				       struct sk_buff *skb)  { -	return -EAFNOSUPPORT;  }  static int dummy_icmpv6_err_convert(u8 type, u8 code, int *err)  { @@ -102,7 +101,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  		return err;  	if (msg->msg_name) { -		struct sockaddr_in6 *u = (struct sockaddr_in6 *) msg->msg_name; +		DECLARE_SOCKADDR(struct sockaddr_in6 *, u, msg->msg_name);  		if (msg->msg_namelen < sizeof(struct sockaddr_in6) ||  		    u->sin6_family != AF_INET6) {  			return -EINVAL; @@ -116,7 +115,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	} else {  		if (sk->sk_state != TCP_ESTABLISHED)  			return -EDESTADDRREQ; -		daddr = &np->daddr; +		daddr = &sk->sk_v6_daddr;  	}  	if (!iif) @@ -135,6 +134,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	fl6.flowi6_proto = IPPROTO_ICMPV6;  	fl6.saddr = np->saddr;  	fl6.daddr = *daddr; +	fl6.flowi6_mark = sk->sk_mark;  	fl6.fl6_icmp_type = user_icmph.icmp6_type;  	fl6.fl6_icmp_code = user_icmph.icmp6_code;  	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); @@ -144,7 +144,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	else if (!fl6.flowi6_oif)  		fl6.flowi6_oif = np->ucast_oif; -	dst = ip6_sk_dst_lookup_flow(sk, &fl6,  daddr, 1); +	dst = ip6_sk_dst_lookup_flow(sk, &fl6,  daddr);  	if (IS_ERR(dst))  		return PTR_ERR(dst);  	rt = (struct rt6_info *) dst; @@ -167,12 +167,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	pfh.wcheck = 0;  	pfh.family = AF_INET6; -	if (ipv6_addr_is_multicast(&fl6.daddr)) -		hlimit = np->mcast_hops; -	else -		hlimit = np->hop_limit; -	if (hlimit < 0) -		hlimit = ip6_dst_hoplimit(dst); +	hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);  	lock_sock(sk);  	err = ip6_append_data(sk, ping_getfrag, &pfh, len, @@ -181,8 +176,8 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  			      MSG_DONTWAIT, np->dontfrag);  	if (err) { -		ICMP6_INC_STATS_BH(sock_net(sk), rt->rt6i_idev, -				   ICMP6_MIB_OUTERRORS); +		ICMP6_INC_STATS(sock_net(sk), rt->rt6i_idev, +				ICMP6_MIB_OUTERRORS);  		ip6_flush_pending_frames(sk);  	} else {  		err = icmpv6_push_pending_frames(sk, &fl6, @@ -253,7 +248,9 @@ int __init pingv6_init(void)  		return ret;  #endif  	pingv6_ops.ipv6_recv_error = ipv6_recv_error; -	pingv6_ops.ip6_datagram_recv_ctl = ip6_datagram_recv_ctl; +	pingv6_ops.ip6_datagram_recv_common_ctl = ip6_datagram_recv_common_ctl; +	pingv6_ops.ip6_datagram_recv_specific_ctl = +		ip6_datagram_recv_specific_ctl;  	pingv6_ops.icmpv6_err_convert = icmpv6_err_convert;  	pingv6_ops.ipv6_icmp_error = ipv6_icmp_error;  	pingv6_ops.ipv6_chk_addr = ipv6_chk_addr; @@ -266,7 +263,8 @@ int __init pingv6_init(void)  void pingv6_exit(void)  {  	pingv6_ops.ipv6_recv_error = dummy_ipv6_recv_error; -	pingv6_ops.ip6_datagram_recv_ctl = dummy_ip6_datagram_recv_ctl; +	pingv6_ops.ip6_datagram_recv_common_ctl = dummy_ip6_datagram_recv_ctl; +	pingv6_ops.ip6_datagram_recv_specific_ctl = dummy_ip6_datagram_recv_ctl;  	pingv6_ops.icmpv6_err_convert = dummy_icmpv6_err_convert;  	pingv6_ops.ipv6_icmp_error = dummy_ipv6_icmp_error;  	pingv6_ops.ipv6_chk_addr = dummy_ipv6_chk_addr;  | 
