[BACK]Return to ip_input.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/ip_input.c between version 1.135.2.4 and 1.159

version 1.135.2.4, 2002/06/23 17:50:51 version 1.159, 2002/11/02 07:28:12
Line 192  int ip_forwsrcrt = IPFORWSRCRT;
Line 192  int ip_forwsrcrt = IPFORWSRCRT;
 int     ip_directedbcast = IPDIRECTEDBCAST;  int     ip_directedbcast = IPDIRECTEDBCAST;
 int     ip_allowsrcrt = IPALLOWSRCRT;  int     ip_allowsrcrt = IPALLOWSRCRT;
 int     ip_mtudisc = IPMTUDISC;  int     ip_mtudisc = IPMTUDISC;
 u_int   ip_mtudisc_timeout = IPMTUDISCTIMEOUT;  int     ip_mtudisc_timeout = IPMTUDISCTIMEOUT;
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
 int     ipprintfs = 0;  int     ipprintfs = 0;
 #endif  #endif
Line 257  do {         \
Line 257  do {         \
                 printf("%s:%d: ipq already locked\n", __FILE__, __LINE__); \                  printf("%s:%d: ipq already locked\n", __FILE__, __LINE__); \
                 panic("ipq_lock");                                      \                  panic("ipq_lock");                                      \
         }                                                               \          }                                                               \
 } while (0)  } while (/*CONSTCOND*/ 0)
 #define IPQ_LOCK_CHECK()                                                \  #define IPQ_LOCK_CHECK()                                                \
 do {                                                                    \  do {                                                                    \
         if (ipq_locked == 0) {                                          \          if (ipq_locked == 0) {                                          \
                 printf("%s:%d: ipq lock not held\n", __FILE__, __LINE__); \                  printf("%s:%d: ipq lock not held\n", __FILE__, __LINE__); \
                 panic("ipq lock check");                                \                  panic("ipq lock check");                                \
         }                                                               \          }                                                               \
 } while (0)  } while (/*CONSTCOND*/ 0)
 #else  #else
 #define IPQ_LOCK()              (void) ipq_lock_try()  #define IPQ_LOCK()              (void) ipq_lock_try()
 #define IPQ_LOCK_CHECK()        /* nothing */  #define IPQ_LOCK_CHECK()        /* nothing */
Line 420  ip_input(struct mbuf *m)
Line 420  ip_input(struct mbuf *m)
         if (TAILQ_FIRST(&in_ifaddr) == 0)          if (TAILQ_FIRST(&in_ifaddr) == 0)
                 goto bad;                  goto bad;
         ipstat.ips_total++;          ipstat.ips_total++;
         if (m->m_len < sizeof (struct ip) &&          /*
             (m = m_pullup(m, sizeof (struct ip))) == 0) {           * If the IP header is not aligned, slurp it up into a new
                 ipstat.ips_toosmall++;           * mbuf with space for link headers, in the event we forward
                 return;           * it.  Otherwise, if it is aligned, make sure the entire
            * base IP header is in the first mbuf of the chain.
            */
           if (IP_HDR_ALIGNED_P(mtod(m, caddr_t)) == 0) {
                   if ((m = m_copyup(m, sizeof(struct ip),
                                     (max_linkhdr + 3) & ~3)) == NULL) {
                           /* XXXJRT new stat, please */
                           ipstat.ips_toosmall++;
                           return;
                   }
           } else if (__predict_false(m->m_len < sizeof (struct ip))) {
                   if ((m = m_pullup(m, sizeof (struct ip))) == NULL) {
                           ipstat.ips_toosmall++;
                           return;
                   }
         }          }
         ip = mtod(m, struct ip *);          ip = mtod(m, struct ip *);
         if (ip->ip_v != IPVERSION) {          if (ip->ip_v != IPVERSION) {
Line 558  ip_input(struct mbuf *m)
Line 572  ip_input(struct mbuf *m)
 #endif  #endif
   
         /*          /*
          * Convert fields to host representation.  
          */  
         NTOHS(ip->ip_len);  
         NTOHS(ip->ip_off);  
   
         /*  
          * Process options and, if not destined for us,           * Process options and, if not destined for us,
          * ship it on.  ip_dooptions returns 1 when an           * ship it on.  ip_dooptions returns 1 when an
          * error was detected (causing an icmp message           * error was detected (causing an icmp message
Line 708  ours:
Line 716  ours:
          * if the packet was previously fragmented,           * if the packet was previously fragmented,
          * but it's not worth the time; just let them time out.)           * but it's not worth the time; just let them time out.)
          */           */
         if (ip->ip_off & ~(IP_DF|IP_RF)) {          if (ip->ip_off & ~htons(IP_DF|IP_RF)) {
                   if (M_READONLY(m)) {
                           if ((m = m_pullup(m, hlen)) == NULL) {
                                   ipstat.ips_toosmall++;
                                   goto bad;
                           }
                           ip = mtod(m, struct ip *);
                   }
   
                 /*                  /*
                  * Look for queue of fragments                   * Look for queue of fragments
                  * of this datagram.                   * of this datagram.
Line 728  found:
Line 744  found:
                  * set ipqe_mff if more fragments are expected,                   * set ipqe_mff if more fragments are expected,
                  * convert offset of this to bytes.                   * convert offset of this to bytes.
                  */                   */
                 ip->ip_len -= hlen;                  ip->ip_len = htons(ntohs(ip->ip_len) - hlen);
                 mff = (ip->ip_off & IP_MF) != 0;                  mff = (ip->ip_off & htons(IP_MF)) != 0;
                 if (mff) {                  if (mff) {
                         /*                          /*
                          * Make sure that fragments have a data length                           * Make sure that fragments have a data length
                          * that's a non-zero multiple of 8 bytes.                           * that's a non-zero multiple of 8 bytes.
                          */                           */
                         if (ip->ip_len == 0 || (ip->ip_len & 0x7) != 0) {                          if (ntohs(ip->ip_len) == 0 ||
                               (ntohs(ip->ip_len) & 0x7) != 0) {
                                 ipstat.ips_badfrags++;                                  ipstat.ips_badfrags++;
                                 IPQ_UNLOCK();                                  IPQ_UNLOCK();
                                 goto bad;                                  goto bad;
                         }                          }
                 }                  }
                 ip->ip_off <<= 3;                  ip->ip_off = htons((ntohs(ip->ip_off) & IP_OFFMASK) << 3);
   
                 /*                  /*
                  * If datagram marked as having more fragments                   * If datagram marked as having more fragments
                  * or if this is not the first fragment,                   * or if this is not the first fragment,
                  * attempt reassembly; if it succeeds, proceed.                   * attempt reassembly; if it succeeds, proceed.
                  */                   */
                 if (mff || ip->ip_off) {                  if (mff || ip->ip_off != htons(0)) {
                         ipstat.ips_fragments++;                          ipstat.ips_fragments++;
                         ipqe = pool_get(&ipqent_pool, PR_NOWAIT);                          ipqe = pool_get(&ipqent_pool, PR_NOWAIT);
                         if (ipqe == NULL) {                          if (ipqe == NULL) {
Line 767  found:
Line 784  found:
                         ipstat.ips_reassembled++;                          ipstat.ips_reassembled++;
                         ip = mtod(m, struct ip *);                          ip = mtod(m, struct ip *);
                         hlen = ip->ip_hl << 2;                          hlen = ip->ip_hl << 2;
                         ip->ip_len += hlen;                          ip->ip_len = htons(ntohs(ip->ip_len) + hlen);
                 } else                  } else
                         if (fp)                          if (fp)
                                 ip_freef(fp);                                  ip_freef(fp);
Line 792  found:
Line 809  found:
          */           */
 #if IFA_STATS  #if IFA_STATS
         if (ia && ip)          if (ia && ip)
                 ia->ia_ifa.ifa_data.ifad_inbytes += ip->ip_len;                  ia->ia_ifa.ifa_data.ifad_inbytes += ntohs(ip->ip_len);
 #endif  #endif
         ipstat.ips_delivered++;          ipstat.ips_delivered++;
     {      {
Line 872  ip_reass(ipqe, fp)
Line 889  ip_reass(ipqe, fp)
          */           */
         for (p = NULL, q = TAILQ_FIRST(&fp->ipq_fragq); q != NULL;          for (p = NULL, q = TAILQ_FIRST(&fp->ipq_fragq); q != NULL;
             p = q, q = TAILQ_NEXT(q, ipqe_q))              p = q, q = TAILQ_NEXT(q, ipqe_q))
                 if (q->ipqe_ip->ip_off > ipqe->ipqe_ip->ip_off)                  if (ntohs(q->ipqe_ip->ip_off) > ntohs(ipqe->ipqe_ip->ip_off))
                         break;                          break;
   
         /*          /*
Line 881  ip_reass(ipqe, fp)
Line 898  ip_reass(ipqe, fp)
          * segment.  If it provides all of our data, drop us.           * segment.  If it provides all of our data, drop us.
          */           */
         if (p != NULL) {          if (p != NULL) {
                 i = p->ipqe_ip->ip_off + p->ipqe_ip->ip_len -                  i = ntohs(p->ipqe_ip->ip_off) + ntohs(p->ipqe_ip->ip_len) -
                     ipqe->ipqe_ip->ip_off;                      ntohs(ipqe->ipqe_ip->ip_off);
                 if (i > 0) {                  if (i > 0) {
                         if (i >= ipqe->ipqe_ip->ip_len)                          if (i >= ntohs(ipqe->ipqe_ip->ip_len))
                                 goto dropfrag;                                  goto dropfrag;
                         m_adj(ipqe->ipqe_m, i);                          m_adj(ipqe->ipqe_m, i);
                         ipqe->ipqe_ip->ip_off += i;                          ipqe->ipqe_ip->ip_off =
                         ipqe->ipqe_ip->ip_len -= i;                              htons(ntohs(ipqe->ipqe_ip->ip_off) + i);
                           ipqe->ipqe_ip->ip_len =
                               htons(ntohs(ipqe->ipqe_ip->ip_len) - i);
                 }                  }
         }          }
   
Line 896  ip_reass(ipqe, fp)
Line 915  ip_reass(ipqe, fp)
          * While we overlap succeeding segments trim them or,           * While we overlap succeeding segments trim them or,
          * if they are completely covered, dequeue them.           * if they are completely covered, dequeue them.
          */           */
         for (; q != NULL && ipqe->ipqe_ip->ip_off + ipqe->ipqe_ip->ip_len >          for (; q != NULL &&
             q->ipqe_ip->ip_off; q = nq) {              ntohs(ipqe->ipqe_ip->ip_off) + ntohs(ipqe->ipqe_ip->ip_len) >
                 i = (ipqe->ipqe_ip->ip_off + ipqe->ipqe_ip->ip_len) -              ntohs(q->ipqe_ip->ip_off); q = nq) {
                     q->ipqe_ip->ip_off;                  i = (ntohs(ipqe->ipqe_ip->ip_off) +
                 if (i < q->ipqe_ip->ip_len) {                      ntohs(ipqe->ipqe_ip->ip_len)) - ntohs(q->ipqe_ip->ip_off);
                         q->ipqe_ip->ip_len -= i;                  if (i < ntohs(q->ipqe_ip->ip_len)) {
                         q->ipqe_ip->ip_off += i;                          q->ipqe_ip->ip_len =
                               htons(ntohs(q->ipqe_ip->ip_len) - i);
                           q->ipqe_ip->ip_off =
                               htons(ntohs(q->ipqe_ip->ip_off) + i);
                         m_adj(q->ipqe_m, i);                          m_adj(q->ipqe_m, i);
                         break;                          break;
                 }                  }
Line 925  insert:
Line 947  insert:
         next = 0;          next = 0;
         for (p = NULL, q = TAILQ_FIRST(&fp->ipq_fragq); q != NULL;          for (p = NULL, q = TAILQ_FIRST(&fp->ipq_fragq); q != NULL;
             p = q, q = TAILQ_NEXT(q, ipqe_q)) {              p = q, q = TAILQ_NEXT(q, ipqe_q)) {
                 if (q->ipqe_ip->ip_off != next)                  if (ntohs(q->ipqe_ip->ip_off) != next)
                         return (0);                          return (0);
                 next += q->ipqe_ip->ip_len;                  next += ntohs(q->ipqe_ip->ip_len);
         }          }
         if (p->ipqe_mff)          if (p->ipqe_mff)
                 return (0);                  return (0);
Line 962  insert:
Line 984  insert:
          * dequeue and discard fragment reassembly header.           * dequeue and discard fragment reassembly header.
          * Make header visible.           * Make header visible.
          */           */
         ip->ip_len = next;          ip->ip_len = htons(next);
         ip->ip_src = fp->ipq_src;          ip->ip_src = fp->ipq_src;
         ip->ip_dst = fp->ipq_dst;          ip->ip_dst = fp->ipq_dst;
         LIST_REMOVE(fp, ipq_q);          LIST_REMOVE(fp, ipq_q);
Line 1445  ip_stripoptions(m, mopt)
Line 1467  ip_stripoptions(m, mopt)
         m->m_len -= olen;          m->m_len -= olen;
         if (m->m_flags & M_PKTHDR)          if (m->m_flags & M_PKTHDR)
                 m->m_pkthdr.len -= olen;                  m->m_pkthdr.len -= olen;
         ip->ip_len -= olen;          ip->ip_len = htons(ntohs(ip->ip_len) - olen);
         ip->ip_hl = sizeof (struct ip) >> 2;          ip->ip_hl = sizeof (struct ip) >> 2;
 }  }
   
Line 1535  ip_forward(m, srcrt)
Line 1557  ip_forward(m, srcrt)
          * we need to generate an ICMP message to the src.           * we need to generate an ICMP message to the src.
          * Pullup to avoid sharing mbuf cluster between m and mcopy.           * Pullup to avoid sharing mbuf cluster between m and mcopy.
          */           */
         mcopy = m_copym(m, 0, imin((int)ip->ip_len, 68), M_DONTWAIT);          mcopy = m_copym(m, 0, imin(ntohs(ip->ip_len), 68), M_DONTWAIT);
         if (mcopy)          if (mcopy)
                 mcopy = m_pullup(mcopy, ip->ip_hl << 2);                  mcopy = m_pullup(mcopy, ip->ip_hl << 2);
   
Line 1841  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1863  ip_sysctl(name, namelen, oldp, oldlenp, 
                 }                  }
                 return (error);                  return (error);
         case IPCTL_MTUDISCTIMEOUT:          case IPCTL_MTUDISCTIMEOUT:
                   old = ip_mtudisc_timeout;
                 error = sysctl_int(oldp, oldlenp, newp, newlen,                  error = sysctl_int(oldp, oldlenp, newp, newlen,
                    &ip_mtudisc_timeout);                     &ip_mtudisc_timeout);
                   if (ip_mtudisc_timeout < 0) {
                           ip_mtudisc_timeout = old;
                           return (EINVAL);
                   }
                 if (ip_mtudisc_timeout_q != NULL)                  if (ip_mtudisc_timeout_q != NULL)
                         rt_timer_queue_change(ip_mtudisc_timeout_q,                          rt_timer_queue_change(ip_mtudisc_timeout_q,
                                               ip_mtudisc_timeout);                                                ip_mtudisc_timeout);
Line 1865  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1892  ip_sysctl(name, namelen, oldp, oldlenp, 
                     &hostzeroisbroadcast));                      &hostzeroisbroadcast));
 #if NGIF > 0  #if NGIF > 0
         case IPCTL_GIF_TTL:          case IPCTL_GIF_TTL:
                 return(sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                                   &ip_gif_ttl));                                    &ip_gif_ttl));
 #endif  #endif
   
 #if NGRE > 0  #if NGRE > 0
         case IPCTL_GRE_TTL:          case IPCTL_GRE_TTL:
                 return(sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                                   &ip_gre_ttl));                                    &ip_gre_ttl));
 #endif  #endif
   

Legend:
Removed from v.1.135.2.4  
changed lines
  Added in v.1.159

CVSweb <webmaster@jp.NetBSD.org>