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