Skip to content

Commit e329ca0

Browse files
author
coverage-leader
committed
test(coverage): Stage-6 phase-4 ff_dpdk_kni 11.2%->47.2% line (+7 TC)
Phase-4 of coverage-boost. Adds 7 ff_dpdk_kni TCs targeting: - ff_kni_proto_filter (6 TC): IPv4-too-short / non-IP frame / TCP+kni-disabled / UDP+kni-disabled / oversized IHL / IPIP recursion - ff_kni_init (1 TC) : tcp/udp port bitmap building with comma+range syntax Coverage: ff_dpdk_kni.c line 11.2% -> 47.2% (+36.0pp) ff_dpdk_kni.c branch 13.6% -> 40.9% (+27.3pp) Project line 43.8% -> 46.3%, branch 44.8% -> 46.5%, func 57.9% -> 61.7% 135 TC / 0 SKIP / 0 FAIL. G8 thresholds raised: ff_dpdk_kni line 8->40, branch 10->35. valgrind 11/11 PASS / 0 leak. No lib patch needed in phase-4.
1 parent 545382d commit e329ca0

2 files changed

Lines changed: 110 additions & 1 deletion

File tree

tests/unit/coverage_threshold.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ BEGIN {
6969
tline["ff_dpdk_pcap.c"] = 95; tbr["ff_dpdk_pcap.c"] = 84
7070
# P3 (Stage-5 subset only — most of the file is out-of-scope by design)
7171
tline["ff_dpdk_if.c"] = 2; tbr["ff_dpdk_if.c"] = 0
72-
tline["ff_dpdk_kni.c"] = 8; tbr["ff_dpdk_kni.c"] = 10
72+
tline["ff_dpdk_kni.c"] = 40; tbr["ff_dpdk_kni.c"] = 35
7373
7474
pass = 0; fail = 0; total_files = 0
7575
}

tests/unit/test_ff_dpdk_kni.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,107 @@ test_ff_kni_enqueue_filter_classification(void **state)
298298
}
299299
}
300300

301+
/* ======================================================================== */
302+
/* Stage-6 Phase-4 coverage extensions: ff_kni_proto_filter + ff_kni_init */
303+
/* ======================================================================== */
304+
305+
#include <rte_ip.h>
306+
#include <rte_tcp.h>
307+
#include <rte_udp.h>
308+
#include <rte_ether.h>
309+
#include <netinet/in.h> /* IPPROTO_TCP / IPPROTO_UDP / IPPROTO_IPIP */
310+
311+
/* TC-U-P3-KNI-05: ff_kni_proto_filter on too-short IPv4 -> FILTER_UNKNOWN */
312+
static void
313+
test_ff_kni_proto_filter_ipv4_short(void **state)
314+
{
315+
(void)state;
316+
uint8_t too_short[10] = {0};
317+
enum FilterReturn rv = ff_kni_proto_filter(too_short, 10, RTE_ETHER_TYPE_IPV4);
318+
assert_int_equal(rv, FILTER_UNKNOWN);
319+
}
320+
321+
/* TC-U-P3-KNI-06: ff_kni_proto_filter on non-IP frame -> FILTER_UNKNOWN */
322+
static void
323+
test_ff_kni_proto_filter_non_ip_frame(void **state)
324+
{
325+
(void)state;
326+
uint8_t arp_payload[28] = {0};
327+
enum FilterReturn rv = ff_kni_proto_filter(arp_payload, sizeof(arp_payload),
328+
RTE_ETHER_TYPE_ARP);
329+
assert_int_equal(rv, FILTER_UNKNOWN);
330+
}
331+
332+
/* TC-U-P3-KNI-07: IPv4+TCP without enable_kni -> FILTER_UNKNOWN (break path) */
333+
static void
334+
test_ff_kni_proto_filter_ipv4_tcp_kni_disabled(void **state)
335+
{
336+
(void)state;
337+
uint8_t pkt[64] = {0};
338+
pkt[0] = 0x45; /* version=4, IHL=5 */
339+
pkt[9] = IPPROTO_TCP; /* next_proto_id */
340+
enum FilterReturn rv = ff_kni_proto_filter(pkt, sizeof(pkt), RTE_ETHER_TYPE_IPV4);
341+
assert_int_equal(rv, FILTER_UNKNOWN);
342+
}
343+
344+
/* TC-U-P3-KNI-08: IPv4+UDP without enable_kni -> FILTER_UNKNOWN */
345+
static void
346+
test_ff_kni_proto_filter_ipv4_udp_kni_disabled(void **state)
347+
{
348+
(void)state;
349+
uint8_t pkt[64] = {0};
350+
pkt[0] = 0x45;
351+
pkt[9] = IPPROTO_UDP;
352+
enum FilterReturn rv = ff_kni_proto_filter(pkt, sizeof(pkt), RTE_ETHER_TYPE_IPV4);
353+
assert_int_equal(rv, FILTER_UNKNOWN);
354+
}
355+
356+
/* TC-U-P3-KNI-09: IPv4 IHL beyond buffer -> FILTER_UNKNOWN */
357+
static void
358+
test_ff_kni_proto_filter_ipv4_oversized_ihl(void **state)
359+
{
360+
(void)state;
361+
uint8_t pkt[24] = {0};
362+
pkt[0] = 0x4F; /* IHL = 15 -> 60 bytes > len */
363+
pkt[9] = IPPROTO_TCP;
364+
enum FilterReturn rv = ff_kni_proto_filter(pkt, sizeof(pkt), RTE_ETHER_TYPE_IPV4);
365+
assert_int_equal(rv, FILTER_UNKNOWN);
366+
}
367+
368+
/* TC-U-P3-KNI-10: IPIP (IPv4-in-IPv4) recursion with too-short inner */
369+
static void
370+
test_ff_kni_proto_filter_ipv4_ipip_recurse(void **state)
371+
{
372+
(void)state;
373+
uint8_t pkt[24] = {0}; /* outer 20 + only 4 inner */
374+
pkt[0] = 0x45;
375+
pkt[9] = IPPROTO_IPIP;
376+
enum FilterReturn rv = ff_kni_proto_filter(pkt, sizeof(pkt), RTE_ETHER_TYPE_IPV4);
377+
assert_int_equal(rv, FILTER_UNKNOWN);
378+
}
379+
380+
/* TC-U-P3-KNI-11: ff_kni_init builds bitmaps from "80,443,8000-8002" / "53" */
381+
static void
382+
test_ff_kni_init_tcp_udp_port_bitmaps(void **state)
383+
{
384+
(void)state;
385+
SKIP_IF_NO_EAL();
386+
/* ff_kni_init re-allocates kni_rp/kni_stat via rte_zmalloc; group_setup
387+
* had used plain calloc(). Save the original pointers, run ff_kni_init,
388+
* then restore so group_teardown can free() the calloc'd arrays. */
389+
struct rte_ring **saved_kni_rp = kni_rp;
390+
struct kni_interface_stats **saved_kni_stat = kni_stat;
391+
/* Range form (8000-8002) + comma list exercises both kni_set_bitmap
392+
* branches. nb_ports=1 keeps the alloc small. */
393+
ff_kni_init(/*nb_ports*/1, /*tcp*/"80,443,8000-8002", /*udp*/"53,5060");
394+
/* Free the rte_zmalloc'd arrays we just produced (best effort) and
395+
* restore the originals so group_teardown's free() is happy. */
396+
rte_free(kni_rp);
397+
rte_free(kni_stat);
398+
kni_rp = saved_kni_rp;
399+
kni_stat = saved_kni_stat;
400+
}
401+
301402
/* ------------------------------------------------------------------------ */
302403
/* Main runner */
303404
/* ------------------------------------------------------------------------ */
@@ -309,6 +410,14 @@ main(void)
309410
cmocka_unit_test_setup_teardown(test_ff_kni_enqueue_console_ratelimit_over, test_setup, NULL),
310411
cmocka_unit_test_setup_teardown(test_ff_kni_enqueue_general_ratelimit_over, test_setup, NULL),
311412
cmocka_unit_test_setup_teardown(test_ff_kni_enqueue_filter_classification, test_setup, NULL),
413+
/* Stage-6 Phase-4 coverage extensions */
414+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_ipv4_short, test_setup, NULL),
415+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_non_ip_frame, test_setup, NULL),
416+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_ipv4_tcp_kni_disabled, test_setup, NULL),
417+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_ipv4_udp_kni_disabled, test_setup, NULL),
418+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_ipv4_oversized_ihl, test_setup, NULL),
419+
cmocka_unit_test_setup_teardown(test_ff_kni_proto_filter_ipv4_ipip_recurse, test_setup, NULL),
420+
cmocka_unit_test_setup_teardown(test_ff_kni_init_tcp_udp_port_bitmaps, test_setup, NULL),
312421
};
313422
return cmocka_run_group_tests(tests, group_setup, group_teardown);
314423
}

0 commit comments

Comments
 (0)