switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Utils / IpChecksum.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief IpChecksum public header */
30
31 #ifndef HH_SENF_Utils_IpChecksum_
32 #define HH_SENF_Utils_IpChecksum_ 1
33
34 // Custom includes
35 #include <boost/cstdint.hpp>
36
37 //#include "IpChecksum.mpp"
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39
40 namespace senf {
41
42     /** \brief Calculate TCP/IP 16bit checksum value
43
44         This class allows calculation of the 16bit checksum value as defined in the TCP/IP v4
45         RFC's. This checksum is \e not a CRC.
46
47         To calculate the checksum, you create an instance of IpChecksum. You then repeatedly call
48         the feed() members to pass data in. After all data has been processed, the sum() member will
49         return the calculated checksum.
50
51         The mathematical properties of the checksum allow to skip any \e even number of zero bytes
52         without changing the checksum value.
53       */
54     class IpChecksum
55     {
56     public:
57         //-////////////////////////////////////////////////////////////////////////
58         // Types
59
60         //-////////////////////////////////////////////////////////////////////////
61         ///\name Structors and default members
62         //\{
63
64         IpChecksum();
65
66         //\}
67         //-////////////////////////////////////////////////////////////////////////
68
69         void feed(boost::uint8_t byte); ///< Feed single byte
70
71         template <class InputIterator>
72         void feed(InputIterator b, InputIterator e);
73                                         ///< Feed range of bytes
74
75         boost::uint16_t sum() const;    ///< Calculate checksum
76
77     protected:
78
79     private:
80         boost::uint32_t sum_;
81         bool odd_;
82     };
83
84
85 }
86
87 //-/////////////////////////////////////////////////////////////////////////////////////////////////
88 #include "IpChecksum.cci"
89 //#include "IpChecksum.ct"
90 #include "IpChecksum.cti"
91 #endif
92
93 \f
94 // Local Variables:
95 // mode: c++
96 // fill-column: 100
97 // comment-column: 40
98 // c-file-style: "senf"
99 // indent-tabs-mode: nil
100 // ispell-local-dictionary: "american"
101 // compile-command: "scons -u test"
102 // End: