@ -17,6 +17,7 @@
# include <uapi/linux/pkt_cls.h>
# include <net/ipv6.h>
# include "bpf_helpers.h"
# include "bpf_endian.h"
# define _htonl __builtin_bswap32
# define ERROR(ret) do {\
@ -38,6 +39,10 @@ struct vxlan_metadata {
u32 gbp ;
} ;
struct erspan_metadata {
__be32 index ;
} ;
SEC ( " gre_set_tunnel " )
int _gre_set_tunnel ( struct __sk_buff * skb )
{
@ -76,6 +81,63 @@ int _gre_get_tunnel(struct __sk_buff *skb)
return TC_ACT_OK ;
}
SEC ( " erspan_set_tunnel " )
int _erspan_set_tunnel ( struct __sk_buff * skb )
{
struct bpf_tunnel_key key ;
struct erspan_metadata md ;
int ret ;
__builtin_memset ( & key , 0x0 , sizeof ( key ) ) ;
key . remote_ipv4 = 0xac100164 ; /* 172.16.1.100 */
key . tunnel_id = 2 ;
key . tunnel_tos = 0 ;
key . tunnel_ttl = 64 ;
ret = bpf_skb_set_tunnel_key ( skb , & key , sizeof ( key ) , BPF_F_ZERO_CSUM_TX ) ;
if ( ret < 0 ) {
ERROR ( ret ) ;
return TC_ACT_SHOT ;
}
md . index = htonl ( 123 ) ;
ret = bpf_skb_set_tunnel_opt ( skb , & md , sizeof ( md ) ) ;
if ( ret < 0 ) {
ERROR ( ret ) ;
return TC_ACT_SHOT ;
}
return TC_ACT_OK ;
}
SEC ( " erspan_get_tunnel " )
int _erspan_get_tunnel ( struct __sk_buff * skb )
{
char fmt [ ] = " key %d remote ip 0x%x erspan index 0x%x \n " ;
struct bpf_tunnel_key key ;
struct erspan_metadata md ;
u32 index ;
int ret ;
ret = bpf_skb_get_tunnel_key ( skb , & key , sizeof ( key ) , 0 ) ;
if ( ret < 0 ) {
ERROR ( ret ) ;
return TC_ACT_SHOT ;
}
ret = bpf_skb_get_tunnel_opt ( skb , & md , sizeof ( md ) ) ;
if ( ret < 0 ) {
ERROR ( ret ) ;
return TC_ACT_SHOT ;
}
index = bpf_ntohl ( md . index ) ;
bpf_trace_printk ( fmt , sizeof ( fmt ) ,
key . tunnel_id , key . remote_ipv4 , index ) ;
return TC_ACT_OK ;
}
SEC ( " vxlan_set_tunnel " )
int _vxlan_set_tunnel ( struct __sk_buff * skb )
{
@ -378,5 +440,4 @@ int _ip6ip6_get_tunnel(struct __sk_buff *skb)
return TC_ACT_OK ;
}
char _license [ ] SEC ( " license " ) = " GPL " ;