From 939ad8bd7259820217b6a30d1946fdc09869b01c Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Tue, 15 Nov 2011 21:06:34 -0200 Subject: [PATCH] TCP checksum source and destination addresses use Boost.Asio objects instead of primitive types --- src/ip/pseudoipv4header.h | 4 ++-- src/tcp/tcpheader.cpp | 16 +++++++++++----- src/tcp/tcpheader.h | 8 +++++--- src/tcp/tcpsegmentfactory.cpp | 7 ++++--- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/ip/pseudoipv4header.h b/src/ip/pseudoipv4header.h index d5cc7fe..d71a0b9 100644 --- a/src/ip/pseudoipv4header.h +++ b/src/ip/pseudoipv4header.h @@ -55,9 +55,9 @@ class PseudoIpv4Header { public: /// Source IPv4 address - uint32_t source_address; + uint8_t source_address[4]; /// Destination IPv4 address - uint32_t destination_address; + uint8_t destination_address[4]; /// Zero uint8_t zero_byte; /// Transport layer protocol diff --git a/src/tcp/tcpheader.cpp b/src/tcp/tcpheader.cpp index 094bc1e..1677f4e 100644 --- a/src/tcp/tcpheader.cpp +++ b/src/tcp/tcpheader.cpp @@ -25,9 +25,12 @@ on this file might be covered by the GNU General Public License. #include +#include + #include "ip/pseudoipv4header.h" using namespace std; +using boost::asio::ip::address_v4; //----------------------------------------------------------------------------- // TcpHeader @@ -116,9 +119,9 @@ uint16_t TcpHeader::get_checksum() const } uint16_t TcpHeader::calculate_tcp_checksum( - const uint32_t src_addr, - const uint32_t dest_addr, - const char* tcp_payload_data, + const address_v4::bytes_type &src_addr, + const address_v4::bytes_type &dest_addr, + const uint8_t* tcp_payload_data, const uint16_t tcp_payload_size_in_bytes ) { set_checksum( 0 ); @@ -127,8 +130,11 @@ uint16_t TcpHeader::calculate_tcp_checksum( ); PseudoIpv4Header pseudo_header; - pseudo_header.source_address = htonl(src_addr); - pseudo_header.destination_address = htonl(dest_addr); + BOOST_ASSERT( src_addr.size() == sizeof(pseudo_header.source_address) ); + BOOST_ASSERT( dest_addr.size() == sizeof(pseudo_header.destination_address) ); + // Byte ordering (i.e. endianness) is handle by Boost.Asio + copy( src_addr.begin(), src_addr.end(), pseudo_header.source_address ); + copy( dest_addr.begin(), dest_addr.end(), pseudo_header.destination_address ); pseudo_header.zero_byte = 0; pseudo_header.protocol = IPPROTO_TCP; pseudo_header.header_length = htons( tcp_segment_size_in_bytes ); diff --git a/src/tcp/tcpheader.h b/src/tcp/tcpheader.h index a25ac19..60e60f8 100644 --- a/src/tcp/tcpheader.h +++ b/src/tcp/tcpheader.h @@ -25,6 +25,8 @@ on this file might be covered by the GNU General Public License. #include #include +#include + #include "host/messagepayload.h" //----------------------------------------------------------------------------- @@ -90,9 +92,9 @@ public: uint16_t get_checksum() const; uint16_t calculate_tcp_checksum( - const uint32_t src_addr, - const uint32_t dest_addr, - const char* tcp_payload_data, + const boost::asio::ip::address_v4::bytes_type &src_addr, + const boost::asio::ip::address_v4::bytes_type &dest_addr, + const uint8_t *tcp_payload_data, const uint16_t tcp_payload_size_in_bytes ); diff --git a/src/tcp/tcpsegmentfactory.cpp b/src/tcp/tcpsegmentfactory.cpp index 764b40c..a7f754b 100644 --- a/src/tcp/tcpsegmentfactory.cpp +++ b/src/tcp/tcpsegmentfactory.cpp @@ -32,6 +32,7 @@ using namespace std; using boost::asio::ip::address; +using boost::asio::ip::address_v4; using boost::asio::ip::address_v6; using boost::asio::ip::tcp_raw_protocol; using I2n::Logger::GlobalLogger; @@ -133,10 +134,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(); + address_v4::bytes_type src_address = source_address.to_v4().to_bytes(); + address_v4::bytes_type dst_address = destination_address.to_v4().to_bytes(); uint16_t cksum = tcp_header.calculate_tcp_checksum( - uint_src_address, uint_dst_address, NULL, 0 + src_address, dst_address, NULL, 0 ); tcp_header.set_checksum( cksum ); -- 1.7.1