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