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