summaryrefslogtreecommitdiff
path: root/pfinet/linux-src/net/ipv6/ipv6_sockglue.c
diff options
context:
space:
mode:
Diffstat (limited to 'pfinet/linux-src/net/ipv6/ipv6_sockglue.c')
-rw-r--r--pfinet/linux-src/net/ipv6/ipv6_sockglue.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/pfinet/linux-src/net/ipv6/ipv6_sockglue.c b/pfinet/linux-src/net/ipv6/ipv6_sockglue.c
index 6a48d1be..f1f67811 100644
--- a/pfinet/linux-src/net/ipv6/ipv6_sockglue.c
+++ b/pfinet/linux-src/net/ipv6/ipv6_sockglue.c
@@ -146,7 +146,8 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, char *optval,
goto addrform_done;
}
- if (!(ipv6_addr_type(&np->daddr) & IPV6_ADDR_MAPPED)) {
+ if (ipv6_only_sock(sk) ||
+ !(ipv6_addr_type(&np->daddr) & IPV6_ADDR_MAPPED)) {
retv = -EADDRNOTAVAIL;
goto addrform_done;
}
@@ -181,6 +182,15 @@ addrform_done:
}
break;
+ case IPV6_V6ONLY:
+ if (sk->num) {
+ retv = -EINVAL;
+ goto out;
+ }
+ np->ipv6only = valbool;
+ retv = 0;
+ break;
+
case IPV6_PKTINFO:
np->rxopt.bits.rxinfo = valbool;
retv = 0;
@@ -395,6 +405,9 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, char *optval,
if (!val)
return -ENOTCONN;
break;
+ case IPV6_V6ONLY:
+ val = np->ipv6only;
+ break;
default:
return -EINVAL;
}