dccp: Lockless integration of CCID congestion-control plugins
Based on Arnaldo's earlier patch, this patch integrates the standardised CCID congestion control plugins (CCID-2 and CCID-3) of DCCP with dccp.ko: * enables a faster connection path by eliminating the need to always go through the CCID registration lock; * updates the implementation to use only a single array whose size equals the number of configured CCIDs instead of the maximum (256); * since the CCIDs are now fixed array elements, synchronization is no longer needed, simplifying use and implementation. CCID-2 is suggested as minimum for a basic DCCP implementation (RFC 4340, 10); CCID-3 is a standards-track CCID supported by RFC 4342 and RFC 5348. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
6ea2fde13a
commit
ddebc973c5
@@ -1,80 +1,52 @@
|
||||
menu "DCCP CCIDs Configuration (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
|
||||
config IP_DCCP_CCID2
|
||||
tristate "CCID2 (TCP-Like) (EXPERIMENTAL)"
|
||||
def_tristate IP_DCCP
|
||||
select IP_DCCP_ACKVEC
|
||||
---help---
|
||||
CCID 2, TCP-like Congestion Control, denotes Additive Increase,
|
||||
Multiplicative Decrease (AIMD) congestion control with behavior
|
||||
modelled directly on TCP, including congestion window, slow start,
|
||||
timeouts, and so forth [RFC 2581]. CCID 2 achieves maximum
|
||||
bandwidth over the long term, consistent with the use of end-to-end
|
||||
congestion control, but halves its congestion window in response to
|
||||
each congestion event. This leads to the abrupt rate changes
|
||||
typical of TCP. Applications should use CCID 2 if they prefer
|
||||
maximum bandwidth utilization to steadiness of rate. This is often
|
||||
the case for applications that are not playing their data directly
|
||||
to the user. For example, a hypothetical application that
|
||||
transferred files over DCCP, using application-level retransmissions
|
||||
for lost packets, would prefer CCID 2 to CCID 3. On-line games may
|
||||
also prefer CCID 2. See RFC 4341 for further details.
|
||||
|
||||
CCID2 is the default CCID used by DCCP.
|
||||
|
||||
config IP_DCCP_CCID2_DEBUG
|
||||
bool "CCID2 debugging messages"
|
||||
depends on IP_DCCP_CCID2
|
||||
---help---
|
||||
Enable CCID2-specific debugging messages.
|
||||
bool "CCID-2 debugging messages"
|
||||
---help---
|
||||
Enable CCID-2 specific debugging messages.
|
||||
|
||||
When compiling CCID2 as a module, this debugging output can
|
||||
additionally be toggled by setting the ccid2_debug module
|
||||
parameter to 0 or 1.
|
||||
The debugging output can additionally be toggled by setting the
|
||||
ccid2_debug parameter to 0 or 1.
|
||||
|
||||
If in doubt, say N.
|
||||
If in doubt, say N.
|
||||
|
||||
config IP_DCCP_CCID3
|
||||
tristate "CCID3 (TCP-Friendly) (EXPERIMENTAL)"
|
||||
def_tristate IP_DCCP
|
||||
bool "CCID-3 (TCP-Friendly) (EXPERIMENTAL)"
|
||||
def_bool y if (IP_DCCP = y || IP_DCCP = m)
|
||||
select IP_DCCP_TFRC_LIB
|
||||
---help---
|
||||
CCID 3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
|
||||
CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
|
||||
rate-controlled congestion control mechanism. TFRC is designed to
|
||||
be reasonably fair when competing for bandwidth with TCP-like flows,
|
||||
where a flow is "reasonably fair" if its sending rate is generally
|
||||
within a factor of two of the sending rate of a TCP flow under the
|
||||
same conditions. However, TFRC has a much lower variation of
|
||||
throughput over time compared with TCP, which makes CCID 3 more
|
||||
suitable than CCID 2 for applications such streaming media where a
|
||||
throughput over time compared with TCP, which makes CCID-3 more
|
||||
suitable than CCID-2 for applications such streaming media where a
|
||||
relatively smooth sending rate is of importance.
|
||||
|
||||
CCID 3 is further described in RFC 4342,
|
||||
CCID-3 is further described in RFC 4342,
|
||||
http://www.ietf.org/rfc/rfc4342.txt
|
||||
|
||||
The TFRC congestion control algorithms were initially described in
|
||||
RFC 3448.
|
||||
RFC 5448.
|
||||
|
||||
This text was extracted from RFC 4340 (sec. 10.2),
|
||||
http://www.ietf.org/rfc/rfc4340.txt
|
||||
|
||||
To compile this CCID as a module, choose M here: the module will be
|
||||
called dccp_ccid3.
|
||||
|
||||
If in doubt, say M.
|
||||
If in doubt, say N.
|
||||
|
||||
config IP_DCCP_CCID3_DEBUG
|
||||
bool "CCID3 debugging messages"
|
||||
depends on IP_DCCP_CCID3
|
||||
---help---
|
||||
Enable CCID3-specific debugging messages.
|
||||
bool "CCID-3 debugging messages"
|
||||
depends on IP_DCCP_CCID3
|
||||
---help---
|
||||
Enable CCID-3 specific debugging messages.
|
||||
|
||||
When compiling CCID3 as a module, this debugging output can
|
||||
additionally be toggled by setting the ccid3_debug module
|
||||
parameter to 0 or 1.
|
||||
The debugging output can additionally be toggled by setting the
|
||||
ccid3_debug parameter to 0 or 1.
|
||||
|
||||
If in doubt, say N.
|
||||
If in doubt, say N.
|
||||
|
||||
config IP_DCCP_CCID3_RTO
|
||||
int "Use higher bound for nofeedback timer"
|
||||
|
@@ -1,9 +1 @@
|
||||
obj-$(CONFIG_IP_DCCP_CCID3) += dccp_ccid3.o
|
||||
|
||||
dccp_ccid3-y := ccid3.o
|
||||
|
||||
obj-$(CONFIG_IP_DCCP_CCID2) += dccp_ccid2.o
|
||||
|
||||
dccp_ccid2-y := ccid2.o
|
||||
|
||||
obj-y += lib/
|
||||
|
@@ -768,10 +768,9 @@ static void ccid2_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
|
||||
static struct ccid_operations ccid2 = {
|
||||
struct ccid_operations ccid2_ops = {
|
||||
.ccid_id = DCCPC_CCID2,
|
||||
.ccid_name = "TCP-like",
|
||||
.ccid_owner = THIS_MODULE,
|
||||
.ccid_hc_tx_obj_size = sizeof(struct ccid2_hc_tx_sock),
|
||||
.ccid_hc_tx_init = ccid2_hc_tx_init,
|
||||
.ccid_hc_tx_exit = ccid2_hc_tx_exit,
|
||||
@@ -784,22 +783,5 @@ static struct ccid_operations ccid2 = {
|
||||
|
||||
#ifdef CONFIG_IP_DCCP_CCID2_DEBUG
|
||||
module_param(ccid2_debug, bool, 0644);
|
||||
MODULE_PARM_DESC(ccid2_debug, "Enable debug messages");
|
||||
MODULE_PARM_DESC(ccid2_debug, "Enable CCID-2 debug messages");
|
||||
#endif
|
||||
|
||||
static __init int ccid2_module_init(void)
|
||||
{
|
||||
return ccid_register(&ccid2);
|
||||
}
|
||||
module_init(ccid2_module_init);
|
||||
|
||||
static __exit void ccid2_module_exit(void)
|
||||
{
|
||||
ccid_unregister(&ccid2);
|
||||
}
|
||||
module_exit(ccid2_module_exit);
|
||||
|
||||
MODULE_AUTHOR("Andrea Bittau <a.bittau@cs.ucl.ac.uk>");
|
||||
MODULE_DESCRIPTION("DCCP TCP-Like (CCID2) CCID");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("net-dccp-ccid-2");
|
||||
|
@@ -940,10 +940,9 @@ static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ccid_operations ccid3 = {
|
||||
struct ccid_operations ccid3_ops = {
|
||||
.ccid_id = DCCPC_CCID3,
|
||||
.ccid_name = "TCP-Friendly Rate Control",
|
||||
.ccid_owner = THIS_MODULE,
|
||||
.ccid_hc_tx_obj_size = sizeof(struct ccid3_hc_tx_sock),
|
||||
.ccid_hc_tx_init = ccid3_hc_tx_init,
|
||||
.ccid_hc_tx_exit = ccid3_hc_tx_exit,
|
||||
@@ -964,23 +963,5 @@ static struct ccid_operations ccid3 = {
|
||||
|
||||
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
|
||||
module_param(ccid3_debug, bool, 0644);
|
||||
MODULE_PARM_DESC(ccid3_debug, "Enable debug messages");
|
||||
MODULE_PARM_DESC(ccid3_debug, "Enable CCID-3 debug messages");
|
||||
#endif
|
||||
|
||||
static __init int ccid3_module_init(void)
|
||||
{
|
||||
return ccid_register(&ccid3);
|
||||
}
|
||||
module_init(ccid3_module_init);
|
||||
|
||||
static __exit void ccid3_module_exit(void)
|
||||
{
|
||||
ccid_unregister(&ccid3);
|
||||
}
|
||||
module_exit(ccid3_module_exit);
|
||||
|
||||
MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>, "
|
||||
"Arnaldo Carvalho de Melo <acme@ghostprotocols.net>");
|
||||
MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("net-dccp-ccid-3");
|
||||
|
Reference in New Issue
Block a user