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 (); |