2015-02-18 15:25:19 +00:00
|
|
|
# $FreeBSD$
|
|
|
|
#
|
|
|
|
# Common code to marry kernel config(8) goo and module building goo.
|
|
|
|
#
|
|
|
|
|
|
|
|
# Generate options files that otherwise would be built
|
|
|
|
# in substantially similar ways through the tree. Move
|
|
|
|
# the code here when they all produce identical results
|
|
|
|
# (or should)
|
|
|
|
.if !defined(KERNBUILDDIR)
|
|
|
|
opt_bpf.h:
|
|
|
|
echo "#define DEV_BPF 1" > ${.TARGET}
|
|
|
|
.if ${MK_INET_SUPPORT} != "no"
|
|
|
|
opt_inet.h:
|
|
|
|
@echo "#define INET 1" > ${.TARGET}
|
|
|
|
@echo "#define TCP_OFFLOAD 1" >> ${.TARGET}
|
|
|
|
.endif
|
|
|
|
.if ${MK_INET6_SUPPORT} != "no"
|
|
|
|
opt_inet6.h:
|
|
|
|
@echo "#define INET6 1" > ${.TARGET}
|
|
|
|
.endif
|
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.
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
2017-01-18 13:31:17 +00:00
|
|
|
.if ${MK_RATELIMIT} != "no"
|
|
|
|
opt_ratelimit.h:
|
|
|
|
@echo "#define RATELIMIT 1" > ${.TARGET}
|
|
|
|
.endif
|
2015-02-18 15:25:19 +00:00
|
|
|
opt_mrouting.h:
|
|
|
|
echo "#define MROUTING 1" > ${.TARGET}
|
|
|
|
opt_natm.h:
|
|
|
|
echo "#define NATM 1" > ${.TARGET}
|
|
|
|
opt_scsi.h:
|
|
|
|
echo "#define SCSI_DELAY 15000" > ${.TARGET}
|
|
|
|
opt_wlan.h:
|
|
|
|
echo "#define IEEE80211_DEBUG 1" > ${.TARGET}
|
|
|
|
echo "#define IEEE80211_AMPDU_AGE 1" >> ${.TARGET}
|
|
|
|
echo "#define IEEE80211_SUPPORT_MESH 1" >> ${.TARGET}
|
|
|
|
KERN_OPTS.i386=NEW_PCIB DEV_PCI
|
|
|
|
KERN_OPTS.amd64=NEW_PCIB DEV_PCI
|
|
|
|
KERN_OPTS.powerpc=NEW_PCIB DEV_PCI
|
|
|
|
KERN_OPTS=MROUTING NATM IEEE80211_DEBUG \
|
|
|
|
IEEE80211_AMPDU_AGE IEEE80211_SUPPORT_MESH DEV_BPF \
|
|
|
|
${KERN_OPTS.${MACHINE}} ${KERN_OPTS_EXTRA}
|
|
|
|
.if ${MK_INET_SUPPORT} != "no"
|
|
|
|
KERN_OPTS+= INET TCP_OFFLOAD
|
|
|
|
.endif
|
|
|
|
.if ${MK_INET6_SUPPORT} != "no"
|
|
|
|
KERN_OPTS+= INET6
|
|
|
|
.endif
|
2016-03-12 22:21:02 +00:00
|
|
|
.elif !defined(KERN_OPTS)
|
2015-02-18 15:25:19 +00:00
|
|
|
KERN_OPTS!=cat ${KERNBUILDDIR}/opt*.h | awk '{print $$2;}' | sort -u
|
2016-03-12 22:21:02 +00:00
|
|
|
.export KERN_OPTS
|
2015-02-18 15:25:19 +00:00
|
|
|
.endif
|
2016-03-12 22:21:14 +00:00
|
|
|
|
2016-07-22 17:31:14 +00:00
|
|
|
.if !defined(NO_MODULES) && !defined(__MPATH)
|
2016-03-12 22:21:14 +00:00
|
|
|
__MPATH!=find ${SYSDIR:tA}/ -name \*_if.m
|
|
|
|
.export __MPATH
|
|
|
|
.endif
|