struct globals {
struct flow_keys flow;
- __u32 nhoff;
};
struct bpf_map_def SEC("maps") percpu_map = {
static __always_inline void parse_ip_proto(struct __sk_buff *skb,
struct globals *g, __u32 ip_proto)
{
- __u32 nhoff = g->nhoff;
+ __u32 nhoff = skb->cb[0];
int poff;
switch (ip_proto) {
if (gre_flags & GRE_SEQ)
nhoff += 4;
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
parse_eth_proto(skb, gre_proto);
break;
}
if (!g)
return 0;
- nhoff = g->nhoff;
+ nhoff = skb->cb[0];
if (unlikely(ip_is_fragment(skb, nhoff)))
return 0;
verlen = load_byte(skb, nhoff + 0/*offsetof(struct iphdr, ihl)*/);
nhoff += (verlen & 0xF) << 2;
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
parse_ip_proto(skb, g, ip_proto);
return 0;
}
if (!g)
return 0;
- nhoff = g->nhoff;
+ nhoff = skb->cb[0];
ip_proto = load_byte(skb,
nhoff + offsetof(struct ipv6hdr, nexthdr));
nhoff + offsetof(struct ipv6hdr, daddr));
nhoff += sizeof(struct ipv6hdr);
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
parse_ip_proto(skb, g, ip_proto);
return 0;
}
PROG(PARSE_VLAN)(struct __sk_buff *skb)
{
- struct globals *g = this_cpu_globals();
__u32 nhoff, proto;
- if (!g)
- return 0;
-
- nhoff = g->nhoff;
+ nhoff = skb->cb[0];
proto = load_half(skb, nhoff + offsetof(struct vlan_hdr,
h_vlan_encapsulated_proto));
nhoff += sizeof(struct vlan_hdr);
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
parse_eth_proto(skb, proto);
PROG(PARSE_MPLS)(struct __sk_buff *skb)
{
- struct globals *g = this_cpu_globals();
__u32 nhoff, label;
- if (!g)
- return 0;
-
- nhoff = g->nhoff;
+ nhoff = skb->cb[0];
label = load_word(skb, nhoff);
nhoff += sizeof(struct mpls_label);
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
if (label & MPLS_LS_S_MASK) {
__u8 verlen = load_byte(skb, nhoff);
SEC("socket/0")
int main_prog(struct __sk_buff *skb)
{
- struct globals *g = this_cpu_globals();
__u32 nhoff = ETH_HLEN;
__u32 proto = load_half(skb, 12);
- if (!g)
- return 0;
-
- g->nhoff = nhoff;
+ skb->cb[0] = nhoff;
parse_eth_proto(skb, proto);
return 0;
}