lcc/clcc/example/example.bpf.c (27 lines of code) (raw):
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_endian.h>
#include "example.h"
struct
{
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
__uint(key_size, sizeof(u32));
__uint(value_size, sizeof(u32));
} events SEC(".maps");
SEC("kprobe/tcp_connect")
int BPF_KPROBE(tcp_connect, struct sock *sk)
{
struct example e;
struct inet_sock *inet = (struct inet_sock *)sk;
e.pid = bpf_get_current_pid_tgid() >> 32;
bpf_get_current_comm(&e.comm, TASK_COMM_LEN);
BPF_CORE_READ_INTO(&e.daddr, sk, __sk_common.skc_daddr);
BPF_CORE_READ_INTO(&e.dport, sk, __sk_common.skc_dport);
BPF_CORE_READ_INTO(&e.saddr, sk, __sk_common.skc_rcv_saddr);
BPF_CORE_READ_INTO(&e.sport, inet, inet_sport);
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &e, sizeof(e));
return 0;
}
char LICENSE[] SEC("license") = "GPL";