From: Guilherme Maciel Ferreira Date: Sat, 12 Nov 2011 02:38:34 +0000 (-0200) Subject: Using Boost.Asio protocol type instead of the enumeration for TCP X-Git-Tag: v1.2~24 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=3bc86f5ea0d1da5db39062c24f19d3136529fa3c;p=pingcheck Using Boost.Asio protocol type instead of the enumeration for TCP - Also, changed the IP address to Boost type --- diff --git a/src/tcp/tcpsegmentfactory.cpp b/src/tcp/tcpsegmentfactory.cpp index 2e0b60d..764b40c 100644 --- a/src/tcp/tcpsegmentfactory.cpp +++ b/src/tcp/tcpsegmentfactory.cpp @@ -26,9 +26,14 @@ #include "tcp/tcpheader.h" #include "tcp/tcpipv4segment.h" +#ifdef IPV6_WORKING +#include "tcp/tcpipv6segment.h" +#endif using namespace std; using boost::asio::ip::address; +using boost::asio::ip::address_v6; +using boost::asio::ip::tcp_raw_protocol; using I2n::Logger::GlobalLogger; //----------------------------------------------------------------------------- @@ -36,36 +41,32 @@ using I2n::Logger::GlobalLogger; //----------------------------------------------------------------------------- TcpSegmentItem TcpSegmentFactory::create_tcp_segment( - const IpVersion version, + const tcp_raw_protocol::socket::protocol_type &protocol, std::istream &is ) { - BOOST_ASSERT( (IP_VERSION_4 == version) || (IP_VERSION_6 == version) ); + BOOST_ASSERT( (tcp_raw_protocol::v4() == protocol) || (tcp_raw_protocol::v6() == protocol) ); TcpSegmentItem tcp_segment; - switch ( version ) + if ( tcp_raw_protocol::v4() == protocol ) { - case IP_VERSION_4: tcp_segment.reset( new TcpIpv4Segment() ); - break; + } #ifdef IPV6_WORKING - case IP_VERSION_6: + else if ( tcp_raw_protocol::v6() == protocol ) + { tcp_segment.reset( new TcpIpv6Segment() ); - break; + } #endif - default: + else + { BOOST_ASSERT( !"Invalid TCP Segment Type." ); - break; } if ( !tcp_segment->read( is ) ) { GlobalLogger.notice() << "Could not read TCP Segment." << endl; - - // TODO why good packets reports as bad? - //IcmpPacketItem icmp_packet_empty; - //tcp_segment = icmp_packet_empty; } return tcp_segment; @@ -73,53 +74,56 @@ TcpSegmentItem TcpSegmentFactory::create_tcp_segment( TcpSegmentItem TcpSegmentFactory::create_tcp_segment_ack_request( - const IpVersion version, - const uint32_t source_address, - const uint32_t destination_address, + const tcp_raw_protocol::socket::protocol_type &protocol, + const address &source_address, + const address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number ) { - BOOST_ASSERT( (IP_VERSION_4 == version) || (IP_VERSION_6 == version) ); + BOOST_ASSERT( (tcp_raw_protocol::v4() == protocol) || (tcp_raw_protocol::v6() == protocol) ); TcpSegmentItem tcp_segment; - switch (version) + if ( tcp_raw_protocol::v4() == protocol ) { - case IP_VERSION_4: tcp_segment = create_tcp_ipv4_segment_ack_request( source_address, destination_address, source_port, destination_port, sequence_number ); - break; + } #ifdef IPV6_WORKING - case IP_VERSION_6: + else if ( tcp_raw_protocol::v6() == protocol ) + { tcp_segment = create_tcp_ipv6_segment_ack_request( source_address, destination_address, source_port, destination_port, sequence_number ); - break; + } #endif - default: + else + { BOOST_ASSERT( !"Invalid TCP Segment Type." ); - break; } return tcp_segment; } TcpSegmentItem TcpSegmentFactory::create_tcp_ipv4_segment_ack_request( - const uint32_t source_address, - const uint32_t destination_address, + const address &source_address, + const address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number ) { + BOOST_ASSERT( source_address.is_v4() ); + BOOST_ASSERT( destination_address.is_v4() ); + // (5 words of 32 bits = 5 * 4 bytes = 20 bytes) const uint8_t header_size_in_words = 5; // size in units of 32 bits const uint16_t window_size_in_octets = 32768; - // Create an TCP header for an ACK request. + // Create a TCP header for an ACK request. TcpHeader tcp_header; tcp_header.set_source_port( source_port ); // assign a random ephemeral port number tcp_header.set_destination_port( destination_port ); @@ -129,8 +133,10 @@ TcpSegmentItem TcpSegmentFactory::create_tcp_ipv4_segment_ack_request( tcp_header.set_window_size( window_size_in_octets ); // window size // Calculate the checksum of the TCP header + uint32_t uint_src_address = source_address.to_v4().to_ulong(); + uint32_t uint_dst_address = destination_address.to_v4().to_ulong(); uint16_t cksum = tcp_header.calculate_tcp_checksum( - source_address, destination_address, NULL, 0 + uint_src_address, uint_dst_address, NULL, 0 ); tcp_header.set_checksum( cksum ); @@ -140,19 +146,22 @@ TcpSegmentItem TcpSegmentFactory::create_tcp_ipv4_segment_ack_request( } TcpSegmentItem TcpSegmentFactory::create_tcp_ipv6_segment_ack_request( - const address source_address, - const address destination_address, + const address &source_address, + const address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number ) { #ifdef IPV6_WORKING + BOOST_ASSERT( source_address.is_v6() ); + BOOST_ASSERT( destination_address.is_v6() ); + // (5 words of 32 bits = 5 * 4 bytes = 20 bytes) const uint8_t header_size_in_words = 5; // size in units of 32 bits const uint16_t window_size_in_octets = 32768; - // Create an TCP header for an ACK request. + // Create a TCP header for an ACK request. TcpHeader tcp_header; tcp_header.set_source_port( source_port ); // assign a random ephemeral port number tcp_header.set_destination_port( destination_port ); @@ -162,8 +171,8 @@ TcpSegmentItem TcpSegmentFactory::create_tcp_ipv6_segment_ack_request( tcp_header.set_window_size( window_size_in_octets ); // window size // Calculate the checksum - uint32_t src_address = source_address.to_v6().to_ulong(); - uint32_t dst_address = destination_address.to_v6().to_ulong(); + address_v6::bytes_type src_address = source_address.to_v6().to_bytes(); + address_v6::bytes_type dst_address = destination_address.to_v6().to_bytes(); uint16_t cksum = tcp_header.calculate_tcp_checksum( src_address, dst_address, NULL, 0 ); diff --git a/src/tcp/tcpsegmentfactory.h b/src/tcp/tcpsegmentfactory.h index 50daa32..e81677a 100644 --- a/src/tcp/tcpsegmentfactory.h +++ b/src/tcp/tcpsegmentfactory.h @@ -26,8 +26,8 @@ #include #include +#include -#include "ip/ipversion.h" #include "tcp/tcpsegment.h" //----------------------------------------------------------------------------- @@ -42,13 +42,13 @@ class TcpSegmentFactory { public: static TcpSegmentItem create_tcp_segment( - const IpVersion version, + const boost::asio::ip::tcp_raw_protocol::socket::protocol_type &protocol, std::istream &is ); static TcpSegmentItem create_tcp_segment_ack_request( - const IpVersion version, - const uint32_t source_address, - const uint32_t destination_address, + const boost::asio::ip::tcp_raw_protocol::socket::protocol_type &protocol, + const boost::asio::ip::address &source_address, + const boost::asio::ip::address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number @@ -56,15 +56,15 @@ public: private: static TcpSegmentItem create_tcp_ipv4_segment_ack_request( - const uint32_t source_address, - const uint32_t destination_address, + const boost::asio::ip::address &source_address, + const boost::asio::ip::address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number ); static TcpSegmentItem create_tcp_ipv6_segment_ack_request( - const boost::asio::ip::address source_address, - const boost::asio::ip::address destination_address, + const boost::asio::ip::address &source_address, + const boost::asio::ip::address &destination_address, const uint16_t source_port, const uint16_t destination_port, const uint16_t sequence_number