cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

for_each_hash_map_elem.c (1855B)


      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_HASH);
     10	__uint(max_entries, 3);
     11	__type(key, __u32);
     12	__type(value, __u64);
     13} hashmap SEC(".maps");
     14
     15struct {
     16	__uint(type, BPF_MAP_TYPE_PERCPU_HASH);
     17	__uint(max_entries, 1);
     18	__type(key, __u32);
     19	__type(value, __u64);
     20} percpu_map SEC(".maps");
     21
     22struct callback_ctx {
     23	struct __sk_buff *ctx;
     24	int input;
     25	int output;
     26};
     27
     28static __u64
     29check_hash_elem(struct bpf_map *map, __u32 *key, __u64 *val,
     30		struct callback_ctx *data)
     31{
     32	struct __sk_buff *skb = data->ctx;
     33	__u32 k;
     34	__u64 v;
     35
     36	if (skb) {
     37		k = *key;
     38		v = *val;
     39		if (skb->len == 10000 && k == 10 && v == 10)
     40			data->output = 3; /* impossible path */
     41		else
     42			data->output = 4;
     43	} else {
     44		data->output = data->input;
     45		bpf_map_delete_elem(map, key);
     46	}
     47
     48	return 0;
     49}
     50
     51__u32 cpu = 0;
     52__u32 percpu_called = 0;
     53__u32 percpu_key = 0;
     54__u64 percpu_val = 0;
     55int percpu_output = 0;
     56
     57static __u64
     58check_percpu_elem(struct bpf_map *map, __u32 *key, __u64 *val,
     59		  struct callback_ctx *unused)
     60{
     61	struct callback_ctx data;
     62
     63	percpu_called++;
     64	cpu = bpf_get_smp_processor_id();
     65	percpu_key = *key;
     66	percpu_val = *val;
     67
     68	data.ctx = 0;
     69	data.input = 100;
     70	data.output = 0;
     71	bpf_for_each_map_elem(&hashmap, check_hash_elem, &data, 0);
     72	percpu_output = data.output;
     73
     74	return 0;
     75}
     76
     77int hashmap_output = 0;
     78int hashmap_elems = 0;
     79int percpu_map_elems = 0;
     80
     81SEC("tc")
     82int test_pkt_access(struct __sk_buff *skb)
     83{
     84	struct callback_ctx data;
     85
     86	data.ctx = skb;
     87	data.input = 10;
     88	data.output = 0;
     89	hashmap_elems = bpf_for_each_map_elem(&hashmap, check_hash_elem, &data, 0);
     90	hashmap_output = data.output;
     91
     92	percpu_map_elems = bpf_for_each_map_elem(&percpu_map, check_percpu_elem,
     93						 (void *)0, 0);
     94	return 0;
     95}