[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.139

version 1.103.2.11, 2005/12/11 10:29:25 version 1.139, 2005/08/05 09:21:26
Line 146  int udpcksum = 1;
Line 146  int udpcksum = 1;
 #else  #else
 int     udpcksum = 0;           /* XXX */  int     udpcksum = 0;           /* XXX */
 #endif  #endif
 int     udp_do_loopback_cksum = 0;  
   
 struct  inpcbtable udbtable;  struct  inpcbtable udbtable;
 struct  udpstat udpstat;  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 187  struct mowner udp_tx_mowner = { "udp", "
Line 186  struct mowner udp_tx_mowner = { "udp", "
 #ifdef UDP_CSUM_COUNTERS  #ifdef UDP_CSUM_COUNTERS
 #include <sys/device.h>  #include <sys/device.h>
   
 #if defined(INET)  
 struct evcnt udp_hwcsum_bad = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  struct evcnt udp_hwcsum_bad = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,
     NULL, "udp", "hwcsum bad");      NULL, "udp", "hwcsum bad");
 struct evcnt udp_hwcsum_ok = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  struct evcnt udp_hwcsum_ok = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,
Line 197  struct evcnt udp_hwcsum_data = EVCNT_INI
Line 195  struct evcnt udp_hwcsum_data = EVCNT_INI
 struct evcnt udp_swcsum = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  struct evcnt udp_swcsum = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,
     NULL, "udp", "swcsum");      NULL, "udp", "swcsum");
   
   #define UDP_CSUM_COUNTER_INCR(ev)       (ev)->ev_count++
   
 EVCNT_ATTACH_STATIC(udp_hwcsum_bad);  EVCNT_ATTACH_STATIC(udp_hwcsum_bad);
 EVCNT_ATTACH_STATIC(udp_hwcsum_ok);  EVCNT_ATTACH_STATIC(udp_hwcsum_ok);
 EVCNT_ATTACH_STATIC(udp_hwcsum_data);  EVCNT_ATTACH_STATIC(udp_hwcsum_data);
 EVCNT_ATTACH_STATIC(udp_swcsum);  EVCNT_ATTACH_STATIC(udp_swcsum);
 #endif /* defined(INET) */  
   
 #if defined(INET6)  
 struct evcnt udp6_hwcsum_bad = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  
     NULL, "udp6", "hwcsum bad");  
 struct evcnt udp6_hwcsum_ok = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  
     NULL, "udp6", "hwcsum ok");  
 struct evcnt udp6_hwcsum_data = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  
     NULL, "udp6", "hwcsum data");  
 struct evcnt udp6_swcsum = EVCNT_INITIALIZER(EVCNT_TYPE_MISC,  
     NULL, "udp6", "swcsum");  
   
 EVCNT_ATTACH_STATIC(udp6_hwcsum_bad);  
 EVCNT_ATTACH_STATIC(udp6_hwcsum_ok);  
 EVCNT_ATTACH_STATIC(udp6_hwcsum_data);  
 EVCNT_ATTACH_STATIC(udp6_swcsum);  
 #endif /* defined(INET6) */  
   
 #define UDP_CSUM_COUNTER_INCR(ev)       (ev)->ev_count++  
   
 #else  #else
   
Line 401  udp_input(struct mbuf *m, ...)
Line 382  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;
   
         if ((n = udp4_realinput(&src, &dst, &m, iphlen)) == -1) {          n = udp4_realinput(&src, &dst, m, iphlen);
                 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 464  static int
Line 442  static int
 udp6_input_checksum(struct mbuf *m, const struct udphdr *uh, int off, int len)  udp6_input_checksum(struct mbuf *m, const struct udphdr *uh, int off, int len)
 {  {
   
         /*  
          * XXX it's better to record and check if this mbuf is  
          * already checked.  
          */  
   
         if (__predict_false((m->m_flags & M_LOOP) && !udp_do_loopback_cksum)) {          if (__predict_false((m->m_flags & M_LOOP) && !udp_do_loopback_cksum)) {
                 goto good;                  goto good;
         }          }
Line 476  udp6_input_checksum(struct mbuf *m, cons
Line 449  udp6_input_checksum(struct mbuf *m, cons
                 udp6stat.udp6s_nosum++;                  udp6stat.udp6s_nosum++;
                 goto bad;                  goto bad;
         }          }
           if (in6_cksum(m, IPPROTO_UDP, off, len) != 0) {
         switch (m->m_pkthdr.csum_flags &  
             ((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_UDPv6) |  
             M_CSUM_TCP_UDP_BAD | M_CSUM_DATA)) {  
         case M_CSUM_UDPv6|M_CSUM_TCP_UDP_BAD:  
                 UDP_CSUM_COUNTER_INCR(&udp6_hwcsum_bad);  
                 udp6stat.udp6s_badsum++;                  udp6stat.udp6s_badsum++;
                 goto bad;                  goto bad;
   
 #if 0 /* notyet */  
         case M_CSUM_UDPv6|M_CSUM_DATA:  
 #endif  
   
         case M_CSUM_UDPv6:  
                 /* Checksum was okay. */  
                 UDP_CSUM_COUNTER_INCR(&udp6_hwcsum_ok);  
                 break;  
   
         default:  
                 /*  
                  * Need to compute it ourselves.  Maybe skip checksum  
                  * on loopback interfaces.  
                  */  
                 UDP_CSUM_COUNTER_INCR(&udp6_swcsum);  
                 if (in6_cksum(m, IPPROTO_UDP, off, len) != 0) {  
                         udp6stat.udp6s_badsum++;  
                         goto bad;  
                 }  
         }          }
   
 good:  good:
Line 711  udp6_sendup(struct mbuf *m, int off /* o
Line 659  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 **mp, int off /* offset of udphdr */)          struct mbuf *m, 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 806  udp4_realinput(struct sockaddr_in *src, 
Line 753  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;
   
                         switch(udp4_espinudp(mp, off, sa, inp->inp_socket)) {                          if (udp4_espinudp(m, off, sa, inp->inp_socket) != 0) {
                         case -1:        /* Error, m was freeed */  
                                 rcvcnt = -1;  
                                 goto bad;  
                                 break;  
   
                         case 1:         /* ESP over UDP */  
                                 rcvcnt++;                                  rcvcnt++;
                                 goto bad;                                  goto bad;
                                 break;  
   
                         case 0:         /* plain UDP */  
                         default:        /* Unexpected */  
                                 /*  
                                  * Normal UDP processing will take place  
                                  * m may have changed.  
                                  */  
                                 m = *mp;  
                                 break;  
                         }                          }
   
                           /* Normal UDP processing will take place */
                 }                  }
 #endif  #endif
   
Line 1175  int udp_recvspace = 40 * (1024 + sizeof(
Line 1108  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 lwp *l)          struct mbuf *control, struct proc *p)
 {  {
         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 1246  udp_usrreq(struct socket *so, int req, s
Line 1177  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);
                 if (error)                  if (error)
                         break;                          break;
                 soisconnected(so);                  soisconnected(so);
Line 1288  udp_usrreq(struct socket *so, int req, s
Line 1219  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);
                         if (error)                          if (error)
                                 goto die;                                  goto die;
                 } else {                  } else {
Line 1417  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
Line 1348  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(mp, off, src, so)  udp4_espinudp(m, off, src, so)
         struct mbuf **mp;          struct mbuf *m;
         int off;          int off;
         struct sockaddr *src;          struct sockaddr *src;
         struct socket *so;          struct socket *so;
Line 1437  udp4_espinudp(mp, off, src, so)
Line 1367  udp4_espinudp(mp, 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 1448  udp4_espinudp(mp, off, src, so)
Line 1377  udp4_espinudp(mp, off, src, so)
                 minlen = m->m_pkthdr.len;                  minlen = m->m_pkthdr.len;
   
         if (m->m_len < minlen) {          if (m->m_len < minlen) {
                 if ((*mp = m_pullup(m, minlen)) == NULL) {                  if ((m = m_pullup(m, minlen)) == NULL) {
                         printf("udp4_espinudp: m_pullup failed\n");                          printf("udp4_espinudp: m_pullup failed\n");
                         return -1;                          return 0;
                 }                  }
                 m = *mp;  
         }          }
   
         len = m->m_len - off;          len = m->m_len - off;
Line 1479  udp4_espinudp(mp, off, src, so)
Line 1407  udp4_espinudp(mp, off, src, so)
         }          }
   
         if (inp->inp_flags & INP_ESPINUDP_NON_IKE) {          if (inp->inp_flags & INP_ESPINUDP_NON_IKE) {
                 u_int32_t *st = (u_int32_t *)data;                  u_int64_t *st = (u_int64_t *)data;
   
                 if ((len <= sizeof(u_int64_t) + sizeof(struct esp))                  if ((len <= sizeof(u_int64_t) + sizeof(struct esp))
                     || ((st[0] | st[1]) != 0))                      || (*st != 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.103.2.11  
changed lines
  Added in v.1.139

CVSweb <webmaster@jp.NetBSD.org>