| // Copyright (c) PLUMgrid, Inc. | |
| // Licensed under the Apache License, Version 2.0 (the "License") | |
| #include <bcc/proto.h> | |
| // physical endpoint manager (pem) tables which connects VMs and bridges | |
| // <ifindex_in, ifindex_out> | |
| BPF_HASH(pem_dest, u32, u32, 256); | |
| // <0, tx_pkts> | |
| BPF_ARRAY(pem_stats, u32, 1); | |
| int pem(struct __sk_buff *skb) { | |
| u32 ifindex_in, *ifindex_p; | |
| u8 *cursor = 0; | |
| struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet)); | |
| ifindex_in = skb->ingress_ifindex; | |
| ifindex_p = pem_dest.lookup(&ifindex_in); | |
| if (ifindex_p) { | |
| #if 1 | |
| if (ethernet->type == 0x0800 || ethernet->type == 0x0806) { | |
| /* accumulate stats */ | |
| u32 index = 0; | |
| u32 *value = pem_stats.lookup(&index); | |
| if (value) | |
| lock_xadd(value, 1); | |
| } | |
| #endif | |
| bpf_clone_redirect(skb, *ifindex_p, 0); | |
| } | |
| return 1; | |
| } |