Release 4.7 include/net/checksum.h
/*
* INET An implementation of the TCP/IP protocol suite for the LINUX
* operating system. INET is implemented using the BSD Socket
* interface as the means of communication with the user level.
*
* Checksumming functions for IP, TCP, UDP and so on
*
* Authors: Jorge Cwik, <jorge@laser.satlink.net>
* Arnt Gulbrandsen, <agulbra@nvg.unit.no>
* Borrows very liberally from tcp.c and ip.c, see those
* files for more names.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _CHECKSUM_H
#define _CHECKSUM_H
#include <linux/errno.h>
#include <asm/types.h>
#include <asm/byteorder.h>
#include <asm/uaccess.h>
#include <asm/checksum.h>
#ifndef _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
static inline
__wsum csum_and_copy_from_user (const void __user *src, void *dst,
int len, __wsum sum, int *err_ptr)
{
if (access_ok(VERIFY_READ, src, len))
return csum_partial_copy_from_user(src, dst, len, sum, err_ptr);
if (len)
*err_ptr = -EFAULT;
return sum;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 59 | 90.77% | 2 | 40.00% |
al viro | al viro | 5 | 7.69% | 2 | 40.00% |
jesper juhl | jesper juhl | 1 | 1.54% | 1 | 20.00% |
| Total | 65 | 100.00% | 5 | 100.00% |
#endif
#ifndef HAVE_CSUM_COPY_USER
static __inline__ __wsum csum_and_copy_to_user
(const void *src, void __user *dst, int len, __wsum sum, int *err_ptr)
{
sum = csum_partial(src, len, sum);
if (access_ok(VERIFY_WRITE, dst, len)) {
if (copy_to_user(dst, src, len) == 0)
return sum;
}
if (len)
*err_ptr = -EFAULT;
return (__force __wsum)-1; /* invalid checksum */
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 77 | 89.53% | 1 | 33.33% |
al viro | al viro | 9 | 10.47% | 2 | 66.67% |
| Total | 86 | 100.00% | 3 | 100.00% |
#endif
#ifndef HAVE_ARCH_CSUM_ADD
static inline __wsum csum_add(__wsum csum, __wsum addend)
{
u32 res = (__force u32)csum;
res += (__force u32)addend;
return (__force __wsum)(res + (res < (__force u32)addend));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
al viro | al viro | 28 | 57.14% | 1 | 33.33% |
pre-git | pre-git | 21 | 42.86% | 2 | 66.67% |
| Total | 49 | 100.00% | 3 | 100.00% |
#endif
static inline __wsum csum_sub(__wsum csum, __wsum addend)
{
return csum_add(csum, ~addend);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 19 | 86.36% | 1 | 50.00% |
al viro | al viro | 3 | 13.64% | 1 | 50.00% |
| Total | 22 | 100.00% | 2 | 100.00% |
static inline __sum16 csum16_add(__sum16 csum, __be16 addend)
{
u16 res = (__force u16)csum;
res += (__force u16)addend;
return (__force __sum16)(res + (res < (__force u16)addend));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
eric dumazet | eric dumazet | 49 | 100.00% | 1 | 100.00% |
| Total | 49 | 100.00% | 1 | 100.00% |
static inline __sum16 csum16_sub(__sum16 csum, __be16 addend)
{
return csum16_add(csum, ~addend);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
eric dumazet | eric dumazet | 22 | 100.00% | 1 | 100.00% |
| Total | 22 | 100.00% | 1 | 100.00% |
static inline __wsum
csum_block_add(__wsum csum, __wsum csum2, int offset)
{
u32 sum = (__force u32)csum2;
/* rotate sum to align it with a 16b boundary */
if (offset & 1)
sum = ror32(sum, 8);
return csum_add(csum, (__force __wsum)sum);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 29 | 54.72% | 1 | 33.33% |
al viro | al viro | 19 | 35.85% | 1 | 33.33% |
alexander duyck | alexander duyck | 5 | 9.43% | 1 | 33.33% |
| Total | 53 | 100.00% | 3 | 100.00% |
static inline __wsum
csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len)
{
return csum_block_add(csum, csum2, offset);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
daniel borkmann | daniel borkmann | 26 | 89.66% | 1 | 33.33% |
pre-git | pre-git | 2 | 6.90% | 1 | 33.33% |
al viro | al viro | 1 | 3.45% | 1 | 33.33% |
| Total | 29 | 100.00% | 3 | 100.00% |
static inline __wsum
csum_block_sub(__wsum csum, __wsum csum2, int offset)
{
return csum_block_add(csum, ~csum2, offset);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 17 | 62.96% | 1 | 25.00% |
alexander duyck | alexander duyck | 5 | 18.52% | 1 | 25.00% |
daniel borkmann | daniel borkmann | 3 | 11.11% | 1 | 25.00% |
al viro | al viro | 2 | 7.41% | 1 | 25.00% |
| Total | 27 | 100.00% | 4 | 100.00% |
static inline __wsum csum_unfold(__sum16 n)
{
return (__force __wsum)n;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
al viro | al viro | 17 | 100.00% | 1 | 100.00% |
| Total | 17 | 100.00% | 1 | 100.00% |
static inline __wsum csum_partial_ext(const void *buff, int len, __wsum sum)
{
return csum_partial(buff, len, sum);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
daniel borkmann | daniel borkmann | 28 | 100.00% | 1 | 100.00% |
| Total | 28 | 100.00% | 1 | 100.00% |
#define CSUM_MANGLED_0 ((__force __sum16)0xffff)
static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
{
*sum = csum_fold(csum_add(diff, ~csum_unfold(*sum)));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
daniel borkmann | daniel borkmann | 32 | 100.00% | 1 | 100.00% |
| Total | 32 | 100.00% | 1 | 100.00% |
static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to)
{
__wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from);
*sum = csum_fold(csum_add(tmp, (__force __wsum)to));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
patrick mchardy | patrick mchardy | 27 | 50.94% | 1 | 33.33% |
eric dumazet | eric dumazet | 20 | 37.74% | 1 | 33.33% |
christophe leroy | christophe leroy | 6 | 11.32% | 1 | 33.33% |
| Total | 53 | 100.00% | 3 | 100.00% |
/* Implements RFC 1624 (Incremental Internet Checksum)
* 3. Discussion states :
* HC' = ~(~HC + ~m + m')
* m : old value of a 16bit field
* m' : new value of a 16bit field
*/
static inline void csum_replace2(__sum16 *sum, __be16 old, __be16 new)
{
*sum = ~csum16_add(csum16_sub(~(*sum), old), new);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
patrick mchardy | patrick mchardy | 21 | 56.76% | 1 | 50.00% |
eric dumazet | eric dumazet | 16 | 43.24% | 1 | 50.00% |
| Total | 37 | 100.00% | 2 | 100.00% |
struct sk_buff;
void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
__be32 from, __be32 to, bool pseudohdr);
void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
const __be32 *from, const __be32 *to,
bool pseudohdr);
void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
__wsum diff, bool pseudohdr);
static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
__be16 from, __be16 to,
bool pseudohdr)
{
inet_proto_csum_replace4(sum, skb, (__force __be32)from,
(__force __be32)to, pseudohdr);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
patrick mchardy | patrick mchardy | 45 | 97.83% | 1 | 50.00% |
tom herbert | tom herbert | 1 | 2.17% | 1 | 50.00% |
| Total | 46 | 100.00% | 2 | 100.00% |
static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
int start, int offset)
{
__sum16 *psum = (__sum16 *)(ptr + offset);
__wsum delta;
/* Subtract out checksum up to start */
csum = csum_sub(csum, csum_partial(ptr, start, 0));
/* Set derived checksum in packet */
delta = csum_sub((__force __wsum)csum_fold(csum),
(__force __wsum)*psum);
*psum = csum_fold(csum);
return delta;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
tom herbert | tom herbert | 87 | 100.00% | 2 | 100.00% |
| Total | 87 | 100.00% | 2 | 100.00% |
static inline void remcsum_unadjust(__sum16 *psum, __wsum delta)
{
*psum = csum_fold(csum_sub(delta, *psum));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
tom herbert | tom herbert | 28 | 100.00% | 1 | 100.00% |
| Total | 28 | 100.00% | 1 | 100.00% |
#endif
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 253 | 29.98% | 9 | 30.00% |
tom herbert | tom herbert | 142 | 16.82% | 6 | 20.00% |
patrick mchardy | patrick mchardy | 142 | 16.82% | 2 | 6.67% |
eric dumazet | eric dumazet | 108 | 12.80% | 2 | 6.67% |
daniel borkmann | daniel borkmann | 89 | 10.55% | 3 | 10.00% |
al viro | al viro | 88 | 10.43% | 3 | 10.00% |
alexander duyck | alexander duyck | 10 | 1.18% | 1 | 3.33% |
christophe leroy | christophe leroy | 6 | 0.71% | 1 | 3.33% |
arnaldo carvalho de melo | arnaldo carvalho de melo | 3 | 0.36% | 1 | 3.33% |
david s. miller | david s. miller | 2 | 0.24% | 1 | 3.33% |
jesper juhl | jesper juhl | 1 | 0.12% | 1 | 3.33% |
| Total | 844 | 100.00% | 30 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.