Skip to content
This repository has been archived by the owner on Jan 19, 2023. It is now read-only.

Error compiling control-plane user_xdp5.h #106

Open
kwjjyn opened this issue May 27, 2019 · 5 comments
Open

Error compiling control-plane user_xdp5.h #106

kwjjyn opened this issue May 27, 2019 · 5 comments
Labels

Comments

@kwjjyn
Copy link

kwjjyn commented May 27, 2019

Hi,
When I run the below command in the /p4c/extensions/p4c-xdp/tests :

# gcc -I ../lib/   ../lib/libbpf.o user_xdp5.c -o xdp5

there's an error that

In file included from xdp5.h:6:0,
                 from user_xdp5.c:20:
ebpf_xdp.h:24:25: fatal error: ebpf_kernel.h: No such file or directory
 #include "ebpf_kernel.h"
                         ^
compilation terminated.

And then I found the header files to be included are in the /p4c/backends/ebpf/runtime/,
so I move the ebpf_kernel.h and ebpf_common.h into the /tests :

root@debian:~/p4c/extensions/p4c-xdp/tests# cp /root/p4c/backends/ebpf/runtime/ebpf_common.h ./
root@debian:~/p4c/extensions/p4c-xdp/tests# cp /root/p4c/backends/ebpf/runtime/ebpf_kernel.h ./

however, when I compile again , some other errors occured :

In file included from ebpf_xdp.h:24:0,
                 from xdp5.h:6,
                 from user_xdp5.c:20:
ebpf_kernel.h:111:19: error: static declaration of ‘bpf_lookup_elem’ follows non-static declaration
 static inline int bpf_lookup_elem(int fd, void *key, void *value) {
                   ^~~~~~~~~~~~~~~
In file included from user_xdp5.c:17:0:
../lib/libbpf.h:10:5: note: previous declaration of ‘bpf_lookup_elem’ was here
 int bpf_lookup_elem(int fd, void *key, void *value);
     ^~~~~~~~~~~~~~~
In file included from ebpf_xdp.h:24:0,
                 from xdp5.h:6,
                 from user_xdp5.c:20:
ebpf_kernel.h:131:19: error: static declaration of ‘bpf_update_elem’ follows non-static declaration
 static inline int bpf_update_elem(int fd, void *key, void *value, u64 flags) {
                   ^~~~~~~~~~~~~~~
In file included from user_xdp5.c:17:0:
../lib/libbpf.h:9:5: note: previous declaration of ‘bpf_update_elem’ was here
 int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags);
     ^~~~~~~~~~~~~~~
In file included from ebpf_xdp.h:24:0,
                 from xdp5.h:6,
                 from user_xdp5.c:20:
ebpf_kernel.h:149:19: error: static declaration of ‘bpf_delete_elem’ follows non-static declaration
 static inline int bpf_delete_elem(int fd, void *key) {
                   ^~~~~~~~~~~~~~~
In file included from user_xdp5.c:17:0:
../lib/libbpf.h:11:5: note: previous declaration of ‘bpf_delete_elem’ was here
 int bpf_delete_elem(int fd, void *key);
     ^~~~~~~~~~~~~~~
In file included from ebpf_xdp.h:24:0,
                 from xdp5.h:6,
                 from user_xdp5.c:20:
ebpf_kernel.h:165:19: error: static declaration of ‘bpf_obj_pin’ follows non-static declaration
 static inline int bpf_obj_pin(int fd, const char *pathname) {
                   ^~~~~~~~~~~
In file included from user_xdp5.c:17:0:
../lib/libbpf.h:18:5: note: previous declaration of ‘bpf_obj_pin’ was here
 int bpf_obj_pin(int fd, const char *pathname);
     ^~~~~~~~~~~
In file included from ebpf_xdp.h:24:0,
                 from xdp5.h:6,
                 from user_xdp5.c:20:
ebpf_kernel.h:181:19: error: static declaration of ‘bpf_obj_get’ follows non-static declaration
 static inline int bpf_obj_get(const char *pathname) {
                   ^~~~~~~~~~~
In file included from user_xdp5.c:17:0:
../lib/libbpf.h:19:5: note: previous declaration of ‘bpf_obj_get’ was here
 int bpf_obj_get(const char *pathname);
     ^~~~~~~~~~~
user_xdp5.c: In function ‘main’:
user_xdp5.c:29:25: error: storage size of ‘key’ isn’t known
  struct dstmactable_key key;
                         ^~~
user_xdp5.c:30:27: error: storage size of ‘value’ isn’t known
  struct dstmactable_value value;
                           ^~~~~
user_xdp5.c:33:2: warning: implicit declaration of function ‘initialize_tables’ [-Wimplicit-function-declaration]
  initialize_tables();
  ^~~~~~~~~~~~~~~~~
user_xdp5.c:35:17: error: ‘Fallback_action’ undeclared (first use in this function)
  value.action = Fallback_action;
                 ^~~~~~~~~~~~~~~
user_xdp5.c:35:17: note: each undeclared identifier is reported only once for each function it appears in

could you give me some advice?
Thanks.

@williamtu
Copy link
Contributor

Hi,
Thanks for testing this case.
The user_xdp5.c is obsolete and not tested at all.
I did quick fix to make it works by

diff --git a/lib/libbpf.h b/lib/libbpf.h
index 1c874b8..ada1e31 100644
--- a/lib/libbpf.h
+++ b/lib/libbpf.h
@@ -4,19 +4,19 @@
 
 struct bpf_insn;
 
-int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
+static int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
 		   int max_entries);
-int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags);
-int bpf_lookup_elem(int fd, void *key, void *value);
-int bpf_delete_elem(int fd, void *key);
-int bpf_get_next_key(int fd, void *key, void *next_key);
+static int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags);
+static int bpf_lookup_elem(int fd, void *key, void *value);
+static int bpf_delete_elem(int fd, void *key);
+static int bpf_get_next_key(int fd, void *key, void *next_key);
 
-int bpf_prog_load(enum bpf_prog_type prog_type,
+static int bpf_prog_load(enum bpf_prog_type prog_type,
 		  const struct bpf_insn *insns, int insn_len,
 		  const char *license, int kern_version);
 
-int bpf_obj_pin(int fd, const char *pathname);
-int bpf_obj_get(const char *pathname);
+static int bpf_obj_pin(int fd, const char *pathname);
+static int bpf_obj_get(const char *pathname);
 
 #define LOG_BUF_SIZE 262144
 extern char bpf_log_buf[LOG_BUF_SIZE];
diff --git a/tests/user_xdp5.c b/tests/user_xdp5.c
index ca13f9d..32f2875 100644
--- a/tests/user_xdp5.c
+++ b/tests/user_xdp5.c
@@ -26,13 +26,10 @@ int main(void)
 {
 	int ret;	
     int fd;
-	struct dstmactable_key key;
-	struct dstmactable_value value;
+	struct Ingress_dstmactable_key key;
+	struct Ingress_dstmactable_value value;
 
-    /* populate the default table */
-	initialize_tables();
-
-	value.action = Fallback_action;
+	value.action = Ingress_Fallback_action;
 	key.field0 = 0x800; // IP packet
 
     printf("=== Open BPF map: %s ===\n", MAP_PATH TABLE);

and compile it with

root@ba8b8adc32b6:/home/p4c/extensions/p4c-xdp/tests# gcc -I. -I../../../backends/ebpf/runtime/ -I ../lib/ ../lib/libbpf.o user_xdp5.c

@mihaibudiu
Copy link
Contributor

@williamtu : do you want to push your changes to libbpf.h as a pull request?

@kwjjyn
Copy link
Author

kwjjyn commented May 31, 2019

Actually when I update libbpf.h , I found that I can't run make in the /tests , because the load_and_verify.c file relies on the ../lib/bpf_load.c which alse include the libbpf.h . However, the functions which bpf_load,c calls are defined static functions in the libbpf.h . So it can't be compiled right.

But it's all right. The control plane code just use libbpf.h code . And I delete the bpf_load.c , .h and dont use the bpfloader anymore.

At the last . I think maybe you can maintain a copy of libbpf.h and libbpf.c with static in another folder like lib-control . And there is no effect on the /tests . And compile the control plane code with

gcc -I../../../backends/ebpf/runtime/ -I ../lib-control/ ../lib-control/libbpf.o user_xdp5.c -o user_xdp5
@williamtu
Copy link
Contributor

Thanks for your help. I will work on a pull request.

@chengchuntu
Copy link
Contributor

keep it open until fixed.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
4 participants