1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | |
3 | /* |
4 | * Copyright 2022 Google LLC. |
5 | */ |
6 | |
7 | #include <linux/bpf.h> |
8 | #include <bpf/bpf_helpers.h> |
9 | #include <bpf/bpf_endian.h> |
10 | #include <netinet/in.h> |
11 | #include <sys/socket.h> |
12 | |
13 | /* 2001:db8::1 */ |
14 | #define BINDADDR_V6 { { { 0x20,0x01,0x0d,0xb8,0,0,0,0,0,0,0,0,0,0,0,1 } } } |
15 | |
16 | __u32 do_bind = 0; |
17 | __u32 has_error = 0; |
18 | __u32 invocations_v4 = 0; |
19 | __u32 invocations_v6 = 0; |
20 | |
21 | SEC("cgroup/connect4" ) |
22 | int connect_v4_prog(struct bpf_sock_addr *ctx) |
23 | { |
24 | struct sockaddr_in sa = { |
25 | .sin_family = AF_INET, |
26 | .sin_addr.s_addr = bpf_htonl(0x01010101), |
27 | }; |
28 | |
29 | __sync_fetch_and_add(&invocations_v4, 1); |
30 | |
31 | if (do_bind && bpf_bind(ctx, (struct sockaddr *)&sa, sizeof(sa))) |
32 | has_error = 1; |
33 | |
34 | return 1; |
35 | } |
36 | |
37 | SEC("cgroup/connect6" ) |
38 | int connect_v6_prog(struct bpf_sock_addr *ctx) |
39 | { |
40 | struct sockaddr_in6 sa = { |
41 | .sin6_family = AF_INET6, |
42 | .sin6_addr = BINDADDR_V6, |
43 | }; |
44 | |
45 | __sync_fetch_and_add(&invocations_v6, 1); |
46 | |
47 | if (do_bind && bpf_bind(ctx, (struct sockaddr *)&sa, sizeof(sa))) |
48 | has_error = 1; |
49 | |
50 | return 1; |
51 | } |
52 | |
53 | char _license[] SEC("license" ) = "GPL" ; |
54 | |