Using Boost.Asio protocol type instead of the enumeration for TCP
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sat, 12 Nov 2011 02:38:34 +0000 (00:38 -0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sat, 12 Nov 2011 02:49:36 +0000 (00:49 -0200)
- Also, changed the IP address to Boost type

src/tcp/tcpsegmentfactory.cpp
src/tcp/tcpsegmentfactory.h

index 2e0b60d..764b40c 100644 (file)
 
 #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
     );
index 50daa32..e81677a 100644 (file)
@@ -26,8 +26,8 @@
 #include <iostream>
 
 #include <boost/asio.hpp>
+#include <boost/asio/ip/tcp_raw_protocol.hpp>
 
-#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