Module Name:    src
Committed By:   rmind
Date:           Thu May 22 22:01:12 UTC 2014

Modified Files:
        src/sys/net: if_tokensubr.c
        src/sys/netinet: in.c in.h in_pcb.c in_pcb.h in_var.h ip_flow.c
            ip_input.c ip_var.h

Log Message:
- Add in_init() and move some functions, variables and sysctls into in.c
  where they belong to.  Make some functions and variables static.
- ip_input.c: reduce some #ifdefs, cleanup a little.
- Move some sysctls into ip_flow.c as they belong there.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.64 src/sys/net/if_tokensubr.c
cvs rdiff -u -r1.144 -r1.145 src/sys/netinet/in.c
cvs rdiff -u -r1.89 -r1.90 src/sys/netinet/in.h
cvs rdiff -u -r1.146 -r1.147 src/sys/netinet/in_pcb.c
cvs rdiff -u -r1.51 -r1.52 src/sys/netinet/in_pcb.h
cvs rdiff -u -r1.65 -r1.66 src/sys/netinet/in_var.h
cvs rdiff -u -r1.63 -r1.64 src/sys/netinet/ip_flow.c
cvs rdiff -u -r1.310 -r1.311 src/sys/netinet/ip_input.c
cvs rdiff -u -r1.100 -r1.101 src/sys/netinet/ip_var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_tokensubr.c
diff -u src/sys/net/if_tokensubr.c:1.63 src/sys/net/if_tokensubr.c:1.64
--- src/sys/net/if_tokensubr.c:1.63	Thu May 15 09:23:03 2014
+++ src/sys/net/if_tokensubr.c	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tokensubr.c,v 1.63 2014/05/15 09:23:03 msaitoh Exp $	*/
+/*	$NetBSD: if_tokensubr.c,v 1.64 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (c) 1982, 1989, 1993
@@ -92,7 +92,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.63 2014/05/15 09:23:03 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.64 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_atalk.h"
@@ -124,17 +124,16 @@ __KERNEL_RCSID(0, "$NetBSD: if_tokensubr
 #include <net/if_ether.h>
 #include <net/if_token.h>
 
-#include "carp.h"
-#if NCARP > 0
-#include <netinet/ip_carp.h>
-#endif
-
 #ifdef INET
 #include <netinet/in.h>
 #include <netinet/in_var.h>
 #include <netinet/if_inarp.h>
 #endif
 
+#include "carp.h"
+#if NCARP > 0
+#include <netinet/ip_carp.h>
+#endif
 
 #ifdef DECNET
 #include <netdnet/dn.h>

Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.144 src/sys/netinet/in.c:1.145
--- src/sys/netinet/in.c:1.144	Sat Jun 29 21:06:58 2013
+++ src/sys/netinet/in.c	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in.c,v 1.144 2013/06/29 21:06:58 rmind Exp $	*/
+/*	$NetBSD: in.c,v 1.145 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.144 2013/06/29 21:06:58 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.145 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_conf.h"
@@ -132,13 +132,14 @@ __KERNEL_RCSID(0, "$NetBSD: in.c,v 1.144
 #include <netinet/in_selsrc.h>
 #endif
 
-static u_int in_mask2len(struct in_addr *);
-static void in_len2mask(struct in_addr *, u_int);
-static int in_lifaddr_ioctl(struct socket *, u_long, void *,
+static u_int	in_mask2len(struct in_addr *);
+static void	in_len2mask(struct in_addr *, u_int);
+static int	in_lifaddr_ioctl(struct socket *, u_long, void *,
 	struct ifnet *, struct lwp *);
 
-static int in_addprefix(struct in_ifaddr *, int);
-static int in_scrubprefix(struct in_ifaddr *);
+static int	in_addprefix(struct in_ifaddr *, int);
+static int	in_scrubprefix(struct in_ifaddr *);
+static void	in_sysctl_init(struct sysctllog **);
 
 #ifndef SUBNETSARELOCAL
 #define	SUBNETSARELOCAL	1
@@ -148,15 +149,39 @@ static int in_scrubprefix(struct in_ifad
 #define HOSTZEROBROADCAST 1
 #endif
 
-int subnetsarelocal = SUBNETSARELOCAL;
-int hostzeroisbroadcast = HOSTZEROBROADCAST;
+static int			subnetsarelocal = SUBNETSARELOCAL;
+static int			hostzeroisbroadcast = HOSTZEROBROADCAST;
 
 /*
  * This list is used to keep track of in_multi chains which belong to
  * deleted interface addresses.  We use in_ifaddr so that a chain head
  * won't be deallocated until all multicast address record are deleted.
  */
-static TAILQ_HEAD(, in_ifaddr) in_mk = TAILQ_HEAD_INITIALIZER(in_mk);
+static TAILQ_HEAD(, in_ifaddr)	in_mk = TAILQ_HEAD_INITIALIZER(in_mk);
+
+static struct pool		inmulti_pool;
+static u_int			in_multientries;
+struct in_multihashhead *	in_multihashtbl;
+
+u_long				in_multihash;
+struct in_ifaddrhashhead *	in_ifaddrhashtbl;
+u_long				in_ifaddrhash;
+struct in_ifaddrhead		in_ifaddrhead;
+
+void
+in_init(void)
+{
+	pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl",
+	    NULL, IPL_SOFTNET);
+	TAILQ_INIT(&in_ifaddrhead);
+
+	in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
+	    &in_ifaddrhash);
+	in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
+	    &in_multihash);
+
+	in_sysctl_init(NULL);
+}
 
 /*
  * Return 1 if an internet address is for a ``local'' host
@@ -1132,3 +1157,116 @@ in_delmulti(struct in_multi *inm)
 	}
 	splx(s);
 }
+
+struct sockaddr_in *
+in_selectsrc(struct sockaddr_in *sin, struct route *ro,
+    int soopts, struct ip_moptions *mopts, int *errorp)
+{
+	struct rtentry *rt = NULL;
+	struct in_ifaddr *ia = NULL;
+
+	/*
+         * If route is known or can be allocated now, take the
+         * source address from the interface.  Otherwise, punt.
+	 */
+	if ((soopts & SO_DONTROUTE) != 0)
+		rtcache_free(ro);
+	else {
+		union {
+			struct sockaddr		dst;
+			struct sockaddr_in	dst4;
+		} u;
+
+		sockaddr_in_init(&u.dst4, &sin->sin_addr, 0);
+		rt = rtcache_lookup(ro, &u.dst);
+	}
+	/*
+	 * If we found a route, use the address
+	 * corresponding to the outgoing interface
+	 * unless it is the loopback (in case a route
+	 * to our address on another net goes to loopback).
+	 *
+	 * XXX Is this still true?  Do we care?
+	 */
+	if (rt != NULL && (rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0)
+		ia = ifatoia(rt->rt_ifa);
+	if (ia == NULL) {
+		u_int16_t fport = sin->sin_port;
+
+		sin->sin_port = 0;
+		ia = ifatoia(ifa_ifwithladdr(sintosa(sin)));
+		sin->sin_port = fport;
+		if (ia == NULL) {
+			/* Find 1st non-loopback AF_INET address */
+			TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+				if (!(ia->ia_ifp->if_flags & IFF_LOOPBACK))
+					break;
+			}
+		}
+		if (ia == NULL) {
+			*errorp = EADDRNOTAVAIL;
+			return NULL;
+		}
+	}
+	/*
+	 * If the destination address is multicast and an outgoing
+	 * interface has been set as a multicast option, use the
+	 * address of that interface as our source address.
+	 */
+	if (IN_MULTICAST(sin->sin_addr.s_addr) && mopts != NULL) {
+		struct ip_moptions *imo;
+		struct ifnet *ifp;
+
+		imo = mopts;
+		if (imo->imo_multicast_ifp != NULL) {
+			ifp = imo->imo_multicast_ifp;
+			IFP_TO_IA(ifp, ia);		/* XXX */
+			if (ia == 0) {
+				*errorp = EADDRNOTAVAIL;
+				return NULL;
+			}
+		}
+	}
+	if (ia->ia_ifa.ifa_getifa != NULL) {
+		ia = ifatoia((*ia->ia_ifa.ifa_getifa)(&ia->ia_ifa,
+		                                      sintosa(sin)));
+	}
+#ifdef GETIFA_DEBUG
+	else
+		printf("%s: missing ifa_getifa\n", __func__);
+#endif
+	return satosin(&ia->ia_addr);
+}
+
+static void
+in_sysctl_init(struct sysctllog **clog)
+{
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT,
+		       CTLTYPE_NODE, "inet",
+		       SYSCTL_DESCR("PF_INET related settings"),
+		       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"),
+		       NULL, 0, NULL, 0,
+		       CTL_NET, PF_INET, IPPROTO_IP, CTL_EOL);
+
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+		       CTLTYPE_INT, "subnetsarelocal",
+		       SYSCTL_DESCR("Whether logical subnets are considered "
+				    "local"),
+		       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, "hostzerobroadcast",
+		       SYSCTL_DESCR("All zeroes address is broadcast address"),
+		       NULL, 0, &hostzeroisbroadcast, 0,
+		       CTL_NET, PF_INET, IPPROTO_IP,
+		       IPCTL_HOSTZEROBROADCAST, CTL_EOL);
+}

Index: src/sys/netinet/in.h
diff -u src/sys/netinet/in.h:1.89 src/sys/netinet/in.h:1.90
--- src/sys/netinet/in.h:1.89	Thu Jun 27 19:38:16 2013
+++ src/sys/netinet/in.h	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in.h,v 1.89 2013/06/27 19:38:16 christos Exp $	*/
+/*	$NetBSD: in.h,v 1.90 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -564,6 +564,12 @@ void	in_delayed_cksum(struct mbuf *);
 int	in_localaddr(struct in_addr);
 void	in_socktrim(struct sockaddr_in *);
 
+struct route;
+struct ip_moptions;
+
+struct sockaddr_in *in_selectsrc(struct sockaddr_in *,
+	struct route *, int, struct ip_moptions *, int *);
+
 #define	in_hosteq(s,t)	((s).s_addr == (t).s_addr)
 #define	in_nullhost(x)	((x).s_addr == INADDR_ANY)
 

Index: src/sys/netinet/in_pcb.c
diff -u src/sys/netinet/in_pcb.c:1.146 src/sys/netinet/in_pcb.c:1.147
--- src/sys/netinet/in_pcb.c:1.146	Sat Nov 23 14:20:21 2013
+++ src/sys/netinet/in_pcb.c	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.c,v 1.146 2013/11/23 14:20:21 christos Exp $	*/
+/*	$NetBSD: in_pcb.c,v 1.147 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.146 2013/11/23 14:20:21 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.147 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -1053,83 +1053,3 @@ in_pcbrtentry(struct inpcb *inp)
 	sockaddr_in_init(&u.dst4, &inp->inp_faddr, 0);
 	return rtcache_lookup(ro, &u.dst);
 }
-
-struct sockaddr_in *
-in_selectsrc(struct sockaddr_in *sin, struct route *ro,
-    int soopts, struct ip_moptions *mopts, int *errorp)
-{
-	struct rtentry *rt = NULL;
-	struct in_ifaddr *ia = NULL;
-
-	/*
-         * If route is known or can be allocated now, take the
-         * source address from the interface.  Otherwise, punt.
-	 */
-	if ((soopts & SO_DONTROUTE) != 0)
-		rtcache_free(ro);
-	else {
-		union {
-			struct sockaddr		dst;
-			struct sockaddr_in	dst4;
-		} u;
-
-		sockaddr_in_init(&u.dst4, &sin->sin_addr, 0);
-		rt = rtcache_lookup(ro, &u.dst);
-	}
-	/*
-	 * If we found a route, use the address
-	 * corresponding to the outgoing interface
-	 * unless it is the loopback (in case a route
-	 * to our address on another net goes to loopback).
-	 *
-	 * XXX Is this still true?  Do we care?
-	 */
-	if (rt != NULL && (rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0)
-		ia = ifatoia(rt->rt_ifa);
-	if (ia == NULL) {
-		u_int16_t fport = sin->sin_port;
-
-		sin->sin_port = 0;
-		ia = ifatoia(ifa_ifwithladdr(sintosa(sin)));
-		sin->sin_port = fport;
-		if (ia == NULL) {
-			/* Find 1st non-loopback AF_INET address */
-			TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
-				if (!(ia->ia_ifp->if_flags & IFF_LOOPBACK))
-					break;
-			}
-		}
-		if (ia == NULL) {
-			*errorp = EADDRNOTAVAIL;
-			return NULL;
-		}
-	}
-	/*
-	 * If the destination address is multicast and an outgoing
-	 * interface has been set as a multicast option, use the
-	 * address of that interface as our source address.
-	 */
-	if (IN_MULTICAST(sin->sin_addr.s_addr) && mopts != NULL) {
-		struct ip_moptions *imo;
-		struct ifnet *ifp;
-
-		imo = mopts;
-		if (imo->imo_multicast_ifp != NULL) {
-			ifp = imo->imo_multicast_ifp;
-			IFP_TO_IA(ifp, ia);		/* XXX */
-			if (ia == 0) {
-				*errorp = EADDRNOTAVAIL;
-				return NULL;
-			}
-		}
-	}
-	if (ia->ia_ifa.ifa_getifa != NULL) {
-		ia = ifatoia((*ia->ia_ifa.ifa_getifa)(&ia->ia_ifa,
-		                                      sintosa(sin)));
-	}
-#ifdef GETIFA_DEBUG
-	else
-		printf("%s: missing ifa_getifa\n", __func__);
-#endif
-	return satosin(&ia->ia_addr);
-}

Index: src/sys/netinet/in_pcb.h
diff -u src/sys/netinet/in_pcb.h:1.51 src/sys/netinet/in_pcb.h:1.52
--- src/sys/netinet/in_pcb.h:1.51	Thu Jun 27 19:38:16 2013
+++ src/sys/netinet/in_pcb.h	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.h,v 1.51 2013/06/27 19:38:16 christos Exp $	*/
+/*	$NetBSD: in_pcb.h,v 1.52 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -158,8 +158,6 @@ void	in_setpeeraddr(struct inpcb *, stru
 void	in_setsockaddr(struct inpcb *, struct mbuf *);
 struct rtentry *
 	in_pcbrtentry(struct inpcb *);
-extern struct sockaddr_in *in_selectsrc(struct sockaddr_in *,
-	struct route *, int, struct ip_moptions *, int *);
 #endif
 
 #endif /* !_NETINET_IN_PCB_H_ */

Index: src/sys/netinet/in_var.h
diff -u src/sys/netinet/in_var.h:1.65 src/sys/netinet/in_var.h:1.66
--- src/sys/netinet/in_var.h:1.65	Fri Nov  5 01:35:57 2010
+++ src/sys/netinet/in_var.h	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_var.h,v 1.65 2010/11/05 01:35:57 rmind Exp $	*/
+/*	$NetBSD: in_var.h,v 1.66 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -130,20 +130,16 @@ LIST_HEAD(in_ifaddrhashhead, in_ifaddr);
 TAILQ_HEAD(in_ifaddrhead, in_ifaddr);		/* Type of the list head */
 LIST_HEAD(in_multihashhead, in_multi);		/* Type of the hash head */
 
-
 extern	u_long in_ifaddrhash;			/* size of hash table - 1 */
-extern	int	in_ifaddrentries;		/* total number of addrs */
 extern  struct in_ifaddrhashhead *in_ifaddrhashtbl;	/* Hash table head */
 extern  struct in_ifaddrhead in_ifaddrhead;		/* List head (in ip_input) */
 
 extern	u_long in_multihash;			/* size of hash table - 1 */
-extern	int	in_multientries;		/* total number of addrs */
 extern  struct in_multihashhead *in_multihashtbl;	/* Hash table head */
 
 extern	struct	ifqueue	ipintrq;		/* ip packet input queue */
 extern	const	int	inetctlerrmap[];
 
-
 /*
  * Macro for finding whether an internet address (in_addr) belongs to one
  * of our interfaces (in_ifaddr).  NULL if the address isn't ours.

Index: src/sys/netinet/ip_flow.c
diff -u src/sys/netinet/ip_flow.c:1.63 src/sys/netinet/ip_flow.c:1.64
--- src/sys/netinet/ip_flow.c:1.63	Tue Apr  1 13:11:44 2014
+++ src/sys/netinet/ip_flow.c	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_flow.c,v 1.63 2014/04/01 13:11:44 pooka Exp $	*/
+/*	$NetBSD: ip_flow.c,v 1.64 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.63 2014/04/01 13:11:44 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.64 2014/05/22 22:01:12 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -91,8 +91,10 @@ do { \
 #ifndef IPFLOW_MAX
 #define	IPFLOW_MAX		256
 #endif
-int ip_maxflows = IPFLOW_MAX;
-int ip_hashsize = IPFLOW_DEFAULT_HASHSIZE;
+static int ip_maxflows = IPFLOW_MAX;
+static int ip_hashsize = IPFLOW_DEFAULT_HASHSIZE;
+
+static void ipflow_sysctl_init(struct sysctllog **);
 
 static size_t 
 ipflow_hash(const struct ip *ip)
@@ -133,8 +135,8 @@ ipflow_poolinit(void)
 	    NULL, IPL_NET);
 }
 
-int
-ipflow_init(int table_size)
+static int
+ipflow_reinit(int table_size)
 {
 	struct ipflowhead *new_table;
 	size_t i;
@@ -158,6 +160,13 @@ ipflow_init(int table_size)
 	return 0;
 }
 
+void
+ipflow_init(void)
+{
+	(void)ipflow_reinit(ip_hashsize);
+	ipflow_sysctl_init(NULL);
+}
+
 int
 ipflow_fastforward(struct mbuf *m)
 {
@@ -489,8 +498,102 @@ ipflow_invalidate_all(int new_size)
 	}
 
 	if (new_size)
-		error = ipflow_init(new_size);
+		error = ipflow_reinit(new_size);
 	splx(s);
 
 	return error;
 }
+
+#ifdef GATEWAY
+/*
+ * sysctl helper routine for net.inet.ip.maxflows.
+ */
+static int
+sysctl_net_inet_ip_maxflows(SYSCTLFN_ARGS)
+{
+	int error;
+
+	error = sysctl_lookup(SYSCTLFN_CALL(rnode));
+	if (error || newp == NULL)
+		return (error);
+
+	mutex_enter(softnet_lock);
+	KERNEL_LOCK(1, NULL);
+
+	ipflow_reap(false);
+
+	KERNEL_UNLOCK_ONE(NULL);
+	mutex_exit(softnet_lock);
+
+	return (0);
+}
+
+static int
+sysctl_net_inet_ip_hashsize(SYSCTLFN_ARGS)
+{
+	int error, tmp;
+	struct sysctlnode node;
+
+	node = *rnode;
+	tmp = ip_hashsize;
+	node.sysctl_data = &tmp;
+	error = sysctl_lookup(SYSCTLFN_CALL(&node));
+	if (error || newp == NULL)
+		return (error);
+
+	if ((tmp & (tmp - 1)) == 0 && tmp != 0) {
+		/*
+		 * Can only fail due to malloc()
+		 */
+		mutex_enter(softnet_lock);
+		KERNEL_LOCK(1, NULL);
+
+		error = ipflow_invalidate_all(tmp);
+
+		KERNEL_UNLOCK_ONE(NULL);
+		mutex_exit(softnet_lock);
+
+	} else {
+		/*
+		 * EINVAL if not a power of 2
+	         */
+		error = EINVAL;
+	}
+
+	return error;
+}
+#endif /* GATEWAY */
+
+static void
+ipflow_sysctl_init(struct sysctllog **clog)
+{
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT,
+		       CTLTYPE_NODE, "inet",
+		       SYSCTL_DESCR("PF_INET related settings"),
+		       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"),
+		       NULL, 0, NULL, 0,
+		       CTL_NET, PF_INET, IPPROTO_IP, 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_net_inet_ip_maxflows, 0, &ip_maxflows, 0,
+		       CTL_NET, PF_INET, IPPROTO_IP,
+		       IPCTL_MAXFLOWS, CTL_EOL);
+	sysctl_createv(clog, 0, NULL, NULL,
+			CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+			CTLTYPE_INT, "hashsize",
+			SYSCTL_DESCR("Size of hash table for fast forwarding (IPv4)"),
+			sysctl_net_inet_ip_hashsize, 0, &ip_hashsize, 0,
+			CTL_NET, PF_INET, IPPROTO_IP,
+			CTL_CREATE, CTL_EOL);
+#endif /* GATEWAY */
+}

Index: src/sys/netinet/ip_input.c
diff -u src/sys/netinet/ip_input.c:1.310 src/sys/netinet/ip_input.c:1.311
--- src/sys/netinet/ip_input.c:1.310	Wed Mar 19 08:27:21 2014
+++ src/sys/netinet/ip_input.c	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_input.c,v 1.310 2014/03/19 08:27:21 liamjfoy Exp $	*/
+/*	$NetBSD: ip_input.c,v 1.311 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.310 2014/03/19 08:27:21 liamjfoy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.311 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -212,16 +212,8 @@ int	ip_do_randomid = 0;
  */
 int	ip_checkinterface = 0;
 
-
 struct rttimer_queue *ip_mtudisc_timeout_q = NULL;
 
-u_long	in_ifaddrhash;				/* size of hash table - 1 */
-int	in_ifaddrentries;			/* total number of addrs */
-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 */
-struct	in_multihashhead *in_multihashtbl;
 struct	ifqueue ipintrq;
 
 ipid_state_t *		ip_ids;
@@ -231,8 +223,6 @@ percpu_t *ipstat_percpu;
 
 pfil_head_t *inet_pfil_hook;
 
-struct pool inmulti_pool;
-
 #ifdef INET_CSUM_COUNTERS
 #include <sys/device.h>
 
@@ -262,7 +252,9 @@ EVCNT_ATTACH_STATIC(ip_swcsum);
  * maintenance when the remote end is on a network that is not known
  * to us.
  */
-int	ip_nhops = 0;
+
+static int	ip_nhops = 0;
+
 static	struct ip_srcrt {
 	struct	in_addr dst;			/* final destination */
 	char	nop;				/* one NOP to align */
@@ -279,7 +271,9 @@ struct mowner ip_rx_mowner = MOWNER_INIT
 struct mowner ip_tx_mowner = MOWNER_INIT("internet", "tx");
 #endif
 
-static void sysctl_net_inet_ip_setup(struct sysctllog **);
+static bool		ip_dooptions(struct mbuf *);
+static struct in_ifaddr *ip_rtaddr(struct in_addr);
+static void		sysctl_net_inet_ip_setup(struct sysctllog **);
 
 /*
  * IP initialization: fill in IP protocol switch table.
@@ -289,18 +283,16 @@ void
 ip_init(void)
 {
 	const struct protosw *pr;
-	int i;
 
+	in_init();
 	sysctl_net_inet_ip_setup(NULL);
 
-	pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl",
-	    NULL, IPL_SOFTNET);
-
 	pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW);
-	if (pr == 0)
-		panic("ip_init");
-	for (i = 0; i < IPPROTO_MAX; i++)
+	KASSERT(pr != NULL);
+
+	for (u_int i = 0; i < IPPROTO_MAX; i++) {
 		ip_protox[i] = pr - inetsw;
+	}
 	for (pr = inetdomain.dom_protosw;
 	    pr < inetdomain.dom_protoswNPROTOSW; pr++)
 		if (pr->pr_domain->dom_family == PF_INET &&
@@ -314,14 +306,9 @@ ip_init(void)
 
 	ipintrq.ifq_maxlen = IFQ_MAXLEN;
 
-	TAILQ_INIT(&in_ifaddrhead);
-	in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
-	    &in_ifaddrhash);
-	in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
-	    &in_multihash);
 	ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);
 #ifdef GATEWAY
-	ipflow_init(ip_hashsize);
+	ipflow_init();
 #endif
 
 	/* Register our Packet Filter hook. */
@@ -340,7 +327,8 @@ struct	sockaddr_in ipaddr = {
 	.sin_len = sizeof(ipaddr),
 	.sin_family = AF_INET,
 };
-struct	route ipforward_rt;
+
+static struct route	ipforward_rt;
 
 /*
  * IP software interrupt routine
@@ -814,13 +802,13 @@ ip_drain(void)
 }
 
 /*
- * Do option processing on a datagram,
- * possibly discarding it if bad options are encountered,
- * or forwarding it if source-routed.
- * Returns 1 if packet has been forwarded/freed,
- * 0 if the packet should be processed further.
+ * ip_dooptions: perform option processing on a datagram, possibly discarding
+ * it if bad options are encountered, or forwarding it if source-routed.
+ *
+ * => Returns true if packet has been forwarded/freed.
+ * => Returns false if the packet should be processed further.
  */
-int
+static bool
 ip_dooptions(struct mbuf *m)
 {
 	struct ip *ip = mtod(m, struct ip *);
@@ -1036,20 +1024,20 @@ ip_dooptions(struct mbuf *m)
 			goto bad;
 		}
 		ip_forward(m, 1);
-		return (1);
+		return true;
 	}
-	return (0);
+	return false;
 bad:
 	icmp_error(m, type, code, 0, 0);
 	IP_STATINC(IP_STAT_BADOPTIONS);
-	return (1);
+	return true;
 }
 
 /*
- * Given address of next destination (final or next hop),
+ * ip_rtaddr: given address of next destination (final or next hop),
  * return internet address info of interface to be used to get there.
  */
-struct in_ifaddr *
+static struct in_ifaddr *
 ip_rtaddr(struct in_addr dst)
 {
 	struct rtentry *rt;
@@ -1067,19 +1055,15 @@ ip_rtaddr(struct in_addr dst)
 }
 
 /*
- * Save incoming source route for use in replies,
- * to be picked up later by ip_srcroute if the receiver is interested.
+ * save_rte: save incoming source route for use in replies, to be picked
+ * up later by ip_srcroute if the receiver is interested.
  */
-void
+static void
 save_rte(u_char *option, struct in_addr dst)
 {
 	unsigned olen;
 
 	olen = option[IPOPT_OLEN];
-#ifdef DIAGNOSTIC
-	if (ipprintfs)
-		printf("save_rte: olen %d\n", olen);
-#endif /* 0 */
 	if (olen > sizeof(ip_srcrt) - (1 + sizeof(dst)))
 		return;
 	memcpy((void *)ip_srcrt.srcopt, (void *)option, olen);
@@ -1110,20 +1094,12 @@ ip_srcroute(void)
 	/* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */
 	m->m_len = ip_nhops * sizeof(struct in_addr) + sizeof(struct in_addr) +
 	    OPTSIZ;
-#ifdef DIAGNOSTIC
-	if (ipprintfs)
-		printf("ip_srcroute: nhops %d mlen %d", ip_nhops, m->m_len);
-#endif
 
 	/*
 	 * First save first hop for return route
 	 */
 	p = &ip_srcrt.route[ip_nhops - 1];
 	*(mtod(m, struct in_addr *)) = *p--;
-#ifdef DIAGNOSTIC
-	if (ipprintfs)
-		printf(" hops %x", ntohl(mtod(m, struct in_addr *)->s_addr));
-#endif
 
 	/*
 	 * Copy option fields and padding (nop) to mbuf.
@@ -1140,20 +1116,12 @@ ip_srcroute(void)
 	 * reversing the path (pointers are now aligned).
 	 */
 	while (p >= ip_srcrt.route) {
-#ifdef DIAGNOSTIC
-		if (ipprintfs)
-			printf(" %x", ntohl(q->s_addr));
-#endif
 		*q++ = *p--;
 	}
 	/*
 	 * Last hop goes to final destination.
 	 */
 	*q = ip_srcrt.dst;
-#ifdef DIAGNOSTIC
-	if (ipprintfs)
-		printf(" %x\n", ntohl(q->s_addr));
-#endif
 	return (m);
 }
 
@@ -1222,12 +1190,6 @@ ip_forward(struct mbuf *m, int srcrt)
 	m->m_pkthdr.csum_flags = 0;
 
 	dest = 0;
-#ifdef DIAGNOSTIC
-	if (ipprintfs) {
-		printf("forward: src %s ", inet_ntoa(ip->ip_src));
-		printf("dst %s ttl %x\n", inet_ntoa(ip->ip_dst), ip->ip_ttl);
-	}
-#endif
 	if (m->m_flags & (M_BCAST|M_MCAST) || in_canforward(ip->ip_dst) == 0) {
 		IP_STATINC(IP_STAT_CANTFORWARD);
 		m_freem(m);
@@ -1280,11 +1242,6 @@ ip_forward(struct mbuf *m, int srcrt)
 			 */
 			type = ICMP_REDIRECT;
 			code = ICMP_REDIRECT_HOST;
-#ifdef DIAGNOSTIC
-			if (ipprintfs)
-				printf("redirect (%d) to %x\n", code,
-				    (u_int32_t)dest);
-#endif
 		}
 	}
 
@@ -1343,21 +1300,15 @@ ip_forward(struct mbuf *m, int srcrt)
 		break;
 
 	case ENOBUFS:
-#if 1
 		/*
-		 * a router should not generate ICMP_SOURCEQUENCH as
-		 * required in RFC1812 Requirements for IP Version 4 Routers.
-		 * source quench could be a big problem under DoS attacks,
-		 * or if the underlying interface is rate-limited.
+		 * Do not generate ICMP_SOURCEQUENCH as required in RFC 1812,
+		 * Requirements for IP Version 4 Routers.  Source quench can
+		 * big problem under DoS attacks or if the underlying
+		 * interface is rate-limited.
 		 */
 		if (mcopy)
 			m_freem(mcopy);
 		return;
-#else
-		type = ICMP_SOURCEQUENCH;
-		code = 0;
-		break;
-#endif
 	}
 	icmp_error(mcopy, type, code, dest, destmtu);
 }
@@ -1366,17 +1317,19 @@ void
 ip_savecontrol(struct inpcb *inp, struct mbuf **mp, struct ip *ip,
     struct mbuf *m)
 {
+	struct socket *so = inp->inp_socket;
+	int inpflags = inp->inp_flags;
 
-	if (inp->inp_socket->so_options & SO_TIMESTAMP
+	if (so->so_options & SO_TIMESTAMP
 #ifdef SO_OTIMESTAMP
-	    || inp->inp_socket->so_options & SO_OTIMESTAMP
+	    || so->so_options & SO_OTIMESTAMP
 #endif
 	    ) {
 		struct timeval tv;
 
 		microtime(&tv);
 #ifdef SO_OTIMESTAMP
-		if (inp->inp_socket->so_options & SO_OTIMESTAMP) {
+		if (so->so_options & SO_OTIMESTAMP) {
 			struct timeval50 tv50;
 			timeval_to_timeval50(&tv, &tv50);
 			*mp = sbcreatecontrol((void *) &tv50, sizeof(tv50),
@@ -1388,13 +1341,13 @@ ip_savecontrol(struct inpcb *inp, struct
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
-	if (inp->inp_flags & INP_RECVDSTADDR) {
+	if (inpflags & INP_RECVDSTADDR) {
 		*mp = sbcreatecontrol((void *) &ip->ip_dst,
 		    sizeof(struct in_addr), IP_RECVDSTADDR, IPPROTO_IP);
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
-	if (inp->inp_flags & INP_RECVPKTINFO) {
+	if (inpflags & INP_RECVPKTINFO) {
 		struct in_pktinfo ipi;
 		ipi.ipi_addr = ip->ip_src;
 		ipi.ipi_ifindex = m->m_pkthdr.rcvif->if_index;
@@ -1403,7 +1356,7 @@ ip_savecontrol(struct inpcb *inp, struct
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
-	if (inp->inp_flags & INP_PKTINFO) {
+	if (inpflags & INP_PKTINFO) {
 		struct in_pktinfo ipi;
 		ipi.ipi_addr = ip->ip_dst;
 		ipi.ipi_ifindex = m->m_pkthdr.rcvif->if_index;
@@ -1412,41 +1365,16 @@ ip_savecontrol(struct inpcb *inp, struct
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
-#ifdef notyet
-	/*
-	 * XXX
-	 * Moving these out of udp_input() made them even more broken
-	 * than they already were.
-	 *	- fen...@parc.xerox.com
-	 */
-	/* options were tossed already */
-	if (inp->inp_flags & INP_RECVOPTS) {
-		*mp = sbcreatecontrol((void *) opts_deleted_above,
-		    sizeof(struct in_addr), IP_RECVOPTS, IPPROTO_IP);
-		if (*mp)
-			mp = &(*mp)->m_next;
-	}
-	/* ip_srcroute doesn't do what we want here, need to fix */
-	if (inp->inp_flags & INP_RECVRETOPTS) {
-		*mp = sbcreatecontrol((void *) ip_srcroute(),
-		    sizeof(struct in_addr), IP_RECVRETOPTS, IPPROTO_IP);
-		if (*mp)
-			mp = &(*mp)->m_next;
-	}
-#endif
-	if (inp->inp_flags & INP_RECVIF) {
+	if (inpflags & INP_RECVIF) {
 		struct sockaddr_dl sdl;
 
-		sockaddr_dl_init(&sdl, sizeof(sdl),
-		    (m->m_pkthdr.rcvif != NULL)
-		        ?  m->m_pkthdr.rcvif->if_index
-			: 0,
-			0, NULL, 0, NULL, 0);
+		sockaddr_dl_init(&sdl, sizeof(sdl), m->m_pkthdr.rcvif ?
+		    m->m_pkthdr.rcvif->if_index : 0, 0, NULL, 0, NULL, 0);
 		*mp = sbcreatecontrol(&sdl, sdl.sdl_len, IP_RECVIF, IPPROTO_IP);
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
-	if (inp->inp_flags & INP_RECVTTL) {
+	if (inpflags & INP_RECVTTL) {
 		*mp = sbcreatecontrol((void *) &ip->ip_ttl,
 		    sizeof(uint8_t), IP_RECVTTL, IPPROTO_IP);
 		if (*mp)
@@ -1509,66 +1437,6 @@ sysctl_net_inet_ip_pmtudto(SYSCTLFN_ARGS
 	return (0);
 }
 
-#ifdef GATEWAY
-/*
- * sysctl helper routine for net.inet.ip.maxflows.
- */
-static int
-sysctl_net_inet_ip_maxflows(SYSCTLFN_ARGS)
-{
-	int error;
-
-	error = sysctl_lookup(SYSCTLFN_CALL(rnode));
-	if (error || newp == NULL)
-		return (error);
-
-	mutex_enter(softnet_lock);
-	KERNEL_LOCK(1, NULL);
-
-	ipflow_reap(false);
-
-	KERNEL_UNLOCK_ONE(NULL);
-	mutex_exit(softnet_lock);
-
-	return (0);
-}
-
-static int
-sysctl_net_inet_ip_hashsize(SYSCTLFN_ARGS)
-{
-	int error, tmp;
-	struct sysctlnode node;
-
-	node = *rnode;
-	tmp = ip_hashsize;
-	node.sysctl_data = &tmp;
-	error = sysctl_lookup(SYSCTLFN_CALL(&node));
-	if (error || newp == NULL)
-		return (error);
-
-	if ((tmp & (tmp - 1)) == 0 && tmp != 0) {
-		/*
-		 * Can only fail due to malloc()
-		 */
-		mutex_enter(softnet_lock);
-		KERNEL_LOCK(1, NULL);
-
-		error = ipflow_invalidate_all(tmp);
-
-		KERNEL_UNLOCK_ONE(NULL);
-		mutex_exit(softnet_lock);
-
-	} else {
-		/*
-		 * EINVAL if not a power of 2
-	         */
-		error = EINVAL;
-	}
-
-	return error;
-}
-#endif /* GATEWAY */
-
 static int
 sysctl_net_inet_ip_stats(SYSCTLFN_ARGS)
 {
@@ -1579,8 +1447,6 @@ sysctl_net_inet_ip_stats(SYSCTLFN_ARGS)
 static void
 sysctl_net_inet_ip_setup(struct sysctllog **clog)
 {
-	extern int subnetsarelocal, hostzeroisbroadcast;
-
 	sysctl_createv(clog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT,
 		       CTLTYPE_NODE, "inet",
@@ -1646,14 +1512,7 @@ sysctl_net_inet_ip_setup(struct sysctllo
 		       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"),
-		       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",
@@ -1682,29 +1541,6 @@ sysctl_net_inet_ip_setup(struct sysctllo
 		       sysctl_net_inet_ip_pmtudto, 0, (void *)&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_net_inet_ip_maxflows, 0, &ip_maxflows, 0,
-		       CTL_NET, PF_INET, IPPROTO_IP,
-		       IPCTL_MAXFLOWS, CTL_EOL);
-	sysctl_createv(clog, 0, NULL, NULL,
-			CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
-			CTLTYPE_INT, "hashsize",
-			SYSCTL_DESCR("Size of hash table for fast forwarding (IPv4)"),
-			sysctl_net_inet_ip_hashsize, 0, &ip_hashsize, 0,
-			CTL_NET, PF_INET, IPPROTO_IP,
-			CTL_CREATE, 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"),
-		       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,

Index: src/sys/netinet/ip_var.h
diff -u src/sys/netinet/ip_var.h:1.100 src/sys/netinet/ip_var.h:1.101
--- src/sys/netinet/ip_var.h:1.100	Sun May 18 14:46:16 2014
+++ src/sys/netinet/ip_var.h	Thu May 22 22:01:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_var.h,v 1.100 2014/05/18 14:46:16 rmind Exp $	*/
+/*	$NetBSD: ip_var.h,v 1.101 2014/05/22 22:01:12 rmind Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -192,22 +192,18 @@ extern struct rttimer_queue *ip_mtudisc_
 extern struct mowner ip_rx_mowner;
 extern struct mowner ip_tx_mowner;
 #endif
-#ifdef GATEWAY
-extern int ip_maxflows;
-extern int ip_hashsize;
-#endif
-extern struct pool inmulti_pool;
 struct	 inpcb;
 struct   sockopt;
 
+void	ip_init(void);
+void	in_init(void);
+
 int	 ip_ctloutput(int, struct socket *, struct sockopt *);
-int	 ip_dooptions(struct mbuf *);
 void	 ip_drain(void);
 void	 ip_drainstub(void);
 void	 ip_forward(struct mbuf *, int);
 void	 ip_freemoptions(struct ip_moptions *);
 int	 ip_getmoptions(struct ip_moptions *, struct sockopt *);
-void	 ip_init(void);
 int	 ip_optcopy(struct ip *, struct ip *);
 u_int	 ip_optlen(struct inpcb *);
 int	 ip_output(struct mbuf *, ...);
@@ -219,8 +215,6 @@ int	 ip_reass_packet(struct mbuf **, str
 void	 ip_reass_slowtimo(void);
 void	 ip_reass_drain(void);
 
-struct in_ifaddr *
-	 ip_rtaddr(struct in_addr);
 void	 ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
 	   struct mbuf *);
 int	 ip_setmoptions(struct ip_moptions **, const struct sockopt *);
@@ -238,7 +232,9 @@ void	 rip_input(struct mbuf *, ...);
 int	 rip_output(struct mbuf *, ...);
 int	 rip_usrreq(struct socket *,
 	    int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
-int	ipflow_init(int);
+
+/* IP Flow interface. */
+void	ipflow_init(void);
 void	ipflow_poolinit(void);
 struct ipflow *ipflow_reap(bool);
 void	ipflow_create(const struct route *, struct mbuf *);

Reply via email to