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 9 char _license[] SEC("license") = "GPL"; 10 11 struct { 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 18 struct { 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 25 struct { 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 35 SEC("iter/sockmap") 36 int 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