int pem(struct __sk_buff *skb) { u32 ifindex_in, *ifindex_p; ifindex_in = skb->ingress_ifindex; ifindex_p = pem_dest.lookup(&ifindex_in); if (ifindex_p) { #if 1 /* 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; }
static inline int do_redirect(struct __sk_buff *skb, int nh_off, int dir) { __u16 dport, off; __u8 ip_proto, ip_vl; int *ifindex; __be32 ip_dest, ip_src; char fmt[] = "skb %p len %d ip_dest %x\n"; ip_proto = load_byte(skb, nh_off + offsetof(struct iphdr, protocol)); ip_src = load_word(skb, nh_off + offsetof(struct iphdr, saddr)); ip_dest = load_word(skb, nh_off + offsetof(struct iphdr, daddr)); if (ip_proto != IPPROTO_TCP) return 0; ip_vl = load_byte(skb, nh_off); if (likely(ip_vl == 0x45)) nh_off += sizeof(struct iphdr); else nh_off += (ip_vl & 0xF) << 2; bpf_trace_printk(fmt, sizeof(fmt), skb, skb->len, ip_dest); dport = load_half(skb, nh_off + offsetof(struct tcphdr, dest)); if (dport != 80) return 0; if (dir == 0) { ifindex = bpf_map_lookup_elem(&container_map, &ip_dest); if (ifindex) { set_tcp_dest_port(skb, 8080); bpf_clone_redirect(skb, *ifindex, 1); } } else { ifindex = bpf_map_lookup_elem(&container_map, &ip_src); if (ifindex) set_tcp_dest_port(skb, 80); } return -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; }