linux/include/net/sctp/checksum.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/* SCTP kernel reference Implementation
   3 * Copyright (c) 1999-2001 Motorola, Inc.
   4 * Copyright (c) 2001-2003 International Business Machines, Corp.
   5 *
   6 * This file is part of the SCTP kernel reference Implementation
   7 *
   8 * SCTP Checksum functions
   9 *
  10 * Please send any bug reports or fixes you make to the
  11 * email address(es):
  12 *    lksctp developers <linux-sctp@vger.kernel.org>
  13 *
  14 * Written or modified by:
  15 *    Dinakaran Joseph
  16 *    Jon Grimm <jgrimm@us.ibm.com>
  17 *    Sridhar Samudrala <sri@us.ibm.com>
  18 *
  19 * Rewritten to use libcrc32c by:
  20 *    Vlad Yasevich <vladislav.yasevich@hp.com>
  21 */
  22
  23#ifndef __sctp_checksum_h__
  24#define __sctp_checksum_h__
  25
  26#include <linux/types.h>
  27#include <net/sctp/sctp.h>
  28#include <linux/crc32c.h>
  29#include <linux/crc32.h>
  30
  31static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum)
  32{
  33        /* This uses the crypto implementation of crc32c, which is either
  34         * implemented w/ hardware support or resolves to __crc32c_le().
  35         */
  36        return (__force __wsum)crc32c((__force __u32)sum, buff, len);
  37}
  38
  39static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
  40                                       int offset, int len)
  41{
  42        return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
  43                                                   (__force __u32)csum2, len);
  44}
  45
  46static const struct skb_checksum_ops sctp_csum_ops = {
  47        .update  = sctp_csum_update,
  48        .combine = sctp_csum_combine,
  49};
  50
  51static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
  52                                        unsigned int offset)
  53{
  54        struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);
  55        __le32 old = sh->checksum;
  56        __wsum new;
  57
  58        sh->checksum = 0;
  59        new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0,
  60                              &sctp_csum_ops);
  61        sh->checksum = old;
  62
  63        return cpu_to_le32((__force __u32)new);
  64}
  65
  66#endif /* __sctp_checksum_h__ */
  67