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 Birgerint 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 Birgerint 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