Fix the inheritance of IPv6 level socket options on TCP sockets.
This was broken for IPv6 listening socket, which are not IPV6_ONLY, and the accepted TCP connection was using IPv4. Reviewed by: bz@, rrs@ MFC after: 1 month Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D16792
This commit is contained in:
parent
6b01d4d433
commit
7d4dcc36a8
@ -770,10 +770,9 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
|
||||
goto abort;
|
||||
}
|
||||
#ifdef INET6
|
||||
if (sc->sc_inc.inc_flags & INC_ISIPV6) {
|
||||
if (inp->inp_vflag & INP_IPV6PROTO) {
|
||||
struct inpcb *oinp = sotoinpcb(lso);
|
||||
struct in6_addr laddr6;
|
||||
struct sockaddr_in6 sin6;
|
||||
|
||||
/*
|
||||
* Inherit socket options from the listening socket.
|
||||
* Note that in6p_inputopts are not (and should not be)
|
||||
@ -787,6 +786,11 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
|
||||
if (oinp->in6p_outputopts)
|
||||
inp->in6p_outputopts =
|
||||
ip6_copypktopts(oinp->in6p_outputopts, M_NOWAIT);
|
||||
}
|
||||
|
||||
if (sc->sc_inc.inc_flags & INC_ISIPV6) {
|
||||
struct in6_addr laddr6;
|
||||
struct sockaddr_in6 sin6;
|
||||
|
||||
sin6.sin6_family = AF_INET6;
|
||||
sin6.sin6_len = sizeof(sin6);
|
||||
|
Loading…
Reference in New Issue
Block a user