162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include "vmlinux.h" 362306a36Sopenharmony_ci#include "bpf_tracing_net.h" 462306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 562306a36Sopenharmony_ci 662306a36Sopenharmony_cistruct bpf_xfrm_info___local { 762306a36Sopenharmony_ci u32 if_id; 862306a36Sopenharmony_ci int link; 962306a36Sopenharmony_ci} __attribute__((preserve_access_index)); 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci__u32 req_if_id; 1262306a36Sopenharmony_ci__u32 resp_if_id; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciint bpf_skb_set_xfrm_info(struct __sk_buff *skb_ctx, 1562306a36Sopenharmony_ci const struct bpf_xfrm_info___local *from) __ksym; 1662306a36Sopenharmony_ciint bpf_skb_get_xfrm_info(struct __sk_buff *skb_ctx, 1762306a36Sopenharmony_ci struct bpf_xfrm_info___local *to) __ksym; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciSEC("tc") 2062306a36Sopenharmony_ciint set_xfrm_info(struct __sk_buff *skb) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci struct bpf_xfrm_info___local info = { .if_id = req_if_id }; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci return bpf_skb_set_xfrm_info(skb, &info) ? TC_ACT_SHOT : TC_ACT_UNSPEC; 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciSEC("tc") 2862306a36Sopenharmony_ciint get_xfrm_info(struct __sk_buff *skb) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct bpf_xfrm_info___local info = {}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (bpf_skb_get_xfrm_info(skb, &info) < 0) 3362306a36Sopenharmony_ci return TC_ACT_SHOT; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci resp_if_id = info.if_id; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci return TC_ACT_UNSPEC; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cichar _license[] SEC("license") = "GPL"; 41