Message ID | 20230726070955.178288-1-guodongtai@kylinos.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | samples/bpf: Update sockex2: get the expected output results | expand |
On Wed, Jul 26, 2023 at 03:09:55PM +0800 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> > --- Thanks, sounds reasonable to me (but I haven't checked it). Might you want to minimize the diff to only contain the move of the sleep call? Kind regards, Nicolas > 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
On Wed, 26 Jul 2023 23:22:49 +0200 Nicolas Schier <nicolas@fjasle.eu> wrote: > On Wed, Jul 26, 2023 at 03:09:55PM +0800 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> > > --- > > Thanks, sounds reasonable to me (but I haven't checked it). Might > you want to minimize the diff to only contain the move of the sleep > call? > > Kind regards, > Nicolas > > > > 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 > hi, the diff to only contain the move of the sleep call likes this: diff --git a/samples/bpf/sockex2_user.c b/samples/bpf/sockex2_user.c index 2c18471336f0..82bb38b9cab0 100644 --- a/samples/bpf/sockex2_user.c +++ b/samples/bpf/sockex2_user.c @@ -49,6 +49,7 @@ int main(int ac, char **argv) 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", @@ -56,7 +57,6 @@ int main(int ac, char **argv) value.bytes, value.packets); key = next_key; } - sleep(1); } return 0; }
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; > }
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; }
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(-)