1259698Sdim// SPDX-License-Identifier: GPL-2.0 2259698Sdim/* Copyright (c) 2020 Cloudflare */ 3259698Sdim#include "bpf_iter.h" 4259698Sdim#include "bpf_tracing_net.h" 5259698Sdim#include <bpf/bpf_helpers.h> 6259698Sdim#include <bpf/bpf_tracing.h> 7259698Sdim#include <errno.h> 8259698Sdim 9259698Sdimchar _license[] SEC("license") = "GPL"; 10259698Sdim 11259698Sdimstruct { 12259698Sdim __uint(type, BPF_MAP_TYPE_SOCKMAP); 13259698Sdim __uint(max_entries, 64); 14259698Sdim __type(key, __u32); 15259698Sdim __type(value, __u64); 16259698Sdim} sockmap SEC(".maps"); 17259698Sdim 18259698Sdimstruct { 19259698Sdim __uint(type, BPF_MAP_TYPE_SOCKHASH); 20259698Sdim __uint(max_entries, 64); 21259698Sdim __type(key, __u32); 22259698Sdim __type(value, __u64); 23259698Sdim} sockhash SEC(".maps"); 24259698Sdim 25259698Sdimstruct { 26259698Sdim __uint(type, BPF_MAP_TYPE_SOCKHASH); 27259698Sdim __uint(max_entries, 64); 28259698Sdim __type(key, __u32); 29259698Sdim __type(value, __u64); 30259698Sdim} dst SEC(".maps"); 31259698Sdim 32259698Sdim__u32 elems = 0; 33259698Sdim__u32 socks = 0; 34259698Sdim 35259698SdimSEC("iter/sockmap") 36259698Sdimint copy(struct bpf_iter__sockmap *ctx) 37259698Sdim{ 38259698Sdim struct sock *sk = ctx->sk; 39259698Sdim __u32 tmp, *key = ctx->key; 40259698Sdim int ret; 41259698Sdim 42259698Sdim if (!key) 43259698Sdim return 0; 44259698Sdim 45259698Sdim elems++; 46259698Sdim 47259698Sdim /* We need a temporary buffer on the stack, since the verifier doesn't 48259698Sdim * let us use the pointer from the context as an argument to the helper. 49259698Sdim */ 50259698Sdim tmp = *key; 51259698Sdim 52259698Sdim if (sk) { 53259698Sdim socks++; 54259698Sdim return bpf_map_update_elem(&dst, &tmp, sk, 0) != 0; 55259698Sdim } 56259698Sdim 57259698Sdim ret = bpf_map_delete_elem(&dst, &tmp); 58259698Sdim return ret && ret != -ENOENT; 59259698Sdim} 60259698Sdim