brintos

brintos / linux-shallow public Read only

0
0
Text · 1.2 KiB · f3af0e3 Raw
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