23 #include "tcp-header.h"
24 #include "ns3/buffer.h"
25 #include "ns3/address-utils.h"
29 NS_OBJECT_ENSURE_REGISTERED (TcpHeader);
31 TcpHeader::TcpHeader ()
33 m_destinationPort (0),
38 m_windowSize (0xffff),
40 m_calcChecksum (false),
45 TcpHeader::~TcpHeader ()
50 TcpHeader::EnableChecksums (
void)
52 m_calcChecksum =
true;
55 void TcpHeader::SetSourcePort (uint16_t port)
59 void TcpHeader::SetDestinationPort (uint16_t port)
61 m_destinationPort = port;
65 m_sequenceNumber = sequenceNumber;
69 m_ackNumber = ackNumber;
71 void TcpHeader::SetLength (uint8_t length)
75 void TcpHeader::SetFlags (uint8_t flags)
79 void TcpHeader::SetWindowSize (uint16_t windowSize)
81 m_windowSize = windowSize;
83 void TcpHeader::SetUrgentPointer (uint16_t urgentPointer)
85 m_urgentPointer = urgentPointer;
88 uint16_t TcpHeader::GetSourcePort ()
const
92 uint16_t TcpHeader::GetDestinationPort ()
const
94 return m_destinationPort;
98 return m_sequenceNumber;
104 uint8_t TcpHeader::GetLength ()
const
108 uint8_t TcpHeader::GetFlags ()
const
112 uint16_t TcpHeader::GetWindowSize ()
const
116 uint16_t TcpHeader::GetUrgentPointer ()
const
118 return m_urgentPointer;
127 m_destination = destination;
128 m_protocol = protocol;
137 m_destination = destination;
138 m_protocol = protocol;
142 TcpHeader::InitializeChecksum (Address source,
147 m_destination = destination;
148 m_protocol = protocol;
152 TcpHeader::CalculateHeaderChecksum (uint16_t size)
const
162 uint32_t maxHdrSz = (2 * Address::MAX_SIZE) + 8;
163 Buffer buf = Buffer (maxHdrSz);
164 buf.AddAtStart (maxHdrSz);
165 Buffer::Iterator it = buf.Begin ();
166 uint32_t hdrSize = 0;
168 WriteTo (it, m_source);
169 WriteTo (it, m_destination);
170 if (Ipv4Address::IsMatchingType(m_source))
173 it.WriteU8 (m_protocol);
174 it.WriteU8 (size >> 8);
175 it.WriteU8 (size & 0xff);
181 it.WriteU8 (size >> 8);
182 it.WriteU8 (size & 0xff);
185 it.WriteU8 (m_protocol);
191 return ~(it.CalculateIpChecksum (hdrSize));
195 TcpHeader::IsChecksumOk (
void)
const
197 return m_goodChecksum;
201 TcpHeader::GetTypeId (
void)
205 .AddConstructor<TcpHeader> ()
210 TcpHeader::GetInstanceTypeId (
void)
const
214 void TcpHeader::Print (std::ostream &os)
const
216 os << m_sourcePort <<
" > " << m_destinationPort;
220 if((m_flags & FIN) != 0)
224 if((m_flags & SYN) != 0)
228 if((m_flags & RST) != 0)
232 if((m_flags & PSH) != 0)
236 if((m_flags & ACK) != 0)
240 if((m_flags & URG) != 0)
244 if((m_flags & ECE) != 0)
248 if((m_flags & CWR) != 0)
254 os<<
" Seq="<<m_sequenceNumber<<
" Ack="<<m_ackNumber<<
" Win="<<m_windowSize;
256 uint32_t TcpHeader::GetSerializedSize (
void)
const
274 uint16_t headerChecksum = CalculateHeaderChecksum (start.
GetSize ());
280 i.WriteU16 (checksum);
291 m_flags = field & 0x3F;
292 m_length = field>>12;
299 uint16_t headerChecksum = CalculateHeaderChecksum (start.
GetSize ());
302 m_goodChecksum = (checksum == 0);
305 return GetSerializedSize ();
uint16_t CalculateIpChecksum(uint16_t size)
Calculate the checksum.
uint32_t ReadNtohU32(void)
iterator in a Buffer instance
void WriteHtonU16(uint16_t data)
void WriteHtonU32(uint32_t data)
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
uint16_t ReadNtohU16(void)
uint32_t GetSize(void) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)