aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/raw.c
diff options
context:
space:
mode:
authorHannes Frederic Sowa <hannes@stressinduktion.org>2015-12-16 11:22:47 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-17 15:12:28 -0500
commit715f504b118998c41a2079a17e16bf5a8a114885 (patch)
tree5d7953224747992bdc2cf8cf5556a81ac84c0a76 /net/ipv6/raw.c
parent32bc201e1974976b7d3fea9a9b17bb7392ca6394 (diff)
ipv6: add IPV6_HDRINCL option for raw sockets
Same as in Windows, we miss IPV6_HDRINCL for SOL_IPV6 and SOL_RAW. The SOL_IP/IP_HDRINCL is not available for IPv6 sockets. Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/raw.c')
-rw-r--r--net/ipv6/raw.c20
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,
972 return -EFAULT; 972 return -EFAULT;
973 973
974 switch (optname) { 974 switch (optname) {
975 case IPV6_HDRINCL:
976 if (sk->sk_type != SOCK_RAW)
977 return -EINVAL;
978 inet_sk(sk)->hdrincl = !!val;
979 return 0;
975 case IPV6_CHECKSUM: 980 case IPV6_CHECKSUM:
976 if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 && 981 if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 &&
977 level == IPPROTO_IPV6) { 982 level == IPPROTO_IPV6) {
@@ -1016,7 +1021,8 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
1016 return -EOPNOTSUPP; 1021 return -EOPNOTSUPP;
1017 return rawv6_seticmpfilter(sk, level, optname, optval, optlen); 1022 return rawv6_seticmpfilter(sk, level, optname, optval, optlen);
1018 case SOL_IPV6: 1023 case SOL_IPV6:
1019 if (optname == IPV6_CHECKSUM) 1024 if (optname == IPV6_CHECKSUM ||
1025 optname == IPV6_HDRINCL)
1020 break; 1026 break;
1021 default: 1027 default:
1022 return ipv6_setsockopt(sk, level, optname, optval, optlen); 1028 return ipv6_setsockopt(sk, level, optname, optval, optlen);
@@ -1037,7 +1043,8 @@ static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname,
1037 return -EOPNOTSUPP; 1043 return -EOPNOTSUPP;
1038 return rawv6_seticmpfilter(sk, level, optname, optval, optlen); 1044 return rawv6_seticmpfilter(sk, level, optname, optval, optlen);
1039 case SOL_IPV6: 1045 case SOL_IPV6:
1040 if (optname == IPV6_CHECKSUM) 1046 if (optname == IPV6_CHECKSUM ||
1047 optname == IPV6_HDRINCL)
1041 break; 1048 break;
1042 default: 1049 default:
1043 return compat_ipv6_setsockopt(sk, level, optname, 1050 return compat_ipv6_setsockopt(sk, level, optname,
@@ -1057,6 +1064,9 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
1057 return -EFAULT; 1064 return -EFAULT;
1058 1065
1059 switch (optname) { 1066 switch (optname) {
1067 case IPV6_HDRINCL:
1068 val = inet_sk(sk)->hdrincl;
1069 break;
1060 case IPV6_CHECKSUM: 1070 case IPV6_CHECKSUM:
1061 /* 1071 /*
1062 * We allow getsockopt() for IPPROTO_IPV6-level 1072 * We allow getsockopt() for IPPROTO_IPV6-level
@@ -1094,7 +1104,8 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
1094 return -EOPNOTSUPP; 1104 return -EOPNOTSUPP;
1095 return rawv6_geticmpfilter(sk, level, optname, optval, optlen); 1105 return rawv6_geticmpfilter(sk, level, optname, optval, optlen);
1096 case SOL_IPV6: 1106 case SOL_IPV6:
1097 if (optname == IPV6_CHECKSUM) 1107 if (optname == IPV6_CHECKSUM ||
1108 optname == IPV6_HDRINCL)
1098 break; 1109 break;
1099 default: 1110 default:
1100 return ipv6_getsockopt(sk, level, optname, optval, optlen); 1111 return ipv6_getsockopt(sk, level, optname, optval, optlen);
@@ -1115,7 +1126,8 @@ static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,
1115 return -EOPNOTSUPP; 1126 return -EOPNOTSUPP;
1116 return rawv6_geticmpfilter(sk, level, optname, optval, optlen); 1127 return rawv6_geticmpfilter(sk, level, optname, optval, optlen);
1117 case SOL_IPV6: 1128 case SOL_IPV6:
1118 if (optname == IPV6_CHECKSUM) 1129 if (optname == IPV6_CHECKSUM ||
1130 optname == IPV6_HDRINCL)
1119 break; 1131 break;
1120 default: 1132 default:
1121 return compat_ipv6_getsockopt(sk, level, optname, 1133 return compat_ipv6_getsockopt(sk, level, optname,