Skip to content

Instantly share code, notes, and snippets.

@mattnite
Last active October 16, 2020 07:21
Show Gist options
  • Save mattnite/9edb2e953cd0dd73389c3515d16391ec to your computer and use it in GitHub Desktop.
Save mattnite/9edb2e953cd0dd73389c3515d16391ec to your computer and use it in GitHub Desktop.
Main program for BPF perf buffer example
const std = @import("std");
const bpf = @import("bpf");
const mem = std.mem;
usingnamespace @import("common.zig");
const os = std.os;
const assert = std.debug.assert;
const c = @cImport({
@cInclude("net/if.h");
});
// tell the compiler to include multithreaded event loop
pub const io_mode = .evented;
// embed external file into .rodata section
const probe = @embedFile("probe.o");
comptime {
@setEvalBranchQuota(4000);
assert(bpf.elf.has_section("socket1"));
}
fn consume_events(perf_buffer: *BPF.PerfBuffer) void {
while (perf_buffer.running.get()) {
const payload = perf_buffer.get();
switch (payload.event) {
.sample => |data| {
defer data.deinit();
std.debug.print("cpu: {}, sample: {}\n", .{
payload.cpu,
mem.bytesToValue(usize, data.items[0..8]),
});
},
.lost => |cnt| {
std.debug.print("cpu: {}, lost: {}\n", .{ payload.cpu, cnt });
},
}
}
}
pub fn main() anyerror!void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
var obj = try bpf.Object.init(&gpa.allocator, probe);
defer obj.deinit();
try obj.load();
defer obj.unload();
const sock_fd = try create_raw_socket("lo");
defer os.close(sock_fd);
const prog = obj.find_prog("socket1") orelse unreachable;
try os.setsockopt(sock_fd, c.SOL_SOCKET, c.SO_ATTACH_BPF, mem.asBytes(&prog));
const perf_event_array = try BPF.PerfEventArray.init(BPF.MapInfo{
.fd = obj.find_map("events") orelse return error.NoEventsMap,
.def = BPF.kern.PerfEventArray.init(256, 0).map.def,
});
var perf_buffer = try BPF.PerfBuffer.init(&gpa.allocator, perf_event_array, 64);
_ = async perf_buffer.run();
_ = async consume_events(&perf_buffer);
// suspends current frame in event loop, which ends up running the program indefinitely
suspend;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment