diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2015-12-16 11:22:47 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-12-17 15:12:28 -0500 |
commit | 715f504b118998c41a2079a17e16bf5a8a114885 (patch) | |
tree | 5d7953224747992bdc2cf8cf5556a81ac84c0a76 /net/ipv6/raw.c | |
parent | 32bc201e1974976b7d3fea9a9b17bb7392ca6394 (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.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, | |||
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, |