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.169.2.8 retrieving revision 1.196 diff -u -p -r1.169.2.8 -r1.196 --- src/sys/netinet/ip_input.c 2005/11/10 14:11:07 1.169.2.8 +++ src/sys/netinet/ip_input.c 2004/01/15 05:13:17 1.196 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.169.2.8 2005/11/10 14:11:07 skrll Exp $ */ +/* $NetBSD: ip_input.c,v 1.196 2004/01/15 05:13:17 itojun Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -98,7 +98,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.169.2.8 2005/11/10 14:11:07 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.196 2004/01/15 05:13:17 itojun Exp $"); #include "opt_inet.h" #include "opt_gateway.h" @@ -131,7 +131,6 @@ __KERNEL_RCSID(0, "$NetBSD: ip_input.c,v #include #include #include -#include #include #include #include @@ -220,10 +219,11 @@ int ip_checkinterface = 0; struct rttimer_queue *ip_mtudisc_timeout_q = NULL; +extern struct domain inetdomain; int ipqmaxlen = IFQ_MAXLEN; u_long in_ifaddrhash; /* size of hash table - 1 */ int in_ifaddrentries; /* total number of addrs */ -struct in_ifaddrhead in_ifaddrhead; +struct in_ifaddrhead in_ifaddrhead; struct in_ifaddrhashhead *in_ifaddrhashtbl; u_long in_multihash; /* size of hash table - 1 */ int in_multientries; /* total number of addrs */ @@ -241,7 +241,7 @@ struct pfil_head inet_pfil_hook; * recalculate IP parameters derived from nmbclusters. */ static int ip_nmbclusters; /* copy of nmbclusters */ -static void ip_nmbclusters_changed(void); /* recalc limits */ +static void ip_nmbclusters_changed __P((void)); /* recalc limits */ #define CHECK_NMBCLUSTER_PARAMS() \ do { \ @@ -257,7 +257,7 @@ do { \ (((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK) struct ipqhead ipq[IPREASS_NHASH]; int ipq_locked; -static int ip_nfragpackets; /* packets in reass queue */ +static int ip_nfragpackets; /* packets in reass queue */ static int ip_nfrags; /* total fragments in reass queues */ int ip_maxfragpackets = 200; /* limit on packets. XXX sysctl */ @@ -267,7 +267,7 @@ int ip_maxfrags; /* limit on fr /* * Additive-Increase/Multiplicative-Decrease (AIMD) strategy for * IP reassembly queue buffer managment. - * + * * We keep a count of total IP fragments (NB: not fragmented packets!) * awaiting reassembly (ip_nfrags) and a limit (ip_maxfrags) on fragments. * If ip_nfrags exceeds ip_maxfrags the limit, we drop half the @@ -275,15 +275,15 @@ int ip_maxfrags; /* limit on fr * repeatedly deleting single packets under heavy fragmentation load * (e.g., from lossy NFS peers). */ -static u_int ip_reass_ttl_decr(u_int ticks); -static void ip_reass_drophalf(void); +static u_int ip_reass_ttl_decr __P((u_int ticks)); +static void ip_reass_drophalf __P((void)); -static __inline int ipq_lock_try(void); -static __inline void ipq_unlock(void); +static __inline int ipq_lock_try __P((void)); +static __inline void ipq_unlock __P((void)); static __inline int -ipq_lock_try(void) +ipq_lock_try() { int s; @@ -302,7 +302,7 @@ ipq_lock_try(void) } static __inline void -ipq_unlock(void) +ipq_unlock() { int s; @@ -333,8 +333,8 @@ do { \ #define IPQ_UNLOCK() ipq_unlock() -POOL_INIT(inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl", NULL); -POOL_INIT(ipqent_pool, sizeof(struct ipqent), 0, 0, 0, "ipqepl", NULL); +struct pool inmulti_pool; +struct pool ipqent_pool; #ifdef INET_CSUM_COUNTERS #include @@ -348,10 +348,6 @@ struct evcnt ip_swcsum = EVCNT_INITIALIZ #define INET_CSUM_COUNTER_INCR(ev) (ev)->ev_count++ -EVCNT_ATTACH_STATIC(ip_hwcsum_bad); -EVCNT_ATTACH_STATIC(ip_hwcsum_ok); -EVCNT_ATTACH_STATIC(ip_swcsum); - #else #define INET_CSUM_COUNTER_INCR(ev) /* nothing */ @@ -373,7 +369,7 @@ static struct ip_srcrt { struct in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)]; } ip_srcrt; -static void save_rte(u_char *, struct in_addr); +static void save_rte __P((u_char *, struct in_addr)); #ifdef MBUFTRACE struct mowner ip_rx_mowner = { "internet", "rx" }; @@ -395,11 +391,16 @@ ip_nmbclusters_changed(void) * All protocols not implemented in kernel go to raw IP protocol handler. */ void -ip_init(void) +ip_init() { - const struct protosw *pr; + struct protosw *pr; int i; + pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl", + NULL); + pool_init(&ipqent_pool, sizeof(struct ipqent), 0, 0, 0, "ipqepl", + NULL); + pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW); if (pr == 0) panic("ip_init"); @@ -439,6 +440,12 @@ ip_init(void) "error %d\n", i); #endif /* PFIL_HOOKS */ +#ifdef INET_CSUM_COUNTERS + evcnt_attach_static(&ip_hwcsum_bad); + evcnt_attach_static(&ip_hwcsum_ok); + evcnt_attach_static(&ip_swcsum); +#endif /* INET_CSUM_COUNTERS */ + #ifdef MBUFTRACE MOWNER_ATTACH(&ip_tx_mowner); MOWNER_ATTACH(&ip_rx_mowner); @@ -452,7 +459,7 @@ struct route ipforward_rt; * IP software interrupt routine */ void -ipintr(void) +ipintr() { int s; struct mbuf *m; @@ -573,16 +580,10 @@ ip_input(struct mbuf *m) break; default: - /* - * Must compute it ourselves. Maybe skip checksum on - * loopback interfaces. - */ - if (__predict_true(!(m->m_pkthdr.rcvif->if_flags & - IFF_LOOPBACK) || ip_do_loopback_cksum)) { - INET_CSUM_COUNTER_INCR(&ip_swcsum); - if (in_cksum(m, hlen) != 0) - goto badcsum; - } + /* Must compute it ourselves. */ + INET_CSUM_COUNTER_INCR(&ip_swcsum); + if (in_cksum(m, hlen) != 0) + goto bad; break; } @@ -656,20 +657,6 @@ ip_input(struct mbuf *m) return; ip = mtod(m, struct ip *); hlen = ip->ip_hl << 2; - /* - * XXX The setting of "srcrt" here is to prevent ip_forward() - * from generating ICMP redirects for packets that have - * been redirected by a hook back out on to the same LAN that - * they came from and is not an indication that the packet - * is being inffluenced by source routing options. This - * allows things like - * "rdr tlp0 0/0 port 80 -> 1.1.1.200 3128 tcp" - * where tlp0 is both on the 1.1.1.0/24 network and is the - * default route for hosts on 1.1.1.0/24. Of course this - * also requires a "map tlp0 ..." to complete the story. - * One might argue whether or not this kind of network config. - * should be supported in this manner... - */ srcrt = (odst.s_addr != ip->ip_dst.s_addr); } #endif /* PFIL_HOOKS */ @@ -733,7 +720,7 @@ ip_input(struct mbuf *m) if (ia != NULL) goto ours; if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) { - IFADDR_FOREACH(ifa, m->m_pkthdr.rcvif) { + TAILQ_FOREACH(ifa, &m->m_pkthdr.rcvif->if_addrlist, ifa_list) { if (ifa->ifa_addr->sa_family != AF_INET) continue; ia = ifatoia(ifa); @@ -759,6 +746,14 @@ ip_input(struct mbuf *m) #ifdef MROUTING extern struct socket *ip_mrouter; + if (M_READONLY(m)) { + if ((m = m_pullup(m, hlen)) == 0) { + ipstat.ips_toosmall++; + return; + } + ip = mtod(m, struct ip *); + } + if (ip_mrouter) { /* * If we are acting as a multicast router, all @@ -836,7 +831,7 @@ ip_input(struct mbuf *m) sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND); } else { sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND, - IP_FORWARDING, &error); + IP_FORWARDING, &error); } if (sp == NULL) { /* NB: can happen if error */ splx(s); @@ -890,6 +885,13 @@ ours: * but it's not worth the time; just let them time out.) */ if (ip->ip_off & ~htons(IP_DF|IP_RF)) { + if (M_READONLY(m)) { + if ((m = m_pullup(m, hlen)) == NULL) { + ipstat.ips_toosmall++; + goto bad; + } + ip = mtod(m, struct ip *); + } /* * Look for queue of fragments @@ -986,7 +988,7 @@ found: * done. If so, then just pass it along. This tag gets * set during AH, ESP, etc. input handling, before the * packet is returned to the ip input queue for delivery. - */ + */ mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL); s = splsoftnet(); if (mtag != NULL) { @@ -994,7 +996,7 @@ found: sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND); } else { sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND, - IP_FORWARDING, &error); + IP_FORWARDING, &error); } if (sp != NULL) { /* @@ -1044,7 +1046,10 @@ badcsum: * is given as fp; otherwise have to make a chain. */ struct mbuf * -ip_reass(struct ipqent *ipqe, struct ipq *fp, struct ipqhead *ipqhead) +ip_reass(ipqe, fp, ipqhead) + struct ipqent *ipqe; + struct ipq *fp; + struct ipqhead *ipqhead; { struct mbuf *m = ipqe->ipqe_m; struct ipqent *nq, *p, *q; @@ -1075,7 +1080,7 @@ ip_reass(struct ipqent *ipqe, struct ipq * We are about to add a fragment; increment frag count. */ ip_nfrags++; - + /* * If first fragment to arrive, create a reassembly queue. */ @@ -1226,7 +1231,6 @@ insert: for (t = m; t; t = t->m_next) plen += t->m_len; m->m_pkthdr.len = plen; - m->m_pkthdr.csum_flags = 0; } return (m); @@ -1245,7 +1249,8 @@ dropfrag: * associated datagrams. */ void -ip_freef(struct ipq *fp) +ip_freef(fp) + struct ipq *fp; { struct ipqent *q, *p; u_int nfrags = 0; @@ -1283,13 +1288,13 @@ static u_int fragttl_histo[(IPFRAGTTL+1) static u_int ip_reass_ttl_decr(u_int ticks) { - u_int nfrags, median, dropfraction, keepfraction; + u_int i, nfrags, median; struct ipq *fp, *nfp; - int i; - + u_int dropfraction, keepfraction; + nfrags = 0; memset(fragttl_histo, 0, sizeof fragttl_histo); - + for (i = 0; i < IPREASS_NHASH; i++) { for (fp = LIST_FIRST(&ipq[i]); fp != NULL; fp = nfp) { fp->ipq_ttl = ((fp->ipq_ttl <= ticks) ? @@ -1342,7 +1347,7 @@ ip_reass_drophalf(void) * queue, discard it. */ void -ip_slowtimo(void) +ip_slowtimo() { static u_int dropscanidx = 0; u_int i; @@ -1399,7 +1404,7 @@ ip_slowtimo(void) * Drain off all datagram fragments. */ void -ip_drain(void) +ip_drain() { /* @@ -1426,7 +1431,8 @@ ip_drain(void) * 0 if the packet should be processed further. */ int -ip_dooptions(struct mbuf *m) +ip_dooptions(m) + struct mbuf *m; { struct ip *ip = mtod(m, struct ip *); u_char *cp, *cp0; @@ -1655,7 +1661,8 @@ bad: * return internet address info of interface to be used to get there. */ struct in_ifaddr * -ip_rtaddr(struct in_addr dst) +ip_rtaddr(dst) + struct in_addr dst; { struct sockaddr_in *sin; @@ -1682,7 +1689,9 @@ ip_rtaddr(struct in_addr dst) * to be picked up later by ip_srcroute if the receiver is interested. */ void -save_rte(u_char *option, struct in_addr dst) +save_rte(option, dst) + u_char *option; + struct in_addr dst; { unsigned olen; @@ -1704,7 +1713,7 @@ save_rte(u_char *option, struct in_addr * The first hop is placed before the options, will be removed later. */ struct mbuf * -ip_srcroute(void) +ip_srcroute() { struct in_addr *p, *q; struct mbuf *m; @@ -1776,7 +1785,9 @@ ip_srcroute(void) * XXX should be deleted; last arg currently ignored. */ void -ip_stripoptions(struct mbuf *m, struct mbuf *mopt) +ip_stripoptions(m, mopt) + struct mbuf *m; + struct mbuf *mopt; { int i; struct ip *ip = mtod(m, struct ip *); @@ -1818,14 +1829,20 @@ const int inetctlerrmap[PRC_NCMDS] = { * via a source route. */ void -ip_forward(struct mbuf *m, int srcrt) +ip_forward(m, srcrt) + 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, destmtu = 0; + int error, type = 0, code = 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. @@ -1853,6 +1870,7 @@ ip_forward(struct mbuf *m, int srcrt) icmp_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, dest, 0); return; } + ip->ip_ttl -= IPTTLDEC; sin = satosin(&ipforward_rt.ro_dst); if ((rt = ipforward_rt.ro_rt) == 0 || @@ -1867,7 +1885,7 @@ ip_forward(struct mbuf *m, int srcrt) rtalloc(&ipforward_rt); if (ipforward_rt.ro_rt == 0) { - icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); + icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, dest, 0); return; } rt = ipforward_rt.ro_rt; @@ -1882,8 +1900,6 @@ ip_forward(struct mbuf *m, int srcrt) if (mcopy) mcopy = m_pullup(mcopy, ip->ip_hl << 2); - ip->ip_ttl -= IPTTLDEC; - /* * If forwarding packet using same interface that it came in on, * perhaps should send a redirect to sender to shortcut a hop. @@ -1940,6 +1956,7 @@ ip_forward(struct mbuf *m, int srcrt) } if (mcopy == NULL) return; + destifp = NULL; switch (error) { @@ -1961,7 +1978,7 @@ ip_forward(struct mbuf *m, int srcrt) code = ICMP_UNREACH_NEEDFRAG; #if !defined(IPSEC) && !defined(FAST_IPSEC) if (ipforward_rt.ro_rt) - destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; + destifp = ipforward_rt.ro_rt->rt_ifp; #else /* * If the packet is routed over IPsec tunnel, tell the @@ -1980,7 +1997,7 @@ ip_forward(struct mbuf *m, int srcrt) &ipsecerror); if (sp == NULL) - destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; + destifp = ipforward_rt.ro_rt->rt_ifp; else { /* count IPsec header size */ ipsechdr = ipsec4_hdrsiz(mcopy, @@ -1989,18 +2006,24 @@ 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) { - destmtu = + dummyifp.if_mtu = ro->ro_rt->rt_rmx.rmx_mtu ? ro->ro_rt->rt_rmx.rmx_mtu : ro->ro_rt->rt_ifp->if_mtu; - destmtu -= ipsechdr; + dummyifp.if_mtu -= ipsechdr; + destifp = &dummyifp; } } @@ -2032,12 +2055,15 @@ ip_forward(struct mbuf *m, int srcrt) break; #endif } - icmp_error(mcopy, type, code, dest, destmtu); + icmp_error(mcopy, type, code, dest, destifp); } void -ip_savecontrol(struct inpcb *inp, struct mbuf **mp, struct ip *ip, - struct mbuf *m) +ip_savecontrol(inp, mp, ip, m) + struct inpcb *inp; + struct mbuf **mp; + struct ip *ip; + struct mbuf *m; { if (inp->inp_socket->so_options & SO_TIMESTAMP) { @@ -2130,7 +2156,7 @@ sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG s = sysctl_lookup(SYSCTLFN_CALL(rnode)); if (s) return (s); - + s = splsoftnet(); ipflow_reap(0); splx(s); @@ -2144,199 +2170,132 @@ SYSCTL_SETUP(sysctl_net_inet_ip_setup, " { extern int subnetsarelocal, hostzeroisbroadcast; - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT, + sysctl_createv(SYSCTL_PERMANENT, CTLTYPE_NODE, "net", NULL, NULL, 0, NULL, 0, CTL_NET, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT, - CTLTYPE_NODE, "inet", - SYSCTL_DESCR("PF_INET related settings"), + sysctl_createv(SYSCTL_PERMANENT, + CTLTYPE_NODE, "inet", NULL, NULL, 0, NULL, 0, CTL_NET, PF_INET, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT, - CTLTYPE_NODE, "ip", - SYSCTL_DESCR("IPv4 related settings"), + sysctl_createv(SYSCTL_PERMANENT, + CTLTYPE_NODE, "ip", NULL, NULL, 0, NULL, 0, CTL_NET, PF_INET, IPPROTO_IP, CTL_EOL); - - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "forwarding", - SYSCTL_DESCR("Enable forwarding of INET datagrams"), + + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "forwarding", NULL, NULL, 0, &ipforwarding, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDING, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "redirect", - SYSCTL_DESCR("Enable sending of ICMP redirect messages"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "redirect", NULL, NULL, 0, &ipsendredirects, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_SENDREDIRECTS, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "ttl", - SYSCTL_DESCR("Default TTL for an INET datagram"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "ttl", NULL, NULL, 0, &ip_defttl, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL, CTL_EOL); #ifdef IPCTL_DEFMTU - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT /* |CTLFLAG_READWRITE? */, - CTLTYPE_INT, "mtu", - SYSCTL_DESCR("Default MTA for an INET route"), + sysctl_createv(SYSCTL_PERMANENT /* |SYSCTL_READWRITE? */, + CTLTYPE_INT, "mtu", NULL, NULL, 0, &ip_mtu, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFMTU, CTL_EOL); #endif /* IPCTL_DEFMTU */ - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READONLY1, - CTLTYPE_INT, "forwsrcrt", - SYSCTL_DESCR("Enable forwarding of source-routed " - "datagrams"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READONLY1, + CTLTYPE_INT, "forwsrcrt", NULL, NULL, 0, &ip_forwsrcrt, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWSRCRT, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "directed-broadcast", - SYSCTL_DESCR("Enable forwarding of broadcast datagrams"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "directed-broadcast", NULL, NULL, 0, &ip_directedbcast, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DIRECTEDBCAST, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "allowsrcrt", - SYSCTL_DESCR("Accept source-routed datagrams"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "allowsrcrt", NULL, NULL, 0, &ip_allowsrcrt, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_ALLOWSRCRT, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "subnetsarelocal", - SYSCTL_DESCR("Whether logical subnets are considered " - "local"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "subnetsarelocal", NULL, NULL, 0, &subnetsarelocal, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_SUBNETSARELOCAL, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "mtudisc", - SYSCTL_DESCR("Use RFC1191 Path MTU Discovery"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "mtudisc", NULL, NULL, 0, &ip_mtudisc, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MTUDISC, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "anonportmin", - SYSCTL_DESCR("Lowest ephemeral port number to assign"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "anonportmin", NULL, sysctl_net_inet_ip_ports, 0, &anonportmin, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_ANONPORTMIN, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "anonportmax", - SYSCTL_DESCR("Highest ephemeral port number to assign"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "anonportmax", NULL, sysctl_net_inet_ip_ports, 0, &anonportmax, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_ANONPORTMAX, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "mtudisctimeout", - SYSCTL_DESCR("Lifetime of a Path MTU Discovered route"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "mtudisctimeout", NULL, sysctl_net_inet_ip_pmtudto, 0, &ip_mtudisc_timeout, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MTUDISCTIMEOUT, CTL_EOL); #ifdef GATEWAY - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "maxflows", - SYSCTL_DESCR("Number of flows for fast forwarding"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "maxflows", NULL, sysctl_net_inet_ip_maxflows, 0, &ip_maxflows, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MAXFLOWS, CTL_EOL); #endif /* GATEWAY */ - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "hostzerobroadcast", - SYSCTL_DESCR("All zeroes address is broadcast address"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "hostzerobroadcast", NULL, NULL, 0, &hostzeroisbroadcast, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_HOSTZEROBROADCAST, CTL_EOL); #if NGIF > 0 - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "gifttl", - SYSCTL_DESCR("Default TTL for a gif tunnel datagram"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "gifttl", NULL, NULL, 0, &ip_gif_ttl, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_GIF_TTL, CTL_EOL); #endif /* NGIF */ #ifndef IPNOPRIVPORTS - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "lowportmin", - SYSCTL_DESCR("Lowest privileged ephemeral port number " - "to assign"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "lowportmin", NULL, sysctl_net_inet_ip_ports, 0, &lowportmin, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_LOWPORTMIN, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "lowportmax", - SYSCTL_DESCR("Highest privileged ephemeral port number " - "to assign"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "lowportmax", NULL, sysctl_net_inet_ip_ports, 0, &lowportmax, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_LOWPORTMAX, CTL_EOL); #endif /* IPNOPRIVPORTS */ - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "maxfragpackets", - SYSCTL_DESCR("Maximum number of fragments to retain for " - "possible reassembly"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "maxfragpackets", NULL, NULL, 0, &ip_maxfragpackets, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MAXFRAGPACKETS, CTL_EOL); #if NGRE > 0 - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "grettl", - SYSCTL_DESCR("Default TTL for a gre tunnel datagram"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "grettl", NULL, NULL, 0, &ip_gre_ttl, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_GRE_TTL, CTL_EOL); #endif /* NGRE */ - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "checkinterface", - SYSCTL_DESCR("Enable receive side of Strong ES model " - "from RFC1122"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "checkinterface", NULL, NULL, 0, &ip_checkinterface, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_CHECKINTERFACE, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "random_id", - SYSCTL_DESCR("Assign random ip_id values"), + sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + CTLTYPE_INT, "random_id", NULL, NULL, 0, &ip_do_randomid, 0, CTL_NET, PF_INET, IPPROTO_IP, IPCTL_RANDOMID, CTL_EOL); - sysctl_createv(clog, 0, NULL, NULL, - CTLFLAG_PERMANENT|CTLFLAG_READWRITE, - CTLTYPE_INT, "do_loopback_cksum", - SYSCTL_DESCR("Perform IP checksum on loopback"), - 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); }