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:
* .01 and and 7 / 8. We use 50 instead of 100 to account for
* delayed ack .
*/
# define TCP_SCALABLE_AI_CNT 50U
# 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 ;
2015-07-09 23:16:29 +03:00
if ( tcp_in_slow_start ( tp ) )
2013-10-31 22:07:31 +04:00
tcp_slow_start ( tp , acked ) ;
2009-02-28 07:44:37 +03:00
else
2015-01-29 04:01:35 +03:00
tcp_cong_avoid_ai ( tp , min ( tp - > snd_cwnd , TCP_SCALABLE_AI_CNT ) ,
1 ) ;
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
2005-06-23 23:29:07 +04:00
return max ( tp - > snd_cwnd - ( tp - > snd_cwnd > > TCP_SCALABLE_MD_SCALE ) , 2U ) ;
}
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 " ) ;