15e0b0a4cSJakub Sitnicki // SPDX-License-Identifier: GPL-2.0 25e0b0a4cSJakub Sitnicki #include <linux/bpf.h> 35e0b0a4cSJakub Sitnicki #include <bpf/bpf_helpers.h> 4*c8ed6685SAndrii Nakryiko #include "bpf_misc.h" 55e0b0a4cSJakub Sitnicki 65e0b0a4cSJakub Sitnicki #define __unused __attribute__((unused)) 75e0b0a4cSJakub Sitnicki 85e0b0a4cSJakub Sitnicki struct { 95e0b0a4cSJakub Sitnicki __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 105e0b0a4cSJakub Sitnicki __uint(max_entries, 1); 115e0b0a4cSJakub Sitnicki __uint(key_size, sizeof(__u32)); 125e0b0a4cSJakub Sitnicki __uint(value_size, sizeof(__u32)); 135e0b0a4cSJakub Sitnicki } jmp_table SEC(".maps"); 145e0b0a4cSJakub Sitnicki 155e0b0a4cSJakub Sitnicki int done = 0; 165e0b0a4cSJakub Sitnicki 175e0b0a4cSJakub Sitnicki SEC("tc") classifier_0(struct __sk_buff * skb __unused)185e0b0a4cSJakub Sitnickiint classifier_0(struct __sk_buff *skb __unused) 195e0b0a4cSJakub Sitnicki { 205e0b0a4cSJakub Sitnicki done = 1; 215e0b0a4cSJakub Sitnicki return 0; 225e0b0a4cSJakub Sitnicki } 235e0b0a4cSJakub Sitnicki 245e0b0a4cSJakub Sitnicki static __noinline subprog_tail(struct __sk_buff * skb)255e0b0a4cSJakub Sitnickiint subprog_tail(struct __sk_buff *skb) 265e0b0a4cSJakub Sitnicki { 275e0b0a4cSJakub Sitnicki /* Don't propagate the constant to the caller */ 285e0b0a4cSJakub Sitnicki volatile int ret = 1; 295e0b0a4cSJakub Sitnicki 305e0b0a4cSJakub Sitnicki bpf_tail_call_static(skb, &jmp_table, 0); 315e0b0a4cSJakub Sitnicki return ret; 325e0b0a4cSJakub Sitnicki } 335e0b0a4cSJakub Sitnicki 345e0b0a4cSJakub Sitnicki SEC("tc") entry(struct __sk_buff * skb)355e0b0a4cSJakub Sitnickiint entry(struct __sk_buff *skb) 365e0b0a4cSJakub Sitnicki { 375e0b0a4cSJakub Sitnicki /* Have data on stack which size is not a multiple of 8 */ 385e0b0a4cSJakub Sitnicki volatile char arr[1] = {}; 395e0b0a4cSJakub Sitnicki 40*c8ed6685SAndrii Nakryiko __sink(arr[0]); 41*c8ed6685SAndrii Nakryiko 425e0b0a4cSJakub Sitnicki return subprog_tail(skb); 435e0b0a4cSJakub Sitnicki } 445e0b0a4cSJakub Sitnicki 455e0b0a4cSJakub Sitnicki char __license[] SEC("license") = "GPL"; 46