Back to home page

OSCL-LXR

 
 

    


0001 #include <linux/bpf.h>
0002 #include <bpf/bpf_helpers.h>
0003 #include <bpf/bpf_endian.h>
0004 
0005 struct {
0006     __uint(type, BPF_MAP_TYPE_SOCKMAP);
0007     __uint(max_entries, 20);
0008     __type(key, int);
0009     __type(value, int);
0010 } sock_map_rx SEC(".maps");
0011 
0012 struct {
0013     __uint(type, BPF_MAP_TYPE_SOCKMAP);
0014     __uint(max_entries, 20);
0015     __type(key, int);
0016     __type(value, int);
0017 } sock_map_tx SEC(".maps");
0018 
0019 struct {
0020     __uint(type, BPF_MAP_TYPE_SOCKMAP);
0021     __uint(max_entries, 20);
0022     __type(key, int);
0023     __type(value, int);
0024 } sock_map_msg SEC(".maps");
0025 
0026 struct {
0027     __uint(type, BPF_MAP_TYPE_ARRAY);
0028     __uint(max_entries, 20);
0029     __type(key, int);
0030     __type(value, int);
0031 } sock_map_break SEC(".maps");
0032 
0033 SEC("sk_skb2")
0034 int bpf_prog2(struct __sk_buff *skb)
0035 {
0036     void *data_end = (void *)(long) skb->data_end;
0037     void *data = (void *)(long) skb->data;
0038     __u32 lport = skb->local_port;
0039     __u32 rport = skb->remote_port;
0040     __u8 *d = data;
0041     __u8 sk, map;
0042 
0043     if (data + 8 > data_end)
0044         return SK_DROP;
0045 
0046     map = d[0];
0047     sk = d[1];
0048 
0049     d[0] = 0xd;
0050     d[1] = 0xe;
0051     d[2] = 0xa;
0052     d[3] = 0xd;
0053     d[4] = 0xb;
0054     d[5] = 0xe;
0055     d[6] = 0xe;
0056     d[7] = 0xf;
0057 
0058     if (!map)
0059         return bpf_sk_redirect_map(skb, &sock_map_rx, sk, 0);
0060     return bpf_sk_redirect_map(skb, &sock_map_tx, sk, 0);
0061 }
0062 
0063 char _license[] SEC("license") = "GPL";