20 |
20 |
21 #include "ns3/log.h" |
21 #include "ns3/log.h" |
22 #include "ns3/assert.h" |
22 #include "ns3/assert.h" |
23 #include "ns3/packet.h" |
23 #include "ns3/packet.h" |
24 #include "ns3/node.h" |
24 #include "ns3/node.h" |
|
25 #include "ns3/boolean.h" |
25 |
26 |
26 #include "udp-l4-protocol.h" |
27 #include "udp-l4-protocol.h" |
27 #include "udp-header.h" |
28 #include "udp-header.h" |
28 #include "ipv4-end-point-demux.h" |
29 #include "ipv4-end-point-demux.h" |
29 #include "ipv4-end-point.h" |
30 #include "ipv4-end-point.h" |
43 UdpL4Protocol::GetTypeId (void) |
44 UdpL4Protocol::GetTypeId (void) |
44 { |
45 { |
45 static TypeId tid = TypeId ("ns3::UdpL4Protocol") |
46 static TypeId tid = TypeId ("ns3::UdpL4Protocol") |
46 .SetParent<Ipv4L4Protocol> () |
47 .SetParent<Ipv4L4Protocol> () |
47 .AddConstructor<UdpL4Protocol> () |
48 .AddConstructor<UdpL4Protocol> () |
|
49 .AddAttribute ("CalcChecksum", "If true, we calculate the checksum of outgoing packets" |
|
50 " and verify the checksum of incoming packets.", |
|
51 BooleanValue (false), |
|
52 MakeBooleanAccessor (&UdpL4Protocol::m_calcChecksum), |
|
53 MakeBooleanChecker ()) |
48 ; |
54 ; |
49 return tid; |
55 return tid; |
50 } |
56 } |
51 |
57 |
52 UdpL4Protocol::UdpL4Protocol () |
58 UdpL4Protocol::UdpL4Protocol () |
149 Ipv4Address const &source, |
155 Ipv4Address const &source, |
150 Ipv4Address const &destination, |
156 Ipv4Address const &destination, |
151 Ptr<Ipv4Interface> interface) |
157 Ptr<Ipv4Interface> interface) |
152 { |
158 { |
153 NS_LOG_FUNCTION (this << packet << source << destination); |
159 NS_LOG_FUNCTION (this << packet << source << destination); |
154 |
|
155 UdpHeader udpHeader; |
160 UdpHeader udpHeader; |
|
161 if(m_calcChecksum) |
|
162 { |
|
163 udpHeader.EnableChecksums(); |
|
164 } |
|
165 |
|
166 udpHeader.SetPayloadSize (packet->GetSize () - udpHeader.GetSerializedSize ()); |
|
167 udpHeader.InitializeChecksum (source, destination, PROT_NUMBER); |
|
168 |
156 packet->RemoveHeader (udpHeader); |
169 packet->RemoveHeader (udpHeader); |
|
170 |
|
171 if(!udpHeader.IsChecksumOk ()) |
|
172 { |
|
173 NS_LOG_INFO("Bad checksum : dropping packet!"); |
|
174 return; |
|
175 } |
|
176 |
157 Ipv4EndPointDemux::EndPoints endPoints = |
177 Ipv4EndPointDemux::EndPoints endPoints = |
158 m_endPoints->Lookup (destination, udpHeader.GetDestinationPort (), |
178 m_endPoints->Lookup (destination, udpHeader.GetDestinationPort (), |
159 source, udpHeader.GetSourcePort (), interface); |
179 source, udpHeader.GetSourcePort (), interface); |
160 for (Ipv4EndPointDemux::EndPointsI endPoint = endPoints.begin (); |
180 for (Ipv4EndPointDemux::EndPointsI endPoint = endPoints.begin (); |
161 endPoint != endPoints.end (); endPoint++) |
181 endPoint != endPoints.end (); endPoint++) |
170 uint16_t sport, uint16_t dport) |
190 uint16_t sport, uint16_t dport) |
171 { |
191 { |
172 NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport); |
192 NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport); |
173 |
193 |
174 UdpHeader udpHeader; |
194 UdpHeader udpHeader; |
|
195 if(m_calcChecksum) |
|
196 { |
|
197 udpHeader.EnableChecksums(); |
|
198 } |
175 udpHeader.SetDestinationPort (dport); |
199 udpHeader.SetDestinationPort (dport); |
176 udpHeader.SetSourcePort (sport); |
200 udpHeader.SetSourcePort (sport); |
177 udpHeader.SetPayloadSize (packet->GetSize ()); |
201 udpHeader.SetPayloadSize (packet->GetSize ()); |
178 udpHeader.InitializeChecksum (saddr, |
202 udpHeader.InitializeChecksum (saddr, |
179 daddr, |
203 daddr, |