blob: e8de63438ed620c0379fd5af78cf8c3e3eded4c6 [file] [log] [blame]
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +02001/* Test routines for the CoDel implementation
2 *
3 * (C) 2015 by sysmocom s.f.m.c. GmbH
4 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
6
7#undef _GNU_SOURCE
8#define _GNU_SOURCE
9
10#if 0
11#include <osmocom/core/talloc.h>
12#include <osmocom/core/prim.h>
13#endif
14#include <osmocom/core/application.h>
15#include <osmocom/core/utils.h>
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010016#include <osmocom/core/timer_compat.h>
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020017#include <osmocom/core/logging.h>
18
19#include "gprs_codel.h"
20
21#include <stdio.h>
22#include <stdlib.h>
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010023#include <time.h>
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020024
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010025static int do_codel_control(struct gprs_codel *state, const struct timespec *recv,
26 struct timespec *now, const struct timespec *delta_now, int count)
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020027{
28 int drop;
29
30 drop = gprs_codel_control(state, recv, now, -1);
31 if (drop) {
32 printf("Dropping packet %d, "
33 "recv = %d.%03d, now = %d.%03d, "
34 "codel.count = %d\n",
35 count,
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010036 (int)recv->tv_sec, (int)recv->tv_nsec/1000000,
37 (int)now->tv_sec, (int)now->tv_nsec/1000000,
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020038 state->count);
39 } else {
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010040 timespecadd(now, delta_now, now);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020041 }
42
43 return drop == 0 ? 0 : 1;
44}
45
46static void test_codel(void)
47{
48 struct gprs_codel codel;
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010049 struct timespec now;
50 struct timespec recv;
51 const struct timespec delta_now = {0, 10000000};
52 const struct timespec init_delta_recv = {0, 5000000};
53 struct timespec delta_recv;
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020054 unsigned count;
55 unsigned sum = 0;
56 unsigned dropped = 0;
57 int drop;
58
59 printf("----- %s START\n", __func__);
60 gprs_codel_init(&codel);
61 gprs_codel_set_interval(&codel, 100);
62
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010063 timespecclear(&now);
64 timespecclear(&recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020065 delta_recv = init_delta_recv;
66
67 for (count = 0; count < 20; count++, sum++) {
68 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010069 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020070 dropped += drop;
71 }
72
73 printf("Dropped %d packets\n", dropped);
74 OSMO_ASSERT(dropped == 0);
75 OSMO_ASSERT(!codel.dropping);
76
77 for (count = 0; count < 20; count++, sum++) {
78 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010079 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020080 dropped += drop;
81 }
82
83 OSMO_ASSERT(dropped == 2);
84 OSMO_ASSERT(codel.dropping);
85
86 /* slow down recv rate */
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010087 delta_recv.tv_nsec = delta_now.tv_nsec;
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020088
89 for (count = 0; count < 75; count++, sum++) {
90 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +010091 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +020092 dropped += drop;
93 }
94
95 OSMO_ASSERT(dropped == 20);
96 OSMO_ASSERT(codel.dropping);
97
98 for (count = 0; count < 50; count++, sum++) {
99 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +0100100 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +0200101 dropped += drop;
102 }
103
104 OSMO_ASSERT(dropped == 20);
105 OSMO_ASSERT(!codel.dropping);
106 OSMO_ASSERT(codel.count >= 20);
107
108 /* go back to old data rate */
109 delta_recv = init_delta_recv;
110
111 for (count = 0; count < 20; count++, sum++) {
112 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +0100113 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +0200114 dropped += drop;
115 }
116
117 OSMO_ASSERT(dropped == 20);
118 OSMO_ASSERT(!codel.dropping);
119
120 for (count = 0; count < 20; count++, sum++) {
121 drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);
Pau Espin Pedrol1de68732020-03-11 14:04:52 +0100122 timespecadd(&recv, &delta_recv, &recv);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +0200123 dropped += drop;
124 }
125
126 OSMO_ASSERT(dropped == 22);
127 OSMO_ASSERT(codel.count >= 2);
128
129 printf("Dropped %d packets\n", dropped);
130
131 printf("----- %s END\n", __func__);
132}
133
134static struct log_info info = {};
135
136int main(int argc, char **argv)
137{
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200138 osmo_init_logging2(NULL, &info);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +0200139 log_set_use_color(osmo_stderr_target, 0);
Pau Espin Pedrol00f52cc2021-02-19 14:01:52 +0100140 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
Jacob Erlbeck4f666bc2015-07-20 12:40:42 +0200141 log_set_log_level(osmo_stderr_target, LOGL_INFO);
142
143 printf("===== CoDel test START\n");
144 test_codel();
145 printf("===== CoDel test END\n\n");
146
147 exit(EXIT_SUCCESS);
148}