~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/samples/bpf/sockex3_user.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 #include <stdio.h>
  3 #include <assert.h>
  4 #include <bpf/bpf.h>
  5 #include <bpf/libbpf.h>
  6 #include "sock_example.h"
  7 #include <unistd.h>
  8 #include <arpa/inet.h>
  9 
 10 struct flow_key_record {
 11         __be32 src;
 12         __be32 dst;
 13         union {
 14                 __be32 ports;
 15                 __be16 port16[2];
 16         };
 17         __u32 ip_proto;
 18 };
 19 
 20 struct pair {
 21         __u64 packets;
 22         __u64 bytes;
 23 };
 24 
 25 int main(int argc, char **argv)
 26 {
 27         int i, sock, fd, main_prog_fd, hash_map_fd;
 28         struct bpf_program *prog;
 29         struct bpf_object *obj;
 30         char filename[256];
 31         FILE *f;
 32 
 33         snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
 34 
 35         obj = bpf_object__open_file(filename, NULL);
 36         if (libbpf_get_error(obj)) {
 37                 fprintf(stderr, "ERROR: opening BPF object file failed\n");
 38                 return 0;
 39         }
 40 
 41         /* load BPF program */
 42         if (bpf_object__load(obj)) {
 43                 fprintf(stderr, "ERROR: loading BPF object file failed\n");
 44                 goto cleanup;
 45         }
 46 
 47         hash_map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map");
 48         if (hash_map_fd < 0) {
 49                 fprintf(stderr, "ERROR: finding a map in obj file failed\n");
 50                 goto cleanup;
 51         }
 52 
 53         /* find BPF main program */
 54         main_prog_fd = 0;
 55         bpf_object__for_each_program(prog, obj) {
 56                 fd = bpf_program__fd(prog);
 57 
 58                 if (!strcmp(bpf_program__name(prog), "main_prog"))
 59                         main_prog_fd = fd;
 60         }
 61 
 62         if (main_prog_fd == 0) {
 63                 fprintf(stderr, "ERROR: can't find main_prog\n");
 64                 goto cleanup;
 65         }
 66 
 67         sock = open_raw_sock("lo");
 68 
 69         /* attach BPF program to socket */
 70         assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &main_prog_fd,
 71                           sizeof(__u32)) == 0);
 72 
 73         if (argc > 1)
 74                 f = popen("ping -4 -c5 localhost", "r");
 75         else
 76                 f = popen("netperf -l 4 localhost", "r");
 77         (void) f;
 78 
 79         for (i = 0; i < 5; i++) {
 80                 struct flow_key_record key = {}, next_key;
 81                 struct pair value;
 82 
 83                 sleep(1);
 84                 printf("IP     src.port -> dst.port               bytes      packets\n");
 85                 while (bpf_map_get_next_key(hash_map_fd, &key, &next_key) == 0) {
 86                         bpf_map_lookup_elem(hash_map_fd, &next_key, &value);
 87                         printf("%s.%05d -> %s.%05d %12lld %12lld\n",
 88                                inet_ntoa((struct in_addr){htonl(next_key.src)}),
 89                                next_key.port16[0],
 90                                inet_ntoa((struct in_addr){htonl(next_key.dst)}),
 91                                next_key.port16[1],
 92                                value.bytes, value.packets);
 93                         key = next_key;
 94                 }
 95         }
 96 
 97 cleanup:
 98         bpf_object__close(obj);
 99         return 0;
100 }
101 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php