[PATCH] samples/bpf: Update sockex2: get the expected output results

George Guo
2023-07-26T07:10:03Z

Running "ping -4 -c5 localhost" only shows 4 times prints not 5:

$ sudo ./samples/bpf/sockex2
ip 127.0.0.1 bytes 392 packets 4
ip 127.0.0.1 bytes 784 packets 8
ip 127.0.0.1 bytes 1176 packets 12
ip 127.0.0.1 bytes 1568 packets 16

debug it with num prints:
$ sudo ./samples/bpf/sockex2
num = 1: ip 127.0.0.1 bytes 392 packets 4
num = 2: ip 127.0.0.1 bytes 784 packets 8
num = 3: ip 127.0.0.1 bytes 1176 packets 12
num = 4: ip 127.0.0.1 bytes 1568 packets 16

The reason is that we check it faster, just put sleep(1) before check
while(bpf_map_get_next_key(map_fd, &key, &next_key) == 0).
Now we get the expected results:

$ sudo ./samples/bpf/sockex2
num = 0: ip 127.0.0.1 bytes 392 packets 4
num = 1: ip 127.0.0.1 bytes 784 packets 8
num = 2: ip 127.0.0.1 bytes 1176 packets 12
num = 3: ip 127.0.0.1 bytes 1568 packets 16
num = 4: ip 127.0.0.1 bytes 1960 packets 20

Signed-off-by: George Guo <guodongtai@kylinos.cn>
---
samples/bpf/sockex2_user.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/samples/bpf/sockex2_user.c b/samples/bpf/sockex2_user.c
index 2c18471336f0..84bf1ab77649 100644
--- a/samples/bpf/sockex2_user.c
+++ b/samples/bpf/sockex2_user.c
@@ -18,8 +18,8 @@ int main(int ac, char **argv)
struct bpf_program *prog;
struct bpf_object *obj;
int map_fd, prog_fd;
- char filename[256];
- int i, sock, err;
+ char filename[256], command[64];
+ int i, sock, err, num = 5;
FILE *f;

snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
@@ -42,21 +42,22 @@ int main(int ac, char **argv)
assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd,
sizeof(prog_fd)) == 0);

- f = popen("ping -4 -c5 localhost", "r");
+ snprintf(command, sizeof(command), "ping -4 -c%d localhost", num);
+ f = popen(command, "r");
(void) f;

- for (i = 0; i < 5; i++) {
+ for (i = 0; i < num; i++) {
int key = 0, next_key;
struct pair value;

+ sleep(1);
while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) {
bpf_map_lookup_elem(map_fd, &next_key, &value);
- printf("ip %s bytes %lld packets %lld\n",
+ printf("num = %d: ip %s bytes %lld packets %lld\n", i,
inet_ntoa((struct in_addr){htonl(next_key)}),
value.bytes, value.packets);
key = next_key;
}
- sleep(1);
}
return 0;
}
--
2.34.1