linux/tools/testing/selftests/bpf/progs/for_each_array_map_elem.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright (c) 2021 Facebook */
   3#include "vmlinux.h"
   4#include <bpf/bpf_helpers.h>
   5
   6char _license[] SEC("license") = "GPL";
   7
   8struct {
   9        __uint(type, BPF_MAP_TYPE_ARRAY);
  10        __uint(max_entries, 3);
  11        __type(key, __u32);
  12        __type(value, __u64);
  13} arraymap SEC(".maps");
  14
  15struct {
  16        __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
  17        __uint(max_entries, 1);
  18        __type(key, __u32);
  19        __type(value, __u64);
  20} percpu_map SEC(".maps");
  21
  22struct callback_ctx {
  23        int output;
  24};
  25
  26static __u64
  27check_array_elem(struct bpf_map *map, __u32 *key, __u64 *val,
  28                 struct callback_ctx *data)
  29{
  30        data->output += *val;
  31        if (*key == 1)
  32                return 1; /* stop the iteration */
  33        return 0;
  34}
  35
  36__u32 cpu = 0;
  37__u64 percpu_val = 0;
  38
  39static __u64
  40check_percpu_elem(struct bpf_map *map, __u32 *key, __u64 *val,
  41                  struct callback_ctx *data)
  42{
  43        cpu = bpf_get_smp_processor_id();
  44        percpu_val = *val;
  45        return 0;
  46}
  47
  48u32 arraymap_output = 0;
  49
  50SEC("classifier")
  51int test_pkt_access(struct __sk_buff *skb)
  52{
  53        struct callback_ctx data;
  54
  55        data.output = 0;
  56        bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
  57        arraymap_output = data.output;
  58
  59        bpf_for_each_map_elem(&percpu_map, check_percpu_elem, (void *)0, 0);
  60        return 0;
  61}
  62