]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet6/udp6_usrreq.c
xnu-517.tar.gz
[apple/xnu.git] / bsd / netinet6 / udp6_usrreq.c
index a6a5951dc2c09fd6642b3d09bc315c3bab01f267..9bab08c72a703405505e7bace1f6a3d476b7e1e6 100644 (file)
@@ -142,9 +142,9 @@ in6_mcmatch(in6p, ia6, ifp)
 }
 
 int
-udp6_input(mp, offp, proto)
+udp6_input(mp, offp)
        struct mbuf **mp;
-       int *offp, proto;
+       int *offp;
 {
        struct mbuf *m = *mp;
        register struct ip6_hdr *ip6;
@@ -547,6 +547,8 @@ udp6_attach(struct socket *so, int proto, struct proc *p)
                return error;
        inp = (struct inpcb *)so->so_pcb;
        inp->inp_vflag |= INP_IPV6;
+       if (ip6_mapped_addr_on)
+               inp->inp_vflag |= INP_IPV4;
        inp->in6p_hops = -1;    /* use kernel default */
        inp->in6p_cksum = -1;   /* just to be sure */
        /*
@@ -635,7 +637,7 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct proc *p)
        error = in6_pcbconnect(inp, nam, p);
        splx(s);
        if (error == 0) {
-               if (ip6_mapped_addr_on) { /* should be non mapped addr */
+               if (ip6_mapped_addr_on || (inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) { /* should be non mapped addr */
                        inp->inp_vflag &= ~INP_IPV4;
                        inp->inp_vflag |= INP_IPV6;
                }
@@ -711,7 +713,7 @@ udp6_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
                }
        }
 
-       if (ip6_mapped_addr_on) {
+       if (ip6_mapped_addr_on || (inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
                int hasv4addr;
                struct sockaddr_in6 *sin6 = 0;