1 // SPDX-License-Identifier: GPL-2.0
7 #include "sock_example.h"
10 #include <sys/resource.h>
13 #define PARSE_IP_PROG_FD (prog_fd[0])
14 #define PROG_ARRAY_FD (map_fd[0])
16 struct flow_key_record
{
31 int main(int argc
, char **argv
)
33 struct rlimit r
= {RLIM_INFINITY
, RLIM_INFINITY
};
36 int i
, sock
, err
, id
, key
= PARSE_IP
;
37 struct bpf_prog_info info
= {};
38 uint32_t info_len
= sizeof(info
);
40 snprintf(filename
, sizeof(filename
), "%s_kern.o", argv
[0]);
41 setrlimit(RLIMIT_MEMLOCK
, &r
);
43 if (load_bpf_file(filename
)) {
44 printf("%s", bpf_log_buf
);
48 /* Test fd array lookup which returns the id of the bpf_prog */
49 err
= bpf_obj_get_info_by_fd(PARSE_IP_PROG_FD
, &info
, &info_len
);
51 err
= bpf_map_lookup_elem(PROG_ARRAY_FD
, &key
, &id
);
53 assert(id
== info
.id
);
55 sock
= open_raw_sock("lo");
57 assert(setsockopt(sock
, SOL_SOCKET
, SO_ATTACH_BPF
, &prog_fd
[4],
61 f
= popen("ping -c5 localhost", "r");
63 f
= popen("netperf -l 4 localhost", "r");
66 for (i
= 0; i
< 5; i
++) {
67 struct flow_key_record key
= {}, next_key
;
71 printf("IP src.port -> dst.port bytes packets\n");
72 while (bpf_map_get_next_key(map_fd
[2], &key
, &next_key
) == 0) {
73 bpf_map_lookup_elem(map_fd
[2], &next_key
, &value
);
74 printf("%s.%05d -> %s.%05d %12lld %12lld\n",
75 inet_ntoa((struct in_addr
){htonl(next_key
.src
)}),
77 inet_ntoa((struct in_addr
){htonl(next_key
.dst
)}),
79 value
.bytes
, value
.packets
);