Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/udp_usrreq.c,v retrieving revision 1.146.2.3 retrieving revision 1.147 diff -u -p -r1.146.2.3 -r1.147 --- src/sys/netinet/udp_usrreq.c 2006/09/09 02:58:47 1.146.2.3 +++ src/sys/netinet/udp_usrreq.c 2006/02/23 01:35:19 1.147 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.146.2.3 2006/09/09 02:58:47 rpaulo Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.147 2006/02/23 01:35:19 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.146.2.3 2006/09/09 02:58:47 rpaulo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.147 2006/02/23 01:35:19 christos Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -99,6 +99,7 @@ __KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c #include #include #include +#include #include #include #endif @@ -710,6 +711,7 @@ udp4_realinput(struct sockaddr_in *src, u_int16_t *sport, *dport; int rcvcnt; struct in_addr *src4, *dst4; + struct inpcb_hdr *inph; struct inpcb *inp; struct mbuf *m = *mp; @@ -749,7 +751,8 @@ udp4_realinput(struct sockaddr_in *src, /* * Locate pcb(s) for datagram. */ - CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) { + CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) { + inp = (struct inpcb *)inph; if (inp->inp_af != AF_INET) continue; @@ -839,7 +842,8 @@ udp6_realinput(int af, struct sockaddr_i int rcvcnt; struct in6_addr src6, *dst6; const struct in_addr *dst4; - struct inpcb *inp; + struct inpcb_hdr *inph; + struct in6pcb *in6p; rcvcnt = 0; off += sizeof(struct udphdr); /* now, offset of payload */ @@ -885,33 +889,34 @@ udp6_realinput(int af, struct sockaddr_i /* * Locate pcb(s) for datagram. */ - CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) { - if (inp->inp_af != AF_INET6) + CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) { + in6p = (struct in6pcb *)inph; + if (in6p->in6p_af != AF_INET6) continue; - if (inp->inp_lport != dport) + if (in6p->in6p_lport != dport) continue; - if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr)) { - if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr, + if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) { + if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, dst6)) continue; } else { if (IN6_IS_ADDR_V4MAPPED(dst6) && - (inp->inp_flags & IN6P_IPV6_V6ONLY)) + (in6p->in6p_flags & IN6P_IPV6_V6ONLY)) continue; } - if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { - if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_faddr, - &src6) || inp->inp_fport != sport) + if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) { + if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, + &src6) || in6p->in6p_fport != sport) continue; } else { if (IN6_IS_ADDR_V4MAPPED(&src6) && - (inp->inp_flags & IN6P_IPV6_V6ONLY)) + (in6p->in6p_flags & IN6P_IPV6_V6ONLY)) continue; } udp6_sendup(m, off, (struct sockaddr *)src, - inp->inp_socket); + in6p->in6p_socket); rcvcnt++; /* @@ -922,7 +927,7 @@ udp6_realinput(int af, struct sockaddr_i * port. It assumes that an application will never * clear these options after setting them. */ - if ((inp->inp_socket->so_options & + if ((in6p->in6p_socket->so_options & (SO_REUSEPORT|SO_REUSEADDR)) == 0) break; } @@ -930,16 +935,16 @@ udp6_realinput(int af, struct sockaddr_i /* * Locate pcb for datagram. */ - inp = in6_pcblookup_connect(&udbtable, &src6, sport, dst6, + in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6, dport, 0); - if (inp == 0) { + if (in6p == 0) { ++udpstat.udps_pcbhashmiss; - inp = in6_pcblookup_bind(&udbtable, dst6, dport, 0); - if (inp == 0) + in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0); + if (in6p == 0) return rcvcnt; } - udp6_sendup(m, off, (struct sockaddr *)src, inp->inp_socket); + udp6_sendup(m, off, (struct sockaddr *)src, in6p->in6p_socket); rcvcnt++; } @@ -1174,12 +1179,14 @@ udp_usrreq(struct socket *so, int req, s struct mbuf *control, struct lwp *l) { struct inpcb *inp; + struct proc *p; int s; int error = 0; + p = l ? l->l_proc : NULL; if (req == PRU_CONTROL) return (in_control(so, (long)m, (caddr_t)nam, - (struct ifnet *)control, l)); + (struct ifnet *)control, p)); if (req == PRU_PURGEIF) { in_pcbpurgeif0(&udbtable, (struct ifnet *)control); @@ -1232,7 +1239,7 @@ udp_usrreq(struct socket *so, int req, s break; case PRU_BIND: - error = in_pcbbind(inp, nam, l); + error = in_pcbbind(inp, nam, p); break; case PRU_LISTEN: @@ -1240,7 +1247,7 @@ udp_usrreq(struct socket *so, int req, s break; case PRU_CONNECT: - error = in_pcbconnect(inp, nam, l); + error = in_pcbconnect(inp, nam, p); if (error) break; soisconnected(so); @@ -1282,7 +1289,7 @@ udp_usrreq(struct socket *so, int req, s error = EISCONN; goto die; } - error = in_pcbconnect(inp, nam, l); + error = in_pcbconnect(inp, nam, p); if (error) goto die; } else {