* [PATCH bpf-next 0/2] sample: xdp1 improvements
@ 2018-10-18 20:47 Matteo Croce
2018-10-18 20:47 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Matteo Croce
0 siblings, 1 reply; 7+ messages in thread
From: Matteo Croce @ 2018-10-18 20:47 UTC (permalink / raw)
To: netdev; +Cc: Alexei Starovoitov, Daniel Borkmann
Small improvements to improve the readability and easiness
to use of the xdp1 sample.
Matteo Croce (2):
samples: bpf: improve xdp1 example
samples: bpf: get ifindex from ifname
samples/bpf/xdp1_user.c | 44 ++++++++++++++++++++++++++++++-----------
1 file changed, 32 insertions(+), 12 deletions(-)
--
2.19.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example
2018-10-18 20:47 [PATCH bpf-next 0/2] sample: xdp1 improvements Matteo Croce
@ 2018-10-18 20:47 ` Matteo Croce
2018-10-18 20:47 ` [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname Matteo Croce
2018-10-19 5:32 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Y Song
0 siblings, 2 replies; 7+ messages in thread
From: Matteo Croce @ 2018-10-18 20:47 UTC (permalink / raw)
To: netdev; +Cc: Alexei Starovoitov, Daniel Borkmann
Store only the total packet count for every protocol, instead of the
whole per-cpu array.
Use bpf_map_get_next_key() to iterate the map, instead of looking up
all the protocols.
Signed-off-by: Matteo Croce <mcroce@redhat.com>
---
samples/bpf/xdp1_user.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
index b02c531510ed..4f3d824fc044 100644
--- a/samples/bpf/xdp1_user.c
+++ b/samples/bpf/xdp1_user.c
@@ -34,26 +34,24 @@ static void int_exit(int sig)
static void poll_stats(int map_fd, int interval)
{
unsigned int nr_cpus = bpf_num_possible_cpus();
- const unsigned int nr_keys = 256;
- __u64 values[nr_cpus], prev[nr_keys][nr_cpus];
- __u32 key;
+ __u64 values[nr_cpus], prev[UINT8_MAX] = { 0 };
int i;
- memset(prev, 0, sizeof(prev));
-
while (1) {
+ __u32 key = UINT32_MAX;
+
sleep(interval);
- for (key = 0; key < nr_keys; key++) {
+ while (bpf_map_get_next_key(map_fd, &key, &key) != -1) {
__u64 sum = 0;
assert(bpf_map_lookup_elem(map_fd, &key, values) == 0);
for (i = 0; i < nr_cpus; i++)
- sum += (values[i] - prev[key][i]);
- if (sum)
+ sum += values[i];
+ if (sum > prev[key])
printf("proto %u: %10llu pkt/s\n",
- key, sum / interval);
- memcpy(prev[key], values, sizeof(values));
+ key, (sum - prev[key]) / interval);
+ prev[key] = sum;
}
}
}
--
2.19.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname
2018-10-18 20:47 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Matteo Croce
@ 2018-10-18 20:47 ` Matteo Croce
2018-10-18 21:30 ` John Fastabend
2018-10-19 5:34 ` Y Song
2018-10-19 5:32 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Y Song
1 sibling, 2 replies; 7+ messages in thread
From: Matteo Croce @ 2018-10-18 20:47 UTC (permalink / raw)
To: netdev; +Cc: Alexei Starovoitov, Daniel Borkmann
Find the ifindex via ioctl(SIOCGIFINDEX) instead of requiring the
numeric ifindex.
Signed-off-by: Matteo Croce <mcroce@redhat.com>
---
samples/bpf/xdp1_user.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
index 4f3d824fc044..a1d0c5dcee9c 100644
--- a/samples/bpf/xdp1_user.c
+++ b/samples/bpf/xdp1_user.c
@@ -15,6 +15,9 @@
#include <unistd.h>
#include <libgen.h>
#include <sys/resource.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <linux/if.h>
#include "bpf_util.h"
#include "bpf/bpf.h"
@@ -59,7 +62,7 @@ static void poll_stats(int map_fd, int interval)
static void usage(const char *prog)
{
fprintf(stderr,
- "usage: %s [OPTS] IFINDEX\n\n"
+ "usage: %s [OPTS] IFACE\n\n"
"OPTS:\n"
" -S use skb-mode\n"
" -N enforce native mode\n",
@@ -74,9 +77,11 @@ int main(int argc, char **argv)
};
const char *optstr = "SN";
int prog_fd, map_fd, opt;
+ struct ifreq ifr = { 0 };
struct bpf_object *obj;
struct bpf_map *map;
char filename[256];
+ int sock;
while ((opt = getopt(argc, argv, optstr)) != -1) {
switch (opt) {
@@ -102,7 +107,24 @@ int main(int argc, char **argv)
return 1;
}
- ifindex = strtoul(argv[optind], NULL, 0);
+ sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+ if (sock == -1) {
+ perror("socket");
+ return 1;
+ }
+
+ if (strlen(argv[optind]) >= IFNAMSIZ) {
+ printf("invalid ifname '%s'\n", argv[optind]);
+ return 1;
+ }
+
+ strcpy(ifr.ifr_name, argv[optind]);
+ if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+ perror("SIOCGIFINDEX");
+ return 1;
+ }
+ close(sock);
+ ifindex = ifr.ifr_ifindex;
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
prog_load_attr.file = filename;
--
2.19.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname
2018-10-18 20:47 ` [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname Matteo Croce
@ 2018-10-18 21:30 ` John Fastabend
2018-10-19 5:34 ` Y Song
1 sibling, 0 replies; 7+ messages in thread
From: John Fastabend @ 2018-10-18 21:30 UTC (permalink / raw)
To: Matteo Croce, netdev; +Cc: Alexei Starovoitov, Daniel Borkmann
On 10/18/2018 01:47 PM, Matteo Croce wrote:
> Find the ifindex via ioctl(SIOCGIFINDEX) instead of requiring the
> numeric ifindex.
>
> Signed-off-by: Matteo Croce <mcroce@redhat.com>
> ---
I don't think there are any expectation that samples have to be
stable as far as inputs over versions. And because I consistently
run this with the ifname before realizing its the ifindex not
string name I'll Ack it.
Acked-by: John Fastabend <john.fastabend@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example
2018-10-18 20:47 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Matteo Croce
2018-10-18 20:47 ` [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname Matteo Croce
@ 2018-10-19 5:32 ` Y Song
1 sibling, 0 replies; 7+ messages in thread
From: Y Song @ 2018-10-19 5:32 UTC (permalink / raw)
To: mcroce; +Cc: netdev, Alexei Starovoitov, Daniel Borkmann
On Thu, Oct 18, 2018 at 1:48 PM Matteo Croce <mcroce@redhat.com> wrote:
>
> Store only the total packet count for every protocol, instead of the
> whole per-cpu array.
> Use bpf_map_get_next_key() to iterate the map, instead of looking up
> all the protocols.
>
> Signed-off-by: Matteo Croce <mcroce@redhat.com>
Acked-by: Yonghong Song <yhs@fb.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname
2018-10-18 20:47 ` [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname Matteo Croce
2018-10-18 21:30 ` John Fastabend
@ 2018-10-19 5:34 ` Y Song
2018-10-19 8:42 ` Matteo Croce
1 sibling, 1 reply; 7+ messages in thread
From: Y Song @ 2018-10-19 5:34 UTC (permalink / raw)
To: mcroce; +Cc: netdev, Alexei Starovoitov, Daniel Borkmann
On Thu, Oct 18, 2018 at 1:48 PM Matteo Croce <mcroce@redhat.com> wrote:
>
> Find the ifindex via ioctl(SIOCGIFINDEX) instead of requiring the
> numeric ifindex.
Maybe use if_nametoindex which is simpler?
>
> Signed-off-by: Matteo Croce <mcroce@redhat.com>
> ---
> samples/bpf/xdp1_user.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
> index 4f3d824fc044..a1d0c5dcee9c 100644
> --- a/samples/bpf/xdp1_user.c
> +++ b/samples/bpf/xdp1_user.c
> @@ -15,6 +15,9 @@
> #include <unistd.h>
> #include <libgen.h>
> #include <sys/resource.h>
> +#include <sys/ioctl.h>
> +#include <sys/socket.h>
> +#include <linux/if.h>
>
> #include "bpf_util.h"
> #include "bpf/bpf.h"
> @@ -59,7 +62,7 @@ static void poll_stats(int map_fd, int interval)
> static void usage(const char *prog)
> {
> fprintf(stderr,
> - "usage: %s [OPTS] IFINDEX\n\n"
> + "usage: %s [OPTS] IFACE\n\n"
> "OPTS:\n"
> " -S use skb-mode\n"
> " -N enforce native mode\n",
> @@ -74,9 +77,11 @@ int main(int argc, char **argv)
> };
> const char *optstr = "SN";
> int prog_fd, map_fd, opt;
> + struct ifreq ifr = { 0 };
> struct bpf_object *obj;
> struct bpf_map *map;
> char filename[256];
> + int sock;
>
> while ((opt = getopt(argc, argv, optstr)) != -1) {
> switch (opt) {
> @@ -102,7 +107,24 @@ int main(int argc, char **argv)
> return 1;
> }
>
> - ifindex = strtoul(argv[optind], NULL, 0);
> + sock = socket(AF_UNIX, SOCK_DGRAM, 0);
> + if (sock == -1) {
> + perror("socket");
> + return 1;
> + }
> +
> + if (strlen(argv[optind]) >= IFNAMSIZ) {
> + printf("invalid ifname '%s'\n", argv[optind]);
> + return 1;
> + }
> +
> + strcpy(ifr.ifr_name, argv[optind]);
> + if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
> + perror("SIOCGIFINDEX");
> + return 1;
> + }
> + close(sock);
> + ifindex = ifr.ifr_ifindex;
>
> snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
> prog_load_attr.file = filename;
> --
> 2.19.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname
2018-10-19 5:34 ` Y Song
@ 2018-10-19 8:42 ` Matteo Croce
0 siblings, 0 replies; 7+ messages in thread
From: Matteo Croce @ 2018-10-19 8:42 UTC (permalink / raw)
To: ys114321; +Cc: netdev, Alexei Starovoitov, Daniel Borkmann
On Fri, Oct 19, 2018 at 5:35 AM Y Song <ys114321@gmail.com> wrote:
>
> On Thu, Oct 18, 2018 at 1:48 PM Matteo Croce <mcroce@redhat.com> wrote:
> >
> > Find the ifindex via ioctl(SIOCGIFINDEX) instead of requiring the
> > numeric ifindex.
>
> Maybe use if_nametoindex which is simpler?
>
> >
> > Signed-off-by: Matteo Croce <mcroce@redhat.com>
> > ---
> > samples/bpf/xdp1_user.c | 26 ++++++++++++++++++++++++--
> > 1 file changed, 24 insertions(+), 2 deletions(-)
> >
> > diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
> > index 4f3d824fc044..a1d0c5dcee9c 100644
> > --- a/samples/bpf/xdp1_user.c
> > +++ b/samples/bpf/xdp1_user.c
> > @@ -15,6 +15,9 @@
> > #include <unistd.h>
> > #include <libgen.h>
> > #include <sys/resource.h>
> > +#include <sys/ioctl.h>
> > +#include <sys/socket.h>
> > +#include <linux/if.h>
> >
> > #include "bpf_util.h"
> > #include "bpf/bpf.h"
> > @@ -59,7 +62,7 @@ static void poll_stats(int map_fd, int interval)
> > static void usage(const char *prog)
> > {
> > fprintf(stderr,
> > - "usage: %s [OPTS] IFINDEX\n\n"
> > + "usage: %s [OPTS] IFACE\n\n"
> > "OPTS:\n"
> > " -S use skb-mode\n"
> > " -N enforce native mode\n",
> > @@ -74,9 +77,11 @@ int main(int argc, char **argv)
> > };
> > const char *optstr = "SN";
> > int prog_fd, map_fd, opt;
> > + struct ifreq ifr = { 0 };
> > struct bpf_object *obj;
> > struct bpf_map *map;
> > char filename[256];
> > + int sock;
> >
> > while ((opt = getopt(argc, argv, optstr)) != -1) {
> > switch (opt) {
> > @@ -102,7 +107,24 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > - ifindex = strtoul(argv[optind], NULL, 0);
> > + sock = socket(AF_UNIX, SOCK_DGRAM, 0);
> > + if (sock == -1) {
> > + perror("socket");
> > + return 1;
> > + }
> > +
> > + if (strlen(argv[optind]) >= IFNAMSIZ) {
> > + printf("invalid ifname '%s'\n", argv[optind]);
> > + return 1;
> > + }
> > +
> > + strcpy(ifr.ifr_name, argv[optind]);
> > + if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
> > + perror("SIOCGIFINDEX");
> > + return 1;
> > + }
> > + close(sock);
> > + ifindex = ifr.ifr_ifindex;
> >
> > snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
> > prog_load_attr.file = filename;
> > --
> > 2.19.1
> >
Right, even better. Will do a v2, thanks.
--
Matteo Croce
per aspera ad upstream
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-10-19 16:48 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-18 20:47 [PATCH bpf-next 0/2] sample: xdp1 improvements Matteo Croce
2018-10-18 20:47 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Matteo Croce
2018-10-18 20:47 ` [PATCH bpf-next 2/2] samples: bpf: get ifindex from ifname Matteo Croce
2018-10-18 21:30 ` John Fastabend
2018-10-19 5:34 ` Y Song
2018-10-19 8:42 ` Matteo Croce
2018-10-19 5:32 ` [PATCH bpf-next 1/2] samples: bpf: improve xdp1 example Y Song
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.