// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2021 Facebook */ #include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> /* modifiers and typedefs are ignored when comparing key/value types */ typedef struct my_key { long x; } key_type; typedef struct my_value { long x; } value_type; extern struct { __uint(max_entries, 16); __type(key, key_type); __type(value, value_type); __uint(type, BPF_MAP_TYPE_HASH); } map1 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY); __type(key, int); __type(value, int); __uint(max_entries, 8); } map2 SEC(".maps"); /* this definition will lose, but it has to exactly match the winner */ struct { __uint(type, BPF_MAP_TYPE_ARRAY); __type(key, int); __type(value, int); __uint(max_entries, 16); } map_weak __weak SEC(".maps"); int output_first2; int output_second2; int output_weak2; SEC("raw_tp/sys_enter") int BPF_PROG(handler_enter2) { /* update values with key = 2 */ int key = 2, val = 2; key_type key_struct = { .x = 2 }; value_type val_struct = { .x = 2000 }; bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); bpf_map_update_elem(&map2, &key, &val, 0); bpf_map_update_elem(&map_weak, &key, &val, 0); return 0; } SEC("raw_tp/sys_exit") int BPF_PROG(handler_exit2) { /* lookup values with key = 1, set in another file */ int key = 1, *val; key_type key_struct = { .x = 1 }; value_type *value_struct; value_struct = bpf_map_lookup_elem(&map1, &key_struct); if (value_struct) output_first2 = value_struct->x; val = bpf_map_lookup_elem(&map2, &key); if (val) output_second2 = *val; val = bpf_map_lookup_elem(&map_weak, &key); if (val) output_weak2 = *val; return 0; } char LICENSE[] SEC("license") = "GPL";