Add ipv4 header checksum support.
This commit is contained in:
@@ -178,6 +178,22 @@ Ipv4Header::IsChecksumOk (void) const
|
||||
return m_goodChecksum;
|
||||
}
|
||||
|
||||
uint16_t
|
||||
Ipv4Header::ChecksumCalculate(Buffer::Iterator &i, uint16_t size)
|
||||
{
|
||||
/* see RFC 1071 to understand this code. */
|
||||
uint32_t sum = 0;
|
||||
|
||||
for (int j = 0; j < size/2; j++)
|
||||
sum += i.ReadU16 ();
|
||||
|
||||
if (size & 1)
|
||||
sum += i.ReadU8 ();
|
||||
|
||||
while (sum >> 16)
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
return ~sum;
|
||||
}
|
||||
|
||||
TypeId
|
||||
Ipv4Header::GetTypeId (void)
|
||||
@@ -266,16 +282,12 @@ Ipv4Header::Serialize (Buffer::Iterator start) const
|
||||
|
||||
if (m_calcChecksum)
|
||||
{
|
||||
#if 0
|
||||
// XXX we need to add Buffer::Iterator::PeekData method
|
||||
uint8_t *data = start.PeekData ();
|
||||
uint16_t checksum = UtilsChecksumCalculate (0, data, GetSize ());
|
||||
checksum = UtilsChecksumComplete (checksum);
|
||||
i = start;
|
||||
uint16_t checksum = ChecksumCalculate(i, 20);
|
||||
NS_LOG_LOGIC ("checksum=" <<checksum);
|
||||
i = start;
|
||||
i.Next (10);
|
||||
i.WriteU16 (checksum);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
uint32_t
|
||||
@@ -313,18 +325,11 @@ Ipv4Header::Deserialize (Buffer::Iterator start)
|
||||
|
||||
if (m_calcChecksum)
|
||||
{
|
||||
#if 0
|
||||
uint8_t *data = start.PeekData ();
|
||||
uint16_t localChecksum = UtilsChecksumCalculate (0, data, headerSize);
|
||||
if (localChecksum == 0xffff)
|
||||
{
|
||||
m_goodChecksum = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_goodChecksum = false;
|
||||
}
|
||||
#endif
|
||||
i = start;
|
||||
uint16_t checksum = ChecksumCalculate(i, headerSize);
|
||||
NS_LOG_LOGIC ("checksum=" <<checksum);
|
||||
|
||||
m_goodChecksum = (checksum == 0);
|
||||
}
|
||||
return GetSerializedSize ();
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public:
|
||||
Ipv4Address GetDestination (void) const;
|
||||
|
||||
/**
|
||||
* \returns true if the upv4 checksum is correct, false otherwise.
|
||||
* \returns true if the ipv4 checksum is correct, false otherwise.
|
||||
*
|
||||
* If Ipv4Header::EnableChecksums has not been called prior to
|
||||
* creating this packet, this method will always return true.
|
||||
@@ -146,6 +146,7 @@ public:
|
||||
virtual uint32_t Deserialize (Buffer::Iterator start);
|
||||
private:
|
||||
|
||||
static uint16_t ChecksumCalculate(Buffer::Iterator &i, uint16_t len);
|
||||
enum FlagsE {
|
||||
DONT_FRAGMENT = (1<<0),
|
||||
MORE_FRAGMENTS = (1<<1)
|
||||
|
||||
Reference in New Issue
Block a user