1 // Copyright (c) PLUMgrid, Inc. 2 // Licensed under the Apache License, Version 2.0 (the "License") 3 struct Ptr { 4 u64 ptr:64; 5 }; 6 struct Counters { 7 u64 stat1:64; 8 u64 stat2:64; 9 }; 10 Table<Ptr, Counters, FIXED_MATCH, AUTO> stats(1024); 11 12 // example with on_valid syntax 13 u32 sys_wr (struct proto::pt_regs *ctx) { 14 struct Ptr key = {.ptr=ctx->di}; 15 struct Counters *leaf; 16 leaf = stats[key]; 17 if leaf { 18 atomic_add(leaf->stat2, 1); 19 } 20 log("sys_wr: %p\n", ctx->di); 21 return 0; 22 } 23 24 // example with smallest available syntax 25 // note: if stats[key] fails, program returns early 26 u32 sys_rd (struct proto::pt_regs *ctx) { 27 struct Ptr key = {.ptr=ctx->di}; 28 atomic_add(stats[key].stat1, 1); 29 } 30 31 // example with if/else case 32 u32 sys_bpf (struct proto::pt_regs *ctx) { 33 struct Ptr key = {.ptr=ctx->di}; 34 struct Counters *leaf; 35 leaf = stats[key]; 36 if leaf { 37 atomic_add(leaf->stat1, 1); 38 } else { 39 log("update %llx failed\n", ctx->di); 40 } 41 return 0; 42 } 43 44