Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
ae27e98a
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ae27e98a
编写于
10月 29, 2008
作者:
S
Sangtae Ha
提交者:
David S. Miller
11月 02, 2008
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TCP] CUBIC v2.3
Signed-off-by:
N
Sangtae Ha
<
sha2@ncsu.edu
>
Signed-off-by:
N
David S. Miller
<
davem@davemloft.net
>
上级
e27dfcea
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
109 addition
and
11 deletion
+109
-11
net/ipv4/tcp_cubic.c
net/ipv4/tcp_cubic.c
+109
-11
未找到文件。
net/ipv4/tcp_cubic.c
浏览文件 @
ae27e98a
/*
/*
* TCP CUBIC: Binary Increase Congestion control for TCP v2.
2
* TCP CUBIC: Binary Increase Congestion control for TCP v2.
3
* Home page:
* Home page:
* http://netsrv.csc.ncsu.edu/twiki/bin/view/Main/BIC
* http://netsrv.csc.ncsu.edu/twiki/bin/view/Main/BIC
* This is from the implementation of CUBIC TCP in
* This is from the implementation of CUBIC TCP in
*
Injong Rhee, Lisong Xu.
*
Sangtae Ha, Injong Rhee and Lisong Xu,
* "CUBIC: A New TCP-Friendly High-Speed TCP Variant
* "CUBIC: A New TCP-Friendly High-Speed TCP Variant
"
* in
PFLDnet 2005
* in
ACM SIGOPS Operating System Review, July 2008.
* Available from:
* Available from:
* http://netsrv.csc.ncsu.edu/export/cubic-paper.pdf
* http://netsrv.csc.ncsu.edu/export/cubic_a_new_tcp_2008.pdf
*
* CUBIC integrates a new slow start algorithm, called HyStart.
* The details of HyStart are presented in
* Sangtae Ha and Injong Rhee,
* "Taming the Elephants: New TCP Slow Start", NCSU TechReport 2008.
* Available from:
* http://netsrv.csc.ncsu.edu/export/hystart_techreport_2008.pdf
*
* All testing results are available from:
* http://netsrv.csc.ncsu.edu/wiki/index.php/TCP_Testing
*
*
* Unless CUBIC is enabled and congestion window is large
* Unless CUBIC is enabled and congestion window is large
* this behaves the same as the original Reno.
* this behaves the same as the original Reno.
...
@@ -23,12 +33,26 @@
...
@@ -23,12 +33,26 @@
*/
*/
#define BICTCP_HZ 10
/* BIC HZ 2^10 = 1024 */
#define BICTCP_HZ 10
/* BIC HZ 2^10 = 1024 */
/* Two methods of hybrid slow start */
#define HYSTART_ACK_TRAIN 0x1
#define HYSTART_DELAY 0x2
/* Number of delay samples for detecting the increase of delay */
#define HYSTART_MIN_SAMPLES 8
#define HYSTART_DELAY_MIN (2U<<3)
#define HYSTART_DELAY_MAX (16U<<3)
#define HYSTART_DELAY_THRESH(x) clamp(x, HYSTART_DELAY_MIN, HYSTART_DELAY_MAX)
static
int
fast_convergence
__read_mostly
=
1
;
static
int
fast_convergence
__read_mostly
=
1
;
static
int
beta
__read_mostly
=
717
;
/* = 717/1024 (BICTCP_BETA_SCALE) */
static
int
beta
__read_mostly
=
717
;
/* = 717/1024 (BICTCP_BETA_SCALE) */
static
int
initial_ssthresh
__read_mostly
;
static
int
initial_ssthresh
__read_mostly
;
static
int
bic_scale
__read_mostly
=
41
;
static
int
bic_scale
__read_mostly
=
41
;
static
int
tcp_friendliness
__read_mostly
=
1
;
static
int
tcp_friendliness
__read_mostly
=
1
;
static
int
hystart
__read_mostly
=
1
;
static
int
hystart_detect
__read_mostly
=
HYSTART_ACK_TRAIN
|
HYSTART_DELAY
;
static
int
hystart_low_window
__read_mostly
=
16
;
static
u32
cube_rtt_scale
__read_mostly
;
static
u32
cube_rtt_scale
__read_mostly
;
static
u32
beta_scale
__read_mostly
;
static
u32
beta_scale
__read_mostly
;
static
u64
cube_factor
__read_mostly
;
static
u64
cube_factor
__read_mostly
;
...
@@ -44,6 +68,13 @@ module_param(bic_scale, int, 0444);
...
@@ -44,6 +68,13 @@ module_param(bic_scale, int, 0444);
MODULE_PARM_DESC
(
bic_scale
,
"scale (scaled by 1024) value for bic function (bic_scale/1024)"
);
MODULE_PARM_DESC
(
bic_scale
,
"scale (scaled by 1024) value for bic function (bic_scale/1024)"
);
module_param
(
tcp_friendliness
,
int
,
0644
);
module_param
(
tcp_friendliness
,
int
,
0644
);
MODULE_PARM_DESC
(
tcp_friendliness
,
"turn on/off tcp friendliness"
);
MODULE_PARM_DESC
(
tcp_friendliness
,
"turn on/off tcp friendliness"
);
module_param
(
hystart
,
int
,
0644
);
MODULE_PARM_DESC
(
hystart
,
"turn on/off hybrid slow start algorithm"
);
module_param
(
hystart_detect
,
int
,
0644
);
MODULE_PARM_DESC
(
hystart_detect
,
"hyrbrid slow start detection mechanisms"
" 1: packet-train 2: delay 3: both packet-train and delay"
);
module_param
(
hystart_low_window
,
int
,
0644
);
MODULE_PARM_DESC
(
hystart_low_window
,
"lower bound cwnd for hybrid slow start"
);
/* BIC TCP Parameters */
/* BIC TCP Parameters */
struct
bictcp
{
struct
bictcp
{
...
@@ -59,7 +90,13 @@ struct bictcp {
...
@@ -59,7 +90,13 @@ struct bictcp {
u32
ack_cnt
;
/* number of acks */
u32
ack_cnt
;
/* number of acks */
u32
tcp_cwnd
;
/* estimated tcp cwnd */
u32
tcp_cwnd
;
/* estimated tcp cwnd */
#define ACK_RATIO_SHIFT 4
#define ACK_RATIO_SHIFT 4
u32
delayed_ack
;
/* estimate the ratio of Packets/ACKs << 4 */
u16
delayed_ack
;
/* estimate the ratio of Packets/ACKs << 4 */
u8
sample_cnt
;
/* number of samples to decide curr_rtt */
u8
found
;
/* the exit point is found? */
u32
round_start
;
/* beginning of each round */
u32
end_seq
;
/* end_seq of the round */
u32
last_jiffies
;
/* last time when the ACK spacing is close */
u32
curr_rtt
;
/* the minimum rtt of current round */
};
};
static
inline
void
bictcp_reset
(
struct
bictcp
*
ca
)
static
inline
void
bictcp_reset
(
struct
bictcp
*
ca
)
...
@@ -76,12 +113,28 @@ static inline void bictcp_reset(struct bictcp *ca)
...
@@ -76,12 +113,28 @@ static inline void bictcp_reset(struct bictcp *ca)
ca
->
delayed_ack
=
2
<<
ACK_RATIO_SHIFT
;
ca
->
delayed_ack
=
2
<<
ACK_RATIO_SHIFT
;
ca
->
ack_cnt
=
0
;
ca
->
ack_cnt
=
0
;
ca
->
tcp_cwnd
=
0
;
ca
->
tcp_cwnd
=
0
;
ca
->
found
=
0
;
}
static
inline
void
bictcp_hystart_reset
(
struct
sock
*
sk
)
{
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
bictcp
*
ca
=
inet_csk_ca
(
sk
);
ca
->
round_start
=
ca
->
last_jiffies
=
jiffies
;
ca
->
end_seq
=
tp
->
snd_nxt
;
ca
->
curr_rtt
=
0
;
ca
->
sample_cnt
=
0
;
}
}
static
void
bictcp_init
(
struct
sock
*
sk
)
static
void
bictcp_init
(
struct
sock
*
sk
)
{
{
bictcp_reset
(
inet_csk_ca
(
sk
));
bictcp_reset
(
inet_csk_ca
(
sk
));
if
(
initial_ssthresh
)
if
(
hystart
)
bictcp_hystart_reset
(
sk
);
if
(
!
hystart
&&
initial_ssthresh
)
tcp_sk
(
sk
)
->
snd_ssthresh
=
initial_ssthresh
;
tcp_sk
(
sk
)
->
snd_ssthresh
=
initial_ssthresh
;
}
}
...
@@ -235,9 +288,11 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
...
@@ -235,9 +288,11 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
if
(
!
tcp_is_cwnd_limited
(
sk
,
in_flight
))
if
(
!
tcp_is_cwnd_limited
(
sk
,
in_flight
))
return
;
return
;
if
(
tp
->
snd_cwnd
<=
tp
->
snd_ssthresh
)
if
(
tp
->
snd_cwnd
<=
tp
->
snd_ssthresh
)
{
if
(
hystart
&&
after
(
ack
,
ca
->
end_seq
))
bictcp_hystart_reset
(
sk
);
tcp_slow_start
(
tp
);
tcp_slow_start
(
tp
);
else
{
}
else
{
bictcp_update
(
ca
,
tp
->
snd_cwnd
);
bictcp_update
(
ca
,
tp
->
snd_cwnd
);
/* In dangerous area, increase slowly.
/* In dangerous area, increase slowly.
...
@@ -281,8 +336,45 @@ static u32 bictcp_undo_cwnd(struct sock *sk)
...
@@ -281,8 +336,45 @@ static u32 bictcp_undo_cwnd(struct sock *sk)
static
void
bictcp_state
(
struct
sock
*
sk
,
u8
new_state
)
static
void
bictcp_state
(
struct
sock
*
sk
,
u8
new_state
)
{
{
if
(
new_state
==
TCP_CA_Loss
)
if
(
new_state
==
TCP_CA_Loss
)
{
bictcp_reset
(
inet_csk_ca
(
sk
));
bictcp_reset
(
inet_csk_ca
(
sk
));
bictcp_hystart_reset
(
sk
);
}
}
static
void
hystart_update
(
struct
sock
*
sk
,
u32
delay
)
{
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
bictcp
*
ca
=
inet_csk_ca
(
sk
);
if
(
!
(
ca
->
found
&
hystart_detect
))
{
u32
curr_jiffies
=
jiffies
;
/* first detection parameter - ack-train detection */
if
(
curr_jiffies
-
ca
->
last_jiffies
<=
msecs_to_jiffies
(
2
))
{
ca
->
last_jiffies
=
curr_jiffies
;
if
(
curr_jiffies
-
ca
->
round_start
>=
ca
->
delay_min
>>
4
)
ca
->
found
|=
HYSTART_ACK_TRAIN
;
}
/* obtain the minimum delay of more than sampling packets */
if
(
ca
->
sample_cnt
<
HYSTART_MIN_SAMPLES
)
{
if
(
ca
->
curr_rtt
==
0
||
ca
->
curr_rtt
>
delay
)
ca
->
curr_rtt
=
delay
;
ca
->
sample_cnt
++
;
}
else
{
if
(
ca
->
curr_rtt
>
ca
->
delay_min
+
HYSTART_DELAY_THRESH
(
ca
->
delay_min
>>
4
))
ca
->
found
|=
HYSTART_DELAY
;
}
/*
* Either one of two conditions are met,
* we exit from slow start immediately.
*/
if
(
ca
->
found
&
hystart_detect
)
tp
->
snd_ssthresh
=
tp
->
snd_cwnd
;
}
}
}
/* Track delayed acknowledgment ratio using sliding window
/* Track delayed acknowledgment ratio using sliding window
...
@@ -291,6 +383,7 @@ static void bictcp_state(struct sock *sk, u8 new_state)
...
@@ -291,6 +383,7 @@ static void bictcp_state(struct sock *sk, u8 new_state)
static
void
bictcp_acked
(
struct
sock
*
sk
,
u32
cnt
,
s32
rtt_us
)
static
void
bictcp_acked
(
struct
sock
*
sk
,
u32
cnt
,
s32
rtt_us
)
{
{
const
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
const
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
const
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
bictcp
*
ca
=
inet_csk_ca
(
sk
);
struct
bictcp
*
ca
=
inet_csk_ca
(
sk
);
u32
delay
;
u32
delay
;
...
@@ -314,6 +407,11 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)
...
@@ -314,6 +407,11 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)
/* first time call or link delay decreases */
/* first time call or link delay decreases */
if
(
ca
->
delay_min
==
0
||
ca
->
delay_min
>
delay
)
if
(
ca
->
delay_min
==
0
||
ca
->
delay_min
>
delay
)
ca
->
delay_min
=
delay
;
ca
->
delay_min
=
delay
;
/* hystart triggers when cwnd is larger than some threshold */
if
(
hystart
&&
tp
->
snd_cwnd
<=
tp
->
snd_ssthresh
&&
tp
->
snd_cwnd
>=
hystart_low_window
)
hystart_update
(
sk
,
delay
);
}
}
static
struct
tcp_congestion_ops
cubictcp
=
{
static
struct
tcp_congestion_ops
cubictcp
=
{
...
@@ -372,4 +470,4 @@ module_exit(cubictcp_unregister);
...
@@ -372,4 +470,4 @@ module_exit(cubictcp_unregister);
MODULE_AUTHOR
(
"Sangtae Ha, Stephen Hemminger"
);
MODULE_AUTHOR
(
"Sangtae Ha, Stephen Hemminger"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"CUBIC TCP"
);
MODULE_DESCRIPTION
(
"CUBIC TCP"
);
MODULE_VERSION
(
"2.
2
"
);
MODULE_VERSION
(
"2.
3
"
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录