[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.239 and 1.240

version 1.239, 2018/02/08 10:24:46 version 1.240, 2018/02/10 08:17:00
Line 139  percpu_t *udpstat_percpu;
Line 139  percpu_t *udpstat_percpu;
   
 #ifdef INET  #ifdef INET
 #ifdef IPSEC  #ifdef IPSEC
 static int udp4_espinudp(struct mbuf **, int, struct sockaddr *,  static void 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 *,
Line 606  udp4_realinput(struct sockaddr_in *src, 
Line 606  udp4_realinput(struct sockaddr_in *src, 
                 /* Handle ESP over UDP */                  /* Handle ESP over UDP */
                 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;
                           udp4_espinudp(m, off, sa, inp->inp_socket);
                         switch (udp4_espinudp(mp, off, sa, inp->inp_socket)) {                          *mp = NULL;
                         case -1: /* Error, m was freed */                          goto bad;
                                 rcvcnt = -1;  
                                 goto bad;  
   
                         case 1: /* ESP over UDP */  
                                 rcvcnt++;  
                                 goto bad;  
   
                         case 0: /* plain UDP */  
                         default: /* Unexpected */  
                                 /*  
                                  * Normal UDP processing will take place,  
                                  * m may have changed.  
                                  */  
                                 m = *mp;  
                                 break;  
                         }  
                 }                  }
 #endif  #endif
   
Line 1246  udp_statinc(u_int stat)
Line 1230  udp_statinc(u_int stat)
   
 #if defined(INET) && defined(IPSEC)  #if defined(INET) && defined(IPSEC)
 /*  /*
  * Returns:   * This function always frees the mbuf.
  *     1 if the packet was processed  
  *     0 if normal UDP processing should take place  
  *    -1 if an error occurred and m was freed  
  */   */
 static int  static void
 udp4_espinudp(struct mbuf **mp, int off, struct sockaddr *src,  udp4_espinudp(struct mbuf *m, int off, struct sockaddr *src,
     struct socket *so)      struct socket *so)
 {  {
         size_t len;          size_t len;
Line 1265  udp4_espinudp(struct mbuf **mp, int off,
Line 1246  udp4_espinudp(struct mbuf **mp, int off,
         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 1276  udp4_espinudp(struct mbuf **mp, int off,
Line 1256  udp4_espinudp(struct mbuf **mp, int off,
                 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) {
                         return -1;                          return;
                 }                  }
                 m = *mp;  
         }          }
   
         len = m->m_len - off;          len = m->m_len - off;
Line 1288  udp4_espinudp(struct mbuf **mp, int off,
Line 1267  udp4_espinudp(struct mbuf **mp, int off,
   
         /* Ignore keepalive packets */          /* Ignore keepalive packets */
         if ((len == 1) && (*(unsigned char *)data == 0xff)) {          if ((len == 1) && (*(unsigned char *)data == 0xff)) {
                 m_freem(m);                  goto out;
                 *mp = NULL; /* avoid any further processing by caller ... */  
                 return 1;  
         }          }
   
         /*          /*
Line 1301  udp4_espinudp(struct mbuf **mp, int off,
Line 1278  udp4_espinudp(struct mbuf **mp, int off,
         if (inp->inp_flags & INP_ESPINUDP) {          if (inp->inp_flags & INP_ESPINUDP) {
                 u_int32_t *st = (u_int32_t *)data;                  u_int32_t *st = (u_int32_t *)data;
   
                 if ((len <= sizeof(struct esp)) || (*st == 0))                  if ((len <= sizeof(struct esp)) || (*st == 0)) {
                         return 0; /* Normal UDP processing */                          goto out;
                   }
   
                 skip = sizeof(struct udphdr);                  skip = sizeof(struct udphdr);
         }          }
Line 1311  udp4_espinudp(struct mbuf **mp, int off,
Line 1289  udp4_espinudp(struct mbuf **mp, int off,
                 u_int32_t *st = (u_int32_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[1]) != 0))                      ((st[0] | st[1]) != 0)) {
                         return 0; /* Normal UDP processing */                          goto out;
                   }
   
                 skip = sizeof(struct udphdr) + sizeof(u_int64_t);                  skip = sizeof(struct udphdr) + sizeof(u_int64_t);
         }          }
Line 1359  udp4_espinudp(struct mbuf **mp, int off,
Line 1338  udp4_espinudp(struct mbuf **mp, int off,
          */           */
         if ((tag = m_tag_get(PACKET_TAG_IPSEC_NAT_T_PORTS,          if ((tag = m_tag_get(PACKET_TAG_IPSEC_NAT_T_PORTS,
             sizeof(sport) + sizeof(dport), M_DONTWAIT)) == NULL) {              sizeof(sport) + sizeof(dport), M_DONTWAIT)) == NULL) {
                 m_freem(m);                  goto out;
                 return -1;  
         }          }
         ((u_int16_t *)(tag + 1))[0] = sport;          ((u_int16_t *)(tag + 1))[0] = sport;
         ((u_int16_t *)(tag + 1))[1] = dport;          ((u_int16_t *)(tag + 1))[1] = dport;
Line 1371  udp4_espinudp(struct mbuf **mp, int off,
Line 1349  udp4_espinudp(struct mbuf **mp, int off,
         else          else
                 m_freem(m);                  m_freem(m);
   
         /* We handled it, it shouldn't be handled by UDP */          return;
         *mp = NULL; /* avoid free by caller ... */  
         return 1;  out:
           m_freem(m);
           return;
 }  }
 #endif  #endif
   

Legend:
Removed from v.1.239  
changed lines
  Added in v.1.240

CVSweb <webmaster@jp.NetBSD.org>