// 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 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; }