introduce user accessible mirror of in-kernel 'struct sk_buff': struct __sk_buff { __u32 len; __u32 pkt_type; __u32 mark; __u32 queue_mapping; }; bpf programs can do: int bpf_prog(struct __sk_buff *skb) { __u32 var = skb->pkt_type; which will be compiled to bpf assembler as: dst_reg = *(u32 *)(src_reg + 4) // 4 == offsetof(struct __sk_buff, pkt_type) bpf verifier will check validity of access and will convert it to: dst_reg = *(u8 *)(src_reg + offsetof(struct sk_buff, __pkt_type_offset)) dst_reg &= 7 since skb->pkt_type is a bitfield.
Showing the changes to include/uapi (1 of 5 files). Show all
Unified · Split
| @@ -170,4 +170,14 @@ enum bpf_func_id { · 169 unmodified lines | ||
| 170 | 170 | __BPF_FUNC_MAX_ID, |
| 171 | 171 | }; |
| 172 | 172 | |
| 173 | +/* user accessible mirror of in-kernel sk_buff. | |
| 174 | + * new fields can only be added to the end of this structure | |
| 175 | + */ | |
| 176 | +struct __sk_buff { | |
| 177 | + __u32 len; | |
| 178 | + __u32 pkt_type; | |
| 179 | + __u32 mark; | |
| 180 | + __u32 queue_mapping; | |
| 181 | +}; | |
| 182 | + | |
| 173 | 183 | #endif /* _UAPI__LINUX_BPF_H__ */ |