// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* Copyright (c) 2020 Facebook */ #include "vmlinux.h" #include #include #include #include "replica.h" char LICENSE[] SEC("license") = "Dual BSD/GPL"; struct { __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); __uint(key_size, sizeof(int)); __uint(value_size, sizeof(int)); } events SEC(".maps"); /* __completed_cmd(const uint8_t *cmd, size_t len, unsigned long long seq); */ SEC("uprobe//home/lian/share/9.1-kvstore/kvstore:__completed_cmd") int BPF_KPROBE(handle_completed_cmd, const __u8 *cmd, size_t len, __u64 seq) { struct replica_event evt = {}; __u32 copy_len; evt.type = EVENT_COMPLETED_CMD; evt.complete.seq = seq; copy_len = len; if (copy_len > MAX_CMD_LEN) copy_len = MAX_CMD_LEN; evt.complete.len = copy_len; if (cmd) bpf_probe_read_user(evt.complete.cmd, copy_len, cmd); bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &evt, sizeof(evt)); return 0; } /* __ssync(const uint8_t *ip, uint32_t ip_len, int port, unsigned long long seq); */ SEC("uprobe//home/lian/share/9.1-kvstore/kvstore:__ssync") int BPF_KPROBE(handle_ssync, const __u8 *ip, __u32 ip_len, int port, __u64 seq) { struct replica_event evt = {}; evt.type = EVENT_SSYNC; evt.sync.seq = seq; evt.sync.port = port; __u32 copy_len = ip_len; if (copy_len > sizeof(evt.sync.ip)) copy_len = sizeof(evt.sync.ip); if (ip) bpf_probe_read_user(evt.sync.ip, copy_len, ip); bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &evt, sizeof(evt)); return 0; } /* __sready(void); */ SEC("uprobe//home/lian/share/9.1-kvstore/kvstore:__sready") int BPF_KPROBE(handle_sready) { struct replica_event evt = {}; evt.type = EVENT_SREADY; bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &evt, sizeof(evt)); return 0; }