blob: ec1ccc60a50ddf2bf05a9584ea73c62b1845d5f3 [file] [log] [blame]
/*
* Copyright (c) 2009 Mindspeed Technologies, Inc.
*
* 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.
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*
*/
// Note that Macros are all uppercase
#ifndef _CHECKSUM_H_
#define _CHECKSUM_H_
#include "types.h"
#include "common_hdrs.h"
#ifdef GCC_TOOLCHAIN
U16 ip_fast_checksum(void *iph, unsigned int ihl);
U32 checksum_partial_nofold(void *buf, U32 len, U32 sum);
U16 checksum_partial(void *buf, U32 len, U32 sum);
U32 pseudoheader_checksum(U32 saddr, U32 daddr, U16 len, U8 proto);
U16 compute_checksum(void *dmem_addr, unsigned int dmem_len, void *ddr_addr, unsigned int ddr_len, U32 sum);
static inline U16 checksum_fold(U32 sum)
{
while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
return ~((U16)sum);
}
static inline U16 ip_fast_checksum_gen(ipv4_hdr_t *iph)
{
iph->HeaderChksum = 0;
return ip_fast_checksum(iph, iph->Version_IHL & 0x0f);
}
#else
/********************************************************************************
*
* NAME: IPHeader_Checksum
*
* USAGE: parameter(s):
* - iph : pointer on the begin of IP header.
* - ihl : header length in WORD (32 bit)
*
* return value:
* - The checksum field is the 16 bit one's complement of
* the one's complement sum of all 16 bit words in the
* header.
*
* DESCRIPTION: IP header must bit 32 bit aligned. ihl is a number of WORD.
* Checksum is already complemented
*
********************************************************************************/
U16 ip_fast_checksum(void* iph, unsigned int ihl);
U16 ip_fast_checksum_gen(void* iph);
/********************************************************************************
*
* NAME: pseudoheader_checksum
*
* USAGE: parameter(s):
* - saddr : IP source address
* - daddr : IP dest address
* - len : data length
* - proto : IP protocol
*
* return value:
* - 16 bit checksum of Pseudo-header, not complemented
* to be used as input of checksum_partial
*
********************************************************************************/
U16 pseudoheader_checksum(U32 saddr, U32 daddr, U16 len, U8 proto);
U16 merge_checksum(U32 temp1, U32 Temp2);
/********************************************************************************
*
* NAME: checksum_partial
*
* USAGE: parameter(s):
* - buff : pointer on data
* - len : length in bytes
* - sum : previous checksum
*
* return value:
* - 16 bit checksum, complemented
*
********************************************************************************/
U16 checksum_partial(void *buff, U16 len, U32 sum);
U16 Internet_checksum(void *buff, U16 len, U32 sum);
#endif
// The udpheader_checksum and tcpheader_checksum routines return uncomplemented values
#define udpheader_checksum(buff, sum) ((U16)~checksum_partial((buff), sizeof(udp_hdr_t), (sum)))
#define tcpheader_checksum(buff, sum) ((U16)~checksum_partial((buff), sizeof(tcp_hdr_t), (sum)))
#endif /* _CHECKSUM_H_ */