Blame view

net/ipv4/tcp_scalable.c 1.41 KB
81f7e3824   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  /* Tom Kelly's Scalable TCP
   *
   * See http://www.deneholme.net/tom/scalable/
   *
   * 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
  
  static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked)
  {
  	struct tcp_sock *tp = tcp_sk(sk);
  
  	if (!tcp_is_cwnd_limited(sk))
  		return;
  
  	if (tcp_in_slow_start(tp))
  		tcp_slow_start(tp, acked);
  	else
  		tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT),
  				  1);
  }
  
  static u32 tcp_scalable_ssthresh(struct sock *sk)
  {
  	const struct tcp_sock *tp = tcp_sk(sk);
  
  	return max(tp->snd_cwnd - (tp->snd_cwnd>>TCP_SCALABLE_MD_SCALE), 2U);
  }
  
  static struct tcp_congestion_ops tcp_scalable __read_mostly = {
  	.ssthresh	= tcp_scalable_ssthresh,
  	.undo_cwnd	= tcp_reno_undo_cwnd,
  	.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");