diff options
| author | Tony Lindgren <[email protected]> | 2018-11-08 09:57:42 -0800 |
|---|---|---|
| committer | Tony Lindgren <[email protected]> | 2018-11-08 09:57:42 -0800 |
| commit | 07fa3fa2572f2dee85beb8137f90ccf33d7206af (patch) | |
| tree | 0cec1fca7425cd6c423c53c4581ea2a9776ed411 /tools/testing/selftests/bpf/test_queue_stack_map.h | |
| parent | 4ed0dfe3cf39a97cd0ed532212b5e55e9752fe3f (diff) | |
| parent | 651022382c7f8da46cb4872a545ee1da6d097d2a (diff) | |
Merge tag 'v4.20-rc1' into omap-for-v4.21/dt-ti-sysc
Linux 4.20-rc1
Diffstat (limited to 'tools/testing/selftests/bpf/test_queue_stack_map.h')
| -rw-r--r-- | tools/testing/selftests/bpf/test_queue_stack_map.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/test_queue_stack_map.h b/tools/testing/selftests/bpf/test_queue_stack_map.h new file mode 100644 index 000000000000..295b9b3bc5c7 --- /dev/null +++ b/tools/testing/selftests/bpf/test_queue_stack_map.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (c) 2018 Politecnico di Torino +#include <stddef.h> +#include <string.h> +#include <linux/bpf.h> +#include <linux/if_ether.h> +#include <linux/ip.h> +#include <linux/pkt_cls.h> +#include "bpf_helpers.h" + +int _version SEC("version") = 1; + +struct bpf_map_def __attribute__ ((section("maps"), used)) map_in = { + .type = MAP_TYPE, + .key_size = 0, + .value_size = sizeof(__u32), + .max_entries = 32, + .map_flags = 0, +}; + +struct bpf_map_def __attribute__ ((section("maps"), used)) map_out = { + .type = MAP_TYPE, + .key_size = 0, + .value_size = sizeof(__u32), + .max_entries = 32, + .map_flags = 0, +}; + +SEC("test") +int _test(struct __sk_buff *skb) +{ + void *data_end = (void *)(long)skb->data_end; + void *data = (void *)(long)skb->data; + struct ethhdr *eth = (struct ethhdr *)(data); + __u32 value; + int err; + + if (eth + 1 > data_end) + return TC_ACT_SHOT; + + struct iphdr *iph = (struct iphdr *)(eth + 1); + + if (iph + 1 > data_end) + return TC_ACT_SHOT; + + err = bpf_map_pop_elem(&map_in, &value); + if (err) + return TC_ACT_SHOT; + + iph->daddr = value; + + err = bpf_map_push_elem(&map_out, &iph->saddr, 0); + if (err) + return TC_ACT_SHOT; + + return TC_ACT_OK; +} + +char _license[] SEC("license") = "GPL"; |