25 #include "ns3/buffer.h"
26 #include "ns3/address-utils.h"
37 m_destinationPort (0),
42 m_windowSize (0xffff),
44 m_calcChecksum (false),
45 m_goodChecksum (true),
57 static const char* flagNames[8] = {
67 std::string flagsDescription =
"";
68 for (uint8_t i = 0; i < 8; ++i)
72 if (flagsDescription.length() > 0)
74 flagsDescription += delimiter;
76 flagsDescription.append (flagNames[i]);
79 return flagsDescription;
223 uint32_t hdrSize = 0;
262 .SetGroupName (
"Internet")
286 TcpOptionList::const_iterator op;
290 os <<
" " << (*op)->GetInstanceTypeId ().GetName () <<
"(";
318 uint32_t optionLen = 0;
319 TcpOptionList::const_iterator op;
322 optionLen += (*op)->GetSerializedSize ();
323 (*op)->Serialize (i);
324 i.
Next ((*op)->GetSerializedSize ());
328 while (optionLen % 4)
339 uint16_t checksum = i.CalculateIpChecksum (start.
GetSize (), headerChecksum);
343 i.WriteU16 (checksum);
364 uint32_t optionLen = (
m_length - 5) * 4;
367 NS_LOG_ERROR (
"Illegal TCP option length " << optionLen <<
"; options discarded");
372 uint8_t kind = i.
PeekU8 ();
382 NS_LOG_WARN (
"Option kind " << static_cast<int> (kind) <<
" unknown, skipping.");
390 if (optionLen >= optionSize)
392 optionLen -= optionSize;
398 NS_LOG_ERROR (
"Option exceeds TCP option space; option discarded");
414 NS_LOG_ERROR (
"Mismatch between calculated length and in-header value");
422 uint16_t checksum = i.CalculateIpChecksum (start.
GetSize (), headerChecksum);
433 TcpOptionList::const_iterator i;
437 len += (*i)->GetSerializedSize ();
442 len += 4 - (len % 4);
454 NS_LOG_WARN (
"The option kind " << static_cast<int> (option->
GetKind ()) <<
" is unknown");
476 TcpOptionList::const_iterator i;
480 if ((*i)->GetKind () == kind)
492 TcpOptionList::const_iterator i;
496 if ((*i)->GetKind () == kind)
uint16_t CalculateIpChecksum(uint16_t size)
Calculate the checksum.
NUMERIC_TYPE GetValue() const
Extracts the numeric value of the sequence number.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
automatically resized byte buffer
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t ReadNtohU32(void)
iterator in a Buffer instance
a polymophic address class
virtual uint32_t Deserialize(Buffer::Iterator start)=0
Deserialize the Option from a buffer iterator.
void WriteU16(uint16_t data)
void WriteHtonU16(uint16_t data)
void Next(void)
go forward by one byte
static bool IsMatchingType(const Address &address)
Buffer::Iterator Begin(void) const
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void WriteHtonU32(uint32_t data)
not a standardized value; for unknown recv'd options
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
void WriteU8(uint8_t data)
static bool IsKindKnown(uint8_t kind)
Check if the option is implemented.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
virtual uint8_t GetKind(void) const =0
Get the `kind' (as in RFC 793) of this option.
bool operator==(const EventId &a, const EventId &b)
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
bool AddAtStart(uint32_t start)
uint16_t ReadNtohU16(void)
uint32_t GetSize(void) const
a unique identifier for an interface.
static Ptr< TcpOption > CreateOption(uint8_t kind)
Creates an option.
TypeId SetParent(TypeId tid)
virtual uint32_t GetSerializedSize(void) const =0
Returns number of bytes required for Option serialization.