Split methods
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sun, 24 Jul 2011 00:18:34 +0000 (21:18 -0300)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sun, 24 Jul 2011 00:18:34 +0000 (21:18 -0300)
- create_tcp_header() to create the TCP header for ACK ping
- print_rst_reply() to print the TCP header for RST reply

src/tcp/tcppinger.cpp
src/tcp/tcppinger.h

index b681660..8f4cd54 100644 (file)
@@ -31,9 +31,6 @@ on this file might be covered by the GNU General Public License.
 
 #include <logfunc.hpp>
 
-#include "ip/ipv4header.h"
-#include "tcp/tcpheader.h"
-
 using namespace std;
 using boost::asio::const_buffers_1;
 using boost::asio::io_service;
@@ -138,14 +135,13 @@ void TcpPinger::start_send()
     ++SequenceNumber;
 
     // Create an TCP header for an ACK request.
-    TcpHeader tcp_header;
-    uint16_t port = ( random() % 16383 ) + 49152; // same as random() % 65536;
-    tcp_header.source_port( port ); // assign an random ephemeral port number
-    tcp_header.destination_port( 80 );
-    tcp_header.sequence_number( ++SequenceNumber );
-    tcp_header.header_length( 5 ); // header size in units of 32 bits (5 words of 32 bits = 5 * 4 bytes = 20 bytes)
-    tcp_header.acknowledgment( true );
-    tcp_header.window_size( 32768 ); // window size
+    uint16_t source_port = static_cast<uint16_t> ( ( random() % 16383 ) + 49152 ); // same as random() % 65536;
+    uint16_t destination_port = 80;
+    TcpHeader tcp_header = create_tcp_header(
+            source_port,
+            destination_port,
+            ++SequenceNumber
+    );
 
     // TODO isolate this part, so it can change without break the rest of the code
     uint32_t src_addr = get_source_address();
@@ -193,6 +189,24 @@ void TcpPinger::start_send()
     );
 }
 
+TcpHeader TcpPinger::create_tcp_header(
+        const uint16_t source_port,
+        const uint16_t destination_port,
+        const uint16_t sequence_number
+) const
+{
+    // Create an TCP header for an ACK request.
+    TcpHeader tcp_header;
+    tcp_header.source_port( source_port ); // assign an random ephemeral port number
+    tcp_header.destination_port( destination_port );
+    tcp_header.sequence_number( sequence_number );
+    tcp_header.header_length( 5 ); // header size in units of 32 bits (5 words of 32 bits = 5 * 4 bytes = 20 bytes)
+    tcp_header.acknowledgment( true );
+    tcp_header.window_size( 32768 ); // window size
+
+    return tcp_header;
+}
+
 void TcpPinger::handle_timeout()
 {
     ReceivedReply = false;
@@ -218,8 +232,6 @@ void TcpPinger::start_receive()
 
 void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred )
 {
-    std::cerr << "handle_receive( " << bytes_transferred << ")" << std::endl; // TODO
-
     // The actual number of bytes received is committed to the buffer so that we
     // can extract it using a std::istream object.
     ReplyBuffer.commit( bytes_transferred );
@@ -231,27 +243,20 @@ void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred )
         return;
     }
 
-    Ipv4Header ipv4_hdr;
-    TcpHeader tcp_hdr;
-    is >> ipv4_hdr >> tcp_hdr;
+    Ipv4Header ipv4_header;
+    TcpHeader tcp_header;
+    is >> ipv4_header >> tcp_header;
 
     // filter out only the TCP reset (RST) replies that match the our expected
     // sequence number.
     if ( is &&
-         tcp_hdr.reset() &&
-         tcp_hdr.sequence_number() == SequenceNumber &&
-         ipv4_hdr.get_source_address() == DestinationEndpoint.address() )
+         tcp_header.reset() &&
+         tcp_header.sequence_number() == SequenceNumber &&
+         ipv4_header.get_source_address() == DestinationEndpoint.address() )
     {
         ReceivedReply = true;
 
-        // TODO print_rst_xxx
-        // Print out some information about the reply packet.
-        // RST from 74.125.234.17: seq=4279499795 ttl=56 time=1707165.000s
-        ptime now = microsec_clock::universal_time();
-        GlobalLogger.notice() << " RST from " << ipv4_hdr.get_source_address()
-            << ": tcp_seq=" << tcp_hdr.sequence_number()
-            << ", ttl=" << ipv4_hdr.get_time_to_live()
-            << " time=" << (now - TimeSent).total_milliseconds() << " ms" << endl;
+        print_rst_reply( ipv4_header, tcp_header );
 
         TcpSegmentReceiveTimer.cancel();
     }
@@ -259,6 +264,25 @@ void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred )
     start_receive();
 }
 
+/**
+ * @brief Prints the RST reply.
+ *
+ * @param ipv4_header The IPv4 header received.
+ * @param tcp_header The TCP RST header.
+ * @return void
+ */
+void TcpPinger::print_rst_reply(
+        const Ipv4Header &ipv4_header,
+        const TcpHeader &tcp_header
+) const
+{
+    ptime now = microsec_clock::universal_time();
+    GlobalLogger.info() << "RST from " << ipv4_header.get_source_address()
+        << ": tcp_seq=" << tcp_header.sequence_number()
+        << ", ttl=" << ipv4_header.get_time_to_live()
+        << " time=" << (now - TimeSent).total_milliseconds() << " ms" << endl;
+}
+
 
 void TcpPinger::set_ping_status( TcpPinger::PingStatus ping_status )
 {
index 4795f7f..87c3ca3 100644 (file)
@@ -27,6 +27,8 @@ on this file might be covered by the GNU General Public License.
 #include <boost/function.hpp>
 
 #include "host/pinger.h"
+#include "ip/ipv4header.h"
+#include "tcp/tcpheader.h"
 
 //-----------------------------------------------------------------------------
 // TcpPinger
@@ -66,11 +68,21 @@ private:
     void set_destination_endpoint( const std::string &destination_ip );
 
     void start_send();
+    TcpHeader create_tcp_header(
+            const uint16_t source_port,
+            const uint16_t destination_port,
+            const uint16_t sequence_number
+    ) const;
     void handle_timeout();
 
     void start_receive();
     void handle_receive_tcp_segment( const std::size_t &bytes_transferred );
 
+    void print_rst_reply(
+            const Ipv4Header &ipv4_header,
+            const TcpHeader &tcp_header
+    ) const;
+
     void set_ping_status( TcpPinger::PingStatus ping_status );
 
     bool select_source_network_interface(