icmp/icmpechorequestmessage.cpp
icmp/icmpgenericmessage.cpp
icmp/icmpmessage.cpp
+ icmp/icmpmessagepayload.cpp
icmp/icmpheader.cpp
icmp/icmppacket.cpp
icmp/ipv4header.cpp
// IcmpDestinationUnreachableMessage
//-----------------------------------------------------------------------------
-const int IcmpDestinationUnreachableMessage::MessageSizeInBytes = 44;
+static const int MessageSizeInBytes = 44;
-IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage()
+IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage() :
+ Payload( MessageSizeInBytes )
{
- fill( Payload, Payload + sizeof(Payload), 0 );
}
IcmpDestinationUnreachableMessage::~IcmpDestinationUnreachableMessage()
uint16_t IcmpDestinationUnreachableMessage::get_checksum() const
{
- return decode( 2, 3 );
+ return Payload.decode( 2, 3 );
}
void IcmpDestinationUnreachableMessage::set_checksum( uint16_t checksum )
{
- encode( 2, 3, checksum );
+ Payload.encode( 2, 3, checksum );
}
uint16_t IcmpDestinationUnreachableMessage::get_identifier() const
{
- return decode( 32, 33 );
+ return Payload.decode( 32, 33 );
}
void IcmpDestinationUnreachableMessage::set_identifier(
const uint16_t identifier
)
{
- encode( 32, 33, identifier );
+ Payload.encode( 32, 33, identifier );
}
uint16_t IcmpDestinationUnreachableMessage::get_sequence_number() const
{
- return decode( 34, 35 );
+ return Payload.decode( 34, 35 );
}
void IcmpDestinationUnreachableMessage::set_sequence_number(
const uint16_t sequence_number
)
{
- encode( 34, 35, sequence_number );
+ Payload.encode( 34, 35, sequence_number );
}
std::istream& IcmpDestinationUnreachableMessage::read( std::istream &is )
{
- return is.read(
- reinterpret_cast<char *> ( Payload ),
- IcmpDestinationUnreachableMessage::MessageSizeInBytes
- );
+ return Payload.read( is );
}
std::ostream& IcmpDestinationUnreachableMessage::write(
std::ostream &os
) const
{
- return os.write(
- reinterpret_cast<const char *> ( Payload ),
- IcmpDestinationUnreachableMessage::MessageSizeInBytes
- );
-}
-
-uint16_t IcmpDestinationUnreachableMessage::decode( int left_byte, int right_byte ) const
-{
- return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ];
-}
-
-void IcmpDestinationUnreachableMessage::encode( int left_byte, int right_byte, uint16_t value )
-{
- Payload[ left_byte ] = static_cast<uint8_t> ( value >> 8 );
- Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+ return Payload.write( os );
}
#include <ostream>
#include "icmp/icmpmessage.h"
+#include "icmp/icmpmessagepayload.h"
//-----------------------------------------------------------------------------
// IcmpDestinationUnreachableMessage
std::ostream& write( std::ostream &os ) const;
private:
- uint16_t decode( int left_byte, int right_byte ) const;
- void encode( int left_byte, int right_byte, uint16_t value );
-
-private:
- static const int MessageSizeInBytes;
- uint8_t Payload[ 44 ];
+ IcmpMessagePayload Payload;
};
// IcmpEchoReplyMessage
//-----------------------------------------------------------------------------
-const int IcmpEchoReplyMessage::MessageSizeInBytes = 8;
+static const int MessageSizeInBytes = 8;
-IcmpEchoReplyMessage::IcmpEchoReplyMessage()
+IcmpEchoReplyMessage::IcmpEchoReplyMessage() :
+ Payload( MessageSizeInBytes )
{
- fill( Payload, Payload + sizeof(Payload), 0 );
}
IcmpEchoReplyMessage::~IcmpEchoReplyMessage()
uint16_t IcmpEchoReplyMessage::get_checksum() const
{
- return decode( 2, 3 );
+ return Payload.decode( 2, 3 );
}
void IcmpEchoReplyMessage::set_checksum( uint16_t checksum )
{
- encode( 2, 3, checksum );
+ Payload.encode( 2, 3, checksum );
}
uint16_t IcmpEchoReplyMessage::get_identifier() const
{
- return decode( 4, 5 );
+ return Payload.decode( 4, 5 );
}
void IcmpEchoReplyMessage::set_identifier(
const uint16_t identifier
)
{
- encode( 4, 5, identifier );
+ Payload.encode( 4, 5, identifier );
}
uint16_t IcmpEchoReplyMessage::get_sequence_number() const
{
- return decode( 6, 7 );
+ return Payload.decode( 6, 7 );
}
void IcmpEchoReplyMessage::set_sequence_number(
const uint16_t sequence_number
)
{
- encode( 6, 7, sequence_number );
+ Payload.encode( 6, 7, sequence_number );
}
std::istream& IcmpEchoReplyMessage::read( std::istream &is )
{
- return is.read(
- reinterpret_cast<char *> ( Payload ),
- IcmpEchoReplyMessage::MessageSizeInBytes
- );
+ return Payload.read( is );
}
std::ostream& IcmpEchoReplyMessage::write( std::ostream &os ) const
{
- return os.write(
- reinterpret_cast<const char *> ( Payload ),
- IcmpEchoReplyMessage::MessageSizeInBytes
- );
-}
-
-uint16_t IcmpEchoReplyMessage::decode( int left_byte, int right_byte ) const
-{
- return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ];
-}
-
-void IcmpEchoReplyMessage::encode( int left_byte, int right_byte, uint16_t value )
-{
- Payload[ left_byte ] = static_cast<uint8_t> ( value >> 8 );
- Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+ return Payload.write( os );
}
#include <ostream>
#include "icmp/icmpmessage.h"
+#include "icmp/icmpmessagepayload.h"
//-----------------------------------------------------------------------------
// IcmpEchoReplyMessage
std::ostream& write( std::ostream &os ) const;
private:
- uint16_t decode( int left_byte, int right_byte ) const;
- void encode( int left_byte, int right_byte, uint16_t value );
-
-private:
- static const int MessageSizeInBytes;
- uint8_t Payload[ 8 ];
+ IcmpMessagePayload Payload;
};
// IcmpEchoRequestMessage
//-----------------------------------------------------------------------------
-const int IcmpEchoRequestMessage::MessageSizeInBytes = 8;
+static const int MessageSizeInBytes = 8;
-IcmpEchoRequestMessage::IcmpEchoRequestMessage()
+IcmpEchoRequestMessage::IcmpEchoRequestMessage() :
+ Payload( MessageSizeInBytes )
{
- fill( Payload, Payload + sizeof(Payload), 0 );
}
IcmpEchoRequestMessage::~IcmpEchoRequestMessage()
uint16_t IcmpEchoRequestMessage::get_checksum() const
{
- return decode( 2, 3 );
+ return Payload.decode( 2, 3 );
}
void IcmpEchoRequestMessage::set_checksum( uint16_t checksum )
{
- encode( 2, 3, checksum );
+ Payload.encode( 2, 3, checksum );
}
uint16_t IcmpEchoRequestMessage::get_identifier() const
{
- return decode( 4, 5 );
+ return Payload.decode( 4, 5 );
}
void IcmpEchoRequestMessage::set_identifier(
const uint16_t identifier
)
{
- encode( 4, 5, identifier );
+ Payload.encode( 4, 5, identifier );
}
uint16_t IcmpEchoRequestMessage::get_sequence_number() const
{
- return decode( 6, 7 );
+ return Payload.decode( 6, 7 );
}
void IcmpEchoRequestMessage::set_sequence_number(
const uint16_t sequence_number
)
{
- encode( 6, 7, sequence_number );
+ Payload.encode( 6, 7, sequence_number );
}
std::istream& IcmpEchoRequestMessage::read( std::istream &is )
{
- return is.read(
- reinterpret_cast<char *> ( Payload ),
- IcmpEchoRequestMessage::MessageSizeInBytes
- );
+ return Payload.read( is );
}
std::ostream& IcmpEchoRequestMessage::write( std::ostream &os ) const
{
- return os.write(
- reinterpret_cast<const char *> ( Payload ),
- IcmpEchoRequestMessage::MessageSizeInBytes
- );
-}
-
-uint16_t IcmpEchoRequestMessage::decode( int left_byte, int right_byte ) const
-{
- return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ];
-}
-
-void IcmpEchoRequestMessage::encode( int left_byte, int right_byte, uint16_t value )
-{
- Payload[ left_byte ] = static_cast<uint8_t> ( value >> 8 );
- Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+ return Payload.write( os );
}
#include <ostream>
#include "icmp/icmpmessage.h"
+#include "icmp/icmpmessagepayload.h"
//-----------------------------------------------------------------------------
// IcmpEchoRequestMessage
std::ostream& write( std::ostream &os ) const;
private:
- uint16_t decode( int left_byte, int right_byte ) const;
- void encode( int left_byte, int right_byte, uint16_t value );
-
-private:
- static const int MessageSizeInBytes;
- uint8_t Payload[ 8 ];
+ IcmpMessagePayload Payload;
};
--- /dev/null
+#include "icmp/icmpmessagepayload.h"
+
+#include <boost/assert.hpp>
+
+using namespace std;
+using boost::scoped_array;
+
+//-----------------------------------------------------------------------------
+// IcmpMessagePayload
+//-----------------------------------------------------------------------------
+
+IcmpMessagePayload::IcmpMessagePayload(
+ size_t payload_size_in_bytes
+) :
+ PayloadSizeInBytes( payload_size_in_bytes ),
+ Payload( new uint8_t[ payload_size_in_bytes ] )
+{
+ fill( Payload.get(), Payload.get() + PayloadSizeInBytes, 0 );
+}
+
+IcmpMessagePayload::~IcmpMessagePayload()
+{
+}
+
+const uint8_t& IcmpMessagePayload::operator[]( size_t offset ) const
+{
+ return Payload[ offset ];
+}
+
+uint8_t& IcmpMessagePayload::operator[]( size_t offset )
+{
+ return Payload[ offset ];
+}
+
+uint16_t IcmpMessagePayload::decode(
+ const int left_byte,
+ const int right_byte
+) const
+{
+ return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ];
+}
+
+void IcmpMessagePayload::encode(
+ const int left_byte,
+ const int right_byte,
+ const uint16_t value
+)
+{
+ Payload[ left_byte ] = static_cast<uint8_t> ( value >> 8 );
+ Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+}
+
+istream& IcmpMessagePayload::read( istream &is )
+{
+ char *data_array = reinterpret_cast<char *> ( Payload.get() );
+ is.read( data_array, PayloadSizeInBytes );
+
+ BOOST_ASSERT( is.gcount() == PayloadSizeInBytes );
+
+ return is;
+}
+
+ostream& IcmpMessagePayload::write( ostream &os ) const
+{
+ const char *data_array = reinterpret_cast<const char *> ( Payload.get() );
+ return os.write( data_array, PayloadSizeInBytes );
+}
--- /dev/null
+#ifndef ICMPMESSAGEPAYLOAD_H
+#define ICMPMESSAGEPAYLOAD_H
+
+#include <stdint.h>
+
+#include <istream>
+#include <ostream>
+
+#include <boost/scoped_array.hpp>
+
+//-----------------------------------------------------------------------------
+// IcmpMessagePayload
+//-----------------------------------------------------------------------------
+
+class IcmpMessagePayload
+{
+public:
+ IcmpMessagePayload( std::size_t payload_size_in_bytes );
+ ~IcmpMessagePayload();
+
+ const uint8_t& operator[]( std::size_t offset ) const;
+ uint8_t& operator[]( std::size_t offset );
+
+ uint16_t decode(
+ const int left_byte,
+ const int right_byte
+ ) const;
+ void encode(
+ const int left_byte,
+ const int right_byte,
+ const uint16_t value
+ );
+
+ std::istream& read( std::istream &is );
+ std::ostream& write( std::ostream &os ) const;
+
+private:
+ const int PayloadSizeInBytes;
+ boost::scoped_array<uint8_t> Payload;
+
+};
+
+#endif /* ICMPMESSAGEPAYLOAD_H */