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

Martin KaFai Lau
2023-07-27T18:03:08Z

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@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);

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;
> }