00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "UDPPacket.hh"
00027
00028
00029
00030 #include <iomanip>
00031 #include <boost/io/ios_state.hpp>
00032 #include <senf/Utils/IpChecksum.hh>
00033 #include "IPv6Packet.hh"
00034
00035 #define prefix_
00036
00037
00038 namespace {
00039 SENF_PACKET_REGISTRY_REGISTER( senf::IpTypes, 17, senf::UDPPacket);
00040 }
00041
00042
00043
00044
00045 prefix_ boost::uint16_t senf::UDPPacketParser::calcChecksum()
00046 const
00047 {
00048 IpChecksum summer;
00049
00050 IPv4Packet ipv4 (packet().rfind<IPv4Packet>(nothrow));
00051 if (ipv4) {
00052
00053 summer.feed( ipv4->source().i(),
00054 ipv4->source().i() + IPv4Packet::Parser::source_t::fixed_bytes );
00056 summer.feed( ipv4->destination().i(),
00057 ipv4->destination().i() + IPv4PacketParser::destination_t::fixed_bytes );
00058 summer.feed( 0u );
00061 summer.feed( 17u );
00062 summer.feed( i() + length_offset, i() + length_offset + 2 );
00063 }
00064 else {
00065
00066 IPv6Packet ipv6 (packet().rfind<IPv6Packet>(nothrow));
00067 if (ipv6) {
00068 summer.feed( ipv6->source().i(),
00069 ipv6->source().i() + IPv6Packet::Parser::source_t::fixed_bytes );
00071
00072 summer.feed( ipv6->destination().i(),
00073 ipv6->destination().i() + IPv6PacketParser::destination_t::fixed_bytes );
00074
00075
00076 summer.feed( i() + length_offset, i() + length_offset + 2 );
00077
00078
00079 summer.feed( 0u );
00080 summer.feed( 17u );
00081 }
00082 }
00083
00084
00085
00086 summer.feed( i(), i()+checksum_offset );
00087 summer.feed( i()+checksum_offset+2, data().end() );
00088
00089 boost::uint16_t rv (summer.sum());
00090 return rv ? rv : 0xffffu;
00091 }
00092
00093
00094
00095
00096 prefix_ void senf::UDPPacketType::dump(packet p, std::ostream & os)
00097 {
00098 boost::io::ios_all_saver ias(os);
00099 os << "UDP:\n"
00100 << senf::fieldName("source port") << p->source() << "\n"
00101 << senf::fieldName("dest port") << p->destination() << "\n"
00102 << senf::fieldName("length") << p->length() << "\n"
00103 << senf::fieldName("checksum")
00104 << "0x" << std::hex << std::setw(4) << std::setfill('0') << std::right << p->checksum() << "\n";
00105 }
00106
00107 prefix_ void senf::UDPPacketType::finalize(packet p)
00108 {
00109 p->length() << p.size();
00110 p->checksum() << p->calcChecksum();
00111 }
00112
00113
00114 #undef prefix_
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125