OPNsense - FreeBSD source
Find a file
Mark Johnston a1da7dc1cd socket: Implement SO_SPLICE
This is a feature which allows one to splice two TCP sockets together
such that data which arrives on one socket is automatically pushed into
the send buffer of the spliced socket.  This can be used to make TCP
proxying more efficient as it eliminates the need to copy data into and
out of userspace.

The interface is copied from OpenBSD, and this implementation aims to be
compatible.  Splicing is enabled by setting the SO_SPLICE socket option.
When spliced, data that arrives on the receive buffer is automatically
forwarded to the other socket.  In particular, splicing is a
unidirectional operation; to splice a socket pair in both directions,
SO_SPLICE needs to be applied to both sockets.  More concretely, when
setting the option one passes the following struct:

    struct splice {
	    int fd;
	    off_t max;
	    struct timveval idle;
    };

where "fd" refers to the socket to which the first socket is to be
spliced, and two setsockopt(SO_SPLICE) calls are required to set up a
bi-directional splice.

select(), poll() and kevent() do not return when data arrives in the
receive buffer of a spliced socket, as such data is expected to be
removed automatically once space is available in the corresponding send
buffer.  Userspace can perform I/O on spliced sockets, but it will be
unpredictably interleaved with splice I/O.

A splice can be configured to unsplice once a certain number of bytes
have been transmitted, or after a given time period.  Once unspliced,
the socket behaves normally from userspace's perspective.  The number of
bytes transmitted via the splice can be retrieved using
getsockopt(SO_SPLICE); this works after unsplicing as well, up until the
socket is closed or spliced again.  Userspace can also manually trigger
unsplicing by splicing to -1.

Splicing work is handled by dedicated threads, similar to KTLS.  A
worker thread is assigned at splice creation time.  At some point it
would be nice to have a direct dispatch mode, wherein the thread which
places data into a receive buffer is also responsible for pushing it
into the sink, but this requires tighter integration with the protocol
stack in order to avoid reentrancy problems.

Currently, sowakeup() and related functions will signal the worker
thread assigned to a spliced socket.  so_splice_xfer() does the hard
work of moving data between socket buffers.

Co-authored by:	gallatin
Reviewed by:	brooks (interface bits)
MFC after:	3 months
Sponsored by:	Klara, Inc.
Sponsored by:	Stormshield
Sponsored by:	Netflix
Differential Revision:	https://reviews.freebsd.org/D46411
2024-09-10 16:51:37 +00:00
.cirrus-ci Cirrus-CI: add some timing info on pkg install failure 2021-08-04 15:02:00 -04:00
.github CODEOWNERS: Add nuageinit 2024-07-25 11:15:29 +02:00
bin date: Documentation nits. 2024-09-10 14:29:14 +02:00
cddl zfs: merge openzfs/zfs@b10992582 2024-09-09 18:13:02 +02:00
contrib netbsd-tests: Update a test case to chase grep symlink handling changes 2024-09-07 19:39:49 +00:00
crypto openssl: Remove the specific version numbers from the instructions. 2024-09-08 09:45:31 -07:00
etc flua: add freebsd module implementing kldload/kldunload 2024-09-06 17:25:54 +02:00
gnu Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
include spa_prop_get: require caller to supply output nvlist 2024-09-06 08:45:58 -07:00
kerberos5 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
lib socket: Implement SO_SPLICE 2024-09-10 16:51:37 +00:00
libexec flua: make the ucl module a dynamic module 2024-09-06 17:21:29 +02:00
release EC2: Add new "small" AMIs 2024-09-03 22:57:06 -07:00
rescue Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
sbin geom.8: minor cleanup (markup, spdx, gsched) 2024-09-06 12:34:33 -06:00
secure Update config/build info for OpenSSL 3.0.15 2024-09-07 21:34:18 -07:00
share pf: Add a sysctl to limit work done for rdr source port rewriting 2024-09-10 14:58:19 +00:00
stand loader.efi.8: Remove rogue duplicated lines 2024-09-03 21:14:44 +01:00
sys socket: Implement SO_SPLICE 2024-09-10 16:51:37 +00:00
targets mergemaster: remove from the tree 2024-07-16 08:25:54 -04:00
tests netinet tests: Make some tests more reliable when run in parallel 2024-09-09 15:28:24 +00:00
tools depend-cleanup.sh: Fix overzealous rescue.mk cleanup 2024-09-10 17:33:06 +01:00
usr.bin fetch(1): suppress "Not Modified" in quiet mode 2024-09-07 09:14:23 +07:00
usr.sbin bhyve: support noVNC SetPixelFormat request 2024-09-09 10:21:17 -07:00
.arcconfig arcanist: use FreeBSD/git project repository instead of FreeBSD/svn 2022-08-23 14:16:41 +00:00
.arclint arc lint: ignore /tests/ in chmod 2017-12-19 03:38:06 +00:00
.cirrus.yml Cirrus-CI: switch to llvm18 by default 2024-04-07 17:23:25 -04:00
.clang-format clang-format: Minor tweaks 2024-04-30 17:33:43 -04:00
.git-blame-ignore-revs sys/sys/mman.h: ignore b5c95c93fd in blame 2024-08-06 19:21:33 +01:00
.gitattributes Remove SVN related Git attributes 2023-12-26 10:28:28 -07:00
.gitignore .gitignore: add sys/*/compile 2024-02-02 09:20:36 -07:00
.mailmap mailmap: Translate my personal address 2024-06-22 08:57:56 +02:00
CONTRIBUTING.md CONTRIBUTING.md/style: spring cleaning 2024-05-10 15:07:03 -06:00
COPYRIGHT copyright: Bump the copyright date. 2023-12-31 23:15:43 -07:00
LOCKS Update LOCKS for Git 2023-12-26 10:28:25 -07:00
MAINTAINERS man filesystems: fix more xrefs after move to s4 2024-06-27 18:32:05 -06:00
Makefile armv6: Remove support for building armv6 2024-07-12 11:31:53 +00:00
Makefile.inc1 pkgbase: fix decision logic to keep the old packages 2024-09-10 18:05:29 +02:00
Makefile.libcompat Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
Makefile.sys.inc Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
ObsoleteFiles.inc ObsoleteFiles.inc: Fix examples path 2024-08-31 19:35:07 +03:00
README.md Update README.md to add pointer to release page. 2024-05-09 20:40:46 -06:00
RELNOTES RELNOTES: Document recent bhyve commits which have user-visible impact 2024-09-09 15:28:30 +00:00
UPDATING UPDATING: increase visibility of footnotes 2024-09-06 12:34:33 -06:00

FreeBSD Source:

This is the top level of the FreeBSD source directory.

FreeBSD is an operating system used to power modern servers, desktops, and embedded platforms. A large community has continually developed it for more than thirty years. Its advanced networking, security, and storage features have made FreeBSD the platform of choice for many of the busiest web sites and most pervasive embedded networking and storage devices.

For copyright information, please see the file COPYRIGHT in this directory. Additional copyright information also exists for some sources in this tree - please see the specific source directories for more information.

The Makefile in this directory supports a number of targets for building components (or all) of the FreeBSD source tree. See build(7), config(8), FreeBSD handbook on building userland, and Handbook for kernels for more information, including setting make(1) variables.

For information on the CPU architectures and platforms supported by FreeBSD, see the FreeBSD website's Platforms page.

For official FreeBSD bootable images, see the release page.

Source Roadmap:

Directory Description
bin System/user commands.
cddl Various commands and libraries under the Common Development and Distribution License.
contrib Packages contributed by 3rd parties.
crypto Cryptography stuff (see crypto/README).
etc Template files for /etc.
gnu Commands and libraries under the GNU General Public License (GPL) or Lesser General Public License (LGPL). Please see gnu/COPYING and gnu/COPYING.LIB for more information.
include System include files.
kerberos5 Kerberos5 (Heimdal) package.
lib System libraries.
libexec System daemons.
release Release building Makefile & associated tools.
rescue Build system for statically linked /rescue utilities.
sbin System commands.
secure Cryptographic libraries and commands.
share Shared resources.
stand Boot loader sources.
sys Kernel sources (see sys/README.md).
targets Support for experimental DIRDEPS_BUILD
tests Regression tests which can be run by Kyua. See tests/README for additional information.
tools Utilities for regression testing and miscellaneous tasks.
usr.bin User commands.
usr.sbin System administration commands.

For information on synchronizing your source tree with one or more of the FreeBSD Project's development branches, please see FreeBSD Handbook.