linux/tools/testing/selftests/bpf/progs/bpf_iter_sockmap.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright (c) 2020 Cloudflare */
   3#include "bpf_iter.h"
   4#include "bpf_tracing_net.h"
   5#include <bpf/bpf_helpers.h>
   6#include <bpf/bpf_tracing.h>
   7#include <errno.h>
   8
   9char _license[] SEC("license") = "GPL";
  10
  11struct {
  12        __uint(type, BPF_MAP_TYPE_SOCKMAP);
  13        __uint(max_entries, 64);
  14        __type(key, __u32);
  15        __type(value, __u64);
  16} sockmap SEC(".maps");
  17
  18struct {
  19        __uint(type, BPF_MAP_TYPE_SOCKHASH);
  20        __uint(max_entries, 64);
  21        __type(key, __u32);
  22        __type(value, __u64);
  23} sockhash SEC(".maps");
  24
  25struct {
  26        __uint(type, BPF_MAP_TYPE_SOCKHASH);
  27        __uint(max_entries, 64);
  28        __type(key, __u32);
  29        __type(value, __u64);
  30} dst SEC(".maps");
  31
  32__u32 elems = 0;
  33__u32 socks = 0;
  34
  35SEC("iter/sockmap")
  36int copy(struct bpf_iter__sockmap *ctx)
  37{
  38        struct sock *sk = ctx->sk;
  39        __u32 tmp, *key = ctx->key;
  40        int ret;
  41
  42        if (!key)
  43                return 0;
  44
  45        elems++;
  46
  47        /* We need a temporary buffer on the stack, since the verifier doesn't
  48         * let us use the pointer from the context as an argument to the helper.
  49         */
  50        tmp = *key;
  51
  52        if (sk) {
  53                socks++;
  54                return bpf_map_update_elem(&dst, &tmp, sk, 0) != 0;
  55        }
  56
  57        ret = bpf_map_delete_elem(&dst, &tmp);
  58        return ret && ret != -ENOENT;
  59}
  60