#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;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
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;
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 );
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 );
}
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 );
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
);
#include <iostream>
#include <boost/asio.hpp>
+#include <boost/asio/ip/tcp_raw_protocol.hpp>
-#include "ip/ipversion.h"
#include "tcp/tcpsegment.h"
//-----------------------------------------------------------------------------
{
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
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