[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.2.6 and 1.135

version 1.134.2.6, 2005/12/29 16:10:18 version 1.135, 2005/04/18 21:50:25
Line 152  struct udpstat udpstat;
Line 152  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 382  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 662  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 757  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 1359  SYSCTL_SETUP(sysctl_net_inet_udp_setup, 
Line 1341  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 1376  udp4_espinudp(mp, off, src, so)
Line 1357  udp4_espinudp(mp, 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 1390  udp4_espinudp(mp, off, src, so)
Line 1367  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 1421  udp4_espinudp(mp, off, src, so)
Line 1397  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);
         }          }
   
         /*          /*
          * 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 1471  udp4_espinudp(mp, off, src, so)
Line 1439  udp4_espinudp(mp, 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.2.6  
changed lines
  Added in v.1.135

CVSweb <webmaster@jp.NetBSD.org>