[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.226 and 1.245

version 1.226, 2006/05/08 18:50:12 version 1.245, 2007/03/05 00:50:53
Line 121  __KERNEL_RCSID(0, "$NetBSD$");
Line 121  __KERNEL_RCSID(0, "$NetBSD$");
 #include <sys/kernel.h>  #include <sys/kernel.h>
 #include <sys/pool.h>  #include <sys/pool.h>
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   #include <sys/kauth.h>
   
 #include <net/if.h>  #include <net/if.h>
 #include <net/if_dl.h>  #include <net/if_dl.h>
Line 376  static struct ip_srcrt {
Line 377  static struct ip_srcrt {
 static void save_rte(u_char *, struct in_addr);  static void save_rte(u_char *, struct in_addr);
   
 #ifdef MBUFTRACE  #ifdef MBUFTRACE
 struct mowner ip_rx_mowner = { "internet", "rx" };  struct mowner ip_rx_mowner = MOWNER_INIT("internet", "rx");
 struct mowner ip_tx_mowner = { "internet", "tx" };  struct mowner ip_tx_mowner = MOWNER_INIT("internet", "tx");
 #endif  #endif
   
 /*  /*
Line 414  ip_init(void)
Line 415  ip_init(void)
         for (i = 0; i < IPREASS_NHASH; i++)          for (i = 0; i < IPREASS_NHASH; i++)
                 LIST_INIT(&ipq[i]);                  LIST_INIT(&ipq[i]);
   
         ip_id = time.tv_sec & 0xfffff;          ip_id = time_second & 0xfffff;
   
         ipintrq.ifq_maxlen = ipqmaxlen;          ipintrq.ifq_maxlen = ipqmaxlen;
         ip_nmbclusters_changed();          ip_nmbclusters_changed();
Line 445  ip_init(void)
Line 446  ip_init(void)
 #endif /* MBUFTRACE */  #endif /* MBUFTRACE */
 }  }
   
 struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  struct  sockaddr_in ipaddr = {
           .sin_len = sizeof(ipaddr),
           .sin_family = AF_INET,
   };
 struct  route ipforward_rt;  struct  route ipforward_rt;
   
 /*  /*
Line 457  ipintr(void)
Line 461  ipintr(void)
         int s;          int s;
         struct mbuf *m;          struct mbuf *m;
   
         while (1) {          while (!IF_IS_EMPTY(&ipintrq)) {
                 s = splnet();                  s = splnet();
                 IF_DEQUEUE(&ipintrq, m);                  IF_DEQUEUE(&ipintrq, m);
                 splx(s);                  splx(s);
Line 484  ip_input(struct mbuf *m)
Line 488  ip_input(struct mbuf *m)
         int downmatch;          int downmatch;
         int checkif;          int checkif;
         int srcrt = 0;          int srcrt = 0;
           int s;
         u_int hash;          u_int hash;
 #ifdef FAST_IPSEC  #ifdef FAST_IPSEC
         struct m_tag *mtag;          struct m_tag *mtag;
         struct tdb_ident *tdbi;          struct tdb_ident *tdbi;
         struct secpolicy *sp;          struct secpolicy *sp;
         int s, error;          int error;
 #endif /* FAST_IPSEC */  #endif /* FAST_IPSEC */
   
         MCLAIM(m, &ip_rx_mowner);          MCLAIM(m, &ip_rx_mowner);
Line 511  ip_input(struct mbuf *m)
Line 516  ip_input(struct mbuf *m)
          * it.  Otherwise, if it is aligned, make sure the entire           * it.  Otherwise, if it is aligned, make sure the entire
          * base IP header is in the first mbuf of the chain.           * base IP header is in the first mbuf of the chain.
          */           */
         if (IP_HDR_ALIGNED_P(mtod(m, caddr_t)) == 0) {          if (IP_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
                 if ((m = m_copyup(m, sizeof(struct ip),                  if ((m = m_copyup(m, sizeof(struct ip),
                                   (max_linkhdr + 3) & ~3)) == NULL) {                                    (max_linkhdr + 3) & ~3)) == NULL) {
                         /* XXXJRT new stat, please */                          /* XXXJRT new stat, please */
Line 938  found:
Line 943  found:
                  */                   */
                 if (mff || ip->ip_off != htons(0)) {                  if (mff || ip->ip_off != htons(0)) {
                         ipstat.ips_fragments++;                          ipstat.ips_fragments++;
                           s = splvm();
                         ipqe = pool_get(&ipqent_pool, PR_NOWAIT);                          ipqe = pool_get(&ipqent_pool, PR_NOWAIT);
                           splx(s);
                         if (ipqe == NULL) {                          if (ipqe == NULL) {
                                 ipstat.ips_rcvmemdrop++;                                  ipstat.ips_rcvmemdrop++;
                                 IPQ_UNLOCK();                                  IPQ_UNLOCK();
Line 1051  ip_reass(struct ipqent *ipqe, struct ipq
Line 1058  ip_reass(struct ipqent *ipqe, struct ipq
         struct ip *ip;          struct ip *ip;
         struct mbuf *t;          struct mbuf *t;
         int hlen = ipqe->ipqe_ip->ip_hl << 2;          int hlen = ipqe->ipqe_ip->ip_hl << 2;
         int i, next;          int i, next, s;
   
         IPQ_LOCK_CHECK();          IPQ_LOCK_CHECK();
   
Line 1156  ip_reass(struct ipqent *ipqe, struct ipq
Line 1163  ip_reass(struct ipqent *ipqe, struct ipq
                 nq = TAILQ_NEXT(q, ipqe_q);                  nq = TAILQ_NEXT(q, ipqe_q);
                 m_freem(q->ipqe_m);                  m_freem(q->ipqe_m);
                 TAILQ_REMOVE(&fp->ipq_fragq, q, ipqe_q);                  TAILQ_REMOVE(&fp->ipq_fragq, q, ipqe_q);
                   s = splvm();
                 pool_put(&ipqent_pool, q);                  pool_put(&ipqent_pool, q);
                   splx(s);
                 fp->ipq_nfrags--;                  fp->ipq_nfrags--;
                 ip_nfrags--;                  ip_nfrags--;
         }          }
Line 1197  insert:
Line 1206  insert:
         m->m_next = 0;          m->m_next = 0;
         m_cat(m, t);          m_cat(m, t);
         nq = TAILQ_NEXT(q, ipqe_q);          nq = TAILQ_NEXT(q, ipqe_q);
           s = splvm();
         pool_put(&ipqent_pool, q);          pool_put(&ipqent_pool, q);
           splx(s);
         for (q = nq; q != NULL; q = nq) {          for (q = nq; q != NULL; q = nq) {
                 t = q->ipqe_m;                  t = q->ipqe_m;
                 nq = TAILQ_NEXT(q, ipqe_q);                  nq = TAILQ_NEXT(q, ipqe_q);
                   s = splvm();
                 pool_put(&ipqent_pool, q);                  pool_put(&ipqent_pool, q);
                   splx(s);
                 m_cat(m, t);                  m_cat(m, t);
         }          }
         ip_nfrags -= fp->ipq_nfrags;          ip_nfrags -= fp->ipq_nfrags;
Line 1236  dropfrag:
Line 1249  dropfrag:
         ip_nfrags--;          ip_nfrags--;
         ipstat.ips_fragdropped++;          ipstat.ips_fragdropped++;
         m_freem(m);          m_freem(m);
           s = splvm();
         pool_put(&ipqent_pool, ipqe);          pool_put(&ipqent_pool, ipqe);
           splx(s);
         return (0);          return (0);
 }  }
   
Line 1249  ip_freef(struct ipq *fp)
Line 1264  ip_freef(struct ipq *fp)
 {  {
         struct ipqent *q, *p;          struct ipqent *q, *p;
         u_int nfrags = 0;          u_int nfrags = 0;
           int s;
   
         IPQ_LOCK_CHECK();          IPQ_LOCK_CHECK();
   
Line 1257  ip_freef(struct ipq *fp)
Line 1273  ip_freef(struct ipq *fp)
                 m_freem(q->ipqe_m);                  m_freem(q->ipqe_m);
                 nfrags++;                  nfrags++;
                 TAILQ_REMOVE(&fp->ipq_fragq, q, ipqe_q);                  TAILQ_REMOVE(&fp->ipq_fragq, q, ipqe_q);
                   s = splvm();
                 pool_put(&ipqent_pool, q);                  pool_put(&ipqent_pool, q);
                   splx(s);
         }          }
   
         if (nfrags != fp->ipq_nfrags)          if (nfrags != fp->ipq_nfrags)
Line 1389  ip_slowtimo(void)
Line 1407  ip_slowtimo(void)
                 dropscanidx = i;                  dropscanidx = i;
         }          }
         IPQ_UNLOCK();          IPQ_UNLOCK();
 #ifdef GATEWAY  
         ipflow_slowtimo();  
 #endif  
         splx(s);          splx(s);
 }  }
   
Line 1510  ip_dooptions(struct mbuf *m)
Line 1525  ip_dooptions(struct mbuf *m)
                         /*                          /*
                          * locate outgoing interface                           * locate outgoing interface
                          */                           */
                         bcopy((caddr_t)(cp + off), (caddr_t)&ipaddr.sin_addr,                          bcopy((void *)(cp + off), (void *)&ipaddr.sin_addr,
                             sizeof(ipaddr.sin_addr));                              sizeof(ipaddr.sin_addr));
                         if (opt == IPOPT_SSRR)                          if (opt == IPOPT_SSRR)
                                 ia = ifatoia(ifa_ifwithladdr(sintosa(&ipaddr)));                                  ia = ifatoia(ifa_ifwithladdr(sintosa(&ipaddr)));
Line 1522  ip_dooptions(struct mbuf *m)
Line 1537  ip_dooptions(struct mbuf *m)
                                 goto bad;                                  goto bad;
                         }                          }
                         ip->ip_dst = ipaddr.sin_addr;                          ip->ip_dst = ipaddr.sin_addr;
                         bcopy((caddr_t)&ia->ia_addr.sin_addr,                          bcopy((void *)&ia->ia_addr.sin_addr,
                             (caddr_t)(cp + off), sizeof(struct in_addr));                              (void *)(cp + off), sizeof(struct in_addr));
                         cp[IPOPT_OFFSET] += sizeof(struct in_addr);                          cp[IPOPT_OFFSET] += sizeof(struct in_addr);
                         /*                          /*
                          * Let ip_intr's mcast routing check handle mcast pkts                           * Let ip_intr's mcast routing check handle mcast pkts
Line 1546  ip_dooptions(struct mbuf *m)
Line 1561  ip_dooptions(struct mbuf *m)
                         off--;                  /* 0 origin */                          off--;                  /* 0 origin */
                         if ((off + sizeof(struct in_addr)) > optlen)                          if ((off + sizeof(struct in_addr)) > optlen)
                                 break;                                  break;
                         bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr,                          bcopy((void *)(&ip->ip_dst), (void *)&ipaddr.sin_addr,
                             sizeof(ipaddr.sin_addr));                              sizeof(ipaddr.sin_addr));
                         /*                          /*
                          * locate outgoing interface; if we're the destination,                           * locate outgoing interface; if we're the destination,
Line 1559  ip_dooptions(struct mbuf *m)
Line 1574  ip_dooptions(struct mbuf *m)
                                 code = ICMP_UNREACH_HOST;                                  code = ICMP_UNREACH_HOST;
                                 goto bad;                                  goto bad;
                         }                          }
                         bcopy((caddr_t)&ia->ia_addr.sin_addr,                          bcopy((void *)&ia->ia_addr.sin_addr,
                             (caddr_t)(cp + off), sizeof(struct in_addr));                              (void *)(cp + off), sizeof(struct in_addr));
                         cp[IPOPT_OFFSET] += sizeof(struct in_addr);                          cp[IPOPT_OFFSET] += sizeof(struct in_addr);
                         break;                          break;
   
Line 1629  ip_dooptions(struct mbuf *m)
Line 1644  ip_dooptions(struct mbuf *m)
                         }                          }
                         ntime = iptime();                          ntime = iptime();
                         cp0 = (u_char *) &ntime; /* XXX grumble, GCC... */                          cp0 = (u_char *) &ntime; /* XXX grumble, GCC... */
                         bcopy(cp0, (caddr_t)cp + ipt->ipt_ptr - 1,                          memmove((char *)cp + ipt->ipt_ptr - 1, cp0,
                             sizeof(n_time));                              sizeof(n_time));
                         ipt->ipt_ptr += sizeof(n_time);                          ipt->ipt_ptr += sizeof(n_time);
                 }                  }
Line 1657  bad:
Line 1672  bad:
 struct in_ifaddr *  struct in_ifaddr *
 ip_rtaddr(struct in_addr dst)  ip_rtaddr(struct in_addr dst)
 {  {
         struct sockaddr_in *sin;          if (!in_hosteq(dst, satocsin(rtcache_getdst(&ipforward_rt))->sin_addr))
                   rtcache_free(&ipforward_rt);
           else
                   rtcache_check(&ipforward_rt);
   
         sin = satosin(&ipforward_rt.ro_dst);          if (ipforward_rt.ro_rt == NULL) {
                   struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst);
   
         if (ipforward_rt.ro_rt == 0 || !in_hosteq(dst, sin->sin_addr)) {  
                 if (ipforward_rt.ro_rt) {  
                         RTFREE(ipforward_rt.ro_rt);  
                         ipforward_rt.ro_rt = 0;  
                 }  
                 sin->sin_family = AF_INET;                  sin->sin_family = AF_INET;
                 sin->sin_len = sizeof(*sin);                  sin->sin_len = sizeof(*sin);
                 sin->sin_addr = dst;                  sin->sin_addr = dst;
   
                 rtalloc(&ipforward_rt);                  rtcache_init(&ipforward_rt);
                   if (ipforward_rt.ro_rt == NULL)
                           return NULL;
         }          }
         if (ipforward_rt.ro_rt == 0)          return ifatoia(ipforward_rt.ro_rt->rt_ifa);
                 return ((struct in_ifaddr *)0);  
         return (ifatoia(ipforward_rt.ro_rt->rt_ifa));  
 }  }
   
 /*  /*
Line 1693  save_rte(u_char *option, struct in_addr 
Line 1707  save_rte(u_char *option, struct in_addr 
 #endif /* 0 */  #endif /* 0 */
         if (olen > sizeof(ip_srcrt) - (1 + sizeof(dst)))          if (olen > sizeof(ip_srcrt) - (1 + sizeof(dst)))
                 return;                  return;
         bcopy((caddr_t)option, (caddr_t)ip_srcrt.srcopt, olen);          bcopy((void *)option, (void *)ip_srcrt.srcopt, olen);
         ip_nhops = (olen - IPOPT_OFFSET - 1) / sizeof(struct in_addr);          ip_nhops = (olen - IPOPT_OFFSET - 1) / sizeof(struct in_addr);
         ip_srcrt.dst = dst;          ip_srcrt.dst = dst;
 }  }
Line 1710  ip_srcroute(void)
Line 1724  ip_srcroute(void)
         struct mbuf *m;          struct mbuf *m;
   
         if (ip_nhops == 0)          if (ip_nhops == 0)
                 return ((struct mbuf *)0);                  return NULL;
         m = m_get(M_DONTWAIT, MT_SOOPTS);          m = m_get(M_DONTWAIT, MT_SOOPTS);
         if (m == 0)          if (m == 0)
                 return ((struct mbuf *)0);                  return NULL;
   
         MCLAIM(m, &inetdomain.dom_mowner);          MCLAIM(m, &inetdomain.dom_mowner);
 #define OPTSIZ  (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt))  #define OPTSIZ  (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt))
Line 1741  ip_srcroute(void)
Line 1755  ip_srcroute(void)
          */           */
         ip_srcrt.nop = IPOPT_NOP;          ip_srcrt.nop = IPOPT_NOP;
         ip_srcrt.srcopt[IPOPT_OFFSET] = IPOPT_MINOFF;          ip_srcrt.srcopt[IPOPT_OFFSET] = IPOPT_MINOFF;
         bcopy((caddr_t)&ip_srcrt.nop,          memmove(mtod(m, char *) + sizeof(struct in_addr), &ip_srcrt.nop,
             mtod(m, caddr_t) + sizeof(struct in_addr), OPTSIZ);              OPTSIZ);
         q = (struct in_addr *)(mtod(m, caddr_t) +          q = (struct in_addr *)(mtod(m, char *) +
             sizeof(struct in_addr) + OPTSIZ);              sizeof(struct in_addr) + OPTSIZ);
 #undef OPTSIZ  #undef OPTSIZ
         /*          /*
Line 1780  ip_stripoptions(struct mbuf *m, struct m
Line 1794  ip_stripoptions(struct mbuf *m, struct m
 {  {
         int i;          int i;
         struct ip *ip = mtod(m, struct ip *);          struct ip *ip = mtod(m, struct ip *);
         caddr_t opts;          void *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 = (void *)(ip + 1);
         i = m->m_len - (sizeof (struct ip) + olen);          i = m->m_len - (sizeof (struct ip) + olen);
         bcopy(opts  + olen, opts, (unsigned)i);          memmove(opts, (char *)opts + olen, (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;
Line 1821  void
Line 1835  void
 ip_forward(struct mbuf *m, int srcrt)  ip_forward(struct mbuf *m, int srcrt)
 {  {
         struct ip *ip = mtod(m, struct ip *);          struct ip *ip = mtod(m, struct ip *);
         struct sockaddr_in *sin;  
         struct rtentry *rt;          struct rtentry *rt;
         int error, type = 0, code = 0, destmtu = 0;          int error, type = 0, code = 0, destmtu = 0;
         struct mbuf *mcopy;          struct mbuf *mcopy;
Line 1854  ip_forward(struct mbuf *m, int srcrt)
Line 1867  ip_forward(struct mbuf *m, int srcrt)
                 return;                  return;
         }          }
   
         sin = satosin(&ipforward_rt.ro_dst);          if (!in_hosteq(ip->ip_dst,
         if ((rt = ipforward_rt.ro_rt) == 0 ||                         satocsin(rtcache_getdst(&ipforward_rt))->sin_addr))
             !in_hosteq(ip->ip_dst, sin->sin_addr)) {                  rtcache_free(&ipforward_rt);
                 if (ipforward_rt.ro_rt) {          else
                         RTFREE(ipforward_rt.ro_rt);                  rtcache_check(&ipforward_rt);
                         ipforward_rt.ro_rt = 0;          if (ipforward_rt.ro_rt == NULL) {
                 }                  struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst);
   
                 sin->sin_family = AF_INET;                  sin->sin_family = AF_INET;
                 sin->sin_len = sizeof(struct sockaddr_in);                  sin->sin_len = sizeof(*sin);
                 sin->sin_addr = ip->ip_dst;                  sin->sin_addr = ip->ip_dst;
   
                 rtalloc(&ipforward_rt);                  rtcache_init(&ipforward_rt);
                 if (ipforward_rt.ro_rt == 0) {                  if (ipforward_rt.ro_rt == NULL) {
                         icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0);                          icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0);
                         return;                          return;
                 }                  }
                 rt = ipforward_rt.ro_rt;  
         }          }
           rt = ipforward_rt.ro_rt;
   
         /*          /*
          * Save at most 68 bytes of the packet in case           * Save at most 68 bytes of the packet in case
Line 1917  ip_forward(struct mbuf *m, int srcrt)
Line 1931  ip_forward(struct mbuf *m, int srcrt)
                 }                  }
         }          }
   
         error = ip_output(m, (struct mbuf *)0, &ipforward_rt,          error = ip_output(m, NULL, &ipforward_rt,
             (IP_FORWARDING | (ip_directedbcast ? IP_ALLOWBROADCAST : 0)),              (IP_FORWARDING | (ip_directedbcast ? IP_ALLOWBROADCAST : 0)),
             (struct ip_moptions *)NULL, (struct socket *)NULL);              (struct ip_moptions *)NULL, (struct socket *)NULL);
   
Line 1960  ip_forward(struct mbuf *m, int srcrt)
Line 1974  ip_forward(struct mbuf *m, int srcrt)
                 type = ICMP_UNREACH;                  type = ICMP_UNREACH;
                 code = ICMP_UNREACH_NEEDFRAG;                  code = ICMP_UNREACH_NEEDFRAG;
 #if !defined(IPSEC) && !defined(FAST_IPSEC)  #if !defined(IPSEC) && !defined(FAST_IPSEC)
                 if (ipforward_rt.ro_rt)                  if (ipforward_rt.ro_rt != NULL)
                         destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu;                          destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu;
 #else  #else
                 /*                  /*
Line 1969  ip_forward(struct mbuf *m, int srcrt)
Line 1983  ip_forward(struct mbuf *m, int srcrt)
                  *      tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz                   *      tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz
                  * XXX quickhack!!!                   * XXX quickhack!!!
                  */                   */
                 if (ipforward_rt.ro_rt) {                  if (ipforward_rt.ro_rt != NULL) {
                         struct secpolicy *sp;                          struct secpolicy *sp;
                         int ipsecerror;                          int ipsecerror;
                         size_t ipsechdr;                          size_t ipsechdr;
Line 2044  ip_savecontrol(struct inpcb *inp, struct
Line 2058  ip_savecontrol(struct inpcb *inp, struct
                 struct timeval tv;                  struct timeval tv;
   
                 microtime(&tv);                  microtime(&tv);
                 *mp = sbcreatecontrol((caddr_t) &tv, sizeof(tv),                  *mp = sbcreatecontrol((void *) &tv, sizeof(tv),
                     SCM_TIMESTAMP, SOL_SOCKET);                      SCM_TIMESTAMP, SOL_SOCKET);
                 if (*mp)                  if (*mp)
                         mp = &(*mp)->m_next;                          mp = &(*mp)->m_next;
         }          }
         if (inp->inp_flags & INP_RECVDSTADDR) {          if (inp->inp_flags & INP_RECVDSTADDR) {
                 *mp = sbcreatecontrol((caddr_t) &ip->ip_dst,                  *mp = sbcreatecontrol((void *) &ip->ip_dst,
                     sizeof(struct in_addr), IP_RECVDSTADDR, IPPROTO_IP);                      sizeof(struct in_addr), IP_RECVDSTADDR, IPPROTO_IP);
                 if (*mp)                  if (*mp)
                         mp = &(*mp)->m_next;                          mp = &(*mp)->m_next;
Line 2064  ip_savecontrol(struct inpcb *inp, struct
Line 2078  ip_savecontrol(struct inpcb *inp, struct
          */           */
         /* options were tossed already */          /* options were tossed already */
         if (inp->inp_flags & INP_RECVOPTS) {          if (inp->inp_flags & INP_RECVOPTS) {
                 *mp = sbcreatecontrol((caddr_t) opts_deleted_above,                  *mp = sbcreatecontrol((void *) opts_deleted_above,
                     sizeof(struct in_addr), IP_RECVOPTS, IPPROTO_IP);                      sizeof(struct in_addr), IP_RECVOPTS, IPPROTO_IP);
                 if (*mp)                  if (*mp)
                         mp = &(*mp)->m_next;                          mp = &(*mp)->m_next;
         }          }
         /* ip_srcroute doesn't do what we want here, need to fix */          /* ip_srcroute doesn't do what we want here, need to fix */
         if (inp->inp_flags & INP_RECVRETOPTS) {          if (inp->inp_flags & INP_RECVRETOPTS) {
                 *mp = sbcreatecontrol((caddr_t) ip_srcroute(),                  *mp = sbcreatecontrol((void *) ip_srcroute(),
                     sizeof(struct in_addr), IP_RECVRETOPTS, IPPROTO_IP);                      sizeof(struct in_addr), IP_RECVRETOPTS, IPPROTO_IP);
                 if (*mp)                  if (*mp)
                         mp = &(*mp)->m_next;                          mp = &(*mp)->m_next;
Line 2085  ip_savecontrol(struct inpcb *inp, struct
Line 2099  ip_savecontrol(struct inpcb *inp, struct
                 sdl.sdl_index = m->m_pkthdr.rcvif ?                  sdl.sdl_index = m->m_pkthdr.rcvif ?
                     m->m_pkthdr.rcvif->if_index : 0;                      m->m_pkthdr.rcvif->if_index : 0;
                 sdl.sdl_nlen = sdl.sdl_alen = sdl.sdl_slen = 0;                  sdl.sdl_nlen = sdl.sdl_alen = sdl.sdl_slen = 0;
                 *mp = sbcreatecontrol((caddr_t) &sdl, sdl.sdl_len,                  *mp = sbcreatecontrol((void *) &sdl, sdl.sdl_len,
                     IP_RECVIF, IPPROTO_IP);                      IP_RECVIF, IPPROTO_IP);
                 if (*mp)                  if (*mp)
                         mp = &(*mp)->m_next;                          mp = &(*mp)->m_next;
Line 2093  ip_savecontrol(struct inpcb *inp, struct
Line 2107  ip_savecontrol(struct inpcb *inp, struct
 }  }
   
 /*  /*
    * sysctl helper routine for net.inet.ip.forwsrcrt.
    */
   static int
   sysctl_net_inet_ip_forwsrcrt(SYSCTLFN_ARGS)
   {
           int error, tmp;
           struct sysctlnode node;
   
           node = *rnode;
           tmp = ip_forwsrcrt;
           node.sysctl_data = &tmp;
           error = sysctl_lookup(SYSCTLFN_CALL(&node));
           if (error || newp == NULL)
                   return (error);
   
           if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_FORWSRCRT,
               0, NULL, NULL, NULL))
                   return (EPERM);
   
           ip_forwsrcrt = tmp;
   
           return (0);
   }
   
   /*
  * sysctl helper routine for net.inet.ip.mtudisctimeout.  checks the   * sysctl helper routine for net.inet.ip.mtudisctimeout.  checks the
  * range of the new value and tweaks timers if it changes.   * range of the new value and tweaks timers if it changes.
  */   */
Line 2193  SYSCTL_SETUP(sysctl_net_inet_ip_setup, "
Line 2232  SYSCTL_SETUP(sysctl_net_inet_ip_setup, "
                        IPCTL_DEFMTU, CTL_EOL);                         IPCTL_DEFMTU, CTL_EOL);
 #endif /* IPCTL_DEFMTU */  #endif /* IPCTL_DEFMTU */
         sysctl_createv(clog, 0, NULL, NULL,          sysctl_createv(clog, 0, NULL, NULL,
                        CTLFLAG_PERMANENT|CTLFLAG_READONLY1,                         CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                        CTLTYPE_INT, "forwsrcrt",                         CTLTYPE_INT, "forwsrcrt",
                        SYSCTL_DESCR("Enable forwarding of source-routed "                         SYSCTL_DESCR("Enable forwarding of source-routed "
                                     "datagrams"),                                      "datagrams"),
                        NULL, 0, &ip_forwsrcrt, 0,                         sysctl_net_inet_ip_forwsrcrt, 0, &ip_forwsrcrt, 0,
                        CTL_NET, PF_INET, IPPROTO_IP,                         CTL_NET, PF_INET, IPPROTO_IP,
                        IPCTL_FORWSRCRT, CTL_EOL);                         IPCTL_FORWSRCRT, CTL_EOL);
         sysctl_createv(clog, 0, NULL, NULL,          sysctl_createv(clog, 0, NULL, NULL,

Legend:
Removed from v.1.226  
changed lines
  Added in v.1.245

CVSweb <webmaster@jp.NetBSD.org>