tcp_highspeed.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* Modified Linux module source code from /home/weixl/linux-2.6.22.6 */
  2. #define NS_PROTOCOL "tcp_highspeed.c"
  3. #include "../ns-linux-c.h"
  4. #include "../ns-linux-util.h"
  5. /*
  6.  * Sally Floyd's High Speed TCP (RFC 3649) congestion control
  7.  *
  8.  * See http://www.icir.org/floyd/hstcp.html
  9.  *
  10.  * John Heffner <jheffner@psc.edu>
  11.  */
  12. /* From AIMD tables from RFC 3649 appendix B,
  13.  * with fixed-point MD scaled <<8.
  14.  */
  15. static const struct hstcp_aimd_val {
  16. unsigned int cwnd;
  17. unsigned int md;
  18. } hstcp_aimd_vals[] = {
  19.  {     38,  128, /*  0.50 */ },
  20.  {    118,  112, /*  0.44 */ },
  21.  {    221,  104, /*  0.41 */ },
  22.  {    347,   98, /*  0.38 */ },
  23.  {    495,   93, /*  0.37 */ },
  24.  {    663,   89, /*  0.35 */ },
  25.  {    851,   86, /*  0.34 */ },
  26.  {   1058,   83, /*  0.33 */ },
  27.  {   1284,   81, /*  0.32 */ },
  28.  {   1529,   78, /*  0.31 */ },
  29.  {   1793,   76, /*  0.30 */ },
  30.  {   2076,   74, /*  0.29 */ },
  31.  {   2378,   72, /*  0.28 */ },
  32.  {   2699,   71, /*  0.28 */ },
  33.  {   3039,   69, /*  0.27 */ },
  34.  {   3399,   68, /*  0.27 */ },
  35.  {   3778,   66, /*  0.26 */ },
  36.  {   4177,   65, /*  0.26 */ },
  37.  {   4596,   64, /*  0.25 */ },
  38.  {   5036,   62, /*  0.25 */ },
  39.  {   5497,   61, /*  0.24 */ },
  40.  {   5979,   60, /*  0.24 */ },
  41.  {   6483,   59, /*  0.23 */ },
  42.  {   7009,   58, /*  0.23 */ },
  43.  {   7558,   57, /*  0.22 */ },
  44.  {   8130,   56, /*  0.22 */ },
  45.  {   8726,   55, /*  0.22 */ },
  46.  {   9346,   54, /*  0.21 */ },
  47.  {   9991,   53, /*  0.21 */ },
  48.  {  10661,   52, /*  0.21 */ },
  49.  {  11358,   52, /*  0.20 */ },
  50.  {  12082,   51, /*  0.20 */ },
  51.  {  12834,   50, /*  0.20 */ },
  52.  {  13614,   49, /*  0.19 */ },
  53.  {  14424,   48, /*  0.19 */ },
  54.  {  15265,   48, /*  0.19 */ },
  55.  {  16137,   47, /*  0.19 */ },
  56.  {  17042,   46, /*  0.18 */ },
  57.  {  17981,   45, /*  0.18 */ },
  58.  {  18955,   45, /*  0.18 */ },
  59.  {  19965,   44, /*  0.17 */ },
  60.  {  21013,   43, /*  0.17 */ },
  61.  {  22101,   43, /*  0.17 */ },
  62.  {  23230,   42, /*  0.17 */ },
  63.  {  24402,   41, /*  0.16 */ },
  64.  {  25618,   41, /*  0.16 */ },
  65.  {  26881,   40, /*  0.16 */ },
  66.  {  28193,   39, /*  0.16 */ },
  67.  {  29557,   39, /*  0.15 */ },
  68.  {  30975,   38, /*  0.15 */ },
  69.  {  32450,   38, /*  0.15 */ },
  70.  {  33986,   37, /*  0.15 */ },
  71.  {  35586,   36, /*  0.14 */ },
  72.  {  37253,   36, /*  0.14 */ },
  73.  {  38992,   35, /*  0.14 */ },
  74.  {  40808,   35, /*  0.14 */ },
  75.  {  42707,   34, /*  0.13 */ },
  76.  {  44694,   33, /*  0.13 */ },
  77.  {  46776,   33, /*  0.13 */ },
  78.  {  48961,   32, /*  0.13 */ },
  79.  {  51258,   32, /*  0.13 */ },
  80.  {  53677,   31, /*  0.12 */ },
  81.  {  56230,   30, /*  0.12 */ },
  82.  {  58932,   30, /*  0.12 */ },
  83.  {  61799,   29, /*  0.12 */ },
  84.  {  64851,   28, /*  0.11 */ },
  85.  {  68113,   28, /*  0.11 */ },
  86.  {  71617,   27, /*  0.11 */ },
  87.  {  75401,   26, /*  0.10 */ },
  88.  {  79517,   26, /*  0.10 */ },
  89.  {  84035,   25, /*  0.10 */ },
  90.  {  89053,   24, /*  0.10 */ },
  91. };
  92. #define HSTCP_AIMD_MAX ARRAY_SIZE(hstcp_aimd_vals)
  93. struct hstcp {
  94. u32 ai;
  95. };
  96. static void hstcp_init(struct sock *sk)
  97. {
  98. struct tcp_sock *tp = tcp_sk(sk);
  99. struct hstcp *ca = inet_csk_ca(sk);
  100. ca->ai = 0;
  101. /* Ensure the MD arithmetic works.  This is somewhat pedantic,
  102.  * since I don't think we will see a cwnd this large. :) */
  103. tp->snd_cwnd_clamp = min_t(u32, tp->snd_cwnd_clamp, 0xffffffff/128);
  104. }
  105. static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt,
  106.      u32 in_flight, int data_acked)
  107. {
  108. struct tcp_sock *tp = tcp_sk(sk);
  109. struct hstcp *ca = inet_csk_ca(sk);
  110. if (!tcp_is_cwnd_limited(sk, in_flight))
  111. return;
  112. if (tp->snd_cwnd <= tp->snd_ssthresh)
  113. tcp_slow_start(tp);
  114. else {
  115. /* Update AIMD parameters.
  116.  *
  117.  * We want to guarantee that:
  118.  *     hstcp_aimd_vals[ca->ai-1].cwnd <
  119.  *     snd_cwnd <=
  120.  *     hstcp_aimd_vals[ca->ai].cwnd
  121.  */
  122. if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
  123. while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
  124.        ca->ai < HSTCP_AIMD_MAX - 1)
  125. ca->ai++;
  126. } else if (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd) {
  127. while (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd)
  128. ca->ai--;
  129. }
  130. /* Do additive increase */
  131. if (tp->snd_cwnd < tp->snd_cwnd_clamp) {
  132. /* cwnd = cwnd + a(w) / cwnd */
  133. tp->snd_cwnd_cnt += ca->ai + 1;
  134. if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
  135. tp->snd_cwnd_cnt -= tp->snd_cwnd;
  136. tp->snd_cwnd++;
  137. }
  138. }
  139. }
  140. }
  141. static u32 hstcp_ssthresh(struct sock *sk)
  142. {
  143. const struct tcp_sock *tp = tcp_sk(sk);
  144. const struct hstcp *ca = inet_csk_ca(sk);
  145. /* Do multiplicative decrease */
  146. return max(tp->snd_cwnd - ((tp->snd_cwnd * hstcp_aimd_vals[ca->ai].md) >> 8), 2U);
  147. }
  148. static struct tcp_congestion_ops tcp_highspeed = {
  149. .init = hstcp_init,
  150. .ssthresh = hstcp_ssthresh,
  151. .cong_avoid = hstcp_cong_avoid,
  152. .min_cwnd = tcp_reno_min_cwnd,
  153. .owner = THIS_MODULE,
  154. .name = "highspeed"
  155. };
  156. static int __init hstcp_register(void)
  157. {
  158. BUILD_BUG_ON(sizeof(struct hstcp) > ICSK_CA_PRIV_SIZE);
  159. return tcp_register_congestion_control(&tcp_highspeed);
  160. }
  161. static void __exit hstcp_unregister(void)
  162. {
  163. tcp_unregister_congestion_control(&tcp_highspeed);
  164. }
  165. module_init(hstcp_register);
  166. module_exit(hstcp_unregister);
  167. MODULE_AUTHOR("John Heffner");
  168. MODULE_LICENSE("GPL");
  169. MODULE_DESCRIPTION("High Speed TCP");
  170. #undef NS_PROTOCOL