You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
963 B

// Copyright (c) PLUMgrid, Inc.
// Licensed under the Apache License, Version 2.0 (the "License")
struct Ptr {
u64 ptr:64;
};
struct Counters {
u64 stat1:64;
u64 stat2:64;
};
Table<Ptr, Counters, FIXED_MATCH, AUTO> stats(1024);
// example with on_valid syntax
u32 sys_wr (struct proto::pt_regs *ctx) {
struct Ptr key = {.ptr=ctx->di};
struct Counters *leaf;
leaf = stats[key];
if leaf {
atomic_add(leaf->stat2, 1);
}
log("sys_wr: %p\n", ctx->di);
return 0;
}
// example with smallest available syntax
// note: if stats[key] fails, program returns early
u32 sys_rd (struct proto::pt_regs *ctx) {
struct Ptr key = {.ptr=ctx->di};
atomic_add(stats[key].stat1, 1);
}
// example with if/else case
u32 sys_bpf (struct proto::pt_regs *ctx) {
struct Ptr key = {.ptr=ctx->di};
struct Counters *leaf;
leaf = stats[key];
if leaf {
atomic_add(leaf->stat1, 1);
} else {
log("update %llx failed\n", ctx->di);
}
return 0;
}