[PATCH] lib/bpf: Rename 'bpf_validate' to avoid potential conflict with libpcap

Stephen Hemminger stephen at networkplumber.org
Sun Mar 5 18:31:17 CET 2023


On Sun, 5 Mar 2023 09:16:55 -0800
Stephen Hemminger <stephen at networkplumber.org> wrote:

> On Fri,  3 Mar 2023 21:56:54 +0800
> Martzki <mars14850 at gmail.com> wrote:
> 
> > The library libpcap has their function 'bpf_validate' either so
> > there would be a multiple definition issue when linking with
> > librte_bpf.a and libpcap.a staticly.
> > 
> > You can reproduce this issue by 'meson build -Dprefer_static=true
> > -Denable_apps=test-pmd -Denable_drivers=net/af_xdp,net/af_packet'.
> > Notice you need to have a static version of libpcap to reproduce this.
> > 
> > In 2019 there was a patch reported the same issue but not applied:
> > https://inbox.dpdk.org/stable/2601191342CEEE43887BDE71AB9772580148A95BE2@irsmsx105.ger.corp.intel.com/T
> > 
> > Since 'bpf_validate' is an internal function, I think adding an 'rte'
> > prefix is not a good idea and rename it to 'bpf_do_validate' instead.
> > 
> > Signed-off-by: Martzki <mars14850 at gmail.com>  
> 
> Let's change all the function names here to rte_bpf_XXX.

Something like this

diff --git a/lib/bpf/bpf.c b/lib/bpf/bpf.c
index 1e1dd42a589f..f218a8f2b049 100644
--- a/lib/bpf/bpf.c
+++ b/lib/bpf/bpf.c
@@ -31,14 +31,14 @@ rte_bpf_get_jit(const struct rte_bpf *bpf, struct rte_bpf_jit *jit)
 }
 
 int
-bpf_jit(struct rte_bpf *bpf)
+rte_bpf_jit(struct rte_bpf *bpf)
 {
 	int32_t rc;
 
 #if defined(RTE_ARCH_X86_64)
-	rc = bpf_jit_x86(bpf);
+	rc = rte_bpf_jit_x86(bpf);
 #elif defined(RTE_ARCH_ARM64)
-	rc = bpf_jit_arm64(bpf);
+	rc = rte_bpf_jit_arm64(bpf);
 #else
 	rc = -ENOTSUP;
 #endif
diff --git a/lib/bpf/bpf_convert.c b/lib/bpf/bpf_convert.c
index 9563274c9c6b..d441be66634f 100644
--- a/lib/bpf/bpf_convert.c
+++ b/lib/bpf/bpf_convert.c
@@ -23,11 +23,8 @@
 #include <rte_malloc.h>
 #include <rte_errno.h>
 
-/* Workaround name conflicts with libpcap */
-#define bpf_validate(f, len) bpf_validate_libpcap(f, len)
 #include <pcap/pcap.h>
 #include <pcap/bpf.h>
-#undef bpf_validate
 
 #include "bpf_impl.h"
 #include "bpf_def.h"
diff --git a/lib/bpf/bpf_impl.h b/lib/bpf/bpf_impl.h
index b4d8e87c6dfb..7fca2db9bef6 100644
--- a/lib/bpf/bpf_impl.h
+++ b/lib/bpf/bpf_impl.h
@@ -17,12 +17,10 @@ struct rte_bpf {
 	uint32_t stack_sz;
 };
 
-extern int bpf_validate(struct rte_bpf *bpf);
-
-extern int bpf_jit(struct rte_bpf *bpf);
-
-extern int bpf_jit_x86(struct rte_bpf *);
-extern int bpf_jit_arm64(struct rte_bpf *);
+extern int rte_bpf_validate(struct rte_bpf *bpf);
+extern int rte_bpf_jit(struct rte_bpf *bpf);
+extern int rte_bpf_jit_x86(struct rte_bpf *);
+extern int rte_bpf_jit_arm64(struct rte_bpf *);
 
 extern int rte_bpf_logtype;
 
diff --git a/lib/bpf/bpf_jit_x86.c b/lib/bpf/bpf_jit_x86.c
index c1a30e038660..182004ac7d6c 100644
--- a/lib/bpf/bpf_jit_x86.c
+++ b/lib/bpf/bpf_jit_x86.c
@@ -1490,7 +1490,7 @@ emit(struct bpf_jit_state *st, const struct rte_bpf *bpf)
  * produce a native ISA version of the given BPF code.
  */
 int
-bpf_jit_x86(struct rte_bpf *bpf)
+rte_bpf_jit_x86(struct rte_bpf *bpf)
 {
 	int32_t rc;
 	uint32_t i;
diff --git a/lib/bpf/bpf_load.c b/lib/bpf/bpf_load.c
index 1e17df6ce0ab..2c4bca358603 100644
--- a/lib/bpf/bpf_load.c
+++ b/lib/bpf/bpf_load.c
@@ -108,9 +108,9 @@ rte_bpf_load(const struct rte_bpf_prm *prm)
 		return NULL;
 	}
 
-	rc = bpf_validate(bpf);
+	rc = rte_bpf_validate(bpf);
 	if (rc == 0) {
-		bpf_jit(bpf);
+		rte_bpf_jit(bpf);
 		if (mprotect(bpf, bpf->sz, PROT_READ) != 0)
 			rc = -ENOMEM;
 	}
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 61cbb42216b8..2d3d899966b9 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -2302,7 +2302,7 @@ evaluate(struct bpf_verifier *bvf)
 }
 
 int
-bpf_validate(struct rte_bpf *bpf)
+rte_bpf_validate(struct rte_bpf *bpf)
 {
 	int32_t rc;
 	struct bpf_verifier bvf;


More information about the dev mailing list