| /* SCTP kernel reference Implementation | |
| * Copyright (c) 1999-2001 Motorola, Inc. | |
| * Copyright (c) 2001-2003 International Business Machines, Corp. | |
| * | |
| * This file is part of the SCTP kernel reference Implementation | |
| * | |
| * SCTP Checksum functions | |
| * | |
| * The SCTP reference implementation 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, or (at your option) | |
| * any later version. | |
| * | |
| * The SCTP reference implementation is distributed in the hope that it | |
| * will be useful, but WITHOUT ANY WARRANTY; without even the implied | |
| * ************************ | |
| * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| * See the GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with GNU CC; see the file COPYING. If not, see | |
| * <http://www.gnu.org/licenses/>. | |
| * | |
| * Please send any bug reports or fixes you make to the | |
| * email address(es): | |
| * lksctp developers <linux-sctp@vger.kernel.org> | |
| * | |
| * Written or modified by: | |
| * Dinakaran Joseph | |
| * Jon Grimm <jgrimm@us.ibm.com> | |
| * Sridhar Samudrala <sri@us.ibm.com> | |
| * | |
| * Rewritten to use libcrc32c by: | |
| * Vlad Yasevich <vladislav.yasevich@hp.com> | |
| */ | |
| #ifndef __sctp_checksum_h__ | |
| #define __sctp_checksum_h__ | |
| #include <linux/types.h> | |
| #include <net/sctp/sctp.h> | |
| #include <linux/crc32c.h> | |
| #include <linux/crc32.h> | |
| static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum) | |
| { | |
| /* This uses the crypto implementation of crc32c, which is either | |
| * implemented w/ hardware support or resolves to __crc32c_le(). | |
| */ | |
| return crc32c(sum, buff, len); | |
| } | |
| static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2, | |
| int offset, int len) | |
| { | |
| return __crc32c_le_combine(csum, csum2, len); | |
| } | |
| static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, | |
| unsigned int offset) | |
| { | |
| struct sctphdr *sh = sctp_hdr(skb); | |
| __le32 ret, old = sh->checksum; | |
| const struct skb_checksum_ops ops = { | |
| .update = sctp_csum_update, | |
| .combine = sctp_csum_combine, | |
| }; | |
| sh->checksum = 0; | |
| ret = cpu_to_le32(~__skb_checksum(skb, offset, skb->len - offset, | |
| ~(__u32)0, &ops)); | |
| sh->checksum = old; | |
| return ret; | |
| } | |
| #endif /* __sctp_checksum_h__ */ |