1// SPDX-License-Identifier: GPL-2.0 2#include <linux/bpf.h> 3#include <bpf/bpf_helpers.h> 4#include "bpf_legacy.h" 5#include "bpf_misc.h" 6 7struct { 8 __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 9 __uint(max_entries, 2); 10 __uint(key_size, sizeof(__u32)); 11 __uint(value_size, sizeof(__u32)); 12} jmp_table SEC(".maps"); 13 14__noinline 15int subprog_tail2(struct __sk_buff *skb) 16{ 17 volatile char arr[64] = {}; 18 19 if (load_word(skb, 0) || load_half(skb, 0)) 20 bpf_tail_call_static(skb, &jmp_table, 10); 21 else 22 bpf_tail_call_static(skb, &jmp_table, 1); 23 24 __sink(arr[sizeof(arr) - 1]); 25 26 return skb->len; 27} 28 29static __noinline 30int subprog_tail(struct __sk_buff *skb) 31{ 32 volatile char arr[64] = {}; 33 34 bpf_tail_call_static(skb, &jmp_table, 0); 35 36 __sink(arr[sizeof(arr) - 1]); 37 38 return skb->len * 2; 39} 40 41SEC("tc") 42int classifier_0(struct __sk_buff *skb) 43{ 44 volatile char arr[128] = {}; 45 46 __sink(arr[sizeof(arr) - 1]); 47 48 return subprog_tail2(skb); 49} 50 51SEC("tc") 52int classifier_1(struct __sk_buff *skb) 53{ 54 volatile char arr[128] = {}; 55 56 __sink(arr[sizeof(arr) - 1]); 57 58 return skb->len * 3; 59} 60 61SEC("tc") 62int entry(struct __sk_buff *skb) 63{ 64 volatile char arr[128] = {}; 65 66 __sink(arr[sizeof(arr) - 1]); 67 68 return subprog_tail(skb); 69} 70 71char __license[] SEC("license") = "GPL"; 72