#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;
++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();
);
}
+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;
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 );
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();
}
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 )
{
#include <boost/function.hpp>
#include "host/pinger.h"
+#include "ip/ipv4header.h"
+#include "tcp/tcpheader.h"
//-----------------------------------------------------------------------------
// TcpPinger
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(