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