efa6326974
- Add RATELIMIT kernel configuration keyword which must be set to enable the new functionality. - Add support for hardware driven, Receive Side Scaling, RSS aware, rate limited sendqueues and expose the functionality through the already established SO_MAX_PACING_RATE setsockopt(). The API support rates in the range from 1 to 4Gbytes/s which are suitable for regular TCP and UDP streams. The setsockopt(2) manual page has been updated. - Add rate limit function callback API to "struct ifnet" which supports the following operations: if_snd_tag_alloc(), if_snd_tag_modify(), if_snd_tag_query() and if_snd_tag_free(). - Add support to ifconfig to view, set and clear the IFCAP_TXRTLMT flag, which tells if a network driver supports rate limiting or not. - This patch also adds support for rate limiting through VLAN and LAGG intermediate network devices. - How rate limiting works: 1) The userspace application calls setsockopt() after accepting or making a new connection to set the rate which is then stored in the socket structure in the kernel. Later on when packets are transmitted a check is made in the transmit path for rate changes. A rate change implies a non-blocking ifp->if_snd_tag_alloc() call will be made to the destination network interface, which then sets up a custom sendqueue with the given rate limitation parameter. A "struct m_snd_tag" pointer is returned which serves as a "snd_tag" hint in the m_pkthdr for the subsequently transmitted mbufs. 2) When the network driver sees the "m->m_pkthdr.snd_tag" different from NULL, it will move the packets into a designated rate limited sendqueue given by the snd_tag pointer. It is up to the individual drivers how the rate limited traffic will be rate limited. 3) Route changes are detected by the NIC drivers in the ifp->if_transmit() routine when the ifnet pointer in the incoming snd_tag mismatches the one of the network interface. The network adapter frees the mbuf and returns EAGAIN which causes the ip_output() to release and clear the send tag. Upon next ip_output() a new "snd_tag" will be tried allocated. 4) When the PCB is detached the custom sendqueue will be released by a non-blocking ifp->if_snd_tag_free() call to the currently bound network interface. Reviewed by: wblock (manpages), adrian, gallatin, scottl (network) Differential Revision: https://reviews.freebsd.org/D3687 Sponsored by: Mellanox Technologies MFC after: 3 months |
||
---|---|---|
.. | ||
atf | ||
clang | ||
csu | ||
lib80211 | ||
libalias | ||
libarchive | ||
libauditd | ||
libbegemot | ||
libblacklist | ||
libblocksruntime | ||
libbluetooth | ||
libbsdstat | ||
libbsm | ||
libbsnmp | ||
libbz2 | ||
libc | ||
libc_nonshared | ||
libc++ | ||
libcalendar | ||
libcam | ||
libcapsicum | ||
libcasper | ||
libclang_rt | ||
libcom_err | ||
libcompat | ||
libcompiler_rt | ||
libcrypt | ||
libcuse | ||
libcxxrt | ||
libdevctl | ||
libdevdctl | ||
libdevinfo | ||
libdevstat | ||
libdpv | ||
libdwarf | ||
libedit | ||
libefivar | ||
libelf | ||
libelftc | ||
libevent | ||
libexecinfo | ||
libexpat | ||
libfetch | ||
libfigpar | ||
libgcc_eh | ||
libgcc_s | ||
libgeom | ||
libgpio | ||
libgssapi | ||
libiconv_modules | ||
libifconfig | ||
libipsec | ||
libjail | ||
libkiconv | ||
libkvm | ||
libldns | ||
liblzma | ||
libmagic | ||
libmd | ||
libmemstat | ||
libmilter | ||
libmp | ||
libmt | ||
libnandfs | ||
libnetbsd | ||
libnetgraph | ||
libngatm | ||
libnv | ||
libopenbsd | ||
libopie | ||
libpam | ||
libpathconv | ||
libpcap | ||
libpe | ||
libpjdlog | ||
libpmc | ||
libproc | ||
libprocstat | ||
libradius | ||
librpcsec_gss | ||
librpcsvc | ||
librss | ||
librt | ||
librtld_db | ||
libsbuf | ||
libsdp | ||
libsm | ||
libsmb | ||
libsmdb | ||
libsmutil | ||
libsqlite3 | ||
libstand | ||
libstdbuf | ||
libstdthreads | ||
libsysdecode | ||
libtacplus | ||
libtelnet | ||
libthr | ||
libthread_db | ||
libucl | ||
libufs | ||
libugidfw | ||
libulog | ||
libunbound | ||
libusb | ||
libusbhid | ||
libutil | ||
libvgl | ||
libvmmapi | ||
libwrap | ||
libxo | ||
liby | ||
libypclnt | ||
libz | ||
msun | ||
ncurses | ||
tests | ||
Makefile | ||
Makefile.inc |