1*387f9dfdSAndroid Build Coastguard Worker // Copyright (c) PLUMgrid, Inc.
2*387f9dfdSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License")
3*387f9dfdSAndroid Build Coastguard Worker #include <bcc/proto.h>
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard Worker // physical endpoint manager (pem) tables which connects VMs and bridges
6*387f9dfdSAndroid Build Coastguard Worker // <ifindex_in, ifindex_out>
7*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(pem_dest, u32, u32, 256);
8*387f9dfdSAndroid Build Coastguard Worker // <0, tx_pkts>
9*387f9dfdSAndroid Build Coastguard Worker BPF_ARRAY(pem_stats, u32, 1);
10*387f9dfdSAndroid Build Coastguard Worker
pem(struct __sk_buff * skb)11*387f9dfdSAndroid Build Coastguard Worker int pem(struct __sk_buff *skb) {
12*387f9dfdSAndroid Build Coastguard Worker u32 ifindex_in, *ifindex_p;
13*387f9dfdSAndroid Build Coastguard Worker u8 *cursor = 0;
14*387f9dfdSAndroid Build Coastguard Worker struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));
15*387f9dfdSAndroid Build Coastguard Worker
16*387f9dfdSAndroid Build Coastguard Worker ifindex_in = skb->ingress_ifindex;
17*387f9dfdSAndroid Build Coastguard Worker ifindex_p = pem_dest.lookup(&ifindex_in);
18*387f9dfdSAndroid Build Coastguard Worker if (ifindex_p) {
19*387f9dfdSAndroid Build Coastguard Worker #if 1
20*387f9dfdSAndroid Build Coastguard Worker if (ethernet->type == 0x0800 || ethernet->type == 0x0806) {
21*387f9dfdSAndroid Build Coastguard Worker /* accumulate stats */
22*387f9dfdSAndroid Build Coastguard Worker u32 index = 0;
23*387f9dfdSAndroid Build Coastguard Worker u32 *value = pem_stats.lookup(&index);
24*387f9dfdSAndroid Build Coastguard Worker if (value)
25*387f9dfdSAndroid Build Coastguard Worker lock_xadd(value, 1);
26*387f9dfdSAndroid Build Coastguard Worker }
27*387f9dfdSAndroid Build Coastguard Worker #endif
28*387f9dfdSAndroid Build Coastguard Worker bpf_clone_redirect(skb, *ifindex_p, 0);
29*387f9dfdSAndroid Build Coastguard Worker }
30*387f9dfdSAndroid Build Coastguard Worker
31*387f9dfdSAndroid Build Coastguard Worker return 1;
32*387f9dfdSAndroid Build Coastguard Worker }
33