@@ -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