[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.103.2.11 and 1.146.2.3

version 1.103.2.11, 2005/12/11 10:29:25 version 1.146.2.3, 2006/09/09 02:58:47
Line 95  __KERNEL_RCSID(0, "$NetBSD$");
Line 95  __KERNEL_RCSID(0, "$NetBSD$");
 #include <netinet/udp.h>  #include <netinet/udp.h>
 #include <netinet/udp_var.h>  #include <netinet/udp_var.h>
   
 #ifdef IPSEC_NAT_T  
 #include <netinet6/ipsec.h>  
 #include <netinet6/esp.h>  
 #endif  
   
 #ifdef INET6  #ifdef INET6
 #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>
 #endif  #endif
   
 #ifndef INET6  #ifndef INET6
Line 123  __KERNEL_RCSID(0, "$NetBSD$");
Line 118  __KERNEL_RCSID(0, "$NetBSD$");
 #ifdef FAST_IPSEC  #ifdef FAST_IPSEC
 #include <netipsec/ipsec.h>  #include <netipsec/ipsec.h>
 #include <netipsec/ipsec_var.h>                 /* XXX ipsecstat namespace */  #include <netipsec/ipsec_var.h>                 /* XXX ipsecstat namespace */
   #include <netipsec/esp.h>
 #ifdef INET6  #ifdef INET6
 #include <netipsec/ipsec6.h>  #include <netipsec/ipsec6.h>
 #endif  #endif
Line 130  __KERNEL_RCSID(0, "$NetBSD$");
Line 126  __KERNEL_RCSID(0, "$NetBSD$");
   
 #ifdef IPSEC  #ifdef IPSEC
 #include <netinet6/ipsec.h>  #include <netinet6/ipsec.h>
   #include <netinet6/esp.h>
 #include <netkey/key.h>  #include <netkey/key.h>
 #endif /*IPSEC*/  #endif /*IPSEC*/
   
Line 575  udp6_input(struct mbuf **mp, int *offp, 
Line 572  udp6_input(struct mbuf **mp, int *offp, 
   
         /*          /*
          * Construct source and dst sockaddrs.           * Construct source and dst sockaddrs.
          * Note that ifindex (s6_addr16[1]) is already filled.  
          */           */
         bzero(&src, sizeof(src));          bzero(&src, sizeof(src));
         src.sin6_family = AF_INET6;          src.sin6_family = AF_INET6;
         src.sin6_len = sizeof(struct sockaddr_in6);          src.sin6_len = sizeof(struct sockaddr_in6);
         /* KAME hack: recover scopeid */          src.sin6_addr = ip6->ip6_src;
         (void)in6_recoverscope(&src, &ip6->ip6_src, m->m_pkthdr.rcvif);  
         src.sin6_port = uh->uh_sport;          src.sin6_port = uh->uh_sport;
         bzero(&dst, sizeof(dst));          bzero(&dst, sizeof(dst));
         dst.sin6_family = AF_INET6;          dst.sin6_family = AF_INET6;
         dst.sin6_len = sizeof(struct sockaddr_in6);          dst.sin6_len = sizeof(struct sockaddr_in6);
         /* KAME hack: recover scopeid */          dst.sin6_addr = ip6->ip6_dst;
         (void)in6_recoverscope(&dst, &ip6->ip6_dst, m->m_pkthdr.rcvif);  
         dst.sin6_port = uh->uh_dport;          dst.sin6_port = uh->uh_dport;
   
         if (udp6_realinput(AF_INET6, &src, &dst, m, off) == 0) {          if (udp6_realinput(AF_INET6, &src, &dst, m, off) == 0) {
Line 716  udp4_realinput(struct sockaddr_in *src, 
Line 710  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 756  udp4_realinput(struct sockaddr_in *src, 
Line 749  udp4_realinput(struct sockaddr_in *src, 
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * Locate pcb(s) for datagram.
                  */                   */
                 CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {                  CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
                         inp = (struct inpcb *)inph;  
                         if (inp->inp_af != AF_INET)                          if (inp->inp_af != AF_INET)
                                 continue;                                  continue;
   
Line 845  udp6_realinput(int af, struct sockaddr_i
Line 837  udp6_realinput(int af, struct sockaddr_i
 {  {
         u_int16_t sport, dport;          u_int16_t sport, dport;
         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_hdr *inph;          struct inpcb *inp;
         struct in6pcb *in6p;  
   
         rcvcnt = 0;          rcvcnt = 0;
         off += sizeof(struct udphdr);   /* now, offset of payload */          off += sizeof(struct udphdr);   /* now, offset of payload */
Line 858  udp6_realinput(int af, struct sockaddr_i
Line 849  udp6_realinput(int af, struct sockaddr_i
         if (src->sin6_family != AF_INET6 || dst->sin6_family != AF_INET6)          if (src->sin6_family != AF_INET6 || dst->sin6_family != AF_INET6)
                 goto bad;                  goto bad;
   
         in6_embedscope(&src6, src, NULL, NULL);          src6 = src->sin6_addr;
           if (sa6_recoverscope(src) != 0) {
                   /* XXX: should be impossible. */
                   goto bad;
           }
         sport = src->sin6_port;          sport = src->sin6_port;
         in6_embedscope(&dst6, dst, NULL, NULL);  
         dport = dst->sin6_port;          dport = dst->sin6_port;
         dst4 = (struct in_addr *)&dst->sin6_addr.s6_addr[12];          dst4 = (struct in_addr *)&dst->sin6_addr.s6_addr[12];
           dst6 = &dst->sin6_addr;
   
         if (IN6_IS_ADDR_MULTICAST(&dst6) ||          if (IN6_IS_ADDR_MULTICAST(dst6) ||
             (af == AF_INET && IN_MULTICAST(dst4->s_addr))) {              (af == AF_INET && IN_MULTICAST(dst4->s_addr))) {
                 /*                  /*
                  * Deliver a multicast or broadcast datagram to *all* sockets                   * Deliver a multicast or broadcast datagram to *all* sockets
Line 889  udp6_realinput(int af, struct sockaddr_i
Line 885  udp6_realinput(int af, struct sockaddr_i
                 /*                  /*
                  * Locate pcb(s) for datagram.                   * Locate pcb(s) for datagram.
                  */                   */
                 CIRCLEQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {                  CIRCLEQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
                         in6p = (struct in6pcb *)inph;                          if (inp->inp_af != AF_INET6)
                         if (in6p->in6p_af != AF_INET6)  
                                 continue;                                  continue;
   
                         if (in6p->in6p_lport != dport)                          if (inp->inp_lport != dport)
                                 continue;                                  continue;
                         if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr)) {
                                 if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &dst6))                                  if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr,
                                       dst6))
                                         continue;                                          continue;
                         } else {                          } else {
                                 if (IN6_IS_ADDR_V4MAPPED(&dst6) &&                                  if (IN6_IS_ADDR_V4MAPPED(dst6) &&
                                     (in6p->in6p_flags & IN6P_IPV6_V6ONLY))                                      (inp->inp_flags & IN6P_IPV6_V6ONLY))
                                         continue;                                          continue;
                         }                          }
                         if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
                                 if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr,                                  if (!IN6_ARE_ADDR_EQUAL(&inp->in6p_faddr,
                                     &src6) || in6p->in6p_fport != sport)                                      &src6) || inp->inp_fport != sport)
                                         continue;                                          continue;
                         } else {                          } else {
                                 if (IN6_IS_ADDR_V4MAPPED(&src6) &&                                  if (IN6_IS_ADDR_V4MAPPED(&src6) &&
                                     (in6p->in6p_flags & IN6P_IPV6_V6ONLY))                                      (inp->inp_flags & IN6P_IPV6_V6ONLY))
                                         continue;                                          continue;
                         }                          }
   
                         udp6_sendup(m, off, (struct sockaddr *)src,                          udp6_sendup(m, off, (struct sockaddr *)src,
                                 in6p->in6p_socket);                                  inp->inp_socket);
                         rcvcnt++;                          rcvcnt++;
   
                         /*                          /*
Line 926  udp6_realinput(int af, struct sockaddr_i
Line 922  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 ((in6p->in6p_socket->so_options &                          if ((inp->inp_socket->so_options &
                             (SO_REUSEPORT|SO_REUSEADDR)) == 0)                              (SO_REUSEPORT|SO_REUSEADDR)) == 0)
                                 break;                                  break;
                 }                  }
Line 934  udp6_realinput(int af, struct sockaddr_i
Line 930  udp6_realinput(int af, struct sockaddr_i
                 /*                  /*
                  * Locate pcb for datagram.                   * Locate pcb for datagram.
                  */                   */
                 in6p = in6_pcblookup_connect(&udbtable, &src6, sport,                  inp = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,
                     &dst6, dport, 0);                      dport, 0);
                 if (in6p == 0) {                  if (inp == 0) {
                         ++udpstat.udps_pcbhashmiss;                          ++udpstat.udps_pcbhashmiss;
                         in6p = in6_pcblookup_bind(&udbtable, &dst6, dport, 0);                          inp = in6_pcblookup_bind(&udbtable, dst6, dport, 0);
                         if (in6p == 0)                          if (inp == 0)
                                 return rcvcnt;                                  return rcvcnt;
                 }                  }
   
                 udp6_sendup(m, off, (struct sockaddr *)src, in6p->in6p_socket);                  udp6_sendup(m, off, (struct sockaddr *)src, inp->inp_socket);
                 rcvcnt++;                  rcvcnt++;
         }          }
   
Line 1178  udp_usrreq(struct socket *so, int req, s
Line 1174  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, p));                      (struct ifnet *)control, l));
   
         if (req == PRU_PURGEIF) {          if (req == PRU_PURGEIF) {
                 in_pcbpurgeif0(&udbtable, (struct ifnet *)control);                  in_pcbpurgeif0(&udbtable, (struct ifnet *)control);
Line 1238  udp_usrreq(struct socket *so, int req, s
Line 1232  udp_usrreq(struct socket *so, int req, s
                 break;                  break;
   
         case PRU_BIND:          case PRU_BIND:
                 error = in_pcbbind(inp, nam, p);                  error = in_pcbbind(inp, nam, l);
                 break;                  break;
   
         case PRU_LISTEN:          case PRU_LISTEN:
Line 1246  udp_usrreq(struct socket *so, int req, s
Line 1240  udp_usrreq(struct socket *so, int req, s
                 break;                  break;
   
         case PRU_CONNECT:          case PRU_CONNECT:
                 error = in_pcbconnect(inp, nam, p);                  error = in_pcbconnect(inp, nam, l);
                 if (error)                  if (error)
                         break;                          break;
                 soisconnected(so);                  soisconnected(so);
Line 1288  udp_usrreq(struct socket *so, int req, s
Line 1282  udp_usrreq(struct socket *so, int req, s
                                 error = EISCONN;                                  error = EISCONN;
                                 goto die;                                  goto die;
                         }                          }
                         error = in_pcbconnect(inp, nam, p);                          error = in_pcbconnect(inp, nam, l);
                         if (error)                          if (error)
                                 goto die;                                  goto die;
                 } else {                  } else {
Line 1545  udp4_espinudp(mp, off, src, so)
Line 1539  udp4_espinudp(mp, off, src, so)
         ((u_int16_t *)(tag + 1))[1] = dport;          ((u_int16_t *)(tag + 1))[1] = dport;
         m_tag_prepend(n, tag);          m_tag_prepend(n, tag);
   
   #ifdef FAST_IPSEC
           ipsec4_common_input(n, iphdrlen);
   #else
         esp4_input(n, iphdrlen);          esp4_input(n, iphdrlen);
   #endif
   
         /* We handled it, it shoudln't be handled by UDP */          /* We handled it, it shoudln't be handled by UDP */
         return 1;          return 1;

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

CVSweb <webmaster@jp.NetBSD.org>