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.
- * - [email protected]
- */
- /* 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 *);