File: tcp_naivereno.c

package info (click to toggle)
ns2 2.35%2Bdfsg-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 79,396 kB
  • sloc: cpp: 172,923; tcl: 107,167; perl: 6,391; sh: 6,143; ansic: 5,846; makefile: 829; awk: 525; csh: 355
file content (68 lines) | stat: -rw-r--r-- 1,929 bytes parent folder | download | duplicates (8)
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
64
65
66
67
68
/* This is a very naive Reno implementation, shown as an example on how to develop a new congestion control algorithm with TCP-Linux.
 *
 * See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
 *
 */
#define NS_PROTOCOL "tcp_naive_reno.c"

#include "ns-linux-c.h"
#include "ns-linux-util.h"

static int alpha = 1;
static int beta = 2;
module_param(alpha, int, 0644);
MODULE_PARM_DESC(alpha, "AI increment size of window (in unit of pkt/round trip time)");
module_param(beta, int, 0644);
MODULE_PARM_DESC(beta, "MD decrement portion of window: every loss the window is reduced by a proportion of 1/beta");

/* opencwnd */
void tcp_naive_reno_cong_avoid(struct tcp_sock *tp, u32 ack, u32 rtt, u32 in_flight, int flag)
{
	ack = ack;
	rtt = rtt;
	in_flight = in_flight;
	flag = flag;

	if (tp->snd_cwnd < tp->snd_ssthresh) {
		tp->snd_cwnd++;
	} else {
		if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
			tp->snd_cwnd += alpha;
			tp->snd_cwnd_cnt = 0;
			if (tp->snd_cwnd > tp->snd_cwnd_clamp)
				tp->snd_cwnd = tp->snd_cwnd_clamp;
		} else {
			tp->snd_cwnd_cnt++;
		}
	}
}

/* ssthreshold should be half of the congestion window after a loss */
u32 tcp_naive_reno_ssthresh(struct tcp_sock *tp)
{
	int reduction = tp->snd_cwnd / beta;
        return max(tp->snd_cwnd - reduction, 2U);
}


/* congestion window should be equal to the slow start threshold (after slow start threshold set to half of cwnd before loss). */
u32 tcp_naive_reno_min_cwnd(const struct tcp_sock *tp)
{
        return tp->snd_ssthresh;
}

static struct tcp_congestion_ops tcp_naive_reno = {
        .name           = "naive_reno",
        .ssthresh       = tcp_naive_reno_ssthresh,
        .cong_avoid     = tcp_naive_reno_cong_avoid,
        .min_cwnd       = tcp_naive_reno_min_cwnd
};

int tcp_naive_reno_register(void)
{
	tcp_register_congestion_control(&tcp_naive_reno);
	return 0;
}
module_init(tcp_naive_reno_register);