2005-06-23 12:29:07 -07:00
/* Tom Kelly's Scalable TCP
*
2009-02-24 16:40:16 -08:00
* See http : //www.deneholme.net/tom/scalable/
2005-06-23 12:29:07 -07: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
2016-11-21 14:18:37 +01:00
struct scalable {
u32 loss_cwnd ;
} ;
2014-05-02 21:18:05 -07:00
static void tcp_scalable_cong_avoid ( struct sock * sk , u32 ack , u32 acked )
2005-06-23 12:29:07 -07:00
{
2005-08-10 04:03:31 -03:00
struct tcp_sock * tp = tcp_sk ( sk ) ;
2005-11-10 16:53:30 -08:00
2014-05-02 21:18:05 -07:00
if ( ! tcp_is_cwnd_limited ( sk ) )
2005-06-23 12:29:07 -07:00
return ;
2015-07-09 13:16:29 -07:00
if ( tcp_in_slow_start ( tp ) )
2013-10-31 11:07:31 -07:00
tcp_slow_start ( tp , acked ) ;
2009-02-28 04:44:37 +00:00
else
2015-01-28 20:01:35 -05:00
tcp_cong_avoid_ai ( tp , min ( tp - > snd_cwnd , TCP_SCALABLE_AI_CNT ) ,
1 ) ;
2005-06-23 12:29:07 -07:00
}
2005-08-10 04:03:31 -03:00
static u32 tcp_scalable_ssthresh ( struct sock * sk )
2005-06-23 12:29:07 -07:00
{
2005-08-10 04:03:31 -03:00
const struct tcp_sock * tp = tcp_sk ( sk ) ;
2016-11-21 14:18:37 +01:00
struct scalable * ca = inet_csk_ca ( sk ) ;
ca - > loss_cwnd = tp - > snd_cwnd ;
2014-08-29 23:32:05 -07:00
2005-06-23 12:29:07 -07:00
return max ( tp - > snd_cwnd - ( tp - > snd_cwnd > > TCP_SCALABLE_MD_SCALE ) , 2U ) ;
}
2016-11-21 14:18:37 +01:00
static u32 tcp_scalable_cwnd_undo ( struct sock * sk )
{
const struct scalable * ca = inet_csk_ca ( sk ) ;
return max ( tcp_sk ( sk ) - > snd_cwnd , ca - > loss_cwnd ) ;
}
2011-03-10 00:40:17 -08:00
static struct tcp_congestion_ops tcp_scalable __read_mostly = {
2005-06-23 12:29:07 -07:00
. ssthresh = tcp_scalable_ssthresh ,
2016-11-21 14:18:37 +01:00
. undo_cwnd = tcp_scalable_cwnd_undo ,
2005-06-23 12:29:07 -07: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 " ) ;