60 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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't48 * 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