diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 26 | 
1 files changed, 14 insertions, 12 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index a86c7ae7188..2c65160565e 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -218,8 +218,10 @@ static void raw_err(struct sock *sk, struct sk_buff *skb, u32 info)  	if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)  		ipv4_sk_update_pmtu(skb, sk, info); -	else if (type == ICMP_REDIRECT) +	else if (type == ICMP_REDIRECT) {  		ipv4_sk_redirect(skb, sk); +		return; +	}  	/* Report error on raw socket, if:  	   1. User requested ip_recverr. @@ -297,7 +299,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)  {  	/* Charge it to the socket. */ -	ipv4_pktinfo_prepare(skb); +	ipv4_pktinfo_prepare(sk, skb);  	if (sock_queue_rcv_skb(sk, skb) < 0) {  		kfree_skb(skb);  		return NET_RX_DROP; @@ -387,7 +389,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,  		iph->check   = 0;  		iph->tot_len = htons(length);  		if (!iph->id) -			ip_select_ident(iph, &rt->dst, NULL); +			ip_select_ident(skb, NULL);  		iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);  	} @@ -491,7 +493,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	 */  	if (msg->msg_namelen) { -		struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name; +		DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);  		err = -EINVAL;  		if (msg->msg_namelen < sizeof(*usin))  			goto out; @@ -517,10 +519,12 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	ipc.addr = inet->inet_saddr;  	ipc.opt = NULL;  	ipc.tx_flags = 0; +	ipc.ttl = 0; +	ipc.tos = -1;  	ipc.oif = sk->sk_bound_dev_if;  	if (msg->msg_controllen) { -		err = ip_cmsg_send(sock_net(sk), msg, &ipc); +		err = ip_cmsg_send(sock_net(sk), msg, &ipc, false);  		if (err)  			goto out;  		if (ipc.opt) @@ -556,7 +560,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  			daddr = ipc.opt->opt.faddr;  		}  	} -	tos = RT_CONN_FLAGS(sk); +	tos = get_rtconn_flags(&ipc, sk);  	if (msg->msg_flags & MSG_DONTROUTE)  		tos |= RTO_ONLINK; @@ -571,7 +575,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos,  			   RT_SCOPE_UNIVERSE,  			   inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol, -			   inet_sk_flowi_flags(sk) | FLOWI_FLAG_CAN_SLEEP | +			   inet_sk_flowi_flags(sk) |  			    (inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),  			   daddr, saddr, 0, 0); @@ -686,17 +690,14 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	struct inet_sock *inet = inet_sk(sk);  	size_t copied = 0;  	int err = -EOPNOTSUPP; -	struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);  	struct sk_buff *skb;  	if (flags & MSG_OOB)  		goto out; -	if (addr_len) -		*addr_len = sizeof(*sin); -  	if (flags & MSG_ERRQUEUE) { -		err = ip_recv_error(sk, msg, len); +		err = ip_recv_error(sk, msg, len, addr_len);  		goto out;  	} @@ -722,6 +723,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;  		sin->sin_port = 0;  		memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); +		*addr_len = sizeof(*sin);  	}  	if (inet->cmsg_flags)  		ip_cmsg_recv(msg, skb);  | 
