History

bpf: add skb_load_bytes_relative helper

This adds a small BPF helper similar to bpf_skb_load_bytes() that is able to load relative to mac/net header offset from the skb's linear data. Compared to bpf_skb_load_bytes(), it takes a fifth argument namely start_header, which is either BPF_HDR_START_MAC or BPF_HDR_START_NET. This allows for a more flexible alternative compared to LD_ABS/LD_IND with negative offset. It's enabled for tc BPF programs as well as sock filter program types where it's mainly useful in reuseport programs to ease access to lower header data.

Daniel Borkmann committed 8 years ago

Commit 4e1ec561 parent e0cea7c2 files · +77 −1Browse files

Showing the changes to include/uapi/linux (1 of 2 files). Show all

Unified · Split

include/uapi/linux/bpf.h+32−1
@@ -1802,6 +1802,30 @@ union bpf_attr { · 1801 unmodified lines
18021802 * Return
18031803 * a non-negative value equal to or less than size on success, or
18041804 * a negative error in case of failure.
1805+ *
1806+ * int skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header)
1807+ * Description
1808+ * This helper is similar to **bpf_skb_load_bytes**\ () in that
1809+ * it provides an easy way to load *len* bytes from *offset*
1810+ * from the packet associated to *skb*, into the buffer pointed
1811+ * by *to*. The difference to **bpf_skb_load_bytes**\ () is that
1812+ * a fifth argument *start_header* exists in order to select a
1813+ * base offset to start from. *start_header* can be one of:
1814+ *
1815+ * **BPF_HDR_START_MAC**
1816+ * Base offset to load data from is *skb*'s mac header.
1817+ * **BPF_HDR_START_NET**
1818+ * Base offset to load data from is *skb*'s network header.
1819+ *
1820+ * In general, "direct packet access" is the preferred method to
1821+ * access packet data, however, this helper is in particular useful
1822+ * in socket filters where *skb*\ **->data** does not always point
1823+ * to the start of the mac header and where "direct packet access"
1824+ * is not available.
1825+ *
1826+ * Return
1827+ * 0 on success, or a negative error in case of failure.
1828+ *
18051829 */
18061830 #define __BPF_FUNC_MAPPER(FN) \
18071831 FN(unspec), \
@@ -1871,7 +1895,8 @@ union bpf_attr { · 63 unmodified lines
18711895 FN(bind), \
18721896 FN(xdp_adjust_tail), \
18731897 FN(skb_get_xfrm_state), \
1874− FN(get_stack),
1898+ FN(get_stack), \
1899+ FN(skb_load_bytes_relative),
18751900
18761901 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
18771902 * function eBPF program intends to call
@@ -1932,6 +1957,12 @@ enum bpf_adj_room_mode { · 54 unmodified lines
19321957 BPF_ADJ_ROOM_NET,
19331958 };
19341959
1960+/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */
1961+enum bpf_hdr_start_off {
1962+ BPF_HDR_START_MAC,
1963+ BPF_HDR_START_NET,
1964+};
1965+
19351966 /* user accessible mirror of in-kernel sk_buff.
19361967 * new fields can only be added to the end of this structure
19371968 */