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

From: Martin KaFai Lau
Date: Thu Jul 27 2023 - 14:03:09 EST


On 7/26/23 12:09 AM, George Guo wrote:
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@xxxxxxxxxx>
---
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);

Moving sleep around is paper wrapping it. e.g. what if the first ping did start later than 1s? Please address it properly.

tbf, as an example instead of regression test, displaying fewer line output is fine.

}
return 0;
}