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
4*387f9dfdSAndroid Build Coastguard Worker BPF_PROG_ARRAY(jump, 64);
5*387f9dfdSAndroid Build Coastguard Worker BPF_ARRAY(stats, u64, 64);
6*387f9dfdSAndroid Build Coastguard Worker
7*387f9dfdSAndroid Build Coastguard Worker enum states {
8*387f9dfdSAndroid Build Coastguard Worker S_EOP = 1,
9*387f9dfdSAndroid Build Coastguard Worker S_ETHER,
10*387f9dfdSAndroid Build Coastguard Worker S_ARP,
11*387f9dfdSAndroid Build Coastguard Worker S_IP
12*387f9dfdSAndroid Build Coastguard Worker };
13*387f9dfdSAndroid Build Coastguard Worker
parse_ether(struct __sk_buff * skb)14*387f9dfdSAndroid Build Coastguard Worker int parse_ether(struct __sk_buff *skb) {
15*387f9dfdSAndroid Build Coastguard Worker size_t cur = 0;
16*387f9dfdSAndroid Build Coastguard Worker size_t next = cur + 14;
17*387f9dfdSAndroid Build Coastguard Worker
18*387f9dfdSAndroid Build Coastguard Worker int key = S_ETHER;
19*387f9dfdSAndroid Build Coastguard Worker u64 *leaf = stats.lookup(&key);
20*387f9dfdSAndroid Build Coastguard Worker if (leaf) (*leaf)++;
21*387f9dfdSAndroid Build Coastguard Worker
22*387f9dfdSAndroid Build Coastguard Worker switch (bpf_dext_pkt(skb, cur + 12, 0, 16)) {
23*387f9dfdSAndroid Build Coastguard Worker case 0x0800: jump.call(skb, S_IP);
24*387f9dfdSAndroid Build Coastguard Worker case 0x0806: jump.call(skb, S_ARP);
25*387f9dfdSAndroid Build Coastguard Worker }
26*387f9dfdSAndroid Build Coastguard Worker jump.call(skb, S_EOP);
27*387f9dfdSAndroid Build Coastguard Worker return 1;
28*387f9dfdSAndroid Build Coastguard Worker }
29*387f9dfdSAndroid Build Coastguard Worker
parse_arp(struct __sk_buff * skb)30*387f9dfdSAndroid Build Coastguard Worker int parse_arp(struct __sk_buff *skb) {
31*387f9dfdSAndroid Build Coastguard Worker size_t cur = 14; // TODO: get from ctx
32*387f9dfdSAndroid Build Coastguard Worker size_t next = cur + 28;
33*387f9dfdSAndroid Build Coastguard Worker
34*387f9dfdSAndroid Build Coastguard Worker int key = S_ARP;
35*387f9dfdSAndroid Build Coastguard Worker u64 *leaf = stats.lookup(&key);
36*387f9dfdSAndroid Build Coastguard Worker if (leaf) (*leaf)++;
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard Worker jump.call(skb, S_EOP);
39*387f9dfdSAndroid Build Coastguard Worker return 1;
40*387f9dfdSAndroid Build Coastguard Worker }
41*387f9dfdSAndroid Build Coastguard Worker
parse_ip(struct __sk_buff * skb)42*387f9dfdSAndroid Build Coastguard Worker int parse_ip(struct __sk_buff *skb) {
43*387f9dfdSAndroid Build Coastguard Worker size_t cur = 14; // TODO: get from ctx
44*387f9dfdSAndroid Build Coastguard Worker size_t next = cur + 20;
45*387f9dfdSAndroid Build Coastguard Worker
46*387f9dfdSAndroid Build Coastguard Worker int key = S_IP;
47*387f9dfdSAndroid Build Coastguard Worker u64 *leaf = stats.lookup(&key);
48*387f9dfdSAndroid Build Coastguard Worker if (leaf) (*leaf)++;
49*387f9dfdSAndroid Build Coastguard Worker
50*387f9dfdSAndroid Build Coastguard Worker jump.call(skb, S_EOP);
51*387f9dfdSAndroid Build Coastguard Worker return 1;
52*387f9dfdSAndroid Build Coastguard Worker }
53*387f9dfdSAndroid Build Coastguard Worker
eop(struct __sk_buff * skb)54*387f9dfdSAndroid Build Coastguard Worker int eop(struct __sk_buff *skb) {
55*387f9dfdSAndroid Build Coastguard Worker int key = S_EOP;
56*387f9dfdSAndroid Build Coastguard Worker u64 *leaf = stats.lookup(&key);
57*387f9dfdSAndroid Build Coastguard Worker if (leaf) (*leaf)++;
58*387f9dfdSAndroid Build Coastguard Worker return 1;
59*387f9dfdSAndroid Build Coastguard Worker }
60