@@ -345,6 +345,128 @@ test_ff_in_pcbladdr_af_inet6_freebsd_to_linux_remap(void **state)
345345 ff_regist_pcblddr_fun (NULL );
346346}
347347
348+ /* ======================================================================== */
349+ /* Stage-6 Phase-5 coverage extensions: ff_rss_tbl_* + register_if */
350+ /* ======================================================================== */
351+
352+ /* ------------------------------------------------------------------------ */
353+ /* TC-U-P3-DPDKIF-11 (Stage-6): ff_rss_tbl_set_portrange returns -1 when */
354+ /* rss_check_cfgs is NULL (covers the early-return guard L2722). */
355+ /* ------------------------------------------------------------------------ */
356+ static void
357+ test_ff_rss_tbl_set_portrange_no_cfg (void * * state )
358+ {
359+ (void )state ;
360+ /* Ensure clean state. */
361+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
362+ int rv = ff_rss_tbl_set_portrange (1024 , 2048 );
363+ assert_int_equal (rv , -1 );
364+ }
365+
366+ /* ------------------------------------------------------------------------ */
367+ /* TC-U-P3-DPDKIF-12 (Stage-6): ff_rss_tbl_set_portrange returns -1 when */
368+ /* rss_check_cfgs.enable == 0 (same guard L2722-2724). */
369+ /* ------------------------------------------------------------------------ */
370+ static void
371+ test_ff_rss_tbl_set_portrange_disabled (void * * state )
372+ {
373+ (void )state ;
374+ struct ff_rss_check_cfg dummy = { .enable = 0 };
375+ ff_global_cfg .dpdk .rss_check_cfgs = & dummy ;
376+ int rv = ff_rss_tbl_set_portrange (1024 , 2048 );
377+ assert_int_equal (rv , -1 );
378+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
379+ }
380+
381+ /* ------------------------------------------------------------------------ */
382+ /* TC-U-P3-DPDKIF-13 (Stage-6): ff_rss_tbl_set_portrange with first > last */
383+ /* returns -1 (covers the inverted-range guard). */
384+ /* ------------------------------------------------------------------------ */
385+ static void
386+ test_ff_rss_tbl_set_portrange_inverted_range (void * * state )
387+ {
388+ (void )state ;
389+ struct ff_rss_check_cfg dummy = { .enable = 1 };
390+ ff_global_cfg .dpdk .rss_check_cfgs = & dummy ;
391+ int rv = ff_rss_tbl_set_portrange (/*first*/ 2048 , /*last*/ 1024 );
392+ assert_int_equal (rv , -1 );
393+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
394+ }
395+
396+ /* ------------------------------------------------------------------------ */
397+ /* TC-U-P3-DPDKIF-14 (Stage-6): ff_rss_tbl_get_portrange returns -1 when */
398+ /* rss_check_cfgs is NULL (early-return guard L2782-2784). */
399+ /* ------------------------------------------------------------------------ */
400+ static void
401+ test_ff_rss_tbl_get_portrange_no_cfg (void * * state )
402+ {
403+ (void )state ;
404+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
405+ uint16_t first = 0 , last = 0 ;
406+ uint16_t * portrange = NULL ;
407+ int rv = ff_rss_tbl_get_portrange (0x01020304 , 0x05060708 , htons (80 ),
408+ & first , & last , & portrange );
409+ assert_int_equal (rv , -1 );
410+ }
411+
412+ /* ------------------------------------------------------------------------ */
413+ /* TC-U-P3-DPDKIF-15 (Stage-6): ff_rss_tbl_get_portrange returns -1 when */
414+ /* rss_check_cfgs.enable == 0. */
415+ /* ------------------------------------------------------------------------ */
416+ static void
417+ test_ff_rss_tbl_get_portrange_disabled (void * * state )
418+ {
419+ (void )state ;
420+ struct ff_rss_check_cfg dummy = { .enable = 0 };
421+ ff_global_cfg .dpdk .rss_check_cfgs = & dummy ;
422+ uint16_t first = 0 , last = 0 ;
423+ uint16_t * portrange = NULL ;
424+ int rv = ff_rss_tbl_get_portrange (0x01020304 , 0x05060708 , htons (80 ),
425+ & first , & last , & portrange );
426+ assert_int_equal (rv , -1 );
427+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
428+ }
429+
430+ /* ------------------------------------------------------------------------ */
431+ /* TC-U-P3-DPDKIF-16 (Stage-6): ff_rss_tbl_get_portrange smoke — verify it */
432+ /* doesn't crash when called with an arbitrary 4-tuple against the global */
433+ /* table (initial state). Acceptable return values: 0 (found), 1 (found- */
434+ /* with-portrange), or -1 (not found). Any of these covers the lookup loop.*/
435+ /* ------------------------------------------------------------------------ */
436+ static void
437+ test_ff_rss_tbl_get_portrange_smoke (void * * state )
438+ {
439+ (void )state ;
440+ struct ff_rss_check_cfg dummy = { .enable = 1 };
441+ ff_global_cfg .dpdk .rss_check_cfgs = & dummy ;
442+ uint16_t first = 0 , last = 0 ;
443+ uint16_t * portrange = NULL ;
444+ int rv = ff_rss_tbl_get_portrange (0xDEADBEEF , 0xCAFEBABE , htons (80 ),
445+ & first , & last , & portrange );
446+ /* Just verify the function ran without crashing. The return value
447+ * depends on the global ff_rss_tbl state which we don't control here. */
448+ (void )rv ;
449+ ff_global_cfg .dpdk .rss_check_cfgs = NULL ;
450+ }
451+
452+ /* ------------------------------------------------------------------------ */
453+ /* TC-U-P3-DPDKIF-17 (Stage-6): ff_dpdk_register_if happy path: allocates */
454+ /* and returns a non-NULL ff_dpdk_if_context (covers the malloc + memset */
455+ /* path in L182-L196). */
456+ /* ------------------------------------------------------------------------ */
457+ static void
458+ test_ff_dpdk_register_if_returns_ctx (void * * state )
459+ {
460+ (void )state ;
461+ struct ff_port_cfg pcfg = { .port_id = 0 };
462+ int dummy_softc = 0xCAFE ;
463+ int dummy_ifp = 0xBEEF ;
464+ void * ctx = ff_dpdk_register_if (& dummy_softc , & dummy_ifp , & pcfg );
465+ assert_non_null (ctx );
466+ /* Round-trip via ff_dpdk_deregister_if (already tested) to free. */
467+ ff_dpdk_deregister_if ((struct ff_dpdk_if_context * )ctx );
468+ }
469+
348470/* ------------------------------------------------------------------------ */
349471/* Main runner */
350472/* ------------------------------------------------------------------------ */
@@ -363,6 +485,14 @@ main(void)
363485 cmocka_unit_test (test_ff_in_pcbladdr_no_callback ),
364486 cmocka_unit_test (test_ff_in_pcbladdr_af_inet_dispatches ),
365487 cmocka_unit_test (test_ff_in_pcbladdr_af_inet6_freebsd_to_linux_remap ),
488+ /* Stage-6 Phase-5 coverage extensions */
489+ cmocka_unit_test (test_ff_rss_tbl_set_portrange_no_cfg ),
490+ cmocka_unit_test (test_ff_rss_tbl_set_portrange_disabled ),
491+ cmocka_unit_test (test_ff_rss_tbl_set_portrange_inverted_range ),
492+ cmocka_unit_test (test_ff_rss_tbl_get_portrange_no_cfg ),
493+ cmocka_unit_test (test_ff_rss_tbl_get_portrange_disabled ),
494+ cmocka_unit_test (test_ff_rss_tbl_get_portrange_smoke ),
495+ cmocka_unit_test (test_ff_dpdk_register_if_returns_ctx ),
366496 };
367497 return cmocka_run_group_tests (tests , NULL , NULL );
368498}
0 commit comments