[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.48 and 1.53.2.1

version 1.48, 1997/02/26 04:09:32 version 1.53.2.1, 1998/05/09 03:33:00
Line 83 
Line 83 
 #ifndef IPALLOWSRCRT  #ifndef IPALLOWSRCRT
 #define IPALLOWSRCRT    1       /* allow source-routed packets */  #define IPALLOWSRCRT    1       /* allow source-routed packets */
 #endif  #endif
   #ifndef IPMTUDISC
   #define IPMTUDISC       0
   #endif
   #ifndef IPMTUDISCTIMEOUT
   #define IPMTUDISCTIMEOUT (10 * 60)      /* as per RFC 1191 */
   #endif
   
   
 /*  /*
  * Note: DIRECTED_BROADCAST is handled this way so that previous   * Note: DIRECTED_BROADCAST is handled this way so that previous
  * configuration using this option will Just Work.   * configuration using this option will Just Work.
Line 100  int ip_defttl = IPDEFTTL;
Line 108  int ip_defttl = IPDEFTTL;
 int     ip_forwsrcrt = IPFORWSRCRT;  int     ip_forwsrcrt = IPFORWSRCRT;
 int     ip_directedbcast = IPDIRECTEDBCAST;  int     ip_directedbcast = IPDIRECTEDBCAST;
 int     ip_allowsrcrt = IPALLOWSRCRT;  int     ip_allowsrcrt = IPALLOWSRCRT;
   int     ip_mtudisc = IPMTUDISC;
   u_int   ip_mtudisc_timeout = IPMTUDISCTIMEOUT;
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
 int     ipprintfs = 0;  int     ipprintfs = 0;
 #endif  #endif
   
   struct rttimer_queue *ip_mtudisc_timeout_q = NULL;
   
 extern  struct domain inetdomain;  extern  struct domain inetdomain;
 extern  struct protosw inetsw[];  extern  struct protosw inetsw[];
 u_char  ip_protox[IPPROTO_MAX];  u_char  ip_protox[IPPROTO_MAX];
Line 152  ip_init()
Line 164  ip_init()
         ip_id = time.tv_sec & 0xffff;          ip_id = time.tv_sec & 0xffff;
         ipintrq.ifq_maxlen = ipqmaxlen;          ipintrq.ifq_maxlen = ipqmaxlen;
         TAILQ_INIT(&in_ifaddr);          TAILQ_INIT(&in_ifaddr);
   
           if (ip_mtudisc != 0)
                   ip_mtudisc_timeout_q =
                       rt_timer_queue_create(ip_mtudisc_timeout);
 }  }
   
 struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
Line 258  next:
Line 274  next:
         for (pfh = pfil_hook_get(PFIL_IN); pfh; pfh = pfh->pfil_link.le_next)          for (pfh = pfil_hook_get(PFIL_IN); pfh; pfh = pfh->pfil_link.le_next)
                 if (pfh->pfil_func) {                  if (pfh->pfil_func) {
                         rv = pfh->pfil_func(ip, hlen, m->m_pkthdr.rcvif, 0, &m0);                          rv = pfh->pfil_func(ip, hlen, m->m_pkthdr.rcvif, 0, &m0);
                         ip = mtod(m = m0, struct ip *);  
                         if (rv)                          if (rv)
                                 goto next;                                  goto next;
                           ip = mtod(m = m0, struct ip *);
                 }                  }
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
Line 293  next:
Line 309  next:
                             ip->ip_dst.s_addr == ia->ia_net)                              ip->ip_dst.s_addr == ia->ia_net)
                                 goto ours;                                  goto ours;
                 }                  }
                   /*
                    * An interface with IP address zero accepts
                    * all packets that arrive on that interface.
                    */
                   if ((ia->ia_ifp == m->m_pkthdr.rcvif) &&
                       in_nullhost(ia->ia_addr.sin_addr))
                           goto ours;
         }          }
         if (IN_MULTICAST(ip->ip_dst.s_addr)) {          if (IN_MULTICAST(ip->ip_dst.s_addr)) {
                 struct in_multi *inm;                  struct in_multi *inm;
Line 373  ours:
Line 396  ours:
          * 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 & ~(IP_DF|IP_RF)) {
                 if (m->m_flags & M_EXT) {               /* XXX */  
                         if ((m = m_pullup(m, sizeof (struct ip))) == 0) {  
                                 ipstat.ips_toosmall++;  
                                 goto next;  
                         }  
                         ip = mtod(m, struct ip *);  
                 }  
                 /*                  /*
                  * Look for queue of fragments                   * Look for queue of fragments
                  * of this datagram.                   * of this datagram.
Line 426  found:
Line 442  found:
                                 goto bad;                                  goto bad;
                         }                          }
                         ipqe->ipqe_mff = mff;                          ipqe->ipqe_mff = mff;
                           ipqe->ipqe_m = m;
                         ipqe->ipqe_ip = ip;                          ipqe->ipqe_ip = ip;
                         ip = ip_reass(ipqe, fp);                          m = ip_reass(ipqe, fp);
                         if (ip == 0)                          if (m == 0)
                                 goto next;                                  goto next;
                         ipstat.ips_reassembled++;                          ipstat.ips_reassembled++;
                         m = dtom(ip);                          ip = mtod(m, struct ip *);
                 } else                  } else
                         if (fp)                          if (fp)
                                 ip_freef(fp);                                  ip_freef(fp);
Line 455  bad:
Line 472  bad:
  * reassembly of this datagram already exists, then it   * reassembly of this datagram already exists, then it
  * is given as fp; otherwise have to make a chain.   * is given as fp; otherwise have to make a chain.
  */   */
 struct ip *  struct mbuf *
 ip_reass(ipqe, fp)  ip_reass(ipqe, fp)
         register struct ipqent *ipqe;          register struct ipqent *ipqe;
         register struct ipq *fp;          register struct ipq *fp;
 {  {
         register struct mbuf *m = dtom(ipqe->ipqe_ip);          register struct mbuf *m = ipqe->ipqe_m;
         register struct ipqent *nq, *p, *q;          register struct ipqent *nq, *p, *q;
         struct ip *ip;          struct ip *ip;
         struct mbuf *t;          struct mbuf *t;
Line 478  ip_reass(ipqe, fp)
Line 495  ip_reass(ipqe, fp)
          * If first fragment to arrive, create a reassembly queue.           * If first fragment to arrive, create a reassembly queue.
          */           */
         if (fp == 0) {          if (fp == 0) {
                 if ((t = m_get(M_DONTWAIT, MT_FTABLE)) == NULL)                  MALLOC(fp, struct ipq *, sizeof (struct ipq),
                       M_FTABLE, M_NOWAIT);
                   if (fp == NULL)
                         goto dropfrag;                          goto dropfrag;
                 fp = mtod(t, struct ipq *);  
                 LIST_INSERT_HEAD(&ipq, fp, ipq_q);                  LIST_INSERT_HEAD(&ipq, fp, ipq_q);
                 fp->ipq_ttl = IPFRAGTTL;                  fp->ipq_ttl = IPFRAGTTL;
                 fp->ipq_p = ipqe->ipqe_ip->ip_p;                  fp->ipq_p = ipqe->ipqe_ip->ip_p;
Line 511  ip_reass(ipqe, fp)
Line 529  ip_reass(ipqe, fp)
                 if (i > 0) {                  if (i > 0) {
                         if (i >= ipqe->ipqe_ip->ip_len)                          if (i >= ipqe->ipqe_ip->ip_len)
                                 goto dropfrag;                                  goto dropfrag;
                         m_adj(dtom(ipqe->ipqe_ip), i);                          m_adj(ipqe->ipqe_m, i);
                         ipqe->ipqe_ip->ip_off += i;                          ipqe->ipqe_ip->ip_off += i;
                         ipqe->ipqe_ip->ip_len -= i;                          ipqe->ipqe_ip->ip_len -= i;
                 }                  }
Line 528  ip_reass(ipqe, fp)
Line 546  ip_reass(ipqe, fp)
                 if (i < q->ipqe_ip->ip_len) {                  if (i < q->ipqe_ip->ip_len) {
                         q->ipqe_ip->ip_len -= i;                          q->ipqe_ip->ip_len -= i;
                         q->ipqe_ip->ip_off += i;                          q->ipqe_ip->ip_off += i;
                         m_adj(dtom(q->ipqe_ip), i);                          m_adj(q->ipqe_m, i);
                         break;                          break;
                 }                  }
                 nq = q->ipqe_q.le_next;                  nq = q->ipqe_q.le_next;
                 m_freem(dtom(q->ipqe_ip));                  m_freem(q->ipqe_m);
                 LIST_REMOVE(q, ipqe_q);                  LIST_REMOVE(q, ipqe_q);
                 FREE(q, M_IPQ);                  FREE(q, M_IPQ);
         }          }
Line 568  insert:
Line 586  insert:
                 ip_freef(fp);                  ip_freef(fp);
                 return (0);                  return (0);
         }          }
         m = dtom(q->ipqe_ip);          m = q->ipqe_m;
         t = m->m_next;          t = m->m_next;
         m->m_next = 0;          m->m_next = 0;
         m_cat(m, t);          m_cat(m, t);
         nq = q->ipqe_q.le_next;          nq = q->ipqe_q.le_next;
         FREE(q, M_IPQ);          FREE(q, M_IPQ);
         for (q = nq; q != NULL; q = nq) {          for (q = nq; q != NULL; q = nq) {
                 t = dtom(q->ipqe_ip);                  t = q->ipqe_m;
                 nq = q->ipqe_q.le_next;                  nq = q->ipqe_q.le_next;
                 FREE(q, M_IPQ);                  FREE(q, M_IPQ);
                 m_cat(m, t);                  m_cat(m, t);
Line 591  insert:
Line 609  insert:
         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);
         (void) m_free(dtom(fp));          FREE(fp, M_FTABLE);
         m->m_len += (ip->ip_hl << 2);          m->m_len += (ip->ip_hl << 2);
         m->m_data -= (ip->ip_hl << 2);          m->m_data -= (ip->ip_hl << 2);
         /* some debugging cruft by sklower, below, will go away soon */          /* some debugging cruft by sklower, below, will go away soon */
         if (m->m_flags & M_PKTHDR) { /* XXX this should be done elsewhere */          if (m->m_flags & M_PKTHDR) { /* XXX this should be done elsewhere */
                 register int plen = 0;                  register int plen = 0;
                 for (t = m; m; m = m->m_next)                  for (t = m; t; t = t->m_next)
                         plen += m->m_len;                          plen += t->m_len;
                 t->m_pkthdr.len = plen;                  m->m_pkthdr.len = plen;
         }          }
         return (ip);          return (m);
   
 dropfrag:  dropfrag:
         ipstat.ips_fragdropped++;          ipstat.ips_fragdropped++;
Line 622  ip_freef(fp)
Line 640  ip_freef(fp)
   
         for (q = fp->ipq_fragq.lh_first; q != NULL; q = p) {          for (q = fp->ipq_fragq.lh_first; q != NULL; q = p) {
                 p = q->ipqe_q.le_next;                  p = q->ipqe_q.le_next;
                 m_freem(dtom(q->ipqe_ip));                  m_freem(q->ipqe_m);
                 LIST_REMOVE(q, ipqe_q);                  LIST_REMOVE(q, ipqe_q);
                 FREE(q, M_IPQ);                  FREE(q, M_IPQ);
         }          }
         LIST_REMOVE(fp, ipq_q);          LIST_REMOVE(fp, ipq_q);
         (void) m_free(dtom(fp));          FREE(fp, M_FTABLE);
 }  }
   
 /*  /*
Line 1240  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1258  ip_sysctl(name, namelen, oldp, oldlenp, 
         void *newp;          void *newp;
         size_t newlen;          size_t newlen;
 {  {
           extern int subnetsarelocal;
           int error;
   
         /* All sysctl names at this level are terminal. */          /* All sysctl names at this level are terminal. */
         if (namelen != 1)          if (namelen != 1)
                 return (ENOTDIR);                  return (ENOTDIR);
Line 1270  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1291  ip_sysctl(name, namelen, oldp, oldlenp, 
         case IPCTL_ALLOWSRCRT:          case IPCTL_ALLOWSRCRT:
                 return (sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                     &ip_allowsrcrt));                      &ip_allowsrcrt));
           case IPCTL_SUBNETSARELOCAL:
                   return (sysctl_int(oldp, oldlenp, newp, newlen,
                       &subnetsarelocal));
           case IPCTL_MTUDISC:
                   error = sysctl_int(oldp, oldlenp, newp, newlen,
                       &ip_mtudisc);
                   if (ip_mtudisc != 0 && ip_mtudisc_timeout_q == NULL) {
                           ip_mtudisc_timeout_q =
                               rt_timer_queue_create(ip_mtudisc_timeout);
                   } else if (ip_mtudisc == 0 && ip_mtudisc_timeout_q != NULL) {
                           rt_timer_queue_destroy(ip_mtudisc_timeout_q, TRUE);
                           ip_mtudisc_timeout_q = NULL;
                   }
                   return error;
           case IPCTL_MTUDISCTIMEOUT:
                   error = sysctl_int(oldp, oldlenp, newp, newlen,
                      &ip_mtudisc_timeout);
                   if (ip_mtudisc_timeout_q != NULL)
                           rt_timer_queue_change(ip_mtudisc_timeout_q,
                                                 ip_mtudisc_timeout);
                   return (error);
         default:          default:
                 return (EOPNOTSUPP);                  return (EOPNOTSUPP);
         }          }

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.53.2.1

CVSweb <webmaster@jp.NetBSD.org>