|SUCCESS| examples/l3fwd: fix compilation when DP debug on

dpdklab at iol.unh.edu dpdklab at iol.unh.edu
Tue Apr 14 22:24:31 CEST 2026


Test-Label: ai-code-review
Test-Status: SUCCESS
https://dpdk.org/patch/163021

_AI Code Review_

=== Patch Review: series.patch (via Claude) ===
Review date: 2026-04-14

commit 6de0ea50e9b9 (example commit sha placeholder)
Author: Andrei-Niculae Petre <p31andrei at gmail.com>
examples/l3fwd: fix compilation when DP debug on

Previously, l3fwd example app would fail to compile if one would put
RTE_LOG_DP_LEVEL=RTE_LOG_DEBUG in config/rte_config.h and try to
compile dpdk; this path was not enabled via compiling debug build
(--buildtype=debug) alone, but needed the data path to be at debug
level.

> diff --git a/.mailmap b/.mailmap
> index cdaa471715..df999d00d8 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -106,6 +106,7 @@ Andre Muezerie <andremue at linux.microsoft.com> <andremue at microsoft.com>
>  Andre Richter <andre.o.richter at gmail.com>
>  Andrea Arcangeli <aarcange at redhat.com>
>  Andrea Grandi <andrea.grandi at intel.com>
> +Andrei-Niculae Petre <p31andrei at gmail.com>

[ ... ]

> diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
> index a1275e18bc..8e24f1c599 100644
> --- a/examples/l3fwd/l3fwd_acl.c
> +++ b/examples/l3fwd/l3fwd_acl.c
> @@ -235,6 +235,9 @@ enum {
>  RTE_ACL_RULE_DEF(acl4_rule, RTE_DIM(ipv4_defs));
>  RTE_ACL_RULE_DEF(acl6_rule, RTE_DIM(ipv6_defs));
>  
> +/* Must be included before acl_config definition to enable L3FWDACL_DEBUG */
> +#include "l3fwd_acl.h"
> +

Is it intentional to include the header file so early in the .c file?
This creates an unusual ordering where the header is included before the
static data structures (acl_config, etc.) that use types potentially
defined later.  Does this potentially violate any forward declaration
requirements or create subtle ordering dependencies?

>  static struct {
>  	struct rte_acl_ctx *acx_ipv4[NB_SOCKETS];
>  	struct rte_acl_ctx *acx_ipv6[NB_SOCKETS];
> @@ -251,8 +254,6 @@ static struct rte_acl_rule *acl_base_ipv4, *route_base_ipv4,
>  static unsigned int acl_num_ipv4, route_num_ipv4,
>  		acl_num_ipv6, route_num_ipv6;
>  
> -#include "l3fwd_acl.h"
> -
>  #include "l3fwd_acl_scalar.h"
>  
>  /*
> @@ -773,7 +774,7 @@ read_config_files_acl(void)
>  	}
>  }
>  
> -void
> +static void
>  print_one_ipv4_rule(struct acl4_rule *rule, int extra)
>  {
>  	char abuf[INET6_ADDRSTRLEN];
> @@ -800,7 +801,7 @@ print_one_ipv4_rule(struct acl4_rule *rule, int extra)
>  			rule->data.userdata);
>  }
>  
> -void
> +static void
>  print_one_ipv6_rule(struct acl6_rule *rule, int extra)
>  {
>  	unsigned char a, b, c, d;

[ ... ]

> @@ -855,17 +856,17 @@ print_one_ipv6_rule(struct acl6_rule *rule, int extra)
>  
>  #ifdef L3FWDACL_DEBUG
>  static inline void
> -dump_acl4_rule(struct rte_mbuf *m, uint32_t sig)
> +dump_acl4_rule(const struct rte_mbuf *m, uint32_t sig)
>  {
> -	char abuf[INET6_ADDRSTRLEN];
> +	char abuf[INET_ADDRSTRLEN];

Good catch on using the correct constant for IPv4.

>  	uint32_t offset = sig & ~ACL_DENY_SIGNATURE;
>  	struct rte_ipv4_hdr *ipv4_hdr =
>  		rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *,
>  					sizeof(struct rte_ether_hdr));
>  
> -	printf("Packet Src:%s ", inet_ntop(AF_INET, ipv4_hdr->src_addr,
> +	printf("Packet Src:%s ", inet_ntop(AF_INET, &ipv4_hdr->src_addr,
>  		abuf, sizeof(abuf)));
> -	printf("Dst:%s ", inet_ntop(AF_INET, ipv4_hdr->dst_addr,
> +	printf("Dst:%s ", inet_ntop(AF_INET, &ipv4_hdr->dst_addr,
>  		abuf, sizeof(abuf)));

Does the API of inet_ntop() require a pointer argument?  The
rte_ipv4_hdr structure defines src_addr and dst_addr as rte_be32_t
(which is uint32_t), not as arrays.  Does passing their addresses
(&ipv4_hdr->src_addr) to inet_ntop() match the expected interface?

>  
>  	printf("Src port:%hu,Dst port:%hu ",
> @@ -879,7 +880,7 @@ dump_acl4_rule(struct rte_mbuf *m, uint32_t sig)
>  }
>  
>  static inline void
> -dump_acl6_rule(struct rte_mbuf *m, uint32_t sig)
> +dump_acl6_rule(const struct rte_mbuf *m, uint32_t sig)
>  {
>  	char abuf[INET6_ADDRSTRLEN];
>  	uint32_t offset = sig & ~ACL_DENY_SIGNATURE;
> @@ -888,10 +889,10 @@ dump_acl6_rule(struct rte_mbuf *m, uint32_t sig)
>  					sizeof(struct rte_ether_hdr));
>  
>  	printf("Packet Src");
> -	printf("%s", inet_ntop(AF_INET6, ipv6_hdr->src_addr,
> +	printf("%s", inet_ntop(AF_INET6, &ipv6_hdr->src_addr,
>  		abuf, sizeof(abuf)));
>  	printf("\nDst");
> -	printf("%s", inet_ntop(AF_INET6, ipv6_hdr->dst_addr,
> +	printf("%s", inet_ntop(AF_INET6, &ipv6_hdr->dst_addr,
>  		abuf, sizeof(abuf)));

Does this change make sense for IPv6 addresses?  The rte_ipv6_hdr
structure defines src_addr and dst_addr as uint8_t arrays of size 16.
Was the original code passing the array directly to inet_ntop() correct,
and does adding the address-of operator (&) now pass a pointer to the
array instead of the array itself?

>  
>  	printf("\nSrc port:%hu,Dst port:%hu ",
> @@ -984,8 +985,8 @@ dump_denied_pkt(const struct rte_mbuf *pkt, uint32_t res)
>  	if ((res & ACL_DENY_SIGNATURE) != 0) {
>  		if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type))
>  			dump_acl4_rule(pkt, res);
> -		else if (RTE_ETH_IS_IPV6_HDR(pkt[i]->packet_type))
> -			dump_acl6_rule(pkt[i], res[i]);
> +		else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type))
> +			dump_acl6_rule(pkt, res);

Good fix on removing the incorrect array indexing.

[ ... ]

> diff --git a/examples/l3fwd/l3fwd_acl.h b/examples/l3fwd/l3fwd_acl.h
> index 05af62fe10..a34a08eb7f 100644
> --- a/examples/l3fwd/l3fwd_acl.h
> +++ b/examples/l3fwd/l3fwd_acl.h
> @@ -48,10 +48,4 @@
>   */
>  #define FWD_PORT_SHIFT 1
>  
> -void
> -print_one_ipv4_rule(struct acl4_rule *rule, int extra);
> -
> -void
> -print_one_ipv6_rule(struct acl6_rule *rule, int extra);
> -
>  #endif /* L3FWD_ACL_H */


More information about the test-report mailing list