| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /****************************************************************************** | 
|  | 2 | * | 
|  | 3 | * Name:	skcsum.h | 
|  | 4 | * Project:	GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx) | 
|  | 5 | * Version:	$Revision: 1.10 $ | 
|  | 6 | * Date:	$Date: 2003/08/20 13:59:57 $ | 
|  | 7 | * Purpose:	Store/verify Internet checksum in send/receive packets. | 
|  | 8 | * | 
|  | 9 | ******************************************************************************/ | 
|  | 10 |  | 
|  | 11 | /****************************************************************************** | 
|  | 12 | * | 
|  | 13 | *	(C)Copyright 1998-2001 SysKonnect GmbH. | 
|  | 14 | * | 
|  | 15 | *	This program is free software; you can redistribute it and/or modify | 
|  | 16 | *	it under the terms of the GNU General Public License as published by | 
|  | 17 | *	the Free Software Foundation; either version 2 of the License, or | 
|  | 18 | *	(at your option) any later version. | 
|  | 19 | * | 
|  | 20 | *	The information in this file is provided "AS IS" without warranty. | 
|  | 21 | * | 
|  | 22 | ******************************************************************************/ | 
|  | 23 |  | 
|  | 24 | /****************************************************************************** | 
|  | 25 | * | 
|  | 26 | * Description: | 
|  | 27 | * | 
|  | 28 | * Public header file for the "GEnesis" common module "CSUM". | 
|  | 29 | * | 
|  | 30 | * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" | 
|  | 31 | * and is the code name of this SysKonnect project. | 
|  | 32 | * | 
|  | 33 | * Compilation Options: | 
|  | 34 | * | 
|  | 35 | *	SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an | 
|  | 36 | *	empty module. | 
|  | 37 | * | 
|  | 38 | *	SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id | 
|  | 39 | *	definitions. In this case, all SKCS_PROTO_xxx definitions must be made | 
|  | 40 | *	external. | 
|  | 41 | * | 
|  | 42 | *	SKCS_OVERWRITE_STATUS - Define to overwrite the default return status | 
|  | 43 | *	definitions. In this case, all SKCS_STATUS_xxx definitions must be made | 
|  | 44 | *	external. | 
|  | 45 | * | 
|  | 46 | * Include File Hierarchy: | 
|  | 47 | * | 
|  | 48 | *	"h/skcsum.h" | 
|  | 49 | *	 "h/sktypes.h" | 
|  | 50 | *	 "h/skqueue.h" | 
|  | 51 | * | 
|  | 52 | ******************************************************************************/ | 
|  | 53 |  | 
|  | 54 | #ifndef __INC_SKCSUM_H | 
|  | 55 | #define __INC_SKCSUM_H | 
|  | 56 |  | 
|  | 57 | #include "h/sktypes.h" | 
|  | 58 | #include "h/skqueue.h" | 
|  | 59 |  | 
|  | 60 | /* defines ********************************************************************/ | 
|  | 61 |  | 
|  | 62 | /* | 
|  | 63 | * Define the default bit flags for 'SKCS_PACKET_INFO.ProtocolFlags'  if no user | 
|  | 64 | * overwrite. | 
|  | 65 | */ | 
|  | 66 | #ifndef SKCS_OVERWRITE_PROTO	/* User overwrite? */ | 
|  | 67 | #define SKCS_PROTO_IP	0x1	/* IP (Internet Protocol version 4) */ | 
|  | 68 | #define SKCS_PROTO_TCP	0x2	/* TCP (Transmission Control Protocol) */ | 
|  | 69 | #define SKCS_PROTO_UDP	0x4	/* UDP (User Datagram Protocol) */ | 
|  | 70 |  | 
|  | 71 | /* Indices for protocol statistics. */ | 
|  | 72 | #define SKCS_PROTO_STATS_IP	0 | 
|  | 73 | #define SKCS_PROTO_STATS_UDP	1 | 
|  | 74 | #define SKCS_PROTO_STATS_TCP	2 | 
|  | 75 | #define SKCS_NUM_PROTOCOLS	3	/* Number of supported protocols. */ | 
|  | 76 | #endif	/* !SKCS_OVERWRITE_PROTO */ | 
|  | 77 |  | 
|  | 78 | /* | 
|  | 79 | * Define the default SKCS_STATUS type and values if no user overwrite. | 
|  | 80 | * | 
|  | 81 | *	SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. | 
|  | 82 | *	SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. | 
|  | 83 | *	SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. | 
|  | 84 | *	SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame | 
|  | 85 | *	SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). | 
|  | 86 | *	SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). | 
|  | 87 | *	SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). | 
|  | 88 | *	SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). | 
|  | 89 | *	SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. | 
|  | 90 | *	SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. | 
|  | 91 | *	SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. | 
|  | 92 | */ | 
|  | 93 | #ifndef SKCS_OVERWRITE_STATUS	/* User overwrite? */ | 
|  | 94 | #define SKCS_STATUS	int	/* Define status type. */ | 
|  | 95 |  | 
|  | 96 | #define SKCS_STATUS_UNKNOWN_IP_VERSION	1 | 
|  | 97 | #define SKCS_STATUS_IP_CSUM_ERROR		2 | 
|  | 98 | #define SKCS_STATUS_IP_FRAGMENT			3 | 
|  | 99 | #define SKCS_STATUS_IP_CSUM_OK			4 | 
|  | 100 | #define SKCS_STATUS_TCP_CSUM_ERROR		5 | 
|  | 101 | #define SKCS_STATUS_UDP_CSUM_ERROR		6 | 
|  | 102 | #define SKCS_STATUS_TCP_CSUM_OK			7 | 
|  | 103 | #define SKCS_STATUS_UDP_CSUM_OK			8 | 
|  | 104 | /* needed for Microsoft */ | 
|  | 105 | #define SKCS_STATUS_IP_CSUM_ERROR_UDP	9 | 
|  | 106 | #define SKCS_STATUS_IP_CSUM_ERROR_TCP	10 | 
|  | 107 | /* UDP checksum may be omitted */ | 
|  | 108 | #define SKCS_STATUS_IP_CSUM_OK_NO_UDP	11 | 
|  | 109 | #endif	/* !SKCS_OVERWRITE_STATUS */ | 
|  | 110 |  | 
|  | 111 | /* Clear protocol statistics event. */ | 
|  | 112 | #define SK_CSUM_EVENT_CLEAR_PROTO_STATS	1 | 
|  | 113 |  | 
|  | 114 | /* | 
|  | 115 | * Add two values in one's complement. | 
|  | 116 | * | 
|  | 117 | * Note: One of the two input values may be "longer" than 16-bit, but then the | 
|  | 118 | * resulting sum may be 17 bits long. In this case, add zero to the result using | 
|  | 119 | * SKCS_OC_ADD() again. | 
|  | 120 | * | 
|  | 121 | *	Result = Value1 + Value2 | 
|  | 122 | */ | 
|  | 123 | #define SKCS_OC_ADD(Result, Value1, Value2) {				\ | 
|  | 124 | unsigned long Sum;						\ | 
|  | 125 | \ | 
|  | 126 | Sum = (unsigned long) (Value1) + (unsigned long) (Value2);	\ | 
|  | 127 | /* Add-in any carry. */						\ | 
|  | 128 | (Result) = (Sum & 0xffff) + (Sum >> 16);			\ | 
|  | 129 | } | 
|  | 130 |  | 
|  | 131 | /* | 
|  | 132 | * Subtract two values in one's complement. | 
|  | 133 | * | 
|  | 134 | *	Result = Value1 - Value2 | 
|  | 135 | */ | 
|  | 136 | #define SKCS_OC_SUB(Result, Value1, Value2)	\ | 
|  | 137 | SKCS_OC_ADD((Result), (Value1), ~(Value2) & 0xffff) | 
|  | 138 |  | 
|  | 139 | /* typedefs *******************************************************************/ | 
|  | 140 |  | 
|  | 141 | /* | 
|  | 142 | * SKCS_PROTO_STATS - The CSUM protocol statistics structure. | 
|  | 143 | * | 
|  | 144 | * There is one instance of this structure for each protocol supported. | 
|  | 145 | */ | 
|  | 146 | typedef struct s_CsProtocolStatistics { | 
|  | 147 | SK_U64 RxOkCts;		/* Receive checksum ok. */ | 
|  | 148 | SK_U64 RxUnableCts;	/* Unable to verify receive checksum. */ | 
|  | 149 | SK_U64 RxErrCts;	/* Receive checksum error. */ | 
|  | 150 | SK_U64 TxOkCts;		/* Transmit checksum ok. */ | 
|  | 151 | SK_U64 TxUnableCts;	/* Unable to calculate checksum in hw. */ | 
|  | 152 | } SKCS_PROTO_STATS; | 
|  | 153 |  | 
|  | 154 | /* | 
|  | 155 | * s_Csum - The CSUM module context structure. | 
|  | 156 | */ | 
|  | 157 | typedef struct s_Csum { | 
|  | 158 | /* Enabled receive SK_PROTO_XXX bit flags. */ | 
|  | 159 | unsigned ReceiveFlags[SK_MAX_NETS]; | 
|  | 160 | #ifdef TX_CSUM | 
|  | 161 | unsigned TransmitFlags[SK_MAX_NETS]; | 
|  | 162 | #endif /* TX_CSUM */ | 
|  | 163 |  | 
|  | 164 | /* The protocol statistics structure; one per supported protocol. */ | 
|  | 165 | SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; | 
|  | 166 | } SK_CSUM; | 
|  | 167 |  | 
|  | 168 | /* | 
|  | 169 | * SKCS_PACKET_INFO - The packet information structure. | 
|  | 170 | */ | 
|  | 171 | typedef struct s_CsPacketInfo { | 
|  | 172 | /* Bit field specifiying the desired/found protocols. */ | 
|  | 173 | unsigned ProtocolFlags; | 
|  | 174 |  | 
|  | 175 | /* Length of complete IP header, including any option fields. */ | 
|  | 176 | unsigned IpHeaderLength; | 
|  | 177 |  | 
|  | 178 | /* IP header checksum. */ | 
|  | 179 | unsigned IpHeaderChecksum; | 
|  | 180 |  | 
|  | 181 | /* TCP/UDP pseudo header checksum. */ | 
|  | 182 | unsigned PseudoHeaderChecksum; | 
|  | 183 | } SKCS_PACKET_INFO; | 
|  | 184 |  | 
|  | 185 | /* function prototypes ********************************************************/ | 
|  | 186 |  | 
|  | 187 | #ifndef SK_CS_CALCULATE_CHECKSUM | 
|  | 188 | extern unsigned SkCsCalculateChecksum( | 
|  | 189 | void		*pData, | 
|  | 190 | unsigned	Length); | 
|  | 191 | #endif /* SK_CS_CALCULATE_CHECKSUM */ | 
|  | 192 |  | 
|  | 193 | extern int SkCsEvent( | 
|  | 194 | SK_AC		*pAc, | 
|  | 195 | SK_IOC		Ioc, | 
|  | 196 | SK_U32		Event, | 
|  | 197 | SK_EVPARA	Param); | 
|  | 198 |  | 
|  | 199 | extern SKCS_STATUS SkCsGetReceiveInfo( | 
|  | 200 | SK_AC		*pAc, | 
|  | 201 | void		*pIpHeader, | 
|  | 202 | unsigned	Checksum1, | 
|  | 203 | unsigned	Checksum2, | 
|  | 204 | int			NetNumber); | 
|  | 205 |  | 
|  | 206 | extern void SkCsGetSendInfo( | 
|  | 207 | SK_AC				*pAc, | 
|  | 208 | void				*pIpHeader, | 
|  | 209 | SKCS_PACKET_INFO	*pPacketInfo, | 
|  | 210 | int					NetNumber); | 
|  | 211 |  | 
|  | 212 | extern void SkCsSetReceiveFlags( | 
|  | 213 | SK_AC		*pAc, | 
|  | 214 | unsigned	ReceiveFlags, | 
|  | 215 | unsigned	*pChecksum1Offset, | 
|  | 216 | unsigned	*pChecksum2Offset, | 
|  | 217 | int			NetNumber); | 
|  | 218 |  | 
|  | 219 | #endif	/* __INC_SKCSUM_H */ |