diff options
author | Daniel Borkmann <daniel@iogearbox.net> | 2016-02-19 23:05:23 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-02-21 22:07:09 -0500 |
commit | 7d672345ed295b1356a5d9f7111da1d1d7d65867 (patch) | |
tree | d5217c3aea82938bf7f2896dc74dd79e38fe733e /net/x25/x25_out.c | |
parent | 8e2fe1d9f1a20924f98ea46931a1d7fb092aa876 (diff) | |
download | blackbird-obmc-linux-7d672345ed295b1356a5d9f7111da1d1d7d65867.tar.gz blackbird-obmc-linux-7d672345ed295b1356a5d9f7111da1d1d7d65867.zip |
bpf: add generic bpf_csum_diff helper
For L4 checksums, we currently have bpf_l4_csum_replace() helper. It's
currently limited to handle 2 and 4 byte changes in a header and feeds the
from/to into inet_proto_csum_replace{2,4}() helpers of the kernel. When
working with IPv6, for example, this makes it rather cumbersome to deal
with, similarly when editing larger parts of a header.
Instead, extend the API in a more generic way: For bpf_l4_csum_replace(),
add a case for header field mask of 0 to change the checksum at a given
offset through inet_proto_csum_replace_by_diff(), and provide a helper
bpf_csum_diff() that can generically calculate a from/to diff for arbitrary
amounts of data.
This can be used in multiple ways: for the bpf_l4_csum_replace() only
part, this even provides us with the option to insert precalculated diffs
from user space f.e. from a map, or from bpf_csum_diff() during runtime.
bpf_csum_diff() has a optional from/to stack buffer input, so we can
calculate a diff by using a scratchbuffer for scenarios where we're
inserting (from is NULL), removing (to is NULL) or diffing (from/to buffers
don't need to be of equal size) data. Also, bpf_csum_diff() allows to
feed a previous csum into csum_partial(), so the function can also be
cascaded.
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/x25/x25_out.c')
0 files changed, 0 insertions, 0 deletions