TCP checksum source and destination addresses use Boost.Asio objects instead of primi...
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Tue, 15 Nov 2011 23:06:34 +0000 (21:06 -0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Tue, 15 Nov 2011 23:06:34 +0000 (21:06 -0200)
src/ip/pseudoipv4header.h
src/tcp/tcpheader.cpp
src/tcp/tcpheader.h
src/tcp/tcpsegmentfactory.cpp

index d5cc7fe..d71a0b9 100644 (file)
@@ -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
index 094bc1e..1677f4e 100644 (file)
@@ -25,9 +25,12 @@ on this file might be covered by the GNU General Public License.
 
 #include <algorithm>
 
+#include <boost/assert.hpp>
+
 #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 );
index a25ac19..60e60f8 100644 (file)
@@ -25,6 +25,8 @@ on this file might be covered by the GNU General Public License.
 #include <istream>
 #include <ostream>
 
+#include <boost/asio.hpp>
+
 #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
     );
 
index 764b40c..a7f754b 100644 (file)
@@ -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 );