{
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
#include <algorithm>
+#include <boost/assert.hpp>
+
#include "ip/pseudoipv4header.h"
using namespace std;
+using boost::asio::ip::address_v4;
//-----------------------------------------------------------------------------
// TcpHeader
}
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 );
);
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 );
#include <istream>
#include <ostream>
+#include <boost/asio.hpp>
+
#include "host/messagepayload.h"
//-----------------------------------------------------------------------------
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
);
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;
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 );