diff options
| author | Alexei Starovoitov <ast@plumgrid.com> | 2015-04-01 20:12:13 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-04-06 16:42:35 -0400 |
| commit | 91bc4822c3d61b9bb7ef66d3b77948a4f9177954 (patch) | |
| tree | ca92a811b501957c1e876290d305aaf81c8d9aff /include/uapi | |
| parent | 5888b93b750609680735d6b8b737703083ef40ff (diff) | |
tc: bpf: add checksum helpers
Commit 608cd71a9c7c ("tc: bpf: generalize pedit action") has added the
possibility to mangle packet data to BPF programs in the tc pipeline.
This patch adds two helpers bpf_l3_csum_replace() and bpf_l4_csum_replace()
for fixing up the protocol checksums after the packet mangling.
It also adds 'flags' argument to bpf_skb_store_bytes() helper to avoid
unnecessary checksum recomputations when BPF programs adjusting l3/l4
checksums and documents all three helpers in uapi header.
Moreover, a sample program is added to show how BPF programs can make use
of the mangle and csum helpers.
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/uapi')
| -rw-r--r-- | include/uapi/linux/bpf.h | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 0db8580f3cca..23df3e7f8e7d 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
| @@ -168,7 +168,43 @@ enum bpf_func_id { | |||
| 168 | BPF_FUNC_map_delete_elem, /* int map_delete_elem(&map, &key) */ | 168 | BPF_FUNC_map_delete_elem, /* int map_delete_elem(&map, &key) */ |
| 169 | BPF_FUNC_get_prandom_u32, /* u32 prandom_u32(void) */ | 169 | BPF_FUNC_get_prandom_u32, /* u32 prandom_u32(void) */ |
| 170 | BPF_FUNC_get_smp_processor_id, /* u32 raw_smp_processor_id(void) */ | 170 | BPF_FUNC_get_smp_processor_id, /* u32 raw_smp_processor_id(void) */ |
| 171 | BPF_FUNC_skb_store_bytes, /* int skb_store_bytes(skb, offset, from, len) */ | 171 | |
| 172 | /** | ||
| 173 | * skb_store_bytes(skb, offset, from, len, flags) - store bytes into packet | ||
| 174 | * @skb: pointer to skb | ||
| 175 | * @offset: offset within packet from skb->data | ||
| 176 | * @from: pointer where to copy bytes from | ||
| 177 | * @len: number of bytes to store into packet | ||
| 178 | * @flags: bit 0 - if true, recompute skb->csum | ||
| 179 | * other bits - reserved | ||
| 180 | * Return: 0 on success | ||
| 181 | */ | ||
| 182 | BPF_FUNC_skb_store_bytes, | ||
| 183 | |||
| 184 | /** | ||
| 185 | * l3_csum_replace(skb, offset, from, to, flags) - recompute IP checksum | ||
| 186 | * @skb: pointer to skb | ||
| 187 | * @offset: offset within packet where IP checksum is located | ||
| 188 | * @from: old value of header field | ||
| 189 | * @to: new value of header field | ||
| 190 | * @flags: bits 0-3 - size of header field | ||
| 191 | * other bits - reserved | ||
| 192 | * Return: 0 on success | ||
| 193 | */ | ||
| 194 | BPF_FUNC_l3_csum_replace, | ||
| 195 | |||
| 196 | /** | ||
| 197 | * l4_csum_replace(skb, offset, from, to, flags) - recompute TCP/UDP checksum | ||
| 198 | * @skb: pointer to skb | ||
| 199 | * @offset: offset within packet where TCP/UDP checksum is located | ||
| 200 | * @from: old value of header field | ||
| 201 | * @to: new value of header field | ||
| 202 | * @flags: bits 0-3 - size of header field | ||
| 203 | * bit 4 - is pseudo header | ||
| 204 | * other bits - reserved | ||
| 205 | * Return: 0 on success | ||
| 206 | */ | ||
| 207 | BPF_FUNC_l4_csum_replace, | ||
| 172 | __BPF_FUNC_MAX_ID, | 208 | __BPF_FUNC_MAX_ID, |
| 173 | }; | 209 | }; |
| 174 | 210 | ||
