linux/tools/testing/selftests/bpf/test_queue_stack_map.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2// Copyright (c) 2018 Politecnico di Torino
   3#include <stddef.h>
   4#include <string.h>
   5#include <linux/bpf.h>
   6#include <linux/if_ether.h>
   7#include <linux/ip.h>
   8#include <linux/pkt_cls.h>
   9#include "bpf_helpers.h"
  10
  11int _version SEC("version") = 1;
  12
  13struct bpf_map_def __attribute__ ((section("maps"), used)) map_in = {
  14        .type = MAP_TYPE,
  15        .key_size = 0,
  16        .value_size = sizeof(__u32),
  17        .max_entries = 32,
  18        .map_flags = 0,
  19};
  20
  21struct bpf_map_def __attribute__ ((section("maps"), used)) map_out = {
  22        .type = MAP_TYPE,
  23        .key_size = 0,
  24        .value_size = sizeof(__u32),
  25        .max_entries = 32,
  26        .map_flags = 0,
  27};
  28
  29SEC("test")
  30int _test(struct __sk_buff *skb)
  31{
  32        void *data_end = (void *)(long)skb->data_end;
  33        void *data = (void *)(long)skb->data;
  34        struct ethhdr *eth = (struct ethhdr *)(data);
  35        __u32 value;
  36        int err;
  37
  38        if (eth + 1 > data_end)
  39                return TC_ACT_SHOT;
  40
  41        struct iphdr *iph = (struct iphdr *)(eth + 1);
  42
  43        if (iph + 1 > data_end)
  44                return TC_ACT_SHOT;
  45
  46        err = bpf_map_pop_elem(&map_in, &value);
  47        if (err)
  48                return TC_ACT_SHOT;
  49
  50        iph->daddr = value;
  51
  52        err = bpf_map_push_elem(&map_out, &iph->saddr, 0);
  53        if (err)
  54                return TC_ACT_SHOT;
  55
  56        return TC_ACT_OK;
  57}
  58
  59char _license[] SEC("license") = "GPL";
  60