diff options
| author | David S. Miller <davem@davemloft.net> | 2016-01-13 00:21:27 -0500 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-01-13 00:21:27 -0500 | 
| commit | ddb5388ffd0ad75d07e7b78181a0b579824ba6f0 (patch) | |
| tree | be1e2bd103c69d7bbace3fffd97bc3d714bbc3d7 /net/ipv6/raw.c | |
| parent | ccdf6ce6a8dba374668ae9b4d763e19903611c38 (diff) | |
| parent | 67990608c8b95d2b8ccc29932376ae73d5818727 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 99140986e887..fa59dd7a427e 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -972,6 +972,11 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,  		return -EFAULT;  	switch (optname) { +	case IPV6_HDRINCL: +		if (sk->sk_type != SOCK_RAW) +			return -EINVAL; +		inet_sk(sk)->hdrincl = !!val; +		return 0;  	case IPV6_CHECKSUM:  		if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 &&  		    level == IPPROTO_IPV6) { @@ -1016,7 +1021,8 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,  			return -EOPNOTSUPP;  		return rawv6_seticmpfilter(sk, level, optname, optval, optlen);  	case SOL_IPV6: -		if (optname == IPV6_CHECKSUM) +		if (optname == IPV6_CHECKSUM || +		    optname == IPV6_HDRINCL)  			break;  	default:  		return ipv6_setsockopt(sk, level, optname, optval, optlen); @@ -1037,7 +1043,8 @@ static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname,  			return -EOPNOTSUPP;  		return rawv6_seticmpfilter(sk, level, optname, optval, optlen);  	case SOL_IPV6: -		if (optname == IPV6_CHECKSUM) +		if (optname == IPV6_CHECKSUM || +		    optname == IPV6_HDRINCL)  			break;  	default:  		return compat_ipv6_setsockopt(sk, level, optname, @@ -1057,6 +1064,9 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,  		return -EFAULT;  	switch (optname) { +	case IPV6_HDRINCL: +		val = inet_sk(sk)->hdrincl; +		break;  	case IPV6_CHECKSUM:  		/*  		 * We allow getsockopt() for IPPROTO_IPV6-level @@ -1094,7 +1104,8 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,  			return -EOPNOTSUPP;  		return rawv6_geticmpfilter(sk, level, optname, optval, optlen);  	case SOL_IPV6: -		if (optname == IPV6_CHECKSUM) +		if (optname == IPV6_CHECKSUM || +		    optname == IPV6_HDRINCL)  			break;  	default:  		return ipv6_getsockopt(sk, level, optname, optval, optlen); @@ -1115,7 +1126,8 @@ static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,  			return -EOPNOTSUPP;  		return rawv6_geticmpfilter(sk, level, optname, optval, optlen);  	case SOL_IPV6: -		if (optname == IPV6_CHECKSUM) +		if (optname == IPV6_CHECKSUM || +		    optname == IPV6_HDRINCL)  			break;  	default:  		return compat_ipv6_getsockopt(sk, level, optname,  | 
