[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.141 and 1.146.2.1

version 1.141, 2005/08/10 13:06:49 version 1.146.2.1, 2006/02/05 03:09:11
Line 104  __KERNEL_RCSID(0, "$NetBSD$");
Line 104  __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>
 #endif  #endif
   
 #ifndef INET6  #ifndef INET6
Line 153  struct udpstat udpstat;
Line 153  struct udpstat udpstat;
   
 #ifdef INET  #ifdef INET
 #ifdef IPSEC_NAT_T  #ifdef IPSEC_NAT_T
 static int udp4_espinudp (struct mbuf *, int, struct sockaddr *,  static int udp4_espinudp (struct mbuf **, int, struct sockaddr *,
         struct socket *);          struct socket *);
 #endif  #endif
 static void udp4_sendup (struct mbuf *, int, struct sockaddr *,  static void udp4_sendup (struct mbuf *, int, struct sockaddr *,
         struct socket *);          struct socket *);
 static int udp4_realinput (struct sockaddr_in *, struct sockaddr_in *,  static int udp4_realinput (struct sockaddr_in *, struct sockaddr_in *,
         struct mbuf *, int);          struct mbuf **, int);
 static int udp4_input_checksum(struct mbuf *, const struct udphdr *, int, int);  static int udp4_input_checksum(struct mbuf *, const struct udphdr *, int, int);
 #endif  #endif
 #ifdef INET6  #ifdef INET6
Line 401  udp_input(struct mbuf *m, ...)
Line 401  udp_input(struct mbuf *m, ...)
         bcopy(&ip->ip_dst, &dst.sin_addr, sizeof(dst.sin_addr));          bcopy(&ip->ip_dst, &dst.sin_addr, sizeof(dst.sin_addr));
         dst.sin_port = uh->uh_dport;          dst.sin_port = uh->uh_dport;
   
         n = udp4_realinput(&src, &dst, m, iphlen);          if ((n = udp4_realinput(&src, &dst, &m, iphlen)) == -1) {
                   udpstat.udps_hdrops++;
                   return;
           }
 #ifdef INET6  #ifdef INET6
         if (IN_MULTICAST(ip->ip_dst.s_addr) || n == 0) {          if (IN_MULTICAST(ip->ip_dst.s_addr) || n == 0) {
                 struct sockaddr_in6 src6, dst6;                  struct sockaddr_in6 src6, dst6;
Line 572  udp6_input(struct mbuf **mp, int *offp, 
Line 575  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 708  udp6_sendup(struct mbuf *m, int off /* o
Line 708  udp6_sendup(struct mbuf *m, int off /* o
 #ifdef INET  #ifdef INET
 static int  static int
 udp4_realinput(struct sockaddr_in *src, struct sockaddr_in *dst,  udp4_realinput(struct sockaddr_in *src, struct sockaddr_in *dst,
         struct mbuf *m, int off /* offset of udphdr */)          struct mbuf **mp, int off /* offset of udphdr */)
 {  {
         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_hdr *inph;
         struct inpcb *inp;          struct inpcb *inp;
           struct mbuf *m = *mp;
   
         rcvcnt = 0;          rcvcnt = 0;
         off += sizeof(struct udphdr);   /* now, offset of payload */          off += sizeof(struct udphdr);   /* now, offset of payload */
Line 802  udp4_realinput(struct sockaddr_in *src, 
Line 803  udp4_realinput(struct sockaddr_in *src, 
                 if (inp->inp_flags & INP_ESPINUDP_ALL) {                  if (inp->inp_flags & INP_ESPINUDP_ALL) {
                         struct sockaddr *sa = (struct sockaddr *)src;                          struct sockaddr *sa = (struct sockaddr *)src;
   
                         if (udp4_espinudp(m, off, sa, inp->inp_socket) != 0) {                          switch(udp4_espinudp(mp, off, sa, inp->inp_socket)) {
                           case -1:        /* Error, m was freeed */
                                   rcvcnt = -1;
                                   goto bad;
                                   break;
   
                           case 1:         /* ESP over UDP */
                                 rcvcnt++;                                  rcvcnt++;
                                 goto bad;                                  goto bad;
                         }                                  break;
   
                         /* Normal UDP processing will take place */                          case 0:         /* plain UDP */
                           default:        /* Unexpected */
                                   /*
                                    * Normal UDP processing will take place
                                    * m may have changed.
                                    */
                                   m = *mp;
                                   break;
                           }
                 }                  }
 #endif  #endif
   
Line 827  udp6_realinput(int af, struct sockaddr_i
Line 842  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_hdr *inph;
         struct in6pcb *in6p;          struct in6pcb *in6p;
Line 840  udp6_realinput(int af, struct sockaddr_i
Line 855  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 879  udp6_realinput(int af, struct sockaddr_i
Line 899  udp6_realinput(int af, struct sockaddr_i
                         if (in6p->in6p_lport != dport)                          if (in6p->in6p_lport != dport)
                                 continue;                                  continue;
                         if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {                          if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
                                 if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &dst6))                                  if (!IN6_ARE_ADDR_EQUAL(&in6p->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))                                      (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
                                         continue;                                          continue;
                         }                          }
Line 916  udp6_realinput(int af, struct sockaddr_i
Line 937  udp6_realinput(int af, struct sockaddr_i
                 /*                  /*
                  * Locate pcb for datagram.                   * Locate pcb for datagram.
                  */                   */
                 in6p = in6_pcblookup_connect(&udbtable, &src6, sport,                  in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,
                     &dst6, dport, 0);                      dport, 0);
                 if (in6p == 0) {                  if (in6p == 0) {
                         ++udpstat.udps_pcbhashmiss;                          ++udpstat.udps_pcbhashmiss;
                         in6p = in6_pcblookup_bind(&udbtable, &dst6, dport, 0);                          in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0);
                         if (in6p == 0)                          if (in6p == 0)
                                 return rcvcnt;                                  return rcvcnt;
                 }                  }
Line 1157  int udp_recvspace = 40 * (1024 + sizeof(
Line 1178  int udp_recvspace = 40 * (1024 + sizeof(
 /*ARGSUSED*/  /*ARGSUSED*/
 int  int
 udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,  udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
         struct mbuf *control, struct proc *p)          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, p));
Line 1226  udp_usrreq(struct socket *so, int req, s
Line 1249  udp_usrreq(struct socket *so, int req, s
                 break;                  break;
   
         case PRU_CONNECT:          case PRU_CONNECT:
                 error = in_pcbconnect(inp, nam);                  error = in_pcbconnect(inp, nam, p);
                 if (error)                  if (error)
                         break;                          break;
                 soisconnected(so);                  soisconnected(so);
Line 1268  udp_usrreq(struct socket *so, int req, s
Line 1291  udp_usrreq(struct socket *so, int req, s
                                 error = EISCONN;                                  error = EISCONN;
                                 goto die;                                  goto die;
                         }                          }
                         error = in_pcbconnect(inp, nam);                          error = in_pcbconnect(inp, nam, p);
                         if (error)                          if (error)
                                 goto die;                                  goto die;
                 } else {                  } else {
Line 1397  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
Line 1420  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
  * Returns:   * Returns:
  * 1 if the packet was processed   * 1 if the packet was processed
  * 0 if normal UDP processing should take place   * 0 if normal UDP processing should take place
    * -1 if an error occurent and m was freed
  */   */
 static int  static int
 udp4_espinudp(m, off, src, so)  udp4_espinudp(mp, off, src, so)
         struct mbuf *m;          struct mbuf **mp;
         int off;          int off;
         struct sockaddr *src;          struct sockaddr *src;
         struct socket *so;          struct socket *so;
Line 1416  udp4_espinudp(m, off, src, so)
Line 1440  udp4_espinudp(m, off, src, so)
         struct m_tag *tag;          struct m_tag *tag;
         struct udphdr *udphdr;          struct udphdr *udphdr;
         u_int16_t sport, dport;          u_int16_t sport, dport;
           struct mbuf *m = *mp;
   
         /*          /*
          * Collapse the mbuf chain if the first mbuf is too short           * Collapse the mbuf chain if the first mbuf is too short
Line 1426  udp4_espinudp(m, off, src, so)
Line 1451  udp4_espinudp(m, off, src, so)
                 minlen = m->m_pkthdr.len;                  minlen = m->m_pkthdr.len;
   
         if (m->m_len < minlen) {          if (m->m_len < minlen) {
                 if ((m = m_pullup(m, minlen)) == NULL) {                  if ((*mp = m_pullup(m, minlen)) == NULL) {
                         printf("udp4_espinudp: m_pullup failed\n");                          printf("udp4_espinudp: m_pullup failed\n");
                         return 0;                          return -1;
                 }                  }
                   m = *mp;
         }          }
   
         len = m->m_len - off;          len = m->m_len - off;
Line 1456  udp4_espinudp(m, off, src, so)
Line 1482  udp4_espinudp(m, off, src, so)
         }          }
   
         if (inp->inp_flags & INP_ESPINUDP_NON_IKE) {          if (inp->inp_flags & INP_ESPINUDP_NON_IKE) {
                 u_int64_t *st = (u_int64_t *)data;                  u_int32_t *st = (u_int32_t *)data;
   
                 if ((len <= sizeof(u_int64_t) + sizeof(struct esp))                  if ((len <= sizeof(u_int64_t) + sizeof(struct esp))
                     || (*st != 0))                      || ((st[0] | st[1]) != 0))
                         return 0; /* Normal UDP processing */                          return 0; /* Normal UDP processing */
   
                 skip = sizeof(struct udphdr) + sizeof(u_int64_t);                  skip = sizeof(struct udphdr) + sizeof(u_int64_t);

Legend:
Removed from v.1.141  
changed lines
  Added in v.1.146.2.1

CVSweb <webmaster@jp.NetBSD.org>