141d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann#include "../../include/bpf_api.h" 232e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 332e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann/* Minimal, stand-alone toy map pinning example: 432e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * 532e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * clang -target bpf -O2 [...] -o bpf_shared.o -c bpf_shared.c 632e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * tc filter add dev foo parent 1: bpf obj bpf_shared.o sec egress 732e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * tc filter add dev foo parent ffff: bpf obj bpf_shared.o sec ingress 832e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * 932e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * Both classifier will share the very same map instance in this example, 1032e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * so map content can be accessed from ingress *and* egress side! 1132e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * 1232e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * This example has a pinning of PIN_OBJECT_NS, so it's private and 1332e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * thus shared among various program sections within the object. 1432e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * 1532e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * A setting of PIN_GLOBAL_NS would place it into a global namespace, 1632e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * so that it can be shared among different object files. A setting 1732e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * of PIN_NONE (= 0) means no sharing, so each tc invocation a new map 1832e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann * instance is being created. 1932e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann */ 2032e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 214dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmannstruct bpf_elf_map __section_maps map_sh = { 224dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann .type = BPF_MAP_TYPE_ARRAY, 234dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann .size_key = sizeof(uint32_t), 244dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann .size_value = sizeof(uint32_t), 254dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann .pinning = PIN_OBJECT_NS, /* or PIN_GLOBAL_NS, or PIN_NONE */ 264dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann .max_elem = 1, 274dd3f50af4b82a6a29ede951bde97197e88f9c5dDaniel Borkmann}; 2832e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 2941d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann__section("egress") 3041d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmannint emain(struct __sk_buff *skb) 3132e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann{ 3232e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann int key = 0, *val; 3332e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 3441d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann val = map_lookup_elem(&map_sh, &key); 3532e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann if (val) 3641d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann lock_xadd(val, 1); 3732e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 3841d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann return BPF_H_DEFAULT; 3932e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann} 4032e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 4141d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann__section("ingress") 4241d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmannint imain(struct __sk_buff *skb) 4332e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann{ 4432e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann int key = 0, *val; 4532e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 4641d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann val = map_lookup_elem(&map_sh, &key); 4732e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann if (val) 4892a36995b3ceb4de4ebd43d9358e0edebce67615Daniel Borkmann printt("map val: %d\n", *val); 4932e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 5041d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel Borkmann return BPF_H_DEFAULT; 5132e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann} 5232e93fb7f66d55d597b52ec3b10fd44a47784114Daniel Borkmann 5341d6e33fc9e5b459b7f715acbd6d8dbeddf58576Daniel BorkmannBPF_LICENSE("GPL"); 54