1 /******************************************************************************
 
   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.
 
   9  ******************************************************************************/
 
  11 /******************************************************************************
 
  13  *      (C)Copyright 1998-2001 SysKonnect GmbH.
 
  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.
 
  20  *      The information in this file is provided "AS IS" without warranty.
 
  22  ******************************************************************************/
 
  24 /******************************************************************************
 
  28  * Public header file for the "GEnesis" common module "CSUM".
 
  30  * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon"
 
  31  * and is the code name of this SysKonnect project.
 
  33  * Compilation Options:
 
  35  *      SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an
 
  38  *      SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id
 
  39  *      definitions. In this case, all SKCS_PROTO_xxx definitions must be made
 
  42  *      SKCS_OVERWRITE_STATUS - Define to overwrite the default return status
 
  43  *      definitions. In this case, all SKCS_STATUS_xxx definitions must be made
 
  46  * Include File Hierarchy:
 
  52  ******************************************************************************/
 
  54 #ifndef __INC_SKCSUM_H
 
  55 #define __INC_SKCSUM_H
 
  57 #include "h/sktypes.h"
 
  58 #include "h/skqueue.h"
 
  60 /* defines ********************************************************************/
 
  63  * Define the default bit flags for 'SKCS_PACKET_INFO.ProtocolFlags'  if no user
 
  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) */
 
  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 */
 
  79  * Define the default SKCS_STATUS type and values if no user overwrite.
 
  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. 
 
  93 #ifndef SKCS_OVERWRITE_STATUS   /* User overwrite? */
 
  94 #define SKCS_STATUS     int     /* Define status type. */
 
  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 */
 
 111 /* Clear protocol statistics event. */
 
 112 #define SK_CSUM_EVENT_CLEAR_PROTO_STATS 1
 
 115  * Add two values in one's complement.
 
 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.
 
 121  *      Result = Value1 + Value2
 
 123 #define SKCS_OC_ADD(Result, Value1, Value2) {                           \
 
 126         Sum = (unsigned long) (Value1) + (unsigned long) (Value2);      \
 
 127         /* Add-in any carry. */                                         \
 
 128         (Result) = (Sum & 0xffff) + (Sum >> 16);                        \
 
 132  * Subtract two values in one's complement.
 
 134  *      Result = Value1 - Value2
 
 136 #define SKCS_OC_SUB(Result, Value1, Value2)     \
 
 137         SKCS_OC_ADD((Result), (Value1), ~(Value2) & 0xffff)
 
 139 /* typedefs *******************************************************************/
 
 142  * SKCS_PROTO_STATS - The CSUM protocol statistics structure.
 
 144  * There is one instance of this structure for each protocol supported.
 
 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. */
 
 155  * s_Csum - The CSUM module context structure.
 
 157 typedef struct s_Csum {
 
 158         /* Enabled receive SK_PROTO_XXX bit flags. */
 
 159         unsigned ReceiveFlags[SK_MAX_NETS];
 
 161         unsigned TransmitFlags[SK_MAX_NETS];
 
 164         /* The protocol statistics structure; one per supported protocol. */
 
 165         SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS];
 
 169  * SKCS_PACKET_INFO - The packet information structure.
 
 171 typedef struct s_CsPacketInfo {
 
 172         /* Bit field specifiying the desired/found protocols. */
 
 173         unsigned ProtocolFlags;
 
 175         /* Length of complete IP header, including any option fields. */
 
 176         unsigned IpHeaderLength;
 
 178         /* IP header checksum. */
 
 179         unsigned IpHeaderChecksum;
 
 181         /* TCP/UDP pseudo header checksum. */
 
 182         unsigned PseudoHeaderChecksum;
 
 185 /* function prototypes ********************************************************/
 
 187 #ifndef SK_CS_CALCULATE_CHECKSUM
 
 188 extern unsigned SkCsCalculateChecksum(
 
 191 #endif /* SK_CS_CALCULATE_CHECKSUM */
 
 193 extern int SkCsEvent(
 
 199 extern SKCS_STATUS SkCsGetReceiveInfo(
 
 206 extern void SkCsSetReceiveFlags(
 
 208         unsigned        ReceiveFlags,
 
 209         unsigned        *pChecksum1Offset,
 
 210         unsigned        *pChecksum2Offset,
 
 213 #endif  /* __INC_SKCSUM_H */