#include <algorithm>
#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
#include "ip/pseudoipv4header.h"
#include "ip/pseudoipv6header.h"
bool TcpHeader::get_congestion_window_reduced() const
{
- return ( Payload[13] & 0x80 );
+ return static_cast<bool>( Payload[13] & 0x80 );
}
bool TcpHeader::get_ecn_echo() const
{
- return ( Payload[13] & 0x40 );
+ return static_cast<bool>( Payload[13] & 0x40 );
}
bool TcpHeader::get_urgent() const
{
- return ( Payload[13] & 0x20 );
+ return static_cast<bool>( Payload[13] & 0x20 );
}
bool TcpHeader::get_acknowledgment() const
{
- return ( Payload[13] & 0x10 );
+ return static_cast<bool>( Payload[13] & 0x10 );
}
bool TcpHeader::get_push() const
{
- return ( Payload[13] & 0x08 );
+ return static_cast<bool>( Payload[13] & 0x08 );
}
bool TcpHeader::get_reset() const
{
- return ( Payload[13] & 0x04 );
+ return static_cast<bool>( Payload[13] & 0x04 );
}
bool TcpHeader::get_synchronize() const
{
- return ( Payload[13] & 0x02 );
+ return static_cast<bool>( Payload[13] & 0x02 );
}
bool TcpHeader::get_finish() const
{
- return ( Payload[13] & 0x01 );
+ return static_cast<bool>( Payload[13] & 0x01 );
}
uint16_t TcpHeader::get_window_size() const
);
PseudoIpv4Header pseudo_header;
- BOOST_ASSERT( src_addr.size() == sizeof(pseudo_header.source_address) );
- BOOST_ASSERT( dest_addr.size() == sizeof(pseudo_header.destination_address) );
+
+ BOOST_ASSERT( address_v4::bytes_type::size() == sizeof(pseudo_header.source_address) );
+ BOOST_ASSERT( address_v4::bytes_type::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 );
);
PseudoIpv6Header pseudo_header;
- BOOST_ASSERT( src_addr.size() == sizeof(pseudo_header.source_address) );
- BOOST_ASSERT( dest_addr.size() == sizeof(pseudo_header.destination_address) );
+
+ BOOST_ASSERT( address_v6::bytes_type::size() == sizeof(pseudo_header.source_address) );
+ BOOST_ASSERT( address_v6::bytes_type::size() == sizeof(pseudo_header.destination_address) );
+
copy( src_addr.begin(), src_addr.end(), pseudo_header.source_address );
copy( dest_addr.begin(), dest_addr.end(), pseudo_header.destination_address );
fill_n( pseudo_header.zero_byte, 3, 0 );
return header.Payload.write( os );
}
-uint16_t TcpHeader::calculate_checksum( const uint16_t *word_array, int size ) const
+uint16_t TcpHeader::calculate_checksum(
+ const uint16_t *word_array,
+ const size_t size
+) const
{
- unsigned long cksum = 0;
- while ( size > 1 )
+ uint64_t cksum = 0;
+ int64_t current_size = static_cast<size_t>( size );
+
+ BOOST_STATIC_ASSERT( (sizeof(current_size) / 2) >= sizeof(size) );
+
+ while ( current_size > 1 )
{
cksum += *word_array++;
- size -= sizeof(word_array[ 0 ]);
+ current_size -= static_cast<int64_t>( sizeof(word_array[ 0 ]) );
}
- if ( size )
+ if ( current_size > 0 )
{
- cksum += *(uint8_t*) word_array;
+ cksum += *(reinterpret_cast<const uint8_t *>( word_array ));
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
- return (uint16_t) (~cksum);
+ return static_cast<uint16_t>( ~cksum );
}