77 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (c) 2018 Facebook */3#include <stddef.h>4#include <linux/bpf.h>5#include <linux/types.h>6#include <bpf/bpf_helpers.h>7 8struct {9 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);10 __uint(max_entries, 1);11 __uint(map_flags, 0);12 __type(key, __u32);13 __type(value, __u32);14} mim_array SEC(".maps");15 16struct {17 __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);18 __uint(max_entries, 1);19 __uint(map_flags, 0);20 __type(key, int);21 __type(value, __u32);22} mim_hash SEC(".maps");23 24/* The following three maps are used to test25 * perf_event_array map can be an inner26 * map of hash/array_of_maps.27 */28struct perf_event_array {29 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);30 __type(key, __u32);31 __type(value, __u32);32} inner_map0 SEC(".maps");33 34struct {35 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);36 __uint(max_entries, 1);37 __type(key, __u32);38 __array(values, struct perf_event_array);39} mim_array_pe SEC(".maps") = {40 .values = {&inner_map0}};41 42struct {43 __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);44 __uint(max_entries, 1);45 __type(key, __u32);46 __array(values, struct perf_event_array);47} mim_hash_pe SEC(".maps") = {48 .values = {&inner_map0}};49 50SEC("xdp")51int xdp_mimtest0(struct xdp_md *ctx)52{53 int value = 123;54 int *value_p;55 int key = 0;56 void *map;57 58 map = bpf_map_lookup_elem(&mim_array, &key);59 if (!map)60 return XDP_DROP;61 62 bpf_map_update_elem(map, &key, &value, 0);63 value_p = bpf_map_lookup_elem(map, &key);64 if (!value_p || *value_p != 123)65 return XDP_DROP;66 67 map = bpf_map_lookup_elem(&mim_hash, &key);68 if (!map)69 return XDP_DROP;70 71 bpf_map_update_elem(map, &key, &value, 0);72 73 return XDP_PASS;74}75 76char _license[] SEC("license") = "GPL";77