2017-08-16 08:34:22 +03:00
# include <linux/bpf.h>
# include "bpf_helpers.h"
# include "bpf_util.h"
# include "bpf_endian.h"
int _version SEC ( " version " ) = 1 ;
# define bpf_printk(fmt, ...) \
( { \
char ____fmt [ ] = fmt ; \
bpf_trace_printk ( ____fmt , sizeof ( ____fmt ) , \
# #__VA_ARGS__); \
} )
2017-08-28 17:11:05 +03:00
struct bpf_map_def SEC ( " maps " ) sock_map_rx = {
. type = BPF_MAP_TYPE_SOCKMAP ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( int ) ,
. max_entries = 20 ,
} ;
struct bpf_map_def SEC ( " maps " ) sock_map_tx = {
2017-08-16 08:34:22 +03:00
. type = BPF_MAP_TYPE_SOCKMAP ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( int ) ,
. max_entries = 20 ,
} ;
2018-03-18 22:57:31 +03:00
struct bpf_map_def SEC ( " maps " ) sock_map_msg = {
. type = BPF_MAP_TYPE_SOCKMAP ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( int ) ,
. max_entries = 20 ,
} ;
2017-08-28 17:11:43 +03:00
struct bpf_map_def SEC ( " maps " ) sock_map_break = {
. type = BPF_MAP_TYPE_ARRAY ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( int ) ,
. max_entries = 20 ,
} ;
2017-08-16 08:34:22 +03:00
SEC ( " sk_skb2 " )
int bpf_prog2 ( struct __sk_buff * skb )
{
void * data_end = ( void * ) ( long ) skb - > data_end ;
void * data = ( void * ) ( long ) skb - > data ;
__u32 lport = skb - > local_port ;
__u32 rport = skb - > remote_port ;
2017-08-28 17:11:05 +03:00
__u8 * d = data ;
__u8 sk , map ;
2017-08-16 08:34:22 +03:00
if ( data + 8 > data_end )
return SK_DROP ;
2017-08-28 17:11:05 +03:00
map = d [ 0 ] ;
sk = d [ 1 ] ;
2017-08-16 08:34:22 +03:00
d [ 0 ] = 0xd ;
d [ 1 ] = 0xe ;
d [ 2 ] = 0xa ;
d [ 3 ] = 0xd ;
d [ 4 ] = 0xb ;
d [ 5 ] = 0xe ;
d [ 6 ] = 0xe ;
d [ 7 ] = 0xf ;
2017-08-28 17:11:05 +03:00
if ( ! map )
2017-10-18 17:10:36 +03:00
return bpf_sk_redirect_map ( skb , & sock_map_rx , sk , 0 ) ;
return bpf_sk_redirect_map ( skb , & sock_map_tx , sk , 0 ) ;
2017-08-16 08:34:22 +03:00
}
char _license [ ] SEC ( " license " ) = " GPL " ;