12f7de986SLorenz Bauer // SPDX-License-Identifier: GPL-2.0
22f7de986SLorenz Bauer /* Copyright (c) 2020 Cloudflare */
32f7de986SLorenz Bauer #include "bpf_iter.h"
42f7de986SLorenz Bauer #include "bpf_tracing_net.h"
52f7de986SLorenz Bauer #include <bpf/bpf_helpers.h>
62f7de986SLorenz Bauer #include <bpf/bpf_tracing.h>
72f7de986SLorenz Bauer #include <errno.h>
82f7de986SLorenz Bauer
92f7de986SLorenz Bauer char _license[] SEC("license") = "GPL";
102f7de986SLorenz Bauer
112f7de986SLorenz Bauer struct {
122f7de986SLorenz Bauer __uint(type, BPF_MAP_TYPE_SOCKMAP);
1327870317SLorenz Bauer __uint(max_entries, 64);
142f7de986SLorenz Bauer __type(key, __u32);
152f7de986SLorenz Bauer __type(value, __u64);
162f7de986SLorenz Bauer } sockmap SEC(".maps");
172f7de986SLorenz Bauer
182f7de986SLorenz Bauer struct {
192f7de986SLorenz Bauer __uint(type, BPF_MAP_TYPE_SOCKHASH);
2027870317SLorenz Bauer __uint(max_entries, 64);
212f7de986SLorenz Bauer __type(key, __u32);
222f7de986SLorenz Bauer __type(value, __u64);
232f7de986SLorenz Bauer } sockhash SEC(".maps");
242f7de986SLorenz Bauer
255b87adc3SLorenz Bauer struct {
265b87adc3SLorenz Bauer __uint(type, BPF_MAP_TYPE_SOCKHASH);
275b87adc3SLorenz Bauer __uint(max_entries, 64);
285b87adc3SLorenz Bauer __type(key, __u32);
295b87adc3SLorenz Bauer __type(value, __u64);
305b87adc3SLorenz Bauer } dst SEC(".maps");
315b87adc3SLorenz Bauer
322f7de986SLorenz Bauer __u32 elems = 0;
332f7de986SLorenz Bauer __u32 socks = 0;
342f7de986SLorenz Bauer
352f7de986SLorenz Bauer SEC("iter/sockmap")
copy(struct bpf_iter__sockmap * ctx)365b87adc3SLorenz Bauer int copy(struct bpf_iter__sockmap *ctx)
372f7de986SLorenz Bauer {
382f7de986SLorenz Bauer struct sock *sk = ctx->sk;
392f7de986SLorenz Bauer __u32 tmp, *key = ctx->key;
402f7de986SLorenz Bauer int ret;
412f7de986SLorenz Bauer
425b87adc3SLorenz Bauer if (!key)
435b87adc3SLorenz Bauer return 0;
445b87adc3SLorenz Bauer
452f7de986SLorenz Bauer elems++;
462f7de986SLorenz Bauer
475b87adc3SLorenz Bauer /* We need a temporary buffer on the stack, since the verifier doesn't
485b87adc3SLorenz Bauer * let us use the pointer from the context as an argument to the helper.
495b87adc3SLorenz Bauer */
505b87adc3SLorenz Bauer tmp = *key;
512f7de986SLorenz Bauer
525b87adc3SLorenz Bauer if (sk) {
535b87adc3SLorenz Bauer socks++;
545b87adc3SLorenz Bauer return bpf_map_update_elem(&dst, &tmp, sk, 0) != 0;
555b87adc3SLorenz Bauer }
565b87adc3SLorenz Bauer
575b87adc3SLorenz Bauer ret = bpf_map_delete_elem(&dst, &tmp);
585b87adc3SLorenz Bauer return ret && ret != -ENOENT;
592f7de986SLorenz Bauer }
60