Blame view
samples/bpf/ibumad_user.c
2.45 KB
0ac01febd BPF: Add sample c... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /** * ibumad BPF sample user side * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * Copyright(c) 2018 Ira Weiny, Intel Corporation */ #include <linux/bpf.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <limits.h> #include <sys/resource.h> #include <getopt.h> #include <net/if.h> #include "bpf_load.h" #include "bpf_util.h" |
7cf245a37 samples/bpf: Use ... |
28 |
#include <bpf/libbpf.h> |
0ac01febd BPF: Add sample c... |
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
static void dump_counts(int fd) { __u32 key; __u64 value; for (key = 0; key < 256; key++) { if (bpf_map_lookup_elem(fd, &key, &value)) { printf("failed to read key %u ", key); continue; } if (value) printf("0x%02x : %llu ", key, value); } } static void dump_all_counts(void) { printf("Read 'Class : count' "); dump_counts(map_fd[0]); printf("Write 'Class : count' "); dump_counts(map_fd[1]); } static void dump_exit(int sig) { dump_all_counts(); exit(0); } static const struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"delay", required_argument, NULL, 'd'}, }; static void usage(char *cmd) { printf("eBPF test program to count packets from various IP addresses " "Usage: %s <options> " " --help, -h this menu " " --delay, -d <delay> wait <delay> sec between prints [1 - 1000000] " , cmd ); } int main(int argc, char **argv) { unsigned long delay = 5; int longindex = 0; int opt; char bpf_file[256]; /* Create the eBPF kernel code path name. * This follows the pattern of all of the other bpf samples */ snprintf(bpf_file, sizeof(bpf_file), "%s_kern.o", argv[0]); /* Do one final dump when exiting */ signal(SIGINT, dump_exit); signal(SIGTERM, dump_exit); while ((opt = getopt_long(argc, argv, "hd:rSw", long_options, &longindex)) != -1) { switch (opt) { case 'd': delay = strtoul(optarg, NULL, 0); if (delay == ULONG_MAX || delay < 0 || delay > 1000000) { fprintf(stderr, "ERROR: invalid delay : %s ", optarg); usage(argv[0]); return 1; } break; default: case 'h': usage(argv[0]); return 1; } } if (load_bpf_file(bpf_file)) { fprintf(stderr, "ERROR: failed to load eBPF from file : %s ", bpf_file); return 1; } while (1) { sleep(delay); dump_all_counts(); } return 0; } |