``` commit fb0c5cfad37eaad30f584caaf53fe9824026bc92 Author: Alexis Lothoré (eBPF Foundation) alexis.lothore@bootlin.com
selftests/bpf: integrate test_tc_edt into test_progs
This patch converts test_tc_edt.sh to the test_progs framework, creating a new test that measures BPF-based traffic shaping to verify that the resulting rate matches 5Mbps within a 2% error margin.
diff --git a/tools/testing/selftests/bpf/prog_tests/test_tc_edt.c b/tools/testing/selftests/bpf/prog_tests/test_tc_edt.c new file mode 100644 index 000000000..a77e48fdf --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/test_tc_edt.c
[ ... ]
+#define TARGET_RATE_MBPS 5.0 +#define RATE_ERROR_PERCENT 2.0
[ ... ]
+static void run_test(void) +{
- __u64 rx_bytes_start, rx_bytes_end;
- double rate_mbps, rate_error;
- pthread_t server_thread = 0;
- struct connection *conn;
- __u64 ts_start, ts_end;
- int ret;
- conn = setup_connection();
- if (!ASSERT_OK_PTR(conn, "setup client and server connection"))
return;- ret = pthread_create(&server_thread, NULL, run_server,
(void *)(&conn->server_conn_fd));- if (!ASSERT_OK(ret, "start server rx thread"))
goto end_cleanup_conn;- if (!ASSERT_OK(read_rx_bytes(&rx_bytes_start), "read rx_bytes"))
goto end_kill_thread;- ts_start = get_time_ns();
- while (true) {
send(conn->client_conn_fd, (void *)tx_buffer, BUFFER_LEN, 0);ts_end = get_time_ns();if ((ts_end - ts_start)/100000 >= TIMEOUT_MS) {
^^^^^^
Does this time conversion use the correct divisor? The timeout check appears to divide nanoseconds by 100000, but TIMEOUT_MS is 2000 milliseconds. Converting nanoseconds to milliseconds requires dividing by 1000000, not 100000. With the current calculation, the timeout would trigger after 200 milliseconds rather than 2000 milliseconds.
tx_timeout = true;ret = read_rx_bytes(&rx_bytes_end);if (!ASSERT_OK(ret, "read_rx_bytes"))goto end_cleanup_conn;break;}- }
- rate_mbps = (rx_bytes_end - rx_bytes_start) /
((ts_end - ts_start) / 1000.0);
^^^^^^
Can this rate calculation produce the correct units? The numerator is in bytes, and the denominator (nanoseconds / 1000.0) is in microseconds, giving bytes per microsecond which equals megabytes per second (MB/s). However, the commit message states the test verifies "5Mbps" (megabits per second), and TARGET_RATE_MBPS suggests the same. Converting MB/s to Mbps requires multiplying by 8 (bits per byte), which appears to be missing. Is the test measuring in the wrong units, or is there a naming inconsistency?
- rate_error =
fabs((rate_mbps - TARGET_RATE_MBPS) * 100.0 / TARGET_RATE_MBPS);- fprintf(stderr, "Rate:\t%f\nError:\t%f\n", rate_mbps, rate_error);
- ASSERT_LE(rate_error, RATE_ERROR_PERCENT,
"rate error is lower than threshold");+end_kill_thread:
- tx_timeout = true;
+end_cleanup_conn:
- cleanup_connection(conn);
+}
```
--- AI reviewed your patch. Please fix the bug or email reply why it's not a bug. See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
In-Reply-To-Subject: `selftests/bpf: integrate test_tc_edt into test_progs` CI run summary: https://github.com/kernel-patches/bpf/actions/runs/18978170972