00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_Packets_DefaultBundle_TCPPacket_
00027 #define HH_SENF_Packets_DefaultBundle_TCPPacket_ 1
00028
00029
00030 #include <senf/Packets/Packets.hh>
00031
00032
00033
00034
00035 namespace senf {
00036
00045 struct TCPPacketParser : public PacketParserBase
00046 {
00047 # include SENF_PARSER()
00048
00049 SENF_PARSER_FIELD( source, UInt16Parser );
00050 SENF_PARSER_FIELD( destination, UInt16Parser );
00051 SENF_PARSER_FIELD( sequencenumber, UInt32Parser );
00052 SENF_PARSER_FIELD( acknowledgmentnumber, UInt32Parser );
00053
00054 SENF_PARSER_BITFIELD ( dataoffset, 4, unsigned );
00055 SENF_PARSER_PRIVATE_BITFIELD( reserved, 6, unsigned );
00056 SENF_PARSER_BITFIELD ( urgf, 1, bool );
00057 SENF_PARSER_BITFIELD ( ackf, 1, bool );
00058 SENF_PARSER_BITFIELD ( pshf, 1, bool );
00059 SENF_PARSER_BITFIELD ( rstf, 1, bool );
00060 SENF_PARSER_BITFIELD ( synf, 1, bool );
00061 SENF_PARSER_BITFIELD ( finf, 1, bool );
00062
00063 SENF_PARSER_FIELD( window, UInt16Parser );
00064 SENF_PARSER_FIELD( checksum, UInt16Parser );
00065 SENF_PARSER_FIELD( urgentpointer, UInt16Parser );
00066
00067
00068
00069
00070 SENF_PARSER_SKIP( (dataoffset() < 5 ? 0 : dataoffset()*4-20), 0);
00071
00072 SENF_PARSER_FINALIZE(TCPPacketParser);
00073
00074 SENF_PARSER_INIT() {
00075
00076
00077 reserved_() = 0;
00078
00079 dataoffset() = 5;
00080 }
00081
00082 boost::uint16_t calcChecksum() const;
00083
00086 bool validateChecksum() const {
00087 return checksum() == 0u || checksum() == calcChecksum();
00088 }
00089
00091 };
00092
00142 struct TCPPacketType
00143 : public PacketTypeBase,
00144 public PacketTypeMixin<TCPPacketType>
00145 {
00146 #ifndef DOXYGEN
00147 typedef PacketTypeMixin<TCPPacketType> mixin;
00148 #endif
00149 typedef ConcretePacket<TCPPacketType> packet;
00150 typedef TCPPacketParser parser;
00151
00152 using mixin::nextPacketRange;
00153 using mixin::initSize;
00154 using mixin::init;
00155
00157 static void dump(packet p, std::ostream & os);
00158
00159 static void finalize(packet p);
00160
00164 };
00165
00169 typedef ConcretePacket<TCPPacketType> TCPPacket;
00170 }
00171
00172
00173
00174
00175
00176
00177 #endif
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188