xref: /aosp_15_r20/external/bcc/tests/python/test_xlate1.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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 struct IPKey {
5*387f9dfdSAndroid Build Coastguard Worker   u32 dip;
6*387f9dfdSAndroid Build Coastguard Worker   u32 sip;
7*387f9dfdSAndroid Build Coastguard Worker };
8*387f9dfdSAndroid Build Coastguard Worker struct IPLeaf {
9*387f9dfdSAndroid Build Coastguard Worker   u32 xdip;
10*387f9dfdSAndroid Build Coastguard Worker   u32 xsip;
11*387f9dfdSAndroid Build Coastguard Worker   u64 ip_xlated_pkts;
12*387f9dfdSAndroid Build Coastguard Worker   u64 arp_xlated_pkts;
13*387f9dfdSAndroid Build Coastguard Worker };
14*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(xlate, struct IPKey, struct IPLeaf, 1024);
15*387f9dfdSAndroid Build Coastguard Worker 
on_packet(struct __sk_buff * skb)16*387f9dfdSAndroid Build Coastguard Worker int on_packet(struct __sk_buff *skb) {
17*387f9dfdSAndroid Build Coastguard Worker   u8 *cursor = 0;
18*387f9dfdSAndroid Build Coastguard Worker 
19*387f9dfdSAndroid Build Coastguard Worker   u32 orig_dip = 0;
20*387f9dfdSAndroid Build Coastguard Worker   u32 orig_sip = 0;
21*387f9dfdSAndroid Build Coastguard Worker   struct IPLeaf xleaf = {};
22*387f9dfdSAndroid Build Coastguard Worker 
23*387f9dfdSAndroid Build Coastguard Worker   ethernet: {
24*387f9dfdSAndroid Build Coastguard Worker     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));
25*387f9dfdSAndroid Build Coastguard Worker     switch (ethernet->type) {
26*387f9dfdSAndroid Build Coastguard Worker       case ETH_P_IP: goto ip;
27*387f9dfdSAndroid Build Coastguard Worker       case ETH_P_ARP: goto arp;
28*387f9dfdSAndroid Build Coastguard Worker       case ETH_P_8021Q: goto dot1q;
29*387f9dfdSAndroid Build Coastguard Worker       default: goto EOP;
30*387f9dfdSAndroid Build Coastguard Worker     }
31*387f9dfdSAndroid Build Coastguard Worker   }
32*387f9dfdSAndroid Build Coastguard Worker 
33*387f9dfdSAndroid Build Coastguard Worker   dot1q: {
34*387f9dfdSAndroid Build Coastguard Worker     struct dot1q_t *dot1q = cursor_advance(cursor, sizeof(*dot1q));
35*387f9dfdSAndroid Build Coastguard Worker     switch (dot1q->type) {
36*387f9dfdSAndroid Build Coastguard Worker       case ETH_P_IP: goto ip;
37*387f9dfdSAndroid Build Coastguard Worker       case ETH_P_ARP: goto arp;
38*387f9dfdSAndroid Build Coastguard Worker       default: goto EOP;
39*387f9dfdSAndroid Build Coastguard Worker     }
40*387f9dfdSAndroid Build Coastguard Worker   }
41*387f9dfdSAndroid Build Coastguard Worker 
42*387f9dfdSAndroid Build Coastguard Worker   arp: {
43*387f9dfdSAndroid Build Coastguard Worker     struct arp_t *arp = cursor_advance(cursor, sizeof(*arp));
44*387f9dfdSAndroid Build Coastguard Worker     orig_dip = arp->tpa;
45*387f9dfdSAndroid Build Coastguard Worker     orig_sip = arp->spa;
46*387f9dfdSAndroid Build Coastguard Worker     struct IPKey key = {.dip=orig_dip, .sip=orig_sip};
47*387f9dfdSAndroid Build Coastguard Worker     struct IPLeaf *xleafp = xlate.lookup(&key);
48*387f9dfdSAndroid Build Coastguard Worker     if (xleafp) {
49*387f9dfdSAndroid Build Coastguard Worker       xleaf = *xleafp;
50*387f9dfdSAndroid Build Coastguard Worker       arp->tpa = xleaf.xdip;
51*387f9dfdSAndroid Build Coastguard Worker       arp->spa = xleaf.xsip;
52*387f9dfdSAndroid Build Coastguard Worker       lock_xadd(&xleafp->arp_xlated_pkts, 1);
53*387f9dfdSAndroid Build Coastguard Worker     }
54*387f9dfdSAndroid Build Coastguard Worker     goto EOP;
55*387f9dfdSAndroid Build Coastguard Worker   }
56*387f9dfdSAndroid Build Coastguard Worker 
57*387f9dfdSAndroid Build Coastguard Worker   ip: {
58*387f9dfdSAndroid Build Coastguard Worker     struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));
59*387f9dfdSAndroid Build Coastguard Worker     orig_dip = ip->dst;
60*387f9dfdSAndroid Build Coastguard Worker     orig_sip = ip->src;
61*387f9dfdSAndroid Build Coastguard Worker     struct IPKey key = {.dip=orig_dip, .sip=orig_sip};
62*387f9dfdSAndroid Build Coastguard Worker     struct IPLeaf *xleafp = xlate.lookup(&key);
63*387f9dfdSAndroid Build Coastguard Worker     if (xleafp) {
64*387f9dfdSAndroid Build Coastguard Worker       xleaf = *xleafp;
65*387f9dfdSAndroid Build Coastguard Worker       ip->dst = xleaf.xdip;
66*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l3(&ip->hchecksum, orig_dip, xleaf.xdip);
67*387f9dfdSAndroid Build Coastguard Worker       ip->src = xleaf.xsip;
68*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l3(&ip->hchecksum, orig_sip, xleaf.xsip);
69*387f9dfdSAndroid Build Coastguard Worker       lock_xadd(&xleafp->ip_xlated_pkts, 1);
70*387f9dfdSAndroid Build Coastguard Worker     }
71*387f9dfdSAndroid Build Coastguard Worker     switch (ip->nextp) {
72*387f9dfdSAndroid Build Coastguard Worker       case 6: goto tcp;
73*387f9dfdSAndroid Build Coastguard Worker       case 17: goto udp;
74*387f9dfdSAndroid Build Coastguard Worker       default: goto EOP;
75*387f9dfdSAndroid Build Coastguard Worker     }
76*387f9dfdSAndroid Build Coastguard Worker   }
77*387f9dfdSAndroid Build Coastguard Worker 
78*387f9dfdSAndroid Build Coastguard Worker   udp: {
79*387f9dfdSAndroid Build Coastguard Worker     struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));
80*387f9dfdSAndroid Build Coastguard Worker     if (xleaf.xdip) {
81*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l4(&udp->crc, orig_dip, xleaf.xdip, 1);
82*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l4(&udp->crc, orig_sip, xleaf.xsip, 1);
83*387f9dfdSAndroid Build Coastguard Worker     }
84*387f9dfdSAndroid Build Coastguard Worker     goto EOP;
85*387f9dfdSAndroid Build Coastguard Worker   }
86*387f9dfdSAndroid Build Coastguard Worker 
87*387f9dfdSAndroid Build Coastguard Worker   tcp: {
88*387f9dfdSAndroid Build Coastguard Worker     struct tcp_t *tcp = cursor_advance(cursor, sizeof(*tcp));
89*387f9dfdSAndroid Build Coastguard Worker     if (xleaf.xdip) {
90*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l4(&tcp->cksum, orig_dip, xleaf.xdip, 1);
91*387f9dfdSAndroid Build Coastguard Worker       incr_cksum_l4(&tcp->cksum, orig_sip, xleaf.xsip, 1);
92*387f9dfdSAndroid Build Coastguard Worker     }
93*387f9dfdSAndroid Build Coastguard Worker     goto EOP;
94*387f9dfdSAndroid Build Coastguard Worker   }
95*387f9dfdSAndroid Build Coastguard Worker 
96*387f9dfdSAndroid Build Coastguard Worker EOP:
97*387f9dfdSAndroid Build Coastguard Worker   return 0;
98*387f9dfdSAndroid Build Coastguard Worker }
99