diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 26 | 
1 files changed, 12 insertions, 14 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index cb381f5aa464..4b5db5d1edc2 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -203,8 +203,9 @@ static void raw_err(struct sock *sk, struct sk_buff *skb, u32 info)  	struct inet_sock *inet = inet_sk(sk);  	const int type = icmp_hdr(skb)->type;  	const int code = icmp_hdr(skb)->code; -	int err = 0;  	int harderr = 0; +	bool recverr; +	int err = 0;  	if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)  		ipv4_sk_update_pmtu(skb, sk, info); @@ -218,7 +219,8 @@ static void raw_err(struct sock *sk, struct sk_buff *skb, u32 info)  	   2. Socket is connected (otherwise the error indication  	      is useless without ip_recverr and error is hard.  	 */ -	if (!inet->recverr && sk->sk_state != TCP_ESTABLISHED) +	recverr = inet_test_bit(RECVERR, sk); +	if (!recverr && sk->sk_state != TCP_ESTABLISHED)  		return;  	switch (type) { @@ -245,16 +247,16 @@ static void raw_err(struct sock *sk, struct sk_buff *skb, u32 info)  		}  	} -	if (inet->recverr) { +	if (recverr) {  		const struct iphdr *iph = (const struct iphdr *)skb->data;  		u8 *payload = skb->data + (iph->ihl << 2); -		if (inet->hdrincl) +		if (inet_test_bit(HDRINCL, sk))  			payload = skb->data;  		ip_icmp_error(sk, skb, err, 0, info, payload);  	} -	if (inet->recverr || harderr) { +	if (recverr || harderr) {  		sk->sk_err = err;  		sk_error_report(sk);  	} @@ -413,7 +415,7 @@ error_free:  	kfree_skb(skb);  error:  	IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS); -	if (err == -ENOBUFS && !inet->recverr) +	if (err == -ENOBUFS && !inet_test_bit(RECVERR, sk))  		err = 0;  	return err;  } @@ -489,12 +491,8 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  	if (len > 0xFFFF)  		goto out; -	/* hdrincl should be READ_ONCE(inet->hdrincl) -	 * but READ_ONCE() doesn't work with bit fields. -	 * Doing this indirectly yields the same result. -	 */ -	hdrincl = inet->hdrincl; -	hdrincl = READ_ONCE(hdrincl); +	hdrincl = inet_test_bit(HDRINCL, sk); +  	/*  	 *	Check the flags.  	 */ @@ -645,7 +643,7 @@ back_from_confirm:  			ip_flush_pending_frames(sk);  		else if (!(msg->msg_flags & MSG_MORE)) {  			err = ip_push_pending_frames(sk, &fl4); -			if (err == -ENOBUFS && !inet->recverr) +			if (err == -ENOBUFS && !inet_test_bit(RECVERR, sk))  				err = 0;  		}  		release_sock(sk); @@ -767,7 +765,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,  		memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));  		*addr_len = sizeof(*sin);  	} -	if (inet->cmsg_flags) +	if (inet_cmsg_flags(inet))  		ip_cmsg_recv(msg, skb);  	if (flags & MSG_TRUNC)  		copied = skb->len;  | 
