Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet6/udp6_usrreq.c
Show First 20 Lines • Show All 1,113 Lines • ▼ Show 20 Lines | |||||
#ifdef INET | #ifdef INET | ||||
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { | if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { | ||||
struct sockaddr_in sin; | struct sockaddr_in sin; | ||||
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0) { | if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0) { | ||||
error = EINVAL; | error = EINVAL; | ||||
goto out; | goto out; | ||||
} | } | ||||
if ((inp->inp_vflag & INP_IPV4) == 0) { | |||||
error = EAFNOSUPPORT; | |||||
goto out; | |||||
} | |||||
if (inp->inp_faddr.s_addr != INADDR_ANY) { | if (inp->inp_faddr.s_addr != INADDR_ANY) { | ||||
error = EISCONN; | error = EISCONN; | ||||
goto out; | goto out; | ||||
} | } | ||||
in6_sin6_2_sin(&sin, sin6); | in6_sin6_2_sin(&sin, sin6); | ||||
inp->inp_vflag |= INP_IPV4; | inp->inp_vflag |= INP_IPV4; | ||||
inp->inp_vflag &= ~INP_IPV6; | inp->inp_vflag &= ~INP_IPV6; | ||||
error = prison_remote_ip4(td->td_ucred, &sin.sin_addr); | error = prison_remote_ip4(td->td_ucred, &sin.sin_addr); | ||||
if (error != 0) | if (error != 0) | ||||
goto out; | goto out; | ||||
INP_HASH_WLOCK(pcbinfo); | INP_HASH_WLOCK(pcbinfo); | ||||
error = in_pcbconnect(inp, (struct sockaddr *)&sin, | error = in_pcbconnect(inp, (struct sockaddr *)&sin, | ||||
td->td_ucred); | td->td_ucred); | ||||
INP_HASH_WUNLOCK(pcbinfo); | INP_HASH_WUNLOCK(pcbinfo); | ||||
if (error == 0) | if (error == 0) | ||||
soisconnected(so); | soisconnected(so); | ||||
goto out; | goto out; | ||||
} else { | |||||
if ((inp->inp_vflag & INP_IPV6) == 0) { | |||||
error = EAFNOSUPPORT; | |||||
goto out; | |||||
} | |||||
} | } | ||||
#endif | #endif | ||||
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { | if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { | ||||
error = EISCONN; | error = EISCONN; | ||||
goto out; | goto out; | ||||
} | } | ||||
inp->inp_vflag &= ~INP_IPV4; | inp->inp_vflag &= ~INP_IPV4; | ||||
inp->inp_vflag |= INP_IPV6; | inp->inp_vflag |= INP_IPV6; | ||||
▲ Show 20 Lines • Show All 169 Lines • Show Last 20 Lines |