diff options
Diffstat (limited to 'pfinet/linux-src/net/ipv6/ipv6_sockglue.c')
-rw-r--r-- | pfinet/linux-src/net/ipv6/ipv6_sockglue.c | 15 |
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; } |