[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.134 and 1.134.2.6

version 1.134, 2005/03/11 06:16:16 version 1.134.2.6, 2005/12/29 16:10:18
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 383  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;
   
         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 660  udp6_sendup(struct mbuf *m, int off /* o
Line 662  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 754  udp4_realinput(struct sockaddr_in *src, 
Line 757  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 1080  udp_output(struct mbuf *m, ...)
Line 1097  udp_output(struct mbuf *m, ...)
                 /*                  /*
                  * XXX Cache pseudo-header checksum part for                   * XXX Cache pseudo-header checksum part for
                  * XXX "connected" UDP sockets.                   * XXX "connected" UDP sockets.
                  * Maybe skip checksums on loopback interfaces.  
                  */                   */
                 ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr,                  ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr,
                     ui->ui_dst.s_addr, htons((u_int16_t)len +                      ui->ui_dst.s_addr, htons((u_int16_t)len +
                     sizeof(struct udphdr) + IPPROTO_UDP));                      sizeof(struct udphdr) + IPPROTO_UDP));
                 if (__predict_true(ro->ro_rt == NULL ||                  m->m_pkthdr.csum_flags = M_CSUM_UDPv4;
                                    !(ro->ro_rt->rt_ifp->if_flags &  
                                      IFF_LOOPBACK) ||  
                                    udp_do_loopback_cksum))  
                         m->m_pkthdr.csum_flags = M_CSUM_UDPv4;  
                 else  
                         m->m_pkthdr.csum_flags = 0;  
                 m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);                  m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
         } else          } else
                 ui->ui_sum = 0;                  ui->ui_sum = 0;
Line 1349  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
Line 1359  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 1365  udp4_espinudp(m, off, src, so)
Line 1376  udp4_espinudp(m, off, src, so)
         size_t iphdrlen;          size_t iphdrlen;
         struct ip *ip;          struct ip *ip;
         struct mbuf *n;          struct mbuf *n;
           struct m_tag *tag;
           struct udphdr *udphdr;
           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 1375  udp4_espinudp(m, off, src, so)
Line 1390  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 1405  udp4_espinudp(m, off, src, so)
Line 1421  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);
         }          }
   
         /*          /*
            * Get the UDP ports. They are handled in network
            * order everywhere in IPSEC_NAT_T code.
            */
           udphdr = (struct udphdr *)(data - skip);
           sport = udphdr->uh_sport;
           dport = udphdr->uh_dport;
   
           /*
          * Remove the UDP header (and possibly the non ESP marker)           * Remove the UDP header (and possibly the non ESP marker)
          * IP header lendth is iphdrlen           * IP header lendth is iphdrlen
          * Before:           * Before:
Line 1447  udp4_espinudp(m, off, src, so)
Line 1471  udp4_espinudp(m, off, src, so)
                 return 0;                  return 0;
         }          }
   
           /*
            * Add a PACKET_TAG_IPSEC_NAT_T_PORT tag to remember
            * the source UDP port. This is required if we want
            * to select the right SPD for multiple hosts behind
            * same NAT
            */
           if ((tag = m_tag_get(PACKET_TAG_IPSEC_NAT_T_PORTS,
               sizeof(sport) + sizeof(dport), M_DONTWAIT)) == NULL) {
                   printf("udp4_espinudp: m_tag_get failed\n");
                   m_freem(n);
                   return 0;
           }
           ((u_int16_t *)(tag + 1))[0] = sport;
           ((u_int16_t *)(tag + 1))[1] = dport;
           m_tag_prepend(n, tag);
   
         esp4_input(n, iphdrlen);          esp4_input(n, iphdrlen);
   
         /* We handled it, it shoudln't be handled by UDP */          /* We handled it, it shoudln't be handled by UDP */

Legend:
Removed from v.1.134  
changed lines
  Added in v.1.134.2.6

CVSweb <webmaster@jp.NetBSD.org>