11410620cSUdip Pant // SPDX-License-Identifier: GPL-2.0 21410620cSUdip Pant // Copyright (c) 2020 Facebook 31410620cSUdip Pant 41410620cSUdip Pant #include <linux/stddef.h> 51410620cSUdip Pant #include <linux/bpf.h> 61410620cSUdip Pant #include <linux/pkt_cls.h> 71410620cSUdip Pant #include <bpf/bpf_endian.h> 81410620cSUdip Pant #include <bpf/bpf_helpers.h> 91410620cSUdip Pant 10*ccc3f569SAndrii Nakryiko struct { 11*ccc3f569SAndrii Nakryiko __uint(type, BPF_MAP_TYPE_SOCKMAP); 12*ccc3f569SAndrii Nakryiko __type(key, int); 13*ccc3f569SAndrii Nakryiko __type(value, int); 14*ccc3f569SAndrii Nakryiko __uint(max_entries, 2); 15*ccc3f569SAndrii Nakryiko } sock_map SEC(".maps"); 161410620cSUdip Pant 171410620cSUdip Pant SEC("freplace/cls_redirect") freplace_cls_redirect_test(struct __sk_buff * skb)181410620cSUdip Pantint freplace_cls_redirect_test(struct __sk_buff *skb) 191410620cSUdip Pant { 201410620cSUdip Pant int ret = 0; 211410620cSUdip Pant const int zero = 0; 221410620cSUdip Pant struct bpf_sock *sk; 231410620cSUdip Pant 241410620cSUdip Pant sk = bpf_map_lookup_elem(&sock_map, &zero); 251410620cSUdip Pant if (!sk) 261410620cSUdip Pant return TC_ACT_SHOT; 271410620cSUdip Pant 281410620cSUdip Pant ret = bpf_map_update_elem(&sock_map, &zero, sk, 0); 291410620cSUdip Pant bpf_sk_release(sk); 301410620cSUdip Pant 311410620cSUdip Pant return ret == 0 ? TC_ACT_OK : TC_ACT_SHOT; 321410620cSUdip Pant } 331410620cSUdip Pant 341410620cSUdip Pant char _license[] SEC("license") = "GPL"; 35