summaryrefslogtreecommitdiff
path: root/src/platform/tests/test-tc.c
blob: dc2bf9f2149fc927e25fb4c1f1403df38a490f54 (plain)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// SPDX-License-Identifier: LGPL-2.1+

#include "nm-default.h"

#include <linux/pkt_sched.h>

#include "nm-test-utils-core.h"
#include "platform/nmp-object.h"
#include "platform/nmp-netns.h"
#include "platform/nm-platform-utils.h"
#include "test-common.h"

static NMPObject *
qdisc_new (int ifindex, const char *kind, guint32 parent)
{
	NMPObject *obj;

	obj = nmp_object_new (NMP_OBJECT_TYPE_QDISC, NULL);
	obj->qdisc = (NMPlatformQdisc) {
		.ifindex = ifindex,
		.kind = kind,
		.parent = parent,
	};

	return obj;
}

static GPtrArray *
qdiscs_lookup (int ifindex)
{
	NMPLookup lookup;

	return nm_platform_lookup_clone (NM_PLATFORM_GET,
	                                 nmp_lookup_init_object (&lookup,
	                                                         NMP_OBJECT_TYPE_QDISC,
	                                                         ifindex),
	                                 NULL, NULL);
}

static void
test_qdisc1 (void)
{
	int ifindex;
	gs_unref_ptrarray GPtrArray *known = NULL;
	gs_unref_ptrarray GPtrArray *plat = NULL;
	NMPObject *obj;
	NMPlatformQdisc *qdisc;

	ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
	g_assert_cmpint (ifindex, >, 0);

	nmtstp_run_command       ("tc qdisc del dev %s root", DEVICE_NAME);
	nmtstp_run_command_check ("tc qdisc add dev %s root sfq", DEVICE_NAME);

	nmtstp_wait_for_signal (NM_PLATFORM_GET, 0);

	known = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref);
	g_ptr_array_add (known, qdisc_new (ifindex, "fq_codel", TC_H_ROOT));
	g_ptr_array_add (known, qdisc_new (ifindex, "ingress", TC_H_INGRESS));

	g_assert (nm_platform_qdisc_sync (NM_PLATFORM_GET, ifindex, known));
	plat = qdiscs_lookup (ifindex);
	g_assert (plat);
	g_assert_cmpint (plat->len, ==, 2);

	obj = plat->pdata[0];
	qdisc = NMP_OBJECT_CAST_QDISC (obj);
	g_assert_cmpint (qdisc->parent, ==, TC_H_ROOT);
	g_assert_cmpstr (qdisc->kind, ==, "fq_codel");

	obj = plat->pdata[1];
	qdisc = NMP_OBJECT_CAST_QDISC (obj);
	g_assert_cmpint (qdisc->parent, ==, TC_H_INGRESS);
	g_assert_cmpstr (qdisc->kind, ==, "ingress");
}

static void
test_qdisc2 (void)
{
	int ifindex;
	gs_unref_ptrarray GPtrArray *known = NULL;
	gs_unref_ptrarray GPtrArray *plat = NULL;
	NMPObject *obj;
	NMPlatformQdisc *qdisc;

	ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
	g_assert_cmpint (ifindex, >, 0);

	nmtstp_run_command ("tc qdisc del dev %s root", DEVICE_NAME);

	nmtstp_wait_for_signal (NM_PLATFORM_GET, 0);

	known = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref);
	obj = qdisc_new (ifindex, "fq_codel", TC_H_ROOT);
	obj->qdisc.handle = TC_H_MAKE (0x8142 << 16, 0);
	obj->qdisc.fq_codel.limit = 2048;
	obj->qdisc.fq_codel.flows = 64;
	obj->qdisc.fq_codel.quantum = 1000;
	g_ptr_array_add (known, obj);

	g_assert (nm_platform_qdisc_sync (NM_PLATFORM_GET, ifindex, known));
	plat = qdiscs_lookup (ifindex);
	g_assert (plat);
	g_assert_cmpint (plat->len, ==, 1);

	obj = plat->pdata[0];
	qdisc = NMP_OBJECT_CAST_QDISC (obj);
	g_assert_cmpstr (qdisc->kind, ==, "fq_codel");
	g_assert_cmpint (qdisc->handle, ==, TC_H_MAKE (0x8142 << 16, 0));
	g_assert_cmpint (qdisc->parent, ==, TC_H_ROOT);
	g_assert_cmpint (qdisc->fq_codel.limit, ==, 2048);
	g_assert_cmpint (qdisc->fq_codel.flows, ==, 64);
	g_assert_cmpint (qdisc->fq_codel.quantum, ==, 1000);
}

/*****************************************************************************/

NMTstpSetupFunc const _nmtstp_setup_platform_func = SETUP;

void
_nmtstp_init_tests (int *argc, char ***argv)
{
	nmtst_init_with_logging (argc, argv, NULL, "ALL");
}

void
_nmtstp_setup_tests (void)
{
	if (nmtstp_is_root_test ()) {
		nmtstp_env1_add_test_func ("/link/qdisc/1", test_qdisc1, TRUE);
		nmtstp_env1_add_test_func ("/link/qdisc/2", test_qdisc2, TRUE);
	}
}