bpf_iter_sockmap.c (1182B)
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}