svn commit: r189485 - in user/kmacy/releng_7_net_backport: sbin/route sys/amd64/conf sys/conf sys/kern sys/net sys/netinet sys/netinet6 sys/sys usr.bin/netstat usr.sbin/ndp usr.sbin/ppp usr.sbin/ro...

Kip Macy kmacy at FreeBSD.org
Fri Mar 6 21:39:56 PST 2009


Author: kmacy
Date: Sat Mar  7 05:39:55 2009
New Revision: 189485
URL: http://svn.freebsd.org/changeset/base/189485

Log:
  Backport HEAD network stack as of r189450

Added:
  user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c
  user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c
  user/kmacy/releng_7_net_backport/sys/net/bpf_buffer.c
  user/kmacy/releng_7_net_backport/sys/net/bpf_buffer.h
  user/kmacy/releng_7_net_backport/sys/net/bpf_zerocopy.c
  user/kmacy/releng_7_net_backport/sys/net/bpf_zerocopy.h
  user/kmacy/releng_7_net_backport/sys/net/if_llatbl.c
  user/kmacy/releng_7_net_backport/sys/net/if_llatbl.h
  user/kmacy/releng_7_net_backport/sys/net/radix_mpath.c
  user/kmacy/releng_7_net_backport/sys/net/radix_mpath.h
  user/kmacy/releng_7_net_backport/sys/net/vnet.h
  user/kmacy/releng_7_net_backport/sys/netinet/accf_dns.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_hostcache.h
  user/kmacy/releng_7_net_backport/sys/netinet/vinet.h
  user/kmacy/releng_7_net_backport/sys/netinet6/vinet6.h
  user/kmacy/releng_7_net_backport/sys/sys/_rmlock.h
  user/kmacy/releng_7_net_backport/sys/sys/buf_ring.h
  user/kmacy/releng_7_net_backport/sys/sys/rmlock.h
  user/kmacy/releng_7_net_backport/sys/sys/vimage.h
Modified:
  user/kmacy/releng_7_net_backport/sbin/route/route.c
  user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC
  user/kmacy/releng_7_net_backport/sys/conf/files
  user/kmacy/releng_7_net_backport/sys/conf/options
  user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c
  user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c
  user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c
  user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c
  user/kmacy/releng_7_net_backport/sys/net/bpf.c
  user/kmacy/releng_7_net_backport/sys/net/bpf.h
  user/kmacy/releng_7_net_backport/sys/net/bpf_filter.c
  user/kmacy/releng_7_net_backport/sys/net/bpfdesc.h
  user/kmacy/releng_7_net_backport/sys/net/bridgestp.c
  user/kmacy/releng_7_net_backport/sys/net/bridgestp.h
  user/kmacy/releng_7_net_backport/sys/net/bsd_comp.c
  user/kmacy/releng_7_net_backport/sys/net/ethernet.h
  user/kmacy/releng_7_net_backport/sys/net/ieee8023ad_lacp.c
  user/kmacy/releng_7_net_backport/sys/net/if.c
  user/kmacy/releng_7_net_backport/sys/net/if.h
  user/kmacy/releng_7_net_backport/sys/net/if_arcsubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_atmsubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_bridge.c
  user/kmacy/releng_7_net_backport/sys/net/if_clone.c
  user/kmacy/releng_7_net_backport/sys/net/if_clone.h
  user/kmacy/releng_7_net_backport/sys/net/if_disc.c
  user/kmacy/releng_7_net_backport/sys/net/if_ef.c
  user/kmacy/releng_7_net_backport/sys/net/if_enc.c
  user/kmacy/releng_7_net_backport/sys/net/if_ethersubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_faith.c
  user/kmacy/releng_7_net_backport/sys/net/if_fddisubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_fwsubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_gif.c
  user/kmacy/releng_7_net_backport/sys/net/if_gif.h
  user/kmacy/releng_7_net_backport/sys/net/if_gre.c
  user/kmacy/releng_7_net_backport/sys/net/if_iso88025subr.c
  user/kmacy/releng_7_net_backport/sys/net/if_lagg.c
  user/kmacy/releng_7_net_backport/sys/net/if_loop.c
  user/kmacy/releng_7_net_backport/sys/net/if_media.h
  user/kmacy/releng_7_net_backport/sys/net/if_mib.c
  user/kmacy/releng_7_net_backport/sys/net/if_ppp.c
  user/kmacy/releng_7_net_backport/sys/net/if_sl.c
  user/kmacy/releng_7_net_backport/sys/net/if_spppsubr.c
  user/kmacy/releng_7_net_backport/sys/net/if_stf.c
  user/kmacy/releng_7_net_backport/sys/net/if_tap.c
  user/kmacy/releng_7_net_backport/sys/net/if_tun.c
  user/kmacy/releng_7_net_backport/sys/net/if_var.h
  user/kmacy/releng_7_net_backport/sys/net/if_vlan.c
  user/kmacy/releng_7_net_backport/sys/net/netisr.c
  user/kmacy/releng_7_net_backport/sys/net/netisr.h
  user/kmacy/releng_7_net_backport/sys/net/pfil.c
  user/kmacy/releng_7_net_backport/sys/net/pfil.h
  user/kmacy/releng_7_net_backport/sys/net/ppp_deflate.c
  user/kmacy/releng_7_net_backport/sys/net/radix.c
  user/kmacy/releng_7_net_backport/sys/net/radix.h
  user/kmacy/releng_7_net_backport/sys/net/raw_cb.c
  user/kmacy/releng_7_net_backport/sys/net/raw_cb.h
  user/kmacy/releng_7_net_backport/sys/net/raw_usrreq.c
  user/kmacy/releng_7_net_backport/sys/net/route.c
  user/kmacy/releng_7_net_backport/sys/net/route.h
  user/kmacy/releng_7_net_backport/sys/net/rtsock.c
  user/kmacy/releng_7_net_backport/sys/netinet/icmp6.h
  user/kmacy/releng_7_net_backport/sys/netinet/icmp_var.h
  user/kmacy/releng_7_net_backport/sys/netinet/if_atm.c
  user/kmacy/releng_7_net_backport/sys/netinet/if_ether.c
  user/kmacy/releng_7_net_backport/sys/netinet/if_ether.h
  user/kmacy/releng_7_net_backport/sys/netinet/igmp.c
  user/kmacy/releng_7_net_backport/sys/netinet/igmp.h
  user/kmacy/releng_7_net_backport/sys/netinet/in.c
  user/kmacy/releng_7_net_backport/sys/netinet/in.h
  user/kmacy/releng_7_net_backport/sys/netinet/in_gif.c
  user/kmacy/releng_7_net_backport/sys/netinet/in_mcast.c
  user/kmacy/releng_7_net_backport/sys/netinet/in_pcb.c
  user/kmacy/releng_7_net_backport/sys/netinet/in_pcb.h
  user/kmacy/releng_7_net_backport/sys/netinet/in_proto.c
  user/kmacy/releng_7_net_backport/sys/netinet/in_rmx.c
  user/kmacy/releng_7_net_backport/sys/netinet/in_var.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip6.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip_carp.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_divert.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_dummynet.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_dummynet.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip_fastfwd.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_fw.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip_fw2.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_fw_nat.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_fw_pfil.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_gre.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_icmp.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_icmp.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip_id.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_input.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_ipsec.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_mroute.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_options.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_options.h
  user/kmacy/releng_7_net_backport/sys/netinet/ip_output.c
  user/kmacy/releng_7_net_backport/sys/netinet/ip_var.h
  user/kmacy/releng_7_net_backport/sys/netinet/raw_ip.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_auth.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_bsd_addr.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_constants.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_crc32.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_crc32.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_header.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_indata.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_input.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_os_bsd.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_output.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_output.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_pcb.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_pcb.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_structs.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_sysctl.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_uio.h
  user/kmacy/releng_7_net_backport/sys/netinet/sctp_usrreq.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctputil.c
  user/kmacy/releng_7_net_backport/sys/netinet/sctputil.h
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_hostcache.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_input.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_offload.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_offload.h
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_output.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_reass.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_sack.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_subr.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_syncache.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_syncache.h
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_timer.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_timewait.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_usrreq.c
  user/kmacy/releng_7_net_backport/sys/netinet/tcp_var.h
  user/kmacy/releng_7_net_backport/sys/netinet/toedev.h
  user/kmacy/releng_7_net_backport/sys/netinet/udp_usrreq.c
  user/kmacy/releng_7_net_backport/sys/netinet/udp_var.h
  user/kmacy/releng_7_net_backport/sys/netinet6/dest6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/frag6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/icmp6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_gif.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_ifattach.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_pcb.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_pcb.h
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_proto.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_rmx.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_src.c
  user/kmacy/releng_7_net_backport/sys/netinet6/in6_var.h
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_forward.c
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_input.c
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_ipsec.c
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_mroute.c
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_output.c
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6_var.h
  user/kmacy/releng_7_net_backport/sys/netinet6/ip6protosw.h
  user/kmacy/releng_7_net_backport/sys/netinet6/mld6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/nd6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/nd6.h
  user/kmacy/releng_7_net_backport/sys/netinet6/nd6_nbr.c
  user/kmacy/releng_7_net_backport/sys/netinet6/nd6_rtr.c
  user/kmacy/releng_7_net_backport/sys/netinet6/raw_ip6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/raw_ip6.h
  user/kmacy/releng_7_net_backport/sys/netinet6/route6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/scope6.c
  user/kmacy/releng_7_net_backport/sys/netinet6/sctp6_usrreq.c
  user/kmacy/releng_7_net_backport/sys/netinet6/tcp6_var.h
  user/kmacy/releng_7_net_backport/sys/netinet6/udp6_usrreq.c
  user/kmacy/releng_7_net_backport/sys/sys/conf.h
  user/kmacy/releng_7_net_backport/sys/sys/kernel.h
  user/kmacy/releng_7_net_backport/sys/sys/mbuf.h
  user/kmacy/releng_7_net_backport/sys/sys/pcpu.h
  user/kmacy/releng_7_net_backport/sys/sys/sysctl.h
  user/kmacy/releng_7_net_backport/usr.bin/netstat/inet6.c
  user/kmacy/releng_7_net_backport/usr.bin/netstat/route.c
  user/kmacy/releng_7_net_backport/usr.sbin/ndp/ndp.c
  user/kmacy/releng_7_net_backport/usr.sbin/ppp/route.c
  user/kmacy/releng_7_net_backport/usr.sbin/route6d/route6d.c

Modified: user/kmacy/releng_7_net_backport/sbin/route/route.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sbin/route/route.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sbin/route/route.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -605,9 +605,6 @@ newroute(argc, argv)
 			case K_NOSTATIC:
 				flags &= ~RTF_STATIC;
 				break;
-			case K_LLINFO:
-				flags |= RTF_LLINFO;
-				break;
 			case K_LOCK:
 				locking = 1;
 				break;
@@ -632,9 +629,6 @@ newroute(argc, argv)
 			case K_PROXY:
 				proxy = 1;
 				break;
-			case K_CLONING:
-				flags |= RTF_CLONING;
-				break;
 			case K_XRESOLVE:
 				flags |= RTF_XRESOLVE;
 				break;

Modified: user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC	Sat Mar  7 05:39:55 2009	(r189485)
@@ -30,7 +30,7 @@ options 	SCHED_ULE		# ULE scheduler
 options 	PREEMPTION		# Enable kernel thread preemption
 options 	INET			# InterNETworking
 options 	INET6			# IPv6 communications protocols
-options 	SCTP			# Stream Control Transmission Protocol 
+#options 	SCTP			# Stream Control Transmission Protocol 
 options 	FFS			# Berkeley Fast Filesystem
 options 	SOFTUPDATES		# Enable FFS soft updates support
 options 	UFS_ACL			# Support for access control lists
@@ -306,3 +306,6 @@ device		fwe		# Ethernet over FireWire (n
 device		fwip		# IP over FireWire (RFC 2734,3146)
 device		dcons		# Dumb console driver
 device		dcons_crom	# Configuration ROM for dcons
+
+options		VIMAGE_GLOBALS
+

Modified: user/kmacy/releng_7_net_backport/sys/conf/files
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/conf/files	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/conf/files	Sat Mar  7 05:39:55 2009	(r189485)
@@ -1489,6 +1489,7 @@ kern/subr_acl_posix1e.c		standard
 kern/subr_autoconf.c		standard
 kern/subr_blist.c		standard
 kern/subr_bus.c			standard
+kern/subr_bufring.c		standard
 kern/subr_clock.c		standard
 kern/subr_devstat.c		standard
 kern/subr_disk.c		standard
@@ -1513,6 +1514,7 @@ kern/subr_rman.c		standard
 kern/subr_rtc.c			optional genclock
 kern/subr_sbuf.c		standard
 kern/subr_scanf.c		standard
+kern/kern_rmlock.c		standard
 kern/kern_sdt.c			optional kdtrace_hooks
 kern/subr_sleepqueue.c		standard
 kern/subr_smp.c			standard
@@ -1611,8 +1613,10 @@ libkern/strtoul.c		standard
 libkern/strtouq.c		standard
 libkern/strvalid.c		standard
 net/bpf.c			standard
+net/bpf_buffer.c		optional bpf
 net/bpf_jitter.c		optional bpf_jitter
 net/bpf_filter.c		optional bpf | netgraph_bpf
+net/bpf_zerocopy.c		optional bpf
 net/bridgestp.c			optional bridge | if_bridge
 net/bsd_comp.c			optional ppp_bsdcomp
 net/ieee8023ad_lacp.c		optional lagg
@@ -1635,6 +1639,7 @@ net/if_gre.c			optional gre
 net/if_iso88025subr.c		optional token
 net/if_lagg.c			optional lagg
 net/if_loop.c			optional loop
+net/if_llatbl.c			standard
 net/if_media.c			standard
 net/if_mib.c			standard
 net/if_ppp.c			optional ppp
@@ -1652,6 +1657,7 @@ net/ppp_deflate.c		optional ppp_deflate
 net/ppp_tty.c			optional ppp
 net/pfil.c			optional ether | inet
 net/radix.c			standard
+net/radix_mpath.c		standard
 net/raw_cb.c			standard
 net/raw_usrreq.c		standard
 net/route.c			standard

Modified: user/kmacy/releng_7_net_backport/sys/conf/options
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/conf/options	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/conf/options	Sat Mar  7 05:39:55 2009	(r189485)
@@ -373,6 +373,7 @@ IPSEC			opt_ipsec.h
 IPSEC_DEBUG		opt_ipsec.h
 IPSEC_FILTERTUNNEL	opt_ipsec.h
 IPDIVERT
+MBUF_PROFILING
 DUMMYNET		opt_ipdn.h
 IPFILTER		opt_ipfilter.h
 IPFILTER_LOG		opt_ipfilter.h
@@ -395,6 +396,7 @@ NETATALK		opt_atalk.h
 PPP_BSDCOMP		opt_ppp.h
 PPP_DEFLATE		opt_ppp.h
 PPP_FILTER		opt_ppp.h
+RADIX_MPATH		opt_mpath.h
 SLIP_IFF_OPTS		opt_slip.h
 TCPDEBUG
 TCP_SIGNATURE		opt_inet.h
@@ -754,3 +756,7 @@ XFS
 
 # Interrupt filtering
 INTR_FILTER             opt_global.h
+
+# Virtualize the network stack
+VIMAGE			opt_global.h
+VIMAGE_GLOBALS		opt_global.h

Modified: user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -208,6 +208,9 @@ SYSCTL_STRING(_hw, HW_MACHINE_ARCH, mach
 
 char hostname[MAXHOSTNAMELEN];
 
+struct mtx hostname_mtx;
+MTX_SYSINIT(hostname_mtx, &hostname_mtx, "hostname", MTX_DEF);
+
 static int
 sysctl_hostname(SYSCTL_HANDLER_ARGS)
 {

Added: user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -0,0 +1,522 @@
+/*-
+ * Copyright (c) 2007 Stephan Uphoff <ups at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of any co-contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Machine independent bits of reader/writer lock implementation.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/sys/kern/kern_rmlock.c 182914 2008-09-10 19:13:30Z jhb $");
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/rmlock.h>
+#include <sys/sched.h>
+#include <sys/smp.h>
+#include <sys/systm.h>
+#include <sys/turnstile.h>
+#include <sys/lock_profile.h>
+#include <machine/cpu.h>
+
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
+
+#undef WITNESS_CHECKORDER
+#define WITNESS_CHECKORDER(a, b, c, d, e)
+
+#define RMPF_ONQUEUE	1
+#define RMPF_SIGNAL	2
+
+/* 
+ * To support usage of rmlock in CVs and msleep
+ * yet another list for the priority tracker
+ * would be needed.
+ * Using this lock for cv and msleep also does
+ * not seem very useful
+ */
+
+static __inline void compiler_memory_barrier(void) {
+	__asm __volatile("":::"memory");
+}
+#if 0
+static void assert_rm(struct lock_object *lock, int what);
+#endif
+static void lock_rm(struct lock_object *lock, int how);
+static int unlock_rm(struct lock_object *lock); 
+
+struct lock_class lock_class_rm = {
+	.lc_name = "rm",
+	.lc_flags = LC_SLEEPLOCK | LC_RECURSABLE,
+#if 0
+	.lc_assert = assert_rm,
+#endif
+#if 0
+#ifdef DDB
+	.lc_ddb_show = db_show_rwlock,
+#endif
+#endif
+	.lc_lock = lock_rm,
+	.lc_unlock = unlock_rm,
+};
+
+#if 0
+static void
+assert_rm(struct lock_object *lock, int what)
+{
+
+	panic("assert_rm called");
+}
+#endif
+static void
+lock_rm(struct lock_object *lock, int how) {
+	panic("lock_rm called");
+}
+
+static int
+unlock_rm(struct lock_object *lock) {
+	panic("unlock_rm called");
+}
+
+static struct mtx rm_spinlock;
+
+MTX_SYSINIT(rm_spinlock, &rm_spinlock, "rm_spinlock", MTX_SPIN);
+
+/*
+ * Add or remove tracker from per cpu list.
+ * The per cpu list can be traversed at any time in forward
+ * direction from an interrupt on the *local* cpu.
+ */
+ 
+static void inline 
+rm_tracker_add(struct pcpu *pc, struct rm_priotracker* tracker) {
+	struct rm_queue* next;
+	/* Initialize all tracker pointers */
+	tracker->rmp_cpuQueue.rmq_prev = &pc->pc_rm_queue;
+	next = pc->pc_rm_queue.rmq_next;
+	tracker->rmp_cpuQueue.rmq_next = next;
+	/* rmq_prev is not used during froward traversal */  
+	next->rmq_prev = &tracker->rmp_cpuQueue;
+	/* Update pointer to first element */
+	pc->pc_rm_queue.rmq_next =  &tracker->rmp_cpuQueue;
+}
+
+
+static void inline 
+rm_tracker_remove(struct pcpu *pc, struct rm_priotracker* tracker) {
+	struct rm_queue *next, *prev;
+	next =   tracker->rmp_cpuQueue.rmq_next;
+	prev =   tracker->rmp_cpuQueue.rmq_prev;
+	/* Not used during forward traversal */
+	next->rmq_prev = prev;
+	/* Remove from list */
+	prev->rmq_next = next;
+}
+
+
+
+
+static void rm_cleanIPI(void *arg) {
+	struct pcpu *pc;
+	struct rmlock* rm = arg;
+	struct rm_priotracker *tracker;
+	struct rm_queue* queue;
+	pc = pcpu_find(curcpu);
+
+	for(queue = pc->pc_rm_queue.rmq_next;
+	    queue !=  &pc->pc_rm_queue;
+	    queue = queue->rmq_next) {
+		tracker = (struct rm_priotracker *) queue;
+		if(tracker->rmp_rmlock == rm && tracker->rmp_flags == 0 ) {
+			tracker->rmp_flags = RMPF_ONQUEUE;
+			mtx_lock_spin(&rm_spinlock);
+			LIST_INSERT_HEAD(&rm->rm_activeReaders,tracker, 
+			    rmp_qentry);
+			mtx_unlock_spin(&rm_spinlock);
+		}
+	}
+	return;
+}
+
+
+
+void
+rm_init(struct rmlock *rm, const char *name, int opts)
+{
+	rm->rm_noreadtoken = 1;
+	LIST_INIT(&rm->rm_activeReaders);
+	mtx_init(&rm->rm_lock, name, "RM_MTX",MTX_NOWITNESS);
+	lock_init(&rm->lock_object, &lock_class_rm, name, NULL, (opts & LO_RECURSABLE)| LO_WITNESS);
+
+}
+
+void
+rm_destroy(struct rmlock *rm)
+{
+	mtx_destroy(&rm->rm_lock);
+	lock_destroy(&rm->lock_object);
+}
+
+int
+rm_wowned(struct rmlock *rm)
+{
+
+	return (mtx_owned(&rm->rm_lock));
+}
+
+void
+rm_sysinit(void *arg)
+{
+	struct rm_args *args = arg;
+	rm_init(args->ra_rm, args->ra_desc, args->ra_opts);
+}
+
+
+static void
+_rm_rlock_hard(struct rmlock *rm, struct rm_priotracker* tracker)
+{
+	struct pcpu *pc;
+	struct rm_queue *queue;
+	struct rm_priotracker* atracker;
+
+	critical_enter();
+	pc = pcpu_find(curcpu);
+
+	/* Check if we just need to do a proper critical_exit */
+	if (0 == rm->rm_noreadtoken) {
+		critical_exit();
+		return;
+	}
+
+	/* Remove our tracker from the per cpu list */
+	rm_tracker_remove(pc,tracker);
+
+	/* Check to see if the IPI granted us the lock after all */
+	if(tracker->rmp_flags) {
+		/* Just add back tracker - we hold the lock */
+		rm_tracker_add(pc,tracker);
+		critical_exit();
+		return;
+	}
+
+	
+		
+	/*
+	 * We allow readers to aquire a lock even if a writer
+	 * is blocked if the lock is recursive and the reader
+	 * already holds the lock
+	 */
+
+	if ((rm->lock_object.lo_flags & LO_RECURSABLE) != 0) {
+		/*
+		 * Just grand the lock if this thread already have a tracker
+		 * for this lock on the per cpu queue
+		 */
+
+		for(queue = pc->pc_rm_queue.rmq_next;
+		    queue !=  &pc->pc_rm_queue;
+		    queue = queue->rmq_next) {
+			atracker = (struct rm_priotracker *) queue;
+			if (( atracker->rmp_rmlock == rm) &&
+			    ( atracker->rmp_thread == tracker->rmp_thread )) {
+				mtx_lock_spin(&rm_spinlock);
+				LIST_INSERT_HEAD(&rm->rm_activeReaders,tracker, 
+				    rmp_qentry);
+				tracker->rmp_flags = RMPF_ONQUEUE;
+				mtx_unlock_spin(&rm_spinlock);
+				rm_tracker_add(pc,tracker);
+				critical_exit();
+				return;
+			}
+		}
+	}
+
+
+	sched_unpin();
+	critical_exit();
+
+	mtx_lock(&rm->rm_lock);
+	rm->rm_noreadtoken = 0;
+	critical_enter();
+
+	pc = pcpu_find(curcpu);
+	rm_tracker_add(pc,tracker);
+	sched_pin();
+	critical_exit();
+	
+	mtx_unlock(&rm->rm_lock);
+	return;
+}
+
+void
+_rm_rlock(struct rmlock *rm, struct rm_priotracker* tracker)
+{
+	struct thread *td = curthread;
+	struct pcpu *pc;
+
+	tracker->rmp_flags  = 0;
+	tracker->rmp_thread = td;
+	tracker->rmp_rmlock = rm;
+
+	td->td_critnest++;	/* critical_enter(); */
+
+	compiler_memory_barrier();
+
+	pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */
+
+	rm_tracker_add(pc,tracker);
+
+	td->td_pinned++; /*  sched_pin(); */
+
+	compiler_memory_barrier();
+
+	td->td_critnest--;
+	
+	/* 
+	 * Fast path to combine two common conditions
+	 * into a single conditional jump
+	 */
+  
+	if (0 == (td->td_owepreempt |  rm->rm_noreadtoken)) {
+		return;
+	}
+
+	/* We do not have a read token and need to acquire one */
+	_rm_rlock_hard(rm,tracker);
+}
+
+
+static void
+_rm_unlock_hard(struct thread *td,struct rm_priotracker* tracker)
+{
+		
+	if (td->td_owepreempt) {
+		td->td_critnest++;
+		critical_exit();
+	}
+	
+	if (!tracker->rmp_flags) {
+		return;
+	}
+		
+
+	mtx_lock_spin(&rm_spinlock);
+	LIST_REMOVE(tracker,rmp_qentry);
+
+	if (tracker->rmp_flags & RMPF_SIGNAL) {
+		struct rmlock *rm;
+		struct turnstile* ts;
+
+		rm = tracker->rmp_rmlock;
+			
+		turnstile_chain_lock(&rm->lock_object);
+		mtx_unlock_spin(&rm_spinlock);
+
+		ts = turnstile_lookup(&rm->lock_object);
+
+		turnstile_signal(ts, TS_EXCLUSIVE_QUEUE);
+		turnstile_unpend(ts, TS_EXCLUSIVE_LOCK);
+		turnstile_chain_unlock(&rm->lock_object);
+
+
+	} else
+		mtx_unlock_spin(&rm_spinlock);
+		
+}	
+
+void
+_rm_runlock(struct rmlock *rm, struct rm_priotracker* tracker)
+{
+	struct pcpu *pc;
+	struct thread *td = tracker->rmp_thread;
+
+	td->td_critnest++;	/* critical_enter(); */
+	pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */
+	rm_tracker_remove(pc,tracker);
+	td->td_critnest--;
+	td->td_pinned--; /*  sched_unpin(); */
+
+	if (0 == (td->td_owepreempt | tracker->rmp_flags)) 
+		return;
+
+
+	_rm_unlock_hard(td,tracker);
+
+
+}
+
+
+void
+_rm_wlock(struct rmlock *rm)
+{
+	struct rm_priotracker *prio;
+	struct turnstile *ts;
+
+	mtx_lock(&rm->rm_lock);
+
+	if (rm->rm_noreadtoken == 0) {
+		/* Get all read tokens back */
+
+		rm->rm_noreadtoken = 1;
+
+		/* 
+		 * Assumes rm->rm_noreadtoken update is visible 
+		 * on other CPUs before rm_cleanIPI is called
+		 */
+#ifdef SMP
+   		smp_rendezvous(smp_no_rendevous_barrier,
+		    rm_cleanIPI,
+		    smp_no_rendevous_barrier
+		    ,rm);
+
+#else
+		rm_cleanIPI(rm);
+#endif
+
+
+		mtx_lock_spin(&rm_spinlock);
+	
+		while((prio = LIST_FIRST(&rm->rm_activeReaders)) != NULL) {
+			ts = turnstile_trywait(&rm->lock_object);
+			prio->rmp_flags = RMPF_ONQUEUE | RMPF_SIGNAL;
+			mtx_unlock_spin(&rm_spinlock);
+			turnstile_wait(ts,prio->rmp_thread,
+		    TS_EXCLUSIVE_QUEUE);
+			mtx_lock_spin(&rm_spinlock);
+
+		}
+
+		mtx_unlock_spin(&rm_spinlock);
+	}
+		
+}
+
+
+void
+_rm_wunlock(struct rmlock *rm)
+{
+	mtx_unlock(&rm->rm_lock);
+}
+
+
+#ifdef LOCK_DEBUG
+
+void _rm_wlock_debug(struct rmlock *rm, const char *file, int line)
+{
+
+	WITNESS_CHECKORDER(&rm->lock_object, LOP_NEWORDER | LOP_EXCLUSIVE, 
+	    file, line, NULL);
+
+	_rm_wlock(rm);
+
+	LOCK_LOG_LOCK("RMWLOCK", &rm->lock_object, 0, 0, file, line);
+
+	WITNESS_LOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line);
+
+	curthread->td_locks++;
+
+}
+
+void	_rm_wunlock_debug(struct rmlock *rm, const char *file, int line)
+{
+	curthread->td_locks--;
+	WITNESS_UNLOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line);
+	LOCK_LOG_LOCK("RMWUNLOCK", &rm->lock_object, 0, 0, file, line);
+	_rm_wunlock(rm);
+}	
+
+
+void	
+_rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
+    const char *file, int line)
+{
+
+
+	WITNESS_CHECKORDER(&rm->lock_object, LOP_NEWORDER , file, line, NULL);
+	
+	_rm_rlock(rm, tracker);
+
+	LOCK_LOG_LOCK("RMRLOCK", &rm->lock_object, 0, 0, file, line);
+
+	WITNESS_LOCK(&rm->lock_object, 0 , file, line);
+
+	curthread->td_locks++;	
+}
+
+void	
+_rm_runlock_debug(struct rmlock *rm,  struct rm_priotracker *tracker,
+    const char *file, int line) {
+	curthread->td_locks--;
+	WITNESS_UNLOCK(&rm->lock_object, 0 , file, line);
+	LOCK_LOG_LOCK("RMRUNLOCK", &rm->lock_object, 0, 0, file, line);
+	_rm_runlock(rm, tracker);
+}
+
+
+
+
+#else
+/* 
+ * Just strip out file and line arguments if no lock debugging is enabled
+ * in the kernel - we are called from a kernel module.
+*/
+
+
+void _rm_wlock_debug(struct rmlock *rm, const char *file, int line)
+{
+	_rm_wlock(rm);
+}
+
+void	_rm_wunlock_debug(struct rmlock *rm, const char *file, int line)
+{
+	_rm_wunlock(rm);
+}	
+	
+void	
+_rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
+    const char *file, int line)
+{
+	_rm_rlock(rm, tracker);
+}
+
+void	
+_rm_runlock_debug(struct rmlock *rm,  struct rm_priotracker *tracker,
+    const char *file, int line) {
+	_rm_runlock(rm, tracker);
+}
+
+#endif

Modified: user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -27,6 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_route.h"
+
 #include <sys/param.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
@@ -37,10 +39,13 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysproto.h>
 #include <sys/systm.h>
 #include <sys/uuid.h>
+#include <sys/vimage.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
+#include <net/route.h>
+#include <net/vnet.h>
 
 /*
  * See also:
@@ -87,13 +92,14 @@ MTX_SYSINIT(uuid_lock, &uuid_mutex, "UUI
 static void
 uuid_node(uint16_t *node)
 {
+	INIT_VNET_NET(curvnet);
 	struct ifnet *ifp;
 	struct ifaddr *ifa;
 	struct sockaddr_dl *sdl;
 	int i;
 
 	IFNET_RLOCK();
-	TAILQ_FOREACH(ifp, &ifnet, if_link) {
+	TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
 		/* Walk the address list */
 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 			sdl = (struct sockaddr_dl*)ifa->ifa_addr;

Added: user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -0,0 +1,68 @@
+/**************************************************************************
+ *
+ * Copyright (c) 2007,2008 Kip Macy kmacy at freebsd.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. The name of Kip Macy nor the names of other
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ ***************************************************************************/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/sys/kern/subr_bufring.c 185162 2008-11-22 05:55:56Z kmacy $");
+
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/ktr.h>
+#include <sys/buf_ring.h>
+
+
+struct buf_ring *
+buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock)
+{
+	struct buf_ring *br;
+
+	KASSERT(powerof2(count), ("buf ring must be size power of 2"));
+	
+	br = malloc(sizeof(struct buf_ring) + count*sizeof(caddr_t),
+	    type, flags|M_ZERO);
+	if (br == NULL)
+		return (NULL);
+#ifdef DEBUG_BUFRING
+	br->br_lock = lock;
+#endif	
+	br->br_prod_size = br->br_cons_size = count;
+	br->br_prod_mask = br->br_cons_mask = count-1;
+	br->br_prod_head = br->br_cons_head = 0;
+	br->br_prod_tail = br->br_cons_tail = 0;
+		
+	return (br);
+}
+
+void
+buf_ring_free(struct buf_ring *br, struct malloc_type *type)
+{
+	free(br, type);
+}

Modified: user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/smp.h>
 #include <ddb/ddb.h>
 
-static struct pcpu *cpuid_to_pcpu[MAXCPU];
+struct pcpu *cpuid_to_pcpu[MAXCPU];
 struct cpuhead cpuhead = SLIST_HEAD_INITIALIZER(cpuhead);
 
 /*

Modified: user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mbuf.h>
 #include <sys/mount.h>
 #include <sys/mutex.h>
+#include <sys/rwlock.h>
 #include <sys/refcount.h>
 #include <sys/socket.h>
 #include <sys/systm.h>
@@ -235,6 +236,7 @@ vfs_free_addrlist(struct netexport *nep)
 		if ((rnh = nep->ne_rtable[i])) {
 			RADIX_NODE_HEAD_LOCK(rnh);
 			(*rnh->rnh_walktree) (rnh, vfs_free_netcred, rnh);
+			RADIX_NODE_HEAD_UNLOCK(rnh);
 			RADIX_NODE_HEAD_DESTROY(rnh);
 			free(rnh, M_RTABLE);
 			nep->ne_rtable[i] = NULL;	/* not SMP safe XXX */

Modified: user/kmacy/releng_7_net_backport/sys/net/bpf.c
==============================================================================
--- user/kmacy/releng_7_net_backport/sys/net/bpf.c	Sat Mar  7 03:41:29 2009	(r189484)
+++ user/kmacy/releng_7_net_backport/sys/net/bpf.c	Sat Mar  7 05:39:55 2009	(r189485)
@@ -32,10 +32,11 @@
  * SUCH DAMAGE.
  *
  *      @(#)bpf.c	8.4 (Berkeley) 1/9/95
- *
- * $FreeBSD$
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
 #include "opt_bpf.h"
 #include "opt_mac.h"
 #include "opt_netgraph.h"
@@ -55,6 +56,7 @@
 #include <sys/sockio.h>
 #include <sys/ttycom.h>
 #include <sys/uio.h>
+#include <sys/vimage.h>
 
 #include <sys/event.h>
 #include <sys/file.h>
@@ -65,9 +67,11 @@
 
 #include <net/if.h>
 #include <net/bpf.h>
+#include <net/bpf_buffer.h>
 #ifdef BPF_JITTER
 #include <net/bpf_jitter.h>
 #endif
+#include <net/bpf_zerocopy.h>
 #include <net/bpfdesc.h>
 
 #include <netinet/in.h>
@@ -79,7 +83,7 @@
 
 #include <security/mac/mac_framework.h>
 
-static MALLOC_DEFINE(M_BPF, "BPF", "BPF data");
+MALLOC_DEFINE(M_BPF, "BPF", "BPF data");
 
 #if defined(DEV_BPF) || defined(NETGRAPH_BPF)
 
@@ -95,19 +99,17 @@ static LIST_HEAD(, bpf_if)	bpf_iflist;
 static struct mtx	bpf_mtx;		/* bpf global lock */
 static int		bpf_bpfd_cnt;
 
-static void	bpf_allocbufs(struct bpf_d *);
 static void	bpf_attachd(struct bpf_d *, struct bpf_if *);
 static void	bpf_detachd(struct bpf_d *);
 static void	bpf_freed(struct bpf_d *);
-static void	bpf_mcopy(const void *, void *, size_t);
 static int	bpf_movein(struct uio *, int, struct ifnet *, struct mbuf **,
 		    struct sockaddr *, int *, struct bpf_insn *);
 static int	bpf_setif(struct bpf_d *, struct ifreq *);
 static void	bpf_timed_out(void *);
 static __inline void
 		bpf_wakeup(struct bpf_d *);
-static void	catchpacket(struct bpf_d *, u_char *, u_int,
-		    u_int, void (*)(const void *, void *, size_t),
+static void	catchpacket(struct bpf_d *, u_char *, u_int, u_int,
+		    void (*)(struct bpf_d *, caddr_t, u_int, void *, u_int),
 		    struct timeval *);
 static void	reset_d(struct bpf_d *);
 static int	 bpf_setf(struct bpf_d *, struct bpf_program *, u_long cmd);
@@ -116,24 +118,19 @@ static int	bpf_setdlt(struct bpf_d *, u_
 static void	filt_bpfdetach(struct knote *);
 static int	filt_bpfread(struct knote *, long);
 static void	bpf_drvinit(void *);
-static void	bpf_clone(void *, struct ucred *, char *, int, struct cdev **);
 static int	bpf_stats_sysctl(SYSCTL_HANDLER_ARGS);
 
 SYSCTL_NODE(_net, OID_AUTO, bpf, CTLFLAG_RW, 0, "bpf sysctl");
-static int bpf_bufsize = 4096;
-SYSCTL_INT(_net_bpf, OID_AUTO, bufsize, CTLFLAG_RW,
-    &bpf_bufsize, 0, "Default bpf buffer size");
-static int bpf_maxbufsize = BPF_MAXBUFSIZE;
-SYSCTL_INT(_net_bpf, OID_AUTO, maxbufsize, CTLFLAG_RW,
-    &bpf_maxbufsize, 0, "Maximum bpf buffer size");
-static int bpf_maxinsns = BPF_MAXINSNS;
+int bpf_maxinsns = BPF_MAXINSNS;
 SYSCTL_INT(_net_bpf, OID_AUTO, maxinsns, CTLFLAG_RW,
     &bpf_maxinsns, 0, "Maximum bpf program instructions");
+static int bpf_zerocopy_enable = 1;
+SYSCTL_INT(_net_bpf, OID_AUTO, zerocopy_enable, CTLFLAG_RW,
+    &bpf_zerocopy_enable, 0, "Enable new zero-copy BPF buffer sessions");
 SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_RW,
     bpf_stats_sysctl, "bpf statistics portal");
 
 static	d_open_t	bpfopen;
-static	d_close_t	bpfclose;
 static	d_read_t	bpfread;
 static	d_write_t	bpfwrite;
 static	d_ioctl_t	bpfioctl;
@@ -142,9 +139,7 @@ static	d_kqfilter_t	bpfkqfilter;
 
 static struct cdevsw bpf_cdevsw = {
 	.d_version =	D_VERSION,
-	.d_flags =	D_TRACKCLOSE,
 	.d_open =	bpfopen,
-	.d_close =	bpfclose,
 	.d_read =	bpfread,
 	.d_write =	bpfwrite,
 	.d_ioctl =	bpfioctl,
@@ -156,6 +151,207 @@ static struct cdevsw bpf_cdevsw = {
 static struct filterops bpfread_filtops =
 	{ 1, NULL, filt_bpfdetach, filt_bpfread };
 
+/*
+ * Wrapper functions for various buffering methods.  If the set of buffer
+ * modes expands, we will probably want to introduce a switch data structure
+ * similar to protosw, et.
+ */
+static void
+bpf_append_bytes(struct bpf_d *d, caddr_t buf, u_int offset, void *src,
+    u_int len)
+{
+
+	BPFD_LOCK_ASSERT(d);
+
+	switch (d->bd_bufmode) {
+	case BPF_BUFMODE_BUFFER:
+		return (bpf_buffer_append_bytes(d, buf, offset, src, len));
+
+	case BPF_BUFMODE_ZBUF:
+		d->bd_zcopy++;
+		return (bpf_zerocopy_append_bytes(d, buf, offset, src, len));
+
+	default:
+		panic("bpf_buf_append_bytes");
+	}
+}
+
+static void
+bpf_append_mbuf(struct bpf_d *d, caddr_t buf, u_int offset, void *src,
+    u_int len)
+{
+
+	BPFD_LOCK_ASSERT(d);
+
+	switch (d->bd_bufmode) {
+	case BPF_BUFMODE_BUFFER:
+		return (bpf_buffer_append_mbuf(d, buf, offset, src, len));
+
+	case BPF_BUFMODE_ZBUF:
+		d->bd_zcopy++;
+		return (bpf_zerocopy_append_mbuf(d, buf, offset, src, len));
+
+	default:
+		panic("bpf_buf_append_mbuf");
+	}
+}
+
+/*
+ * This function gets called when the free buffer is re-assigned.
+ */
+static void
+bpf_buf_reclaimed(struct bpf_d *d)
+{
+
+	BPFD_LOCK_ASSERT(d);
+
+	switch (d->bd_bufmode) {
+	case BPF_BUFMODE_BUFFER:
+		return;
+
+	case BPF_BUFMODE_ZBUF:
+		bpf_zerocopy_buf_reclaimed(d);
+		return;
+
+	default:
+		panic("bpf_buf_reclaimed");
+	}
+}
+
+/*
+ * If the buffer mechanism has a way to decide that a held buffer can be made
+ * free, then it is exposed via the bpf_canfreebuf() interface.  (1) is
+ * returned if the buffer can be discarded, (0) is returned if it cannot.
+ */
+static int
+bpf_canfreebuf(struct bpf_d *d)
+{
+
+	BPFD_LOCK_ASSERT(d);
+
+	switch (d->bd_bufmode) {
+	case BPF_BUFMODE_ZBUF:
+		return (bpf_zerocopy_canfreebuf(d));
+	}
+	return (0);
+}
+
+/*
+ * Allow the buffer model to indicate that the current store buffer is
+ * immutable, regardless of the appearance of space.  Return (1) if the
+ * buffer is writable, and (0) if not.
+ */
+static int
+bpf_canwritebuf(struct bpf_d *d)
+{
+
+	BPFD_LOCK_ASSERT(d);
+
+	switch (d->bd_bufmode) {
+	case BPF_BUFMODE_ZBUF:
+		return (bpf_zerocopy_canwritebuf(d));
+	}
+	return (1);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-user mailing list