View | Details | Raw Unified | Return to bug 247
Collapse All | Expand All

(-)a/src/common/buffer.cc (+6 lines)
 Lines 1128-1133   Buffer::Iterator::CalculateIpChecksum(ui Link Here 
1128
  return ~sum;
1128
  return ~sum;
1129
}
1129
}
1130
1130
1131
uint32_t 
1132
Buffer::Iterator::GetSize (void) const
1133
{
1134
  return m_dataEnd - m_dataStart;
1135
}
1136
1131
} // namespace ns3
1137
} // namespace ns3
1132
1138
1133
1139
(-)a/src/common/buffer.h (+5 lines)
 Lines 358-363   public: Link Here 
358
       */
358
       */
359
      uint16_t CalculateIpChecksum(uint16_t size, uint32_t initialChecksum);
359
      uint16_t CalculateIpChecksum(uint16_t size, uint32_t initialChecksum);
360
360
361
      /**
362
       * \returns the size of the underlying buffer we are iterating
363
       */
364
      uint32_t GetSize (void) const;
365
361
  private:
366
  private:
362
      friend class Buffer;
367
      friend class Buffer;
363
      Iterator (Buffer const*buffer);
368
      Iterator (Buffer const*buffer);
(-)a/src/internet-stack/tcp-header.cc (-40 / +28 lines)
 Lines 23-28    Link Here 
23
#include "tcp-socket-impl.h"
23
#include "tcp-socket-impl.h"
24
#include "tcp-header.h"
24
#include "tcp-header.h"
25
#include "ns3/buffer.h"
25
#include "ns3/buffer.h"
26
#include "ns3/address-utils.h"
26
27
27
namespace ns3 {
28
namespace ns3 {
28
29
 Lines 37-44   TcpHeader::TcpHeader () Link Here 
37
    m_flags (0),
38
    m_flags (0),
38
    m_windowSize (0xffff),
39
    m_windowSize (0xffff),
39
    m_urgentPointer (0),
40
    m_urgentPointer (0),
40
    m_initialChecksum(0),
41
    m_checksum (0),
42
    m_calcChecksum(false),
41
    m_calcChecksum(false),
43
    m_goodChecksum(true)
42
    m_goodChecksum(true)
44
{}
43
{}
 Lines 50-60   TcpHeader::EnableChecksums (void) Link Here 
50
TcpHeader::EnableChecksums (void)
49
TcpHeader::EnableChecksums (void)
51
{
50
{
52
  m_calcChecksum = true;
51
  m_calcChecksum = true;
53
}
54
55
void TcpHeader::SetPayloadSize(uint16_t payloadSize)
56
{
57
  m_payloadSize = payloadSize;
58
}
52
}
59
53
60
void TcpHeader::SetSourcePort (uint16_t port)
54
void TcpHeader::SetSourcePort (uint16_t port)
 Lines 84-93   void TcpHeader::SetWindowSize (uint16_t Link Here 
84
void TcpHeader::SetWindowSize (uint16_t windowSize)
78
void TcpHeader::SetWindowSize (uint16_t windowSize)
85
{
79
{
86
  m_windowSize = windowSize;
80
  m_windowSize = windowSize;
87
}
88
void TcpHeader::SetChecksum (uint16_t checksum)
89
{
90
  m_checksum = checksum;
91
}
81
}
92
void TcpHeader::SetUrgentPointer (uint16_t urgentPointer)
82
void TcpHeader::SetUrgentPointer (uint16_t urgentPointer)
93
{
83
{
 Lines 122-131   uint16_t TcpHeader::GetWindowSize () con Link Here 
122
{
112
{
123
  return m_windowSize;
113
  return m_windowSize;
124
}
114
}
125
uint16_t TcpHeader::GetChecksum () const
126
{
127
  return m_checksum;
128
}
129
uint16_t TcpHeader::GetUrgentPointer () const
115
uint16_t TcpHeader::GetUrgentPointer () const
130
{
116
{
131
  return m_urgentPointer;
117
  return m_urgentPointer;
 Lines 133-161   uint16_t TcpHeader::GetUrgentPointer () Link Here 
133
119
134
void 
120
void 
135
TcpHeader::InitializeChecksum (Ipv4Address source, 
121
TcpHeader::InitializeChecksum (Ipv4Address source, 
136
                                   Ipv4Address destination,
122
                               Ipv4Address destination,
137
                                   uint8_t protocol)
123
                               uint8_t protocol)
138
{
124
{
139
  Buffer buf = Buffer(12);
125
  m_source = source;
140
  uint8_t tmp[4];
126
  m_destination = destination;
141
  Buffer::Iterator it;
127
  m_protocol = protocol;
142
  uint16_t tcpLength = m_payloadSize + GetSerializedSize();
128
}
143
129
144
  buf.AddAtStart(12);
130
uint16_t
145
  it = buf.Begin();
131
TcpHeader::CalculateHeaderChecksum (uint16_t size) const
132
{
133
  Buffer buf = Buffer (12);
134
  buf.AddAtStart (12);
135
  Buffer::Iterator it = buf.Begin ();
146
136
147
  source.Serialize(tmp);
137
  WriteTo (it, m_source);
148
  it.Write(tmp, 4); /* source IP address */
138
  WriteTo (it, m_destination);
149
  destination.Serialize(tmp);
139
  it.WriteU8 (0); /* protocol */
150
  it.Write(tmp, 4); /* destination IP address */
140
  it.WriteU8 (m_protocol); /* protocol */
151
  it.WriteU8(0); /* protocol */
141
  it.WriteU8 (size >> 8); /* length */
152
  it.WriteU8(protocol); /* protocol */
142
  it.WriteU8 (size & 0xff); /* length */
153
  it.WriteU8(tcpLength >> 8); /* length */
154
  it.WriteU8(tcpLength & 0xff); /* length */
155
143
156
  it = buf.Begin();
144
  it = buf.Begin ();
157
  /* we don't CompleteChecksum ( ~ ) now */
145
  /* we don't CompleteChecksum ( ~ ) now */
158
  m_initialChecksum = ~(it.CalculateIpChecksum(12));
146
  return ~(it.CalculateIpChecksum (12));
159
}
147
}
160
148
161
bool
149
bool
 Lines 219-225   void TcpHeader::Serialize (Buffer::Itera Link Here 
219
void TcpHeader::Serialize (Buffer::Iterator start)  const
207
void TcpHeader::Serialize (Buffer::Iterator start)  const
220
{
208
{
221
  Buffer::Iterator i = start;
209
  Buffer::Iterator i = start;
222
  uint16_t tcpLength = m_payloadSize + GetSerializedSize();
223
  i.WriteHtonU16 (m_sourcePort);
210
  i.WriteHtonU16 (m_sourcePort);
224
  i.WriteHtonU16 (m_destinationPort);
211
  i.WriteHtonU16 (m_destinationPort);
225
  i.WriteHtonU32 (m_sequenceNumber);
212
  i.WriteHtonU32 (m_sequenceNumber);
 Lines 231-238   void TcpHeader::Serialize (Buffer::Itera Link Here 
231
218
232
  if(m_calcChecksum)
219
  if(m_calcChecksum)
233
  {
220
  {
221
    uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
234
    i = start;
222
    i = start;
235
    uint16_t checksum = i.CalculateIpChecksum(tcpLength, m_initialChecksum);
223
    uint16_t checksum = i.CalculateIpChecksum(start.GetSize (), headerChecksum);
236
    
224
    
237
    i = start;
225
    i = start;
238
    i.Next(16);
226
    i.Next(16);
 Lines 250-265   uint32_t TcpHeader::Deserialize (Buffer: Link Here 
250
  m_flags = field & 0x3F;
238
  m_flags = field & 0x3F;
251
  m_length = field>>12;
239
  m_length = field>>12;
252
  m_windowSize = i.ReadNtohU16 ();
240
  m_windowSize = i.ReadNtohU16 ();
253
  m_checksum = i.ReadU16 ();
241
  i.Next (2);
254
  m_urgentPointer = i.ReadNtohU16 ();
242
  m_urgentPointer = i.ReadNtohU16 ();
255
243
256
  if(m_calcChecksum)
244
  if(m_calcChecksum)
257
  {
245
    {
246
      uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
258
      i = start;
247
      i = start;
259
      uint16_t checksum = i.CalculateIpChecksum(m_payloadSize + GetSerializedSize(), m_initialChecksum);
248
      uint16_t checksum = i.CalculateIpChecksum(start.GetSize (), headerChecksum);
260
261
      m_goodChecksum = (checksum == 0);
249
      m_goodChecksum = (checksum == 0);
262
  }
250
    }
263
251
264
  return GetSerializedSize ();
252
  return GetSerializedSize ();
265
}
253
}
(-)a/src/internet-stack/tcp-header.h (-17 / +6 lines)
 Lines 78-87   public: Link Here 
78
   */
78
   */
79
  void SetWindowSize (uint16_t windowSize);
79
  void SetWindowSize (uint16_t windowSize);
80
  /**
80
  /**
81
   * \param checksum the checksum for this TcpHeader
82
   */
83
  void SetChecksum (uint16_t checksum);
84
  /**
85
   * \param urgentPointer the urgent pointer for this TcpHeader
81
   * \param urgentPointer the urgent pointer for this TcpHeader
86
   */
82
   */
87
  void SetUrgentPointer (uint16_t urgentPointer);
83
  void SetUrgentPointer (uint16_t urgentPointer);
 Lines 117-126   public: Link Here 
117
   */
113
   */
118
  uint16_t GetWindowSize () const;
114
  uint16_t GetWindowSize () const;
119
  /**
115
  /**
120
   * \return the checksum for this TcpHeader
121
   */
122
  uint16_t GetChecksum () const;
123
  /**
124
   * \return the urgent pointer for this TcpHeader
116
   * \return the urgent pointer for this TcpHeader
125
   */
117
   */
126
  uint16_t GetUrgentPointer () const;
118
  uint16_t GetUrgentPointer () const;
 Lines 151-167   public: Link Here 
151
  virtual uint32_t Deserialize (Buffer::Iterator start);
143
  virtual uint32_t Deserialize (Buffer::Iterator start);
152
144
153
  /**
145
  /**
154
   * \param size The payload size in bytes
155
   */
156
  void SetPayloadSize (uint16_t size);
157
158
  /**
159
   * \brief Is the TCP checksum correct ?
146
   * \brief Is the TCP checksum correct ?
160
   * \returns true if the checksum is correct, false otherwise.
147
   * \returns true if the checksum is correct, false otherwise.
161
   */
148
   */
162
  bool IsChecksumOk (void) const;
149
  bool IsChecksumOk (void) const;
163
150
164
private:
151
private:
152
  uint16_t CalculateHeaderChecksum (uint16_t size) const;
165
  uint16_t m_sourcePort;
153
  uint16_t m_sourcePort;
166
  uint16_t m_destinationPort;
154
  uint16_t m_destinationPort;
167
  uint32_t m_sequenceNumber;
155
  uint32_t m_sequenceNumber;
 Lines 170-182   private: Link Here 
170
  uint8_t m_flags;      // really a uint6_t
158
  uint8_t m_flags;      // really a uint6_t
171
  uint16_t m_windowSize;
159
  uint16_t m_windowSize;
172
  uint16_t m_urgentPointer;
160
  uint16_t m_urgentPointer;
173
  uint16_t m_payloadSize;
161
162
  Ipv4Address m_source;
163
  Ipv4Address m_destination;
164
  uint8_t m_protocol;
165
174
  uint16_t m_initialChecksum;
166
  uint16_t m_initialChecksum;
175
  uint16_t m_checksum;
176
177
  bool m_calcChecksum;
167
  bool m_calcChecksum;
178
  bool m_goodChecksum;
168
  bool m_goodChecksum;
179
180
};
169
};
181
170
182
}; // namespace ns3
171
}; // namespace ns3
(-)a/src/internet-stack/tcp-l4-protocol.cc (-2 / +1 lines)
 Lines 448-453   TcpL4Protocol::Receive (Ptr<Packet> pack Link Here 
448
  if(m_calcChecksum)
448
  if(m_calcChecksum)
449
  {
449
  {
450
    tcpHeader.EnableChecksums();
450
    tcpHeader.EnableChecksums();
451
    tcpHeader.InitializeChecksum (source, destination, PROT_NUMBER);
451
  }
452
  }
452
453
453
  packet->PeekHeader (tcpHeader);
454
  packet->PeekHeader (tcpHeader);
 Lines 495-501   TcpL4Protocol::Send (Ptr<Packet> packet, Link Here 
495
  TcpHeader tcpHeader;
496
  TcpHeader tcpHeader;
496
  tcpHeader.SetDestinationPort (dport);
497
  tcpHeader.SetDestinationPort (dport);
497
  tcpHeader.SetSourcePort (sport);
498
  tcpHeader.SetSourcePort (sport);
498
  tcpHeader.SetPayloadSize(packet->GetSize());
499
  if(m_calcChecksum)
499
  if(m_calcChecksum)
500
  {
500
  {
501
    tcpHeader.EnableChecksums();
501
    tcpHeader.EnableChecksums();
 Lines 529-535   TcpL4Protocol::SendPacket (Ptr<Packet> p Link Here 
529
  // XXX outgoingHeader cannot be logged
529
  // XXX outgoingHeader cannot be logged
530
530
531
  outgoingHeader.SetLength (5); //header length in units of 32bit words
531
  outgoingHeader.SetLength (5); //header length in units of 32bit words
532
  outgoingHeader.SetPayloadSize(packet->GetSize());
533
  /* outgoingHeader.SetUrgentPointer (0); //XXX */
532
  /* outgoingHeader.SetUrgentPointer (0); //XXX */
534
  if(m_calcChecksum)
533
  if(m_calcChecksum)
535
  {
534
  {
(-)a/src/internet-stack/udp-header.cc (-24 / +25 lines)
 Lines 19-24    Link Here 
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
 Lines 32-39   UdpHeader::UdpHeader () Link Here 
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
{}
 Lines 80-105   UdpHeader::InitializeChecksum (Ipv4Addre Link Here 
80
                              Ipv4Address destination,
79
                              Ipv4Address destination,
81
                              uint8_t protocol)
80
                              uint8_t protocol)
82
{
81
{
83
  Buffer buf = Buffer(12);
82
  m_source = source;
84
  uint8_t tmp[4];
83
  m_destination = destination;
85
  Buffer::Iterator it;
84
  m_protocol = protocol;
86
  uint16_t udpLength = m_payloadSize + GetSerializedSize();
85
}
86
uint16_t
87
UdpHeader::CalculateHeaderChecksum (uint16_t size) const
88
{
89
  Buffer buf = Buffer (12);
90
  buf.AddAtStart (12);
91
  Buffer::Iterator it = buf.Begin ();
87
92
88
  buf.AddAtStart(12);
93
  WriteTo (it, m_source);
89
  it = buf.Begin();
94
  WriteTo (it, m_destination);
95
  it.WriteU8 (0); /* protocol */
96
  it.WriteU8 (m_protocol); /* protocol */
97
  it.WriteU8 (size >> 8); /* length */
98
  it.WriteU8 (size & 0xff); /* length */
90
99
91
  source.Serialize(tmp);
100
  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 */
101
  /* we don't CompleteChecksum ( ~ ) now */
102
  m_initialChecksum = ~(it.CalculateIpChecksum(12));
102
  return ~(it.CalculateIpChecksum (12));
103
}
103
}
104
104
105
bool
105
bool
 Lines 142-158   UdpHeader::Serialize (Buffer::Iterator s Link Here 
142
UdpHeader::Serialize (Buffer::Iterator start) const
142
UdpHeader::Serialize (Buffer::Iterator start) const
143
{
143
{
144
  Buffer::Iterator i = start;
144
  Buffer::Iterator i = start;
145
  uint16_t udpLength = m_payloadSize + GetSerializedSize();
146
145
147
  i.WriteHtonU16 (m_sourcePort);
146
  i.WriteHtonU16 (m_sourcePort);
148
  i.WriteHtonU16 (m_destinationPort);
147
  i.WriteHtonU16 (m_destinationPort);
149
  i.WriteHtonU16 (udpLength);
148
  i.WriteHtonU16 (start.GetSize ());
150
  i.WriteU16 (0);
149
  i.WriteU16 (0);
151
150
152
  if (m_calcChecksum)
151
  if (m_calcChecksum)
153
    {
152
    {
153
      uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
154
      i = start;
154
      i = start;
155
      uint16_t checksum = i.CalculateIpChecksum(udpLength, m_initialChecksum);
155
      uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
156
156
157
      i = start;
157
      i = start;
158
      i.Next(6);
158
      i.Next(6);
 Lines 166-177   UdpHeader::Deserialize (Buffer::Iterator Link Here 
166
  m_sourcePort = i.ReadNtohU16 ();
166
  m_sourcePort = i.ReadNtohU16 ();
167
  m_destinationPort = i.ReadNtohU16 ();
167
  m_destinationPort = i.ReadNtohU16 ();
168
  m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
168
  m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
169
  m_checksum = i.ReadU16();
169
  i.Next (2);
170
170
171
  if(m_calcChecksum)
171
  if(m_calcChecksum)
172
  {
172
  {
173
      uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
173
      i = start;
174
      i = start;
174
      uint16_t checksum = i.CalculateIpChecksum(m_payloadSize + GetSerializedSize(), m_initialChecksum);
175
      uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
175
176
176
      m_goodChecksum = (checksum == 0);
177
      m_goodChecksum = (checksum == 0);
177
  }
178
  }
(-)a/src/internet-stack/udp-header.h (-2 / +4 lines)
 Lines 100-111   public: Link Here 
100
  bool IsChecksumOk (void) const;
100
  bool IsChecksumOk (void) const;
101
101
102
private:
102
private:
103
  uint16_t CalculateHeaderChecksum (uint16_t size) const;
103
  uint16_t m_sourcePort;
104
  uint16_t m_sourcePort;
104
  uint16_t m_destinationPort;
105
  uint16_t m_destinationPort;
105
  uint16_t m_payloadSize;
106
  uint16_t m_payloadSize;
106
  uint16_t m_initialChecksum;
107
  uint16_t m_checksum;
108
107
108
  Ipv4Address m_source;
109
  Ipv4Address m_destination;
110
  uint8_t m_protocol;
109
  bool m_calcChecksum;
111
  bool m_calcChecksum;
110
  bool m_goodChecksum;
112
  bool m_goodChecksum;
111
};
113
};

Return to bug 247