src/internet-stack/udp-header.cc
changeset 3404 b5d4a04c7b68
parent 3363 33d1ca2e4ba4
equal deleted inserted replaced
3403:ac82ff1f6736 3404:b5d4a04c7b68
    17  *
    17  *
    18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    19  */
    19  */
    20 
    20 
    21 #include "udp-header.h"
    21 #include "udp-header.h"
       
    22 #include "ns3/address-utils.h"
    22 
    23 
    23 namespace ns3 {
    24 namespace ns3 {
    24 
    25 
    25 NS_OBJECT_ENSURE_REGISTERED (UdpHeader);
    26 NS_OBJECT_ENSURE_REGISTERED (UdpHeader);
    26 
    27 
    30  */
    31  */
    31 UdpHeader::UdpHeader ()
    32 UdpHeader::UdpHeader ()
    32   : m_sourcePort (0xfffd),
    33   : m_sourcePort (0xfffd),
    33     m_destinationPort (0xfffd),
    34     m_destinationPort (0xfffd),
    34     m_payloadSize (0xfffd),
    35     m_payloadSize (0xfffd),
    35     m_initialChecksum (0),
       
    36     m_checksum(0),
       
    37     m_calcChecksum(false),
    36     m_calcChecksum(false),
    38     m_goodChecksum(true)
    37     m_goodChecksum(true)
    39 {}
    38 {}
    40 UdpHeader::~UdpHeader ()
    39 UdpHeader::~UdpHeader ()
    41 {
    40 {
    69 UdpHeader::GetDestinationPort (void) const
    68 UdpHeader::GetDestinationPort (void) const
    70 {
    69 {
    71   return m_destinationPort;
    70   return m_destinationPort;
    72 }
    71 }
    73 void 
    72 void 
    74 UdpHeader::SetPayloadSize (uint16_t size)
       
    75 {
       
    76   m_payloadSize = size;
       
    77 }
       
    78 void 
       
    79 UdpHeader::InitializeChecksum (Ipv4Address source, 
    73 UdpHeader::InitializeChecksum (Ipv4Address source, 
    80                               Ipv4Address destination,
    74                               Ipv4Address destination,
    81                               uint8_t protocol)
    75                               uint8_t protocol)
    82 {
    76 {
    83   Buffer buf = Buffer(12);
    77   m_source = source;
    84   uint8_t tmp[4];
    78   m_destination = destination;
    85   Buffer::Iterator it;
    79   m_protocol = protocol;
    86   uint16_t udpLength = m_payloadSize + GetSerializedSize();
    80 }
       
    81 uint16_t
       
    82 UdpHeader::CalculateHeaderChecksum (uint16_t size) const
       
    83 {
       
    84   Buffer buf = Buffer (12);
       
    85   buf.AddAtStart (12);
       
    86   Buffer::Iterator it = buf.Begin ();
    87 
    87 
    88   buf.AddAtStart(12);
    88   WriteTo (it, m_source);
    89   it = buf.Begin();
    89   WriteTo (it, m_destination);
       
    90   it.WriteU8 (0); /* protocol */
       
    91   it.WriteU8 (m_protocol); /* protocol */
       
    92   it.WriteU8 (size >> 8); /* length */
       
    93   it.WriteU8 (size & 0xff); /* length */
    90 
    94 
    91   source.Serialize(tmp);
    95   it = buf.Begin ();
    92   it.Write(tmp, 4); /* source IP address */
       
    93   destination.Serialize(tmp);
       
    94   it.Write(tmp, 4); /* destination IP address */
       
    95   it.WriteU8(0); /* protocol */
       
    96   it.WriteU8(protocol); /* protocol */
       
    97   it.WriteU8(udpLength >> 8); /* length */
       
    98   it.WriteU8(udpLength & 0xff); /* length */
       
    99 
       
   100   it = buf.Begin();
       
   101   /* we don't CompleteChecksum ( ~ ) now */
    96   /* we don't CompleteChecksum ( ~ ) now */
   102   m_initialChecksum = ~(it.CalculateIpChecksum(12));
    97   return ~(it.CalculateIpChecksum (12));
   103 }
    98 }
   104 
    99 
   105 bool
   100 bool
   106 UdpHeader::IsChecksumOk (void) const
   101 UdpHeader::IsChecksumOk (void) const
   107 {
   102 {
   140 
   135 
   141 void
   136 void
   142 UdpHeader::Serialize (Buffer::Iterator start) const
   137 UdpHeader::Serialize (Buffer::Iterator start) const
   143 {
   138 {
   144   Buffer::Iterator i = start;
   139   Buffer::Iterator i = start;
   145   uint16_t udpLength = m_payloadSize + GetSerializedSize();
       
   146 
   140 
   147   i.WriteHtonU16 (m_sourcePort);
   141   i.WriteHtonU16 (m_sourcePort);
   148   i.WriteHtonU16 (m_destinationPort);
   142   i.WriteHtonU16 (m_destinationPort);
   149   i.WriteHtonU16 (udpLength);
   143   i.WriteHtonU16 (start.GetSize ());
   150   i.WriteU16 (0);
   144   i.WriteU16 (0);
   151 
   145 
   152   if (m_calcChecksum)
   146   if (m_calcChecksum)
   153     {
   147     {
       
   148       uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
   154       i = start;
   149       i = start;
   155       uint16_t checksum = i.CalculateIpChecksum(udpLength, m_initialChecksum);
   150       uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
   156 
   151 
   157       i = start;
   152       i = start;
   158       i.Next(6);
   153       i.Next(6);
   159       i.WriteU16(checksum);
   154       i.WriteU16(checksum);
   160     }
   155     }
   164 {
   159 {
   165   Buffer::Iterator i = start;
   160   Buffer::Iterator i = start;
   166   m_sourcePort = i.ReadNtohU16 ();
   161   m_sourcePort = i.ReadNtohU16 ();
   167   m_destinationPort = i.ReadNtohU16 ();
   162   m_destinationPort = i.ReadNtohU16 ();
   168   m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
   163   m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
   169   m_checksum = i.ReadU16();
   164   i.Next (2);
   170 
   165 
   171   if(m_calcChecksum)
   166   if(m_calcChecksum)
   172   {
   167   {
       
   168       uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
   173       i = start;
   169       i = start;
   174       uint16_t checksum = i.CalculateIpChecksum(m_payloadSize + GetSerializedSize(), m_initialChecksum);
   170       uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
   175 
   171 
   176       m_goodChecksum = (checksum == 0);
   172       m_goodChecksum = (checksum == 0);
   177   }
   173   }
   178 
   174 
   179   return GetSerializedSize ();
   175   return GetSerializedSize ();