HomeFreeBSD

Implement kernel support for hardware rate limited sockets.

Description

Implement kernel support for hardware rate limited sockets.

  • 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.

  1. 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.

  1. 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.

  1. 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

Details

Provenance
hselaskyAuthored on
Reviewer
wblock
Parents
rS312378: Use the kernel stack in the ARM FBT DTrace provider. This is used to find
Branches
Unknown
Tags
Unknown