• Daniel Borkmann's avatar
    bpf: add generic bpf_csum_diff helper · 7d672345
    Daniel Borkmann authored
    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: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    7d672345
filter.c 56.3 KB