-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrule_parser_old
53 lines (51 loc) · 1.42 KB
/
rule_parser_old
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
#include "rule_parser.h"
const char *stall_text[] = {
"UNDETERMINED", "DOUBLE_RETRANSMISSION", "SMALL_CWND", "CONTINUOUS_LOSS", "ACK_DELAY", "ACK_LOSS", "PACKET_DELAY", "CLIENT_IDLE","CONNECTION_CLOSING"};
const char *stall_details[] = {
"This stall could not be determined.",
"The retransmitted packet is dropped.",
"Packet loss happens when the congestion window is smaller than 4 MSS.",
"All the outstanding packets are lost.",
"Delayed-ACKs at server.",
"ACK loss happens.",
"RTT jitter (current RTT is larger than (\\tau SRTT)).",
"Client uploading another file.",
"Connection closing.",
};
enum stall_type parse_stall(struct tcp_stall_state *tss)
{
if (tss->retrans + tss->spurious > 0) {
if (tss->cur_pkt_spurious > 0) {
if (tss->ack_delay_time > tss->rto - tss->srtt) {
return ACK_DELAY;
} else {
return ACK_LOSS;
}
} else {
if (tss->sacked > 3) {
if (tss->duration + tss->cur_time - tss->third_dup_ack_time > tss->rto + tss->srtt) {
return DOUBLE_RETRANSMISSION;
} else {
return UNDETERMINED;
}
} else {
return SMALL_CWND;
}
}
} else {
if (tss->cur_pkt_dir == DIR_IN) {
if (tss->duration > tss->rto + tss->srtt) {
return CONTINUOUS_LOSS;
} else {
return PACKET_DELAY;
}
} else {
if (tss->last_dir == DIR_IN)
return ACK_DELAY;
else if (tss->cur_len < tss->max_snd_seg_size)
return CLIENT_IDLE;
else
return UNDETERMINED;
}
}
}