diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 145 | 
1 files changed, 69 insertions, 76 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index cc7313b8f7ea..6a79f3081bdb 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -959,57 +959,54 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,  		return -EFAULT;  	switch (optname) { -		case IPV6_CHECKSUM: -			if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 && -			    level == IPPROTO_IPV6) { -				/* -				 * RFC3542 tells that IPV6_CHECKSUM socket -				 * option in the IPPROTO_IPV6 level is not -				 * allowed on ICMPv6 sockets. -				 * If you want to set it, use IPPROTO_RAW -				 * level IPV6_CHECKSUM socket option -				 * (Linux extension). -				 */ -				return -EINVAL; -			} +	case IPV6_CHECKSUM: +		if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 && +		    level == IPPROTO_IPV6) { +			/* +			 * RFC3542 tells that IPV6_CHECKSUM socket +			 * option in the IPPROTO_IPV6 level is not +			 * allowed on ICMPv6 sockets. +			 * If you want to set it, use IPPROTO_RAW +			 * level IPV6_CHECKSUM socket option +			 * (Linux extension). +			 */ +			return -EINVAL; +		} -			/* You may get strange result with a positive odd offset; -			   RFC2292bis agrees with me. */ -			if (val > 0 && (val&1)) -				return -EINVAL; -			if (val < 0) { -				rp->checksum = 0; -			} else { -				rp->checksum = 1; -				rp->offset = val; -			} +		/* You may get strange result with a positive odd offset; +		   RFC2292bis agrees with me. */ +		if (val > 0 && (val&1)) +			return -EINVAL; +		if (val < 0) { +			rp->checksum = 0; +		} else { +			rp->checksum = 1; +			rp->offset = val; +		} -			return 0; -			break; +		return 0; -		default: -			return -ENOPROTOOPT; +	default: +		return -ENOPROTOOPT;  	}  }  static int rawv6_setsockopt(struct sock *sk, int level, int optname,  			  char __user *optval, unsigned int optlen)  { -	switch(level) { -		case SOL_RAW: -			break; +	switch (level) { +	case SOL_RAW: +		break; -		case SOL_ICMPV6: -			if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) -				return -EOPNOTSUPP; -			return rawv6_seticmpfilter(sk, level, optname, optval, -						   optlen); -		case SOL_IPV6: -			if (optname == IPV6_CHECKSUM) -				break; -		default: -			return ipv6_setsockopt(sk, level, optname, optval, -					       optlen); +	case SOL_ICMPV6: +		if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) +			return -EOPNOTSUPP; +		return rawv6_seticmpfilter(sk, level, optname, optval, optlen); +	case SOL_IPV6: +		if (optname == IPV6_CHECKSUM) +			break; +	default: +		return ipv6_setsockopt(sk, level, optname, optval, optlen);  	}  	return do_rawv6_setsockopt(sk, level, optname, optval, optlen); @@ -1075,21 +1072,19 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,  static int rawv6_getsockopt(struct sock *sk, int level, int optname,  			  char __user *optval, int __user *optlen)  { -	switch(level) { -		case SOL_RAW: -			break; +	switch (level) { +	case SOL_RAW: +		break; -		case SOL_ICMPV6: -			if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) -				return -EOPNOTSUPP; -			return rawv6_geticmpfilter(sk, level, optname, optval, -						   optlen); -		case SOL_IPV6: -			if (optname == IPV6_CHECKSUM) -				break; -		default: -			return ipv6_getsockopt(sk, level, optname, optval, -					       optlen); +	case SOL_ICMPV6: +		if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) +			return -EOPNOTSUPP; +		return rawv6_geticmpfilter(sk, level, optname, optval, optlen); +	case SOL_IPV6: +		if (optname == IPV6_CHECKSUM) +			break; +	default: +		return ipv6_getsockopt(sk, level, optname, optval, optlen);  	}  	return do_rawv6_getsockopt(sk, level, optname, optval, optlen); @@ -1119,31 +1114,29 @@ static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,  static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)  { -	switch(cmd) { -		case SIOCOUTQ: -		{ -			int amount = sk_wmem_alloc_get(sk); +	switch (cmd) { +	case SIOCOUTQ: { +		int amount = sk_wmem_alloc_get(sk); -			return put_user(amount, (int __user *)arg); -		} -		case SIOCINQ: -		{ -			struct sk_buff *skb; -			int amount = 0; - -			spin_lock_bh(&sk->sk_receive_queue.lock); -			skb = skb_peek(&sk->sk_receive_queue); -			if (skb != NULL) -				amount = skb->tail - skb->transport_header; -			spin_unlock_bh(&sk->sk_receive_queue.lock); -			return put_user(amount, (int __user *)arg); -		} +		return put_user(amount, (int __user *)arg); +	} +	case SIOCINQ: { +		struct sk_buff *skb; +		int amount = 0; + +		spin_lock_bh(&sk->sk_receive_queue.lock); +		skb = skb_peek(&sk->sk_receive_queue); +		if (skb != NULL) +			amount = skb->tail - skb->transport_header; +		spin_unlock_bh(&sk->sk_receive_queue.lock); +		return put_user(amount, (int __user *)arg); +	} -		default: +	default:  #ifdef CONFIG_IPV6_MROUTE -			return ip6mr_ioctl(sk, cmd, (void __user *)arg); +		return ip6mr_ioctl(sk, cmd, (void __user *)arg);  #else -			return -ENOIOCTLCMD; +		return -ENOIOCTLCMD;  #endif  	}  }  |