Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.213 retrieving revision 1.220 diff -u -p -r1.213 -r1.220 --- src/sys/netinet/ip_input.c 2005/03/29 09:37:08 1.213 +++ src/sys/netinet/ip_input.c 2005/10/23 18:38:53 1.220 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.213 2005/03/29 09:37:08 yamt Exp $ */ +/* $NetBSD: ip_input.c,v 1.220 2005/10/23 18:38:53 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -98,7 +98,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.213 2005/03/29 09:37:08 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.220 2005/10/23 18:38:53 christos Exp $"); #include "opt_inet.h" #include "opt_gateway.h" @@ -131,6 +131,7 @@ __KERNEL_RCSID(0, "$NetBSD: ip_input.c,v #include #include #include +#include #include #include #include @@ -200,7 +201,6 @@ int ipprintfs = 0; #endif int ip_do_randomid = 0; -int ip_do_loopback_cksum = 0; /* * XXX - Setting ip_checkinterface mostly implements the receive side of @@ -1823,13 +1823,9 @@ ip_forward(struct mbuf *m, int srcrt) struct ip *ip = mtod(m, struct ip *); struct sockaddr_in *sin; struct rtentry *rt; - int error, type = 0, code = 0; + int error, type = 0, code = 0, destmtu = 0; struct mbuf *mcopy; n_long dest; - struct ifnet *destifp; -#if defined(IPSEC) || defined(FAST_IPSEC) - struct ifnet dummyifp; -#endif /* * We are now in the output path. @@ -1872,7 +1868,7 @@ ip_forward(struct mbuf *m, int srcrt) rtalloc(&ipforward_rt); if (ipforward_rt.ro_rt == 0) { - icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, dest, 0); + icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); return; } rt = ipforward_rt.ro_rt; @@ -1943,7 +1939,6 @@ ip_forward(struct mbuf *m, int srcrt) } if (mcopy == NULL) return; - destifp = NULL; switch (error) { @@ -1965,7 +1960,7 @@ ip_forward(struct mbuf *m, int srcrt) code = ICMP_UNREACH_NEEDFRAG; #if !defined(IPSEC) && !defined(FAST_IPSEC) if (ipforward_rt.ro_rt) - destifp = ipforward_rt.ro_rt->rt_ifp; + destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; #else /* * If the packet is routed over IPsec tunnel, tell the @@ -1984,7 +1979,7 @@ ip_forward(struct mbuf *m, int srcrt) &ipsecerror); if (sp == NULL) - destifp = ipforward_rt.ro_rt->rt_ifp; + destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; else { /* count IPsec header size */ ipsechdr = ipsec4_hdrsiz(mcopy, @@ -1993,24 +1988,18 @@ ip_forward(struct mbuf *m, int srcrt) /* * find the correct route for outer IPv4 * header, compute tunnel MTU. - * - * XXX BUG ALERT - * The "dummyifp" code relies upon the fact - * that icmp_error() touches only ifp->if_mtu. */ - /*XXX*/ - destifp = NULL; + if (sp->req != NULL && sp->req->sav != NULL && sp->req->sav->sah != NULL) { ro = &sp->req->sav->sah->sa_route; if (ro->ro_rt && ro->ro_rt->rt_ifp) { - dummyifp.if_mtu = + destmtu = ro->ro_rt->rt_rmx.rmx_mtu ? ro->ro_rt->rt_rmx.rmx_mtu : ro->ro_rt->rt_ifp->if_mtu; - dummyifp.if_mtu -= ipsechdr; - destifp = &dummyifp; + destmtu -= ipsechdr; } } @@ -2042,7 +2031,7 @@ ip_forward(struct mbuf *m, int srcrt) break; #endif } - icmp_error(mcopy, type, code, dest, destifp); + icmp_error(mcopy, type, code, dest, destmtu); } void @@ -2342,4 +2331,11 @@ SYSCTL_SETUP(sysctl_net_inet_ip_setup, " NULL, 0, &ip_do_loopback_cksum, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_LOOPBACKCKSUM, CTL_EOL); + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_STRUCT, "stats", + SYSCTL_DESCR("IP statistics"), + NULL, 0, &ipstat, sizeof(ipstat), + CTL_NET, PF_INET, IPPROTO_IP, IPCTL_STATS, + CTL_EOL); }