2019-05-19 15:08:20 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-06-23 23:29:07 +04:00
/* Tom Kelly's Scalable TCP
*
2009-02-25 03:40:16 +03:00
* See http : //www.deneholme.net/tom/scalable/
2005-06-23 23:29:07 +04:00
*
* John Heffner < jheffner @ sc . edu >
*/
# include <linux/module.h>
# include <net/tcp.h>
/* These factors derived from the recommended values in the aer:
2020-08-23 02:31:41 +03:00
* .01 and 7 / 8.
2005-06-23 23:29:07 +04:00
*/
2020-03-16 09:35:08 +03:00
# define TCP_SCALABLE_AI_CNT 100U
2005-06-23 23:29:07 +04:00
# define TCP_SCALABLE_MD_SCALE 3
2014-05-03 08:18:05 +04:00
static void tcp_scalable_cong_avoid ( struct sock * sk , u32 ack , u32 acked )
2005-06-23 23:29:07 +04:00
{
2005-08-10 11:03:31 +04:00
struct tcp_sock * tp = tcp_sk ( sk ) ;
2005-11-11 03:53:30 +03:00
2014-05-03 08:18:05 +04:00
if ( ! tcp_is_cwnd_limited ( sk ) )
2005-06-23 23:29:07 +04:00
return ;
2020-03-16 09:35:08 +03:00
if ( tcp_in_slow_start ( tp ) ) {
acked = tcp_slow_start ( tp , acked ) ;
if ( ! acked )
return ;
}
2022-04-06 02:35:38 +03:00
tcp_cong_avoid_ai ( tp , min ( tcp_snd_cwnd ( tp ) , TCP_SCALABLE_AI_CNT ) ,
2020-03-16 09:35:08 +03:00
acked ) ;
2005-06-23 23:29:07 +04:00
}
2005-08-10 11:03:31 +04:00
static u32 tcp_scalable_ssthresh ( struct sock * sk )
2005-06-23 23:29:07 +04:00
{
2005-08-10 11:03:31 +04:00
const struct tcp_sock * tp = tcp_sk ( sk ) ;
2014-08-30 10:32:05 +04:00
2022-04-06 02:35:38 +03:00
return max ( tcp_snd_cwnd ( tp ) - ( tcp_snd_cwnd ( tp ) > > TCP_SCALABLE_MD_SCALE ) , 2U ) ;
2005-06-23 23:29:07 +04:00
}
2011-03-10 11:40:17 +03:00
static struct tcp_congestion_ops tcp_scalable __read_mostly = {
2005-06-23 23:29:07 +04:00
. ssthresh = tcp_scalable_ssthresh ,
2017-08-04 06:38:52 +03:00
. undo_cwnd = tcp_reno_undo_cwnd ,
2005-06-23 23:29:07 +04:00
. cong_avoid = tcp_scalable_cong_avoid ,
. owner = THIS_MODULE ,
. name = " scalable " ,
} ;
static int __init tcp_scalable_register ( void )
{
return tcp_register_congestion_control ( & tcp_scalable ) ;
}
static void __exit tcp_scalable_unregister ( void )
{
tcp_unregister_congestion_control ( & tcp_scalable ) ;
}
module_init ( tcp_scalable_register ) ;
module_exit ( tcp_scalable_unregister ) ;
MODULE_AUTHOR ( " John Heffner " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Scalable TCP " ) ;