[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.78 and 1.82.2.5

version 1.78, 1999/01/19 21:58:40 version 1.82.2.5, 2000/03/02 10:24:18
Line 340  next:
Line 340  next:
                 }                  }
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
         }          }
   
           /*
            * RFC1122: packets with a multicast source address are
            * not allowed.
            */
           if (IN_MULTICAST(ip->ip_src.s_addr)) {
                   /* XXX stat */
                   goto bad;
           }
   
         if (in_cksum(m, hlen) != 0) {          if (in_cksum(m, hlen) != 0) {
                 ipstat.ips_badsum++;                  ipstat.ips_badsum++;
                 goto bad;                  goto bad;
Line 349  next:
Line 359  next:
          * Convert fields to host representation.           * Convert fields to host representation.
          */           */
         NTOHS(ip->ip_len);          NTOHS(ip->ip_len);
         NTOHS(ip->ip_id);  
         NTOHS(ip->ip_off);          NTOHS(ip->ip_off);
         len = ip->ip_len;          len = ip->ip_len;
   
         /*          /*
            * Check for additional length bogosity
            */
           if (len < hlen)
           {
                   ipstat.ips_badlen++;
                   goto bad;
           }
   
           /*
          * Check that the amount of data in the buffers           * Check that the amount of data in the buffers
          * is as at least much as the IP header would have us expect.           * is as at least much as the IP header would have us expect.
          * Trim mbufs if longer than we expect.           * Trim mbufs if longer than we expect.
Line 412  next:
Line 430  next:
          * Check our list of addresses, to see if the packet is for us.           * Check our list of addresses, to see if the packet is for us.
          */           */
         INADDR_TO_IA(ip->ip_dst, ia);          INADDR_TO_IA(ip->ip_dst, ia);
         if (ia != NULL) goto ours;          if (ia != NULL)
                   goto ours;
         if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {          if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
                 for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first;                  for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first;
                     ifa != NULL; ifa = ifa->ifa_list.tqe_next) {                      ifa != NULL; ifa = ifa->ifa_list.tqe_next) {
Line 461  next:
Line 480  next:
                          * as expected when ip_mforward() is called from                           * as expected when ip_mforward() is called from
                          * ip_output().)                           * ip_output().)
                          */                           */
                         ip->ip_id = htons(ip->ip_id);  
                         if (ip_mforward(m, m->m_pkthdr.rcvif) != 0) {                          if (ip_mforward(m, m->m_pkthdr.rcvif) != 0) {
                                 ipstat.ips_cantforward++;                                  ipstat.ips_cantforward++;
                                 m_freem(m);                                  m_freem(m);
                                 goto next;                                  goto next;
                         }                          }
                         ip->ip_id = ntohs(ip->ip_id);  
   
                         /*                          /*
                          * The process-level routing demon needs to receive                           * The process-level routing demon needs to receive
Line 572  found:
Line 589  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;
                 } else                  } else
                         if (fp)                          if (fp)
                                 ip_freef(fp);                                  ip_freef(fp);
                 IPQ_UNLOCK();                  IPQ_UNLOCK();
         } else          }
                 ip->ip_len -= hlen;  
   
         /*          /*
          * Switch out to protocol's input routine.           * Switch out to protocol's input routine.
          */           */
   #if IFA_STATS
           ia->ia_ifa.ifa_data.ifad_inbytes += ip->ip_len;
   #endif
         ipstat.ips_delivered++;          ipstat.ips_delivered++;
         (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen);          (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen);
         goto next;          goto next;
Line 836  ip_dooptions(m)
Line 856  ip_dooptions(m)
         struct mbuf *m;          struct mbuf *m;
 {  {
         register struct ip *ip = mtod(m, struct ip *);          register struct ip *ip = mtod(m, struct ip *);
         register u_char *cp;          register u_char *cp, *cp0;
         register struct ip_timestamp *ipt;          register struct ip_timestamp *ipt;
         register struct in_ifaddr *ia;          register struct in_ifaddr *ia;
         int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0;          int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0;
         struct in_addr *sin, dst;          struct in_addr dst;
         n_time ntime;          n_time ntime;
   
         dst = ip->ip_dst;          dst = ip->ip_dst;
Line 970  ip_dooptions(m)
Line 990  ip_dooptions(m)
                                         goto bad;                                          goto bad;
                                 break;                                  break;
                         }                          }
                         sin = (struct in_addr *)(cp + ipt->ipt_ptr - 1);                          cp0 = (cp + ipt->ipt_ptr - 1);
                         switch (ipt->ipt_flg) {                          switch (ipt->ipt_flg) {
   
                         case IPOPT_TS_TSONLY:                          case IPOPT_TS_TSONLY:
Line 985  ip_dooptions(m)
Line 1005  ip_dooptions(m)
                                                             m->m_pkthdr.rcvif);                                                              m->m_pkthdr.rcvif);
                                 if (ia == 0)                                  if (ia == 0)
                                         continue;                                          continue;
                                 bcopy((caddr_t)&ia->ia_addr.sin_addr,                                  bcopy(&ia->ia_addr.sin_addr,
                                     (caddr_t)sin, sizeof(struct in_addr));                                      cp0, sizeof(struct in_addr));
                                 ipt->ipt_ptr += sizeof(struct in_addr);                                  ipt->ipt_ptr += sizeof(struct in_addr);
                                 break;                                  break;
   
Line 994  ip_dooptions(m)
Line 1014  ip_dooptions(m)
                                 if (ipt->ipt_ptr - 1 + sizeof(n_time) +                                  if (ipt->ipt_ptr - 1 + sizeof(n_time) +
                                     sizeof(struct in_addr) > ipt->ipt_len)                                      sizeof(struct in_addr) > ipt->ipt_len)
                                         goto bad;                                          goto bad;
                                 bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr,                                  bcopy(cp0, &ipaddr.sin_addr,
                                     sizeof(struct in_addr));                                      sizeof(struct in_addr));
                                 if (ifa_ifwithaddr((SA)&ipaddr) == 0)                                  if (ifa_ifwithaddr((SA)&ipaddr) == 0)
                                         continue;                                          continue;
Line 1005  ip_dooptions(m)
Line 1025  ip_dooptions(m)
                                 goto bad;                                  goto bad;
                         }                          }
                         ntime = iptime();                          ntime = iptime();
                         bcopy((caddr_t)&ntime, (caddr_t)cp + ipt->ipt_ptr - 1,                          cp0 = (u_char *) &ntime;        /* XXX GCC BUG */
                           bcopy(cp0, (caddr_t)cp + ipt->ipt_ptr - 1,
                             sizeof(n_time));                              sizeof(n_time));
                         ipt->ipt_ptr += sizeof(n_time);                          ipt->ipt_ptr += sizeof(n_time);
                 }                  }
Line 1021  ip_dooptions(m)
Line 1042  ip_dooptions(m)
         }          }
         return (0);          return (0);
 bad:  bad:
         ip->ip_len -= ip->ip_hl << 2;   /* XXX icmp_error adds in hdr length */  
         icmp_error(m, type, code, 0, 0);          icmp_error(m, type, code, 0, 0);
         ipstat.ips_badoptions++;          ipstat.ips_badoptions++;
         return (1);          return (1);
Line 1164  ip_stripoptions(m, mopt)
Line 1184  ip_stripoptions(m, mopt)
         register caddr_t opts;          register caddr_t opts;
         int olen;          int olen;
   
         olen = (ip->ip_hl<<2) - sizeof (struct ip);          olen = (ip->ip_hl << 2) - sizeof (struct ip);
         opts = (caddr_t)(ip + 1);          opts = (caddr_t)(ip + 1);
         i = m->m_len - (sizeof (struct ip) + olen);          i = m->m_len - (sizeof (struct ip) + olen);
         bcopy(opts  + olen, opts, (unsigned)i);          bcopy(opts  + olen, opts, (unsigned)i);
         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_hl = sizeof(struct ip) >> 2;          ip->ip_len -= olen;
           ip->ip_hl = sizeof (struct ip) >> 2;
 }  }
   
 int inetctlerrmap[PRC_NCMDS] = {  int inetctlerrmap[PRC_NCMDS] = {
Line 1217  ip_forward(m, srcrt)
Line 1238  ip_forward(m, srcrt)
                     ntohl(ip->ip_src.s_addr),                      ntohl(ip->ip_src.s_addr),
                     ntohl(ip->ip_dst.s_addr), ip->ip_ttl);                      ntohl(ip->ip_dst.s_addr), ip->ip_ttl);
 #endif  #endif
         if (m->m_flags & M_BCAST || in_canforward(ip->ip_dst) == 0) {          if (m->m_flags & (M_BCAST|M_MCAST) || in_canforward(ip->ip_dst) == 0) {
                 ipstat.ips_cantforward++;                  ipstat.ips_cantforward++;
                 m_freem(m);                  m_freem(m);
                 return;                  return;

Legend:
Removed from v.1.78  
changed lines
  Added in v.1.82.2.5

CVSweb <webmaster@jp.NetBSD.org>