1 | #include <linux/bpf.h> |
2 | #include <bpf/bpf_helpers.h> |
3 | #include <bpf/bpf_endian.h> |
4 | #include "bpf_misc.h" |
5 | |
6 | struct { |
7 | __uint(type, BPF_MAP_TYPE_SOCKMAP); |
8 | __uint(max_entries, 20); |
9 | __type(key, int); |
10 | __type(value, int); |
11 | } sock_map_rx SEC(".maps" ); |
12 | |
13 | struct { |
14 | __uint(type, BPF_MAP_TYPE_SOCKMAP); |
15 | __uint(max_entries, 20); |
16 | __type(key, int); |
17 | __type(value, int); |
18 | } sock_map_tx SEC(".maps" ); |
19 | |
20 | struct { |
21 | __uint(type, BPF_MAP_TYPE_SOCKMAP); |
22 | __uint(max_entries, 20); |
23 | __type(key, int); |
24 | __type(value, int); |
25 | } sock_map_msg SEC(".maps" ); |
26 | |
27 | struct { |
28 | __uint(type, BPF_MAP_TYPE_ARRAY); |
29 | __uint(max_entries, 20); |
30 | __type(key, int); |
31 | __type(value, int); |
32 | } sock_map_break SEC(".maps" ); |
33 | |
34 | SEC("sk_skb2" ) |
35 | int bpf_prog2(struct __sk_buff *skb) |
36 | { |
37 | void *data_end = (void *)(long) skb->data_end; |
38 | void *data = (void *)(long) skb->data; |
39 | __u32 lport = skb->local_port; |
40 | __u32 rport = skb->remote_port; |
41 | __u8 *d = data; |
42 | __u8 sk, map; |
43 | |
44 | __sink(lport); |
45 | __sink(rport); |
46 | |
47 | if (data + 8 > data_end) |
48 | return SK_DROP; |
49 | |
50 | map = d[0]; |
51 | sk = d[1]; |
52 | |
53 | d[0] = 0xd; |
54 | d[1] = 0xe; |
55 | d[2] = 0xa; |
56 | d[3] = 0xd; |
57 | d[4] = 0xb; |
58 | d[5] = 0xe; |
59 | d[6] = 0xe; |
60 | d[7] = 0xf; |
61 | |
62 | if (!map) |
63 | return bpf_sk_redirect_map(skb, &sock_map_rx, sk, 0); |
64 | return bpf_sk_redirect_map(skb, &sock_map_tx, sk, 0); |
65 | } |
66 | |
67 | char _license[] SEC("license" ) = "GPL" ; |
68 | |