github.com/cilium/cilium@v1.16.2/bpf/tests/mock_skb_metadata.h (about) 1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 /* Copyright Authors of Cilium */ 3 4 #pragma once 5 6 #include <bpf/compiler.h> 7 #include <bpf/helpers.h> 8 #include <bpf/loader.h> 9 #include <bpf/section.h> 10 #include <linux/bpf.h> 11 #include <linux/types.h> 12 13 /* 14 * You can mock out ctx_store_meta and ctx_load_meta for skb 15 * by including this file. The user space program automatically 16 * clears the values after the single test. 17 */ 18 19 struct mock_skb_meta { 20 __u32 cb[5]; 21 __u32 _pad0; 22 }; 23 24 struct { 25 __uint(type, BPF_MAP_TYPE_ARRAY); 26 __uint(key_size, sizeof(__u32)); 27 __uint(value_size, sizeof(struct mock_skb_meta)); 28 __uint(max_entries, 1); 29 } mock_skb_meta_map __section_maps_btf; 30 31 static __always_inline __maybe_unused void 32 mock_skb_store_meta(struct __sk_buff *ctx __maybe_unused, const __u32 off, 33 __u32 data) 34 { 35 __u32 idx = 0; 36 struct mock_skb_meta *meta; 37 38 meta = map_lookup_elem(&mock_skb_meta_map, &idx); 39 if (!meta) 40 return; 41 42 meta->cb[off] = data; 43 } 44 45 static __always_inline __maybe_unused __u32 46 mock_skb_load_meta(const struct __sk_buff *ctx __maybe_unused, const __u32 off) 47 { 48 __u32 idx = 0; 49 struct mock_skb_meta *meta; 50 51 meta = map_lookup_elem(&mock_skb_meta_map, &idx); 52 if (!meta) 53 return 0; 54 55 return meta->cb[off]; 56 } 57 58 static __always_inline __maybe_unused __u32 59 mock_skb_load_and_clear_meta(struct __sk_buff *ctx __maybe_unused, const __u32 off) 60 { 61 __u32 val = mock_skb_load_meta(ctx, off); 62 63 mock_skb_store_meta(ctx, off, 0); 64 return val; 65 } 66 67 #define ctx_store_meta mock_skb_store_meta 68 #define ctx_load_meta mock_skb_load_meta 69 #define ctx_load_and_clear_meta mock_skb_load_and_clear_meta