[BACK]Return to udp_usrreq.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/netinet/udp_usrreq.c between version 1.146.2.3 and 1.147

version 1.146.2.3, 2006/09/09 02:58:47 version 1.147, 2006/02/23 01:35:19
Line 99  __KERNEL_RCSID(0, "$NetBSD$");
Line 99  __KERNEL_RCSID(0, "$NetBSD$");
 #include <netinet/ip6.h>  #include <netinet/ip6.h>
 #include <netinet/icmp6.h>  #include <netinet/icmp6.h>
 #include <netinet6/ip6_var.h>  #include <netinet6/ip6_var.h>
   #include <netinet6/in6_pcb.h>
 #include <netinet6/udp6_var.h>  #include <netinet6/udp6_var.h>
 #include <netinet6/scope6_var.h>  #include <netinet6/scope6_var.h>
 #endif  #endif
Line 710  udp4_realinput(struct sockaddr_in *src, 
Line 711  udp4_realinput(struct sockaddr_in *src, 
         u_int16_t *sport, *dport;          u_int16_t *sport, *dport;
         int rcvcnt;          int rcvcnt;
         struct in_addr *src4, *dst4;          struct in_addr *src4, *dst4;
           struct inpcb_hdr *inph;
         struct inpcb *inp;          struct inpcb *inp;
         struct mbuf *m = *mp;          struct mbuf *m = *mp;
   
Line 749  udp4_realinput(struct sockaddr_in *src, 
Line 751  udp4_realinput(struct sockaddr_in *src, 
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * 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)                          if (inp->inp_af != AF_INET)
                                 continue;                                  continue;
   
Line 839  udp6_realinput(int af, struct sockaddr_i
Line 842  udp6_realinput(int af, struct sockaddr_i
         int rcvcnt;          int rcvcnt;
         struct in6_addr src6, *dst6;          struct in6_addr src6, *dst6;
         const struct in_addr *dst4;          const struct in_addr *dst4;
         struct inpcb *inp;          struct inpcb_hdr *inph;
           struct in6pcb *in6p;
   
         rcvcnt = 0;          rcvcnt = 0;
         off += sizeof(struct udphdr);   /* now, offset of payload */          off += sizeof(struct udphdr);   /* now, offset of payload */
Line 885  udp6_realinput(int af, struct sockaddr_i
Line 889  udp6_realinput(int af, struct sockaddr_i
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * Locate pcb(s) for datagram.
                  */                   */
                 CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {                  CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {
                         if (inp->inp_af != AF_INET6)                          in6p = (struct in6pcb *)inph;
                           if (in6p->in6p_af != AF_INET6)
                                 continue;                                  continue;
   
                         if (inp->inp_lport != dport)                          if (in6p->in6p_lport != dport)
                                 continue;                                  continue;
                         if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
                                 if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr,                                  if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr,
                                     dst6))                                      dst6))
                                         continue;                                          continue;
                         } else {                          } else {
                                 if (IN6_IS_ADDR_V4MAPPED(dst6) &&                                  if (IN6_IS_ADDR_V4MAPPED(dst6) &&
                                     (inp->inp_flags & IN6P_IPV6_V6ONLY))                                      (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
                                         continue;                                          continue;
                         }                          }
                         if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
                                 if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_faddr,                                  if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr,
                                     &src6) || inp->inp_fport != sport)                                      &src6) || in6p->in6p_fport != sport)
                                         continue;                                          continue;
                         } else {                          } else {
                                 if (IN6_IS_ADDR_V4MAPPED(&src6) &&                                  if (IN6_IS_ADDR_V4MAPPED(&src6) &&
                                     (inp->inp_flags & IN6P_IPV6_V6ONLY))                                      (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
                                         continue;                                          continue;
                         }                          }
   
                         udp6_sendup(m, off, (struct sockaddr *)src,                          udp6_sendup(m, off, (struct sockaddr *)src,
                                 inp->inp_socket);                                  in6p->in6p_socket);
                         rcvcnt++;                          rcvcnt++;
   
                         /*                          /*
Line 922  udp6_realinput(int af, struct sockaddr_i
Line 927  udp6_realinput(int af, struct sockaddr_i
                          * port.  It assumes that an application will never                           * port.  It assumes that an application will never
                          * clear these options after setting them.                           * clear these options after setting them.
                          */                           */
                         if ((inp->inp_socket->so_options &                          if ((in6p->in6p_socket->so_options &
                             (SO_REUSEPORT|SO_REUSEADDR)) == 0)                              (SO_REUSEPORT|SO_REUSEADDR)) == 0)
                                 break;                                  break;
                 }                  }
Line 930  udp6_realinput(int af, struct sockaddr_i
Line 935  udp6_realinput(int af, struct sockaddr_i
                 /*                  /*
                  * Locate pcb for datagram.                   * Locate pcb for datagram.
                  */                   */
                 inp = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,                  in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,
                     dport, 0);                      dport, 0);
                 if (inp == 0) {                  if (in6p == 0) {
                         ++udpstat.udps_pcbhashmiss;                          ++udpstat.udps_pcbhashmiss;
                         inp = in6_pcblookup_bind(&udbtable, dst6, dport, 0);                          in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0);
                         if (inp == 0)                          if (in6p == 0)
                                 return rcvcnt;                                  return rcvcnt;
                 }                  }
   
                 udp6_sendup(m, off, (struct sockaddr *)src, inp->inp_socket);                  udp6_sendup(m, off, (struct sockaddr *)src, in6p->in6p_socket);
                 rcvcnt++;                  rcvcnt++;
         }          }
   
Line 1174  udp_usrreq(struct socket *so, int req, s
Line 1179  udp_usrreq(struct socket *so, int req, s
         struct mbuf *control, struct lwp *l)          struct mbuf *control, struct lwp *l)
 {  {
         struct inpcb *inp;          struct inpcb *inp;
           struct proc *p;
         int s;          int s;
         int error = 0;          int error = 0;
   
           p = l ? l->l_proc : NULL;
         if (req == PRU_CONTROL)          if (req == PRU_CONTROL)
                 return (in_control(so, (long)m, (caddr_t)nam,                  return (in_control(so, (long)m, (caddr_t)nam,
                     (struct ifnet *)control, l));                      (struct ifnet *)control, p));
   
         if (req == PRU_PURGEIF) {          if (req == PRU_PURGEIF) {
                 in_pcbpurgeif0(&udbtable, (struct ifnet *)control);                  in_pcbpurgeif0(&udbtable, (struct ifnet *)control);
Line 1232  udp_usrreq(struct socket *so, int req, s
Line 1239  udp_usrreq(struct socket *so, int req, s
                 break;                  break;
   
         case PRU_BIND:          case PRU_BIND:
                 error = in_pcbbind(inp, nam, l);                  error = in_pcbbind(inp, nam, p);
                 break;                  break;
   
         case PRU_LISTEN:          case PRU_LISTEN:
Line 1240  udp_usrreq(struct socket *so, int req, s
Line 1247  udp_usrreq(struct socket *so, int req, s
                 break;                  break;
   
         case PRU_CONNECT:          case PRU_CONNECT:
                 error = in_pcbconnect(inp, nam, l);                  error = in_pcbconnect(inp, nam, p);
                 if (error)                  if (error)
                         break;                          break;
                 soisconnected(so);                  soisconnected(so);
Line 1282  udp_usrreq(struct socket *so, int req, s
Line 1289  udp_usrreq(struct socket *so, int req, s
                                 error = EISCONN;                                  error = EISCONN;
                                 goto die;                                  goto die;
                         }                          }
                         error = in_pcbconnect(inp, nam, l);                          error = in_pcbconnect(inp, nam, p);
                         if (error)                          if (error)
                                 goto die;                                  goto die;
                 } else {                  } else {

Legend:
Removed from v.1.146.2.3  
changed lines
  Added in v.1.147

CVSweb <webmaster@jp.NetBSD.org>