190a3a05eSEyal Birger // SPDX-License-Identifier: GPL-2.0
290a3a05eSEyal Birger #include "vmlinux.h"
390a3a05eSEyal Birger #include "bpf_tracing_net.h"
490a3a05eSEyal Birger #include <bpf/bpf_helpers.h>
590a3a05eSEyal Birger 
6*aa67961fSMartin KaFai Lau struct bpf_xfrm_info___local {
7*aa67961fSMartin KaFai Lau 	u32 if_id;
8*aa67961fSMartin KaFai Lau 	int link;
9*aa67961fSMartin KaFai Lau } __attribute__((preserve_access_index));
10*aa67961fSMartin KaFai Lau 
1190a3a05eSEyal Birger __u32 req_if_id;
1290a3a05eSEyal Birger __u32 resp_if_id;
1390a3a05eSEyal Birger 
1490a3a05eSEyal Birger int bpf_skb_set_xfrm_info(struct __sk_buff *skb_ctx,
15*aa67961fSMartin KaFai Lau 			  const struct bpf_xfrm_info___local *from) __ksym;
1690a3a05eSEyal Birger int bpf_skb_get_xfrm_info(struct __sk_buff *skb_ctx,
17*aa67961fSMartin KaFai Lau 			  struct bpf_xfrm_info___local *to) __ksym;
1890a3a05eSEyal Birger 
1990a3a05eSEyal Birger SEC("tc")
set_xfrm_info(struct __sk_buff * skb)2090a3a05eSEyal Birger int set_xfrm_info(struct __sk_buff *skb)
2190a3a05eSEyal Birger {
22*aa67961fSMartin KaFai Lau 	struct bpf_xfrm_info___local info = { .if_id = req_if_id };
2390a3a05eSEyal Birger 
2490a3a05eSEyal Birger 	return bpf_skb_set_xfrm_info(skb, &info) ? TC_ACT_SHOT : TC_ACT_UNSPEC;
2590a3a05eSEyal Birger }
2690a3a05eSEyal Birger 
2790a3a05eSEyal Birger SEC("tc")
get_xfrm_info(struct __sk_buff * skb)2890a3a05eSEyal Birger int get_xfrm_info(struct __sk_buff *skb)
2990a3a05eSEyal Birger {
30*aa67961fSMartin KaFai Lau 	struct bpf_xfrm_info___local info = {};
3190a3a05eSEyal Birger 
3290a3a05eSEyal Birger 	if (bpf_skb_get_xfrm_info(skb, &info) < 0)
3390a3a05eSEyal Birger 		return TC_ACT_SHOT;
3490a3a05eSEyal Birger 
3590a3a05eSEyal Birger 	resp_if_id = info.if_id;
3690a3a05eSEyal Birger 
3790a3a05eSEyal Birger 	return TC_ACT_UNSPEC;
3890a3a05eSEyal Birger }
3990a3a05eSEyal Birger 
4090a3a05eSEyal Birger char _license[] SEC("license") = "GPL";
41