00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "udp-header.h"
00022 #include "ns3/address-utils.h"
00023
00024 namespace ns3 {
00025
00026 NS_OBJECT_ENSURE_REGISTERED (UdpHeader);
00027
00028
00029
00030
00031
00032 UdpHeader::UdpHeader ()
00033 : m_sourcePort (0xfffd),
00034 m_destinationPort (0xfffd),
00035 m_payloadSize (0xfffd),
00036 m_calcChecksum(false),
00037 m_goodChecksum(true)
00038 {}
00039 UdpHeader::~UdpHeader ()
00040 {
00041 m_sourcePort = 0xfffe;
00042 m_destinationPort = 0xfffe;
00043 m_payloadSize = 0xfffe;
00044 }
00045
00046 void
00047 UdpHeader::EnableChecksums (void)
00048 {
00049 m_calcChecksum = true;
00050 }
00051
00052 void
00053 UdpHeader::SetDestinationPort (uint16_t port)
00054 {
00055 m_destinationPort = port;
00056 }
00057 void
00058 UdpHeader::SetSourcePort (uint16_t port)
00059 {
00060 m_sourcePort = port;
00061 }
00062 uint16_t
00063 UdpHeader::GetSourcePort (void) const
00064 {
00065 return m_sourcePort;
00066 }
00067 uint16_t
00068 UdpHeader::GetDestinationPort (void) const
00069 {
00070 return m_destinationPort;
00071 }
00072 void
00073 UdpHeader::InitializeChecksum (Ipv4Address source,
00074 Ipv4Address destination,
00075 uint8_t protocol)
00076 {
00077 m_source = source;
00078 m_destination = destination;
00079 m_protocol = protocol;
00080 }
00081 uint16_t
00082 UdpHeader::CalculateHeaderChecksum (uint16_t size) const
00083 {
00084 Buffer buf = Buffer (12);
00085 buf.AddAtStart (12);
00086 Buffer::Iterator it = buf.Begin ();
00087
00088 WriteTo (it, m_source);
00089 WriteTo (it, m_destination);
00090 it.WriteU8 (0);
00091 it.WriteU8 (m_protocol);
00092 it.WriteU8 (size >> 8);
00093 it.WriteU8 (size & 0xff);
00094
00095 it = buf.Begin ();
00096
00097 return ~(it.CalculateIpChecksum (12));
00098 }
00099
00100 bool
00101 UdpHeader::IsChecksumOk (void) const
00102 {
00103 return m_goodChecksum;
00104 }
00105
00106
00107 TypeId
00108 UdpHeader::GetTypeId (void)
00109 {
00110 static TypeId tid = TypeId ("ns3::UdpHeader")
00111 .SetParent<Header> ()
00112 .AddConstructor<UdpHeader> ()
00113 ;
00114 return tid;
00115 }
00116 TypeId
00117 UdpHeader::GetInstanceTypeId (void) const
00118 {
00119 return GetTypeId ();
00120 }
00121 void
00122 UdpHeader::Print (std::ostream &os) const
00123 {
00124 os << "length: " << m_payloadSize + GetSerializedSize ()
00125 << " "
00126 << m_sourcePort << " > " << m_destinationPort
00127 ;
00128 }
00129
00130 uint32_t
00131 UdpHeader::GetSerializedSize (void) const
00132 {
00133 return 8;
00134 }
00135
00136 void
00137 UdpHeader::Serialize (Buffer::Iterator start) const
00138 {
00139 Buffer::Iterator i = start;
00140
00141 i.WriteHtonU16 (m_sourcePort);
00142 i.WriteHtonU16 (m_destinationPort);
00143 i.WriteHtonU16 (start.GetSize ());
00144 i.WriteU16 (0);
00145
00146 if (m_calcChecksum)
00147 {
00148 uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
00149 i = start;
00150 uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
00151
00152 i = start;
00153 i.Next(6);
00154 i.WriteU16(checksum);
00155 }
00156 }
00157 uint32_t
00158 UdpHeader::Deserialize (Buffer::Iterator start)
00159 {
00160 Buffer::Iterator i = start;
00161 m_sourcePort = i.ReadNtohU16 ();
00162 m_destinationPort = i.ReadNtohU16 ();
00163 m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
00164 i.Next (2);
00165
00166 if(m_calcChecksum)
00167 {
00168 uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
00169 i = start;
00170 uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
00171
00172 m_goodChecksum = (checksum == 0);
00173 }
00174
00175 return GetSerializedSize ();
00176 }
00177
00178
00179 };