is a completely separate TCP stack (tcp_bbr.ko) that will be built only if you add the make options WITH_EXTRA_TCP_STACKS=1 and also include the option TCPHPTS. You can also include the RATELIMIT option if you have a NIC interface that supports hardware pacing, BBR understands how to use such a feature. Note that this commit also adds in a general purpose time-filter which allows you to have a min-filter or max-filter. A filter allows you to have a low (or high) value for some period of time and degrade slowly to another value has time passes. You can find out the details of BBR by looking at the original paper at: https://queue.acm.org/detail.cfm?id=3022184 or consult many other web resources you can find on the web referenced by "BBR congestion control". It should be noted that BBRv1 (which this is) does tend to unfairness in cases of small buffered paths, and it will usually get less bandwidth in the case of large BDP paths(when competing with new-reno or cubic flows). BBR is still an active research area and we do plan on implementing V2 of BBR to see if it is an improvement over V1. Sponsored by: Netflix Inc. Differential Revision: https://reviews.freebsd.org/D21582
58 lines
2.2 KiB
C
58 lines
2.2 KiB
C
#ifndef __sack_filter_h__
|
|
#define __sack_filter_h__
|
|
/*-
|
|
* Copyright (c) 2017-9 Netflix, Inc.
|
|
*
|
|
* 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.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
|
|
*
|
|
* __FBSDID("$FreeBSD$");
|
|
*/
|
|
|
|
/*
|
|
* Seven entry's is carefully choosen to
|
|
* fit in one cache line. We can easily
|
|
* change this to 15 (but it gets very
|
|
* little extra filtering). To change it
|
|
* to be larger than 15 would require either
|
|
* sf_bits becoming a uint32_t and then you
|
|
* could go to 31.. or change it to a full
|
|
* bitstring.. It is really doubtful you
|
|
* will get much benefit beyond 7, in testing
|
|
* there was a small amount but very very small.
|
|
*/
|
|
#define SACK_FILTER_BLOCKS 7
|
|
|
|
struct sack_filter {
|
|
tcp_seq sf_ack;
|
|
uint16_t sf_bits;
|
|
uint8_t sf_cur;
|
|
uint8_t sf_used;
|
|
struct sackblk sf_blks[SACK_FILTER_BLOCKS];
|
|
};
|
|
#ifdef _KERNEL
|
|
void sack_filter_clear(struct sack_filter *sf, tcp_seq seq);
|
|
int sack_filter_blks(struct sack_filter *sf, struct sackblk *in, int numblks,
|
|
tcp_seq th_ack);
|
|
void sack_filter_reject(struct sack_filter *sf, struct sackblk *in);
|
|
#endif
|
|
#endif
|