21 #include "ns3/assert.h" 
   23 #include "ns3/nstime.h" 
   24 #include "ns3/boolean.h" 
   25 #include "ns3/object-vector.h" 
   27 #include "ns3/packet.h" 
   29 #include "ns3/simulator.h" 
   30 #include "ns3/ipv4-route.h" 
   31 #include "ns3/ipv6-route.h" 
   58 #undef NS_LOG_APPEND_CONTEXT 
   59 #define NS_LOG_APPEND_CONTEXT                                   \ 
   60   if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; } 
   70     .SetGroupName (
"Internet")
 
   72     .AddAttribute (
"RttEstimatorType",
 
   73                    "Type of RttEstimator objects.",
 
   77     .AddAttribute (
"SocketType",
 
   78                    "Socket type of TCP objects.",
 
   82     .AddAttribute (
"SocketList", 
"The list of sockets associated to this protocol.",
 
   85                    MakeObjectVectorChecker<TcpSocketBase> ())
 
  111   Ptr<Node> node = this->GetObject<Node> ();
 
  112   Ptr<Ipv4> ipv4 = this->GetObject<Ipv4> ();
 
  117       if ((node != 0) && (ipv4 != 0 || ipv6 != 0))
 
  121           tcpFactory->SetTcp (
this);
 
  185   socket->SetTcp (
this);
 
  186   socket->SetRtt (rtt);
 
  229   NS_LOG_FUNCTION (
this << localAddress << localPort << peerAddress << peerPort);
 
  231                                 peerAddress, peerPort);
 
  273   NS_LOG_FUNCTION (
this << localAddress << localPort << peerAddress << peerPort);
 
  275                                  peerAddress, peerPort);
 
  287                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
 
  289                             const uint8_t payload[8])
 
  291   NS_LOG_FUNCTION (
this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo
 
  292                         << payloadSource << payloadDestination);
 
  294   src = payload[0] << 8;
 
  296   dst = payload[2] << 8;
 
  302       endPoint->
ForwardIcmp (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
 
  306       NS_LOG_DEBUG (
"no endpoint found source=" << payloadSource <<
 
  307                     ", destination=" << payloadDestination <<
 
  308                     ", src=" << src << 
", dst=" << dst);
 
  314                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
 
  316                             const uint8_t payload[8])
 
  318   NS_LOG_FUNCTION (
this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo
 
  319                         << payloadSource << payloadDestination);
 
  321   src = payload[0] << 8;
 
  323   dst = payload[2] << 8;
 
  329       endPoint->
ForwardIcmp (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
 
  333       NS_LOG_DEBUG (
"no endpoint found source=" << payloadSource <<
 
  334                     ", destination=" << payloadDestination <<
 
  335                     ", src=" << src << 
", dst=" << dst);
 
  356                                  << 
" data size " << packet->
GetSize ());
 
  382           outgoingTcpHeader.SetSequenceNumber (incomingHeader.
GetAckNumber ());
 
  396       outgoingTcpHeader.SetDestinationPort (incomingHeader.
GetSourcePort ());
 
  398       SendPacket (rstPacket, outgoingTcpHeader, incomingDAddr, incomingSAddr);
 
  407   NS_LOG_FUNCTION (
this << packet << incomingIpHeader << incomingInterface);
 
  418       return checksumControl;
 
  421   NS_LOG_LOGIC (
"TcpL4Protocol " << 
this << 
" received a packet");
 
  430   if (endPoints.empty ())
 
  432       if (this->GetObject<Ipv6L3Protocol> () != 0)
 
  434           NS_LOG_LOGIC (
"  No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 " << 
this);
 
  443           return (this->
Receive (packet, ipv6Header, fakeInterface));
 
  446       NS_LOG_LOGIC (
"No endpoints matched on TcpL4Protocol "<< 
this <<
 
  449                     " source IP: " << incomingIpHeader.
GetSource () <<
 
  459   NS_ASSERT_MSG (endPoints.size () == 1, 
"Demux returned more than one endpoint");
 
  460   NS_LOG_LOGIC (
"TcpL4Protocol " << 
this << 
" forwarding up to endpoint/socket");
 
  462   (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
 
  490       return checksumControl;
 
  493   NS_LOG_LOGIC (
"TcpL4Protocol " << 
this << 
" received a packet");
 
  496                           incomingTcpHeader.GetDestinationPort (),
 
  498                           incomingTcpHeader.GetSourcePort (), interface);
 
  499   if (endPoints.empty ())
 
  501       NS_LOG_LOGIC (
"No endpoints matched on TcpL4Protocol "<< 
this <<
 
  503                     " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
 
  505                     " source port: "<< incomingTcpHeader.GetSourcePort ());
 
  513   NS_ASSERT_MSG (endPoints.size () == 1, 
"Demux returned more than one endpoint");
 
  514   NS_LOG_LOGIC (
"TcpL4Protocol " << 
this << 
" forwarding up to endpoint/socket");
 
  516   (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
 
  517                                     incomingTcpHeader.GetSourcePort (), interface);
 
  531                                  << 
" data size " << packet->
GetSize ());
 
  556       if (ipv4->GetRoutingProtocol () != 0)
 
  558           route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
 
  569       NS_FATAL_ERROR (
"Trying to use Tcp on a node without an Ipv4 interface");
 
  582                                  << 
" data size " << packet->
GetSize ());
 
  610       if (ipv6->GetRoutingProtocol () != 0)
 
  612           route = ipv6->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
 
  623       NS_FATAL_ERROR (
"Trying to use Tcp on a node without an Ipv6 interface");
 
  675   std::vector<Ptr<TcpSocketBase> >::iterator it = 
m_sockets.begin ();
 
  693   std::vector<Ptr<TcpSocketBase> >::iterator it = 
m_sockets.begin ();
 
static bool IsMatchingType(const Address &address)
If the Address matches the type. 
 
Ipv6Address GetIpv6(void) const 
Get the IPv6 address. 
 
Ptr< Socket > CreateSocket(void)
Create a TCP socket using the TypeId set by SocketType attribute. 
 
TypeId m_socketTypeId
The socket TypeId. 
 
Ipv4Address GetIpv4(void) const 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
Ptr< Node > m_node
the node this stack is associated with 
 
virtual void SetDownTarget6(IpL4Protocol::DownTargetCallback6 cb)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv6 ca...
 
SocketErrno
Enumeration of the possible errors returned by a socket. 
 
virtual IpL4Protocol::DownTargetCallback6 GetDownTarget6(void) const 
This method allows a caller to get the current down target callback set for this L4 protocol (IPv6 ca...
 
void SendPacketV4(Ptr< Packet > pkt, const TcpHeader &outgoing, const Ipv4Address &saddr, const Ipv4Address &daddr, Ptr< NetDevice > oif=0) const 
Send a packet via TCP (IPv4) 
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
virtual enum IpL4Protocol::RxStatus Receive(Ptr< Packet > p, Ipv4Header const &incomingIpHeader, Ptr< Ipv4Interface > incomingInterface)
Called from lower-level layers to send the packet up in the stack. 
 
std::list< Ipv6EndPoint * > EndPoints
Container of the IPv6 endpoints. 
 
Ptr< T > GetObject(void) const 
Get a pointer to the requested aggregated Object. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
void Send(Ptr< Packet > packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr< Ipv6Route > route)
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers...
 
IPv6 layer implementation. 
 
EndPoints Lookup(Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport, Ptr< Ipv6Interface > incomingInterface)
lookup for a match with all the parameters. 
 
static bool ChecksumEnabled(void)
 
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together. 
 
Ipv6EndPoint * Allocate6(void)
Allocate an IPv6 Endpoint. 
 
bool IsNull(void) const 
Check for null implementation. 
 
Ptr< const AttributeAccessor > MakeObjectVectorAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
virtual void ReceiveIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, Ipv4Address payloadSource, Ipv4Address payloadDestination, const uint8_t payload[8])
Called from lower-level layers to send the ICMP packet up in the stack. 
 
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory. 
 
uint32_t GetSize(void) const 
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
enum IpL4Protocol::RxStatus PacketReceived(Ptr< Packet > packet, TcpHeader &incomingTcpHeader, const Address &source, const Address &destination)
Get the tcp header of the incoming packet and checks its checksum if needed. 
 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
 
static TypeId GetTypeId(void)
Get the type ID. 
 
void AddSocket(Ptr< TcpSocketBase > socket)
Make a socket fully operational. 
 
void DeAllocate(Ipv4EndPoint *endPoint)
Remove an IPv4 Endpoint. 
 
a polymophic address class 
 
Tcp socket creation and multiplexing/demultiplexing. 
 
virtual void NotifyNewAggregate()
Setup socket factory and callbacks when aggregated to a node. 
 
Demultiplexes packets to various transport layer endpoints. 
 
static TypeId GetTypeId(void)
Get the type ID. 
 
Ptr< Object > Create(void) const 
Create an Object instance of the configured TypeId. 
 
Base class for all RTT Estimators. 
 
virtual IpL4Protocol::DownTargetCallback GetDownTarget(void) const 
This method allows a caller to get the current down target callback set for this L4 protocol (IPv4 ca...
 
Ipv6EndPoint * Allocate(void)
Allocate a Ipv6EndPoint. 
 
AttributeValue implementation for TypeId. 
 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
 
A base class for implementation of a stream socket using TCP. 
 
static bool IsMatchingType(const Address &address)
 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
 
std::vector< Ptr< TcpSocketBase > > m_sockets
list of sockets 
 
void DeAllocate(Ipv6EndPoint *endPoint)
Remove a end point. 
 
static const uint8_t PROT_NUMBER
protocol number (0x6) 
 
Access to the Ipv4 forwarding table, interfaces, and configuration. 
 
uint32_t PeekHeader(Header &header) const 
Deserialize but does not remove the header from the internal buffer. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address. 
 
Ipv6EndPointDemux * m_endPoints6
A list of IPv6 end points. 
 
void ForwardIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Forward the ICMP packet to the upper level. 
 
virtual int GetProtocolNumber(void) const 
 
virtual void SetNode(Ptr< Node > node)
Set the associated node. 
 
Ipv6EndPoint * SimpleLookup(Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport)
Simple lookup for a four-tuple match. 
 
virtual void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)=0
 
Ipv4EndPoint * SimpleLookup(Ipv4Address daddr, uint16_t dport, Ipv4Address saddr, uint16_t sport)
simple lookup for a match with all the parameters. 
 
void NoEndPointsFound(const TcpHeader &incomingHeader, const Address &incomingSAddr, const Address &incomingDAddr)
Check if RST packet should be sent, and in case, send it. 
 
L4 Protocol abstract base class. 
 
Ipv4EndPoint * Allocate(void)
Allocate an IPv4 Endpoint. 
 
void SendPacketV6(Ptr< Packet > pkt, const TcpHeader &outgoing, const Ipv6Address &saddr, const Ipv6Address &daddr, Ptr< NetDevice > oif=0) const 
Send a packet via TCP (IPv6) 
 
EndPoints Lookup(Ipv4Address daddr, uint16_t dport, Ipv4Address saddr, uint16_t sport, Ptr< Ipv4Interface > incomingInterface)
lookup for a match with all the parameters. 
 
Ipv4EndPointDemux * m_endPoints
A list of IPv4 end points. 
 
void SetNode(Ptr< Node > node)
Set node associated with this stack. 
 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
 
Describes an IPv6 address. 
 
Instantiate subclasses of ns3::Object. 
 
Ptr< const AttributeAccessor > MakeTypeIdAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
Ipv4 addresses are stored in host order in this class. 
 
std::list< Ipv4EndPoint * > EndPoints
Container of the IPv4 endpoints. 
 
static TypeId GetTypeId(void)
Get the type ID. 
 
Demultiplexor for end points. 
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress. 
 
A representation of an internet IPv6 endpoint/connection. 
 
bool RemoveSocket(Ptr< TcpSocketBase > socket)
Remove a socket from the internal list. 
 
virtual void SetDownTarget(IpL4Protocol::DownTargetCallback cb)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv4 ca...
 
void SendPacket(Ptr< Packet > pkt, const TcpHeader &outgoing, const Address &saddr, const Address &daddr, Ptr< NetDevice > oif=0) const 
Send a packet via TCP (IP-agnostic) 
 
static bool IsMatchingType(const Address &addr)
If the address match. 
 
TypeId m_rttTypeId
The RTT Estimator TypeId. 
 
Ipv4Address GetIpv4MappedAddress() const 
Return the Ipv4 address. 
 
void Nullify(void)
Discard the implementation, set it to null. 
 
void ForwardIcmp(Ipv6Address src, uint8_t ttl, uint8_t type, uint8_t code, uint32_t info)
Forward the ICMP packet to the upper level. 
 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
 
static Ipv4Address ConvertFrom(const Address &address)
 
virtual void NotifyNewAggregate(void)
Notify all Objects aggregated to this one of a new Object being aggregated. 
 
Container for a set of ns3::Object pointers. 
 
void DeAllocate(Ipv4EndPoint *endPoint)
Remove a end point. 
 
Ptr< const AttributeChecker > MakeTypeIdChecker(void)
 
static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr)
Make the Ipv4-mapped IPv6 address. 
 
bool IsIpv4MappedAddress() const 
If the address is an IPv4-mapped address. 
 
a unique identifier for an interface. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
static bool IsMatchingType(const Address &address)
 
IpL4Protocol::DownTargetCallback6 m_downTarget6
Callback to send packets over IPv6. 
 
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number. 
 
void AddHeader(const Header &header)
Add header to this packet. 
 
A representation of an internet endpoint/connection. 
 
IpL4Protocol::DownTargetCallback m_downTarget
Callback to send packets over IPv4. 
 
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones. 
 
Ipv4EndPoint * Allocate(void)
Allocate a Ipv4EndPoint.