On Sun, 19 Apr 2009, Kip Macy wrote:
Author: kmacy
Date: Sun Apr 19 04:44:05 2009
New Revision: 191259
URL: http://svn.freebsd.org/changeset/base/191259
Log:
- Allocate a small flowtable in ip_input.c (changeable by tuneable)
- Use for accelerating ip_output
If you anticipate the flowtable being used with many types, I wonder if the
flowtable sysctl to enable/disable it by policy should be on the consumer
side, rather than the producer side? That way you could say "use the
flowtable for ipv4 and ipv6 but not ipx", which might well be helpful for
debugging when adding flowtable support for those protocols. Also, is it the
case that when the flowtable is disabled, it isn't allocated, or is the basic
table always allocated regardless of policy?
Robert N M Watson
Computer Laboratory
University of Cambridge
Modified:
head/sys/netinet/ip_input.c
head/sys/netinet/ip_output.c
head/sys/netinet/vinet.h
Modified: head/sys/netinet/ip_input.c
==============================================================================
--- head/sys/netinet/ip_input.c Sun Apr 19 04:39:42 2009 (r191258)
+++ head/sys/netinet/ip_input.c Sun Apr 19 04:44:05 2009 (r191259)
@@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
#include <net/route.h>
#include <net/netisr.h>
#include <net/vnet.h>
+#include <net/flowtable.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -211,6 +212,11 @@ SYSCTL_INT(_net_inet_ip, IPCTL_DEFMTU, m
SYSCTL_V_INT(V_NET, vnet_inet, _net_inet_ip, OID_AUTO, stealth, CTLFLAG_RW,
ipstealth, 0, "IP stealth mode, no TTL decrementation on forwarding");
#endif
+static int ip_output_flowtable_size = 2048;
+TUNABLE_INT("net.inet.ip.output_flowtable_size", &ip_output_flowtable_size);
+SYSCTL_V_INT(V_NET, vnet_inet, _net_inet_ip, OID_AUTO, output_flowtable_size,
+ CTLFLAG_RDTUN, ip_output_flowtable_size, 2048,
+ "number of entries in the per-cpu output flow caches");
/*
* ipfw_ether and ipfw_bridge hooks.
@@ -221,6 +227,7 @@ ip_dn_io_t *ip_dn_io_ptr = NULL;
#ifdef VIMAGE_GLOBALS
int fw_one_pass;
#endif
+struct flowtable *ip_ft;
static void ip_freef(struct ipqhead *, struct ipq *);
@@ -342,6 +349,8 @@ ip_init(void)
ipintrq.ifq_maxlen = ipqmaxlen;
mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF);
netisr_register(NETISR_IP, ip_input, &ipintrq, 0);
+
+ ip_ft = flowtable_alloc(ip_output_flowtable_size, FL_PCPU);
}
void
Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c Sun Apr 19 04:39:42 2009
(r191258)
+++ head/sys/netinet/ip_output.c Sun Apr 19 04:44:05 2009
(r191259)
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include <net/netisr.h>
#include <net/pfil.h>
#include <net/route.h>
+#include <net/flowtable.h>
#ifdef RADIX_MPATH
#include <net/radix_mpath.h>
#endif
@@ -135,6 +136,7 @@ ip_output(struct mbuf *m, struct mbuf *o
int hlen = sizeof (struct ip);
int mtu;
int len, error = 0;
+ int nortfree = 0;
struct sockaddr_in *dst = NULL; /* keep compiler happy */
struct in_ifaddr *ia = NULL;
int isbroadcast, sw_csum;
@@ -158,6 +160,10 @@ ip_output(struct mbuf *m, struct mbuf *o
m->m_flags |= M_FLOWID;
}
}
+ if ((ro == &iproute) && (ro->ro_rt == NULL) && (ro->ro_lle == NULL)) {
+ if (flowtable_lookup(ip_ft, m, ro) == 0)
+ nortfree = 1;
+ }
if (opt) {
len = 0;
@@ -199,7 +205,8 @@ again:
if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
dst->sin_family != AF_INET ||
dst->sin_addr.s_addr != ip->ip_dst.s_addr)) {
- RTFREE(ro->ro_rt);
+ if (!nortfree)
+ RTFREE(ro->ro_rt);
ro->ro_rt = (struct rtentry *)NULL;
}
#ifdef IPFIREWALL_FORWARD
@@ -638,7 +645,7 @@ passout:
IPSTAT_INC(ips_fragmented);
done:
- if (ro == &iproute && ro->ro_rt) {
+ if (ro == &iproute && ro->ro_rt && !nortfree) {
RTFREE(ro->ro_rt);
}
return (error);
Modified: head/sys/netinet/vinet.h
==============================================================================
--- head/sys/netinet/vinet.h Sun Apr 19 04:39:42 2009 (r191258)
+++ head/sys/netinet/vinet.h Sun Apr 19 04:44:05 2009 (r191259)
@@ -72,6 +72,7 @@ struct vnet_inet {
int _ip_sendsourcequench;
int _ip_do_randomid;
int _ip_checkinterface;
+ int _ip_output_flowtable_size;
u_short _ip_id;
uma_zone_t _ipq_zone;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"