struct sk_buff { /* field names and sizes should match to those in the kernel */ unsignedint len, data_len;
__u16 mac_len, hdr_len, queue_mapping; struct net_device *dev; /* order of the fields doesn't matter */
refcount_t users; unsignedchar *data; char __pkt_type_offset[0]; char cb[48];
};
struct meta { int ifindex;
__u32 cb32_0;
__u8 cb8_0;
};
if (users != 1 || pkt_data != bpf_htons(0x86dd) || meta.ifindex != 1) /* raw tp ignores return value */ return 0;
/* send first 72 byte of the packet to user space */
bpf_skb_output(skb, &perf_buf_map, (72ull << 32) | BPF_F_CURRENT_CPU,
&meta, sizeof(meta)); return 0;
}
struct { bool fentry_test_ok; bool fexit_test_ok;
} result = {};
SEC("fentry/eth_type_trans") int BPF_PROG(fentry_eth_type_trans, struct sk_buff *skb, struct net_device *dev, unsignedshort protocol)
{ int len, ifindex;
__builtin_preserve_access_index(({
len = skb->len;
ifindex = dev->ifindex;
}));
/* fentry sees full packet including L2 header */ if (len != 74 || ifindex != 1) return 0;
result.fentry_test_ok = true; return 0;
}
SEC("fexit/eth_type_trans") int BPF_PROG(fexit_eth_type_trans, struct sk_buff *skb, struct net_device *dev, unsignedshort protocol)
{ int len, ifindex;
__builtin_preserve_access_index(({
len = skb->len;
ifindex = dev->ifindex;
}));
/* fexit sees packet without L2 header that eth_type_trans should have * consumed.
*/ if (len != 60 || protocol != bpf_htons(0x86dd) || ifindex != 1) return 0;
result.fexit_test_ok = true; return 0;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.