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 {
  14        __uint(type, MAP_TYPE);
  15        __uint(max_entries, 32);
  16        __uint(map_flags, 0);
  17        __uint(key_size, 0);
  18        __uint(value_size, sizeof(__u32));
  19} map_in SEC(".maps");
  20
  21struct {
  22        __uint(type, MAP_TYPE);
  23        __uint(max_entries, 32);
  24        __uint(map_flags, 0);
  25        __uint(key_size, 0);
  26        __uint(value_size, sizeof(__u32));
  27} map_out SEC(".maps");
  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