[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.223.4.1 and 1.236.2.1.4.1

version 1.223.4.1, 2006/09/09 02:58:47 version 1.236.2.1.4.1, 2008/03/30 15:26:11
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 487  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 941  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 1009  found:
Line 1013  found:
                         /* XXX error stat??? */                          /* XXX error stat??? */
                         error = EINVAL;                          error = EINVAL;
 DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/  DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
                         goto bad;  
                 }                  }
                 splx(s);                  splx(s);
                 if (error)                  if (error)
Line 1054  ip_reass(struct ipqent *ipqe, struct ipq
Line 1057  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 1159  ip_reass(struct ipqent *ipqe, struct ipq
Line 1162  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 1200  insert:
Line 1205  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 1239  dropfrag:
Line 1248  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 1252  ip_freef(struct ipq *fp)
Line 1263  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 1260  ip_freef(struct ipq *fp)
Line 1272  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 1962  ip_forward(struct mbuf *m, int srcrt)
Line 1976  ip_forward(struct mbuf *m, int srcrt)
         case EMSGSIZE:          case EMSGSIZE:
                 type = ICMP_UNREACH;                  type = ICMP_UNREACH;
                 code = ICMP_UNREACH_NEEDFRAG;                  code = ICMP_UNREACH_NEEDFRAG;
 #if !defined(IPSEC) && !defined(FAST_IPSEC)  
                 if (ipforward_rt.ro_rt)  
                         destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu;  
 #else  
                 /*  
                  * If the packet is routed over IPsec tunnel, tell the  
                  * originator the tunnel MTU.  
                  *      tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz  
                  * XXX quickhack!!!  
                  */  
                 if (ipforward_rt.ro_rt) {                  if (ipforward_rt.ro_rt) {
   
   #if defined(IPSEC) || defined(FAST_IPSEC)
                           /*
                            * If the packet is routed over IPsec tunnel, tell the
                            * originator the tunnel MTU.
                            *      tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz
                            * XXX quickhack!!!
                            */
   
                         struct secpolicy *sp;                          struct secpolicy *sp;
                         int ipsecerror;                          int ipsecerror;
                         size_t ipsechdr;                          size_t ipsechdr;
Line 1981  ip_forward(struct mbuf *m, int srcrt)
Line 1995  ip_forward(struct mbuf *m, int srcrt)
                         sp = ipsec4_getpolicybyaddr(mcopy,                          sp = ipsec4_getpolicybyaddr(mcopy,
                             IPSEC_DIR_OUTBOUND, IP_FORWARDING,                              IPSEC_DIR_OUTBOUND, IP_FORWARDING,
                             &ipsecerror);                              &ipsecerror);
   #endif
   
                         if (sp == NULL)                          destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu;
                                 destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu;  #if defined(IPSEC) || defined(FAST_IPSEC)
                         else {                          if (sp != NULL) {
                                 /* count IPsec header size */                                  /* count IPsec header size */
                                 ipsechdr = ipsec4_hdrsiz(mcopy,                                  ipsechdr = ipsec4_hdrsiz(mcopy,
                                     IPSEC_DIR_OUTBOUND, NULL);                                      IPSEC_DIR_OUTBOUND, NULL);
Line 2013  ip_forward(struct mbuf *m, int srcrt)
Line 2028  ip_forward(struct mbuf *m, int srcrt)
                                 KEY_FREESP(&sp);                                  KEY_FREESP(&sp);
 #endif  #endif
                         }                          }
   #endif /*defined(IPSEC) || defined(FAST_IPSEC)*/
                 }                  }
 #endif /*IPSEC*/  
                 ipstat.ips_cantfrag++;                  ipstat.ips_cantfrag++;
                 break;                  break;
   
Line 2111  sysctl_net_inet_ip_forwsrcrt(SYSCTLFN_AR
Line 2126  sysctl_net_inet_ip_forwsrcrt(SYSCTLFN_AR
         if (error || newp == NULL)          if (error || newp == NULL)
                 return (error);                  return (error);
   
         if (securelevel > 0)          if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_FORWSRCRT,
               0, NULL, NULL, NULL))
                 return (EPERM);                  return (EPERM);
   
         ip_forwsrcrt = tmp;          ip_forwsrcrt = tmp;

Legend:
Removed from v.1.223.4.1  
changed lines
  Added in v.1.236.2.1.4.1

CVSweb <webmaster@jp.NetBSD.org>