29#include "ns3/assert.h" 
   30#include "ns3/boolean.h" 
   33#include "ns3/nstime.h" 
   34#include "ns3/object-map.h" 
   35#include "ns3/packet.h" 
   36#include "ns3/simulator.h" 
   40#include <unordered_map> 
   52#undef NS_LOG_APPEND_CONTEXT 
   53#define NS_LOG_APPEND_CONTEXT                                                                      \ 
   56        std::clog << " [node " << m_node->GetId() << "] ";                                         \ 
 
   63        TypeId(
"ns3::TcpL4Protocol")
 
   65            .SetGroupName(
"Internet")
 
   67            .AddAttribute(
"RttEstimatorType",
 
   68                          "Type of RttEstimator objects.",
 
   72            .AddAttribute(
"SocketType",
 
   73                          "Socket type of TCP objects.",
 
   77            .AddAttribute(
"RecoveryType",
 
   78                          "Recovery type of TCP objects.",
 
   82            .AddAttribute(
"SocketList",
 
   83                          "A container of sockets associated to this protocol. " 
   84                          "The underlying type is an unordered map, the attribute name " 
   85                          "is kept for backward compatibility.",
 
 
  121        if (node && (ipv4 || ipv6))
 
  125            tcpFactory->SetTcp(
this);
 
  126            node->AggregateObject(tcpFactory);
 
 
  192    congestionAlgorithmFactory.
SetTypeId(congestionTypeId);
 
  193    recoveryAlgorithmFactory.
SetTypeId(recoveryTypeId);
 
  201    socket->SetTcp(
this);
 
  203    socket->SetCongestionControlAlgorithm(algo);
 
  204    socket->SetRecoveryAlgorithm(recovery);
 
 
  251    NS_LOG_FUNCTION(
this << boundNetDevice << localAddress << localPort << peerAddress << peerPort);
 
  252    return m_endPoints->Allocate(boundNetDevice, localAddress, localPort, peerAddress, peerPort);
 
 
  297    NS_LOG_FUNCTION(
this << boundNetDevice << localAddress << localPort << peerAddress << peerPort);
 
  298    return m_endPoints6->Allocate(boundNetDevice, localAddress, localPort, peerAddress, peerPort);
 
 
  316                           const uint8_t payload[8])
 
  318    NS_LOG_FUNCTION(
this << icmpSource << (uint16_t)icmpTtl << (uint16_t)icmpType
 
  319                         << (uint16_t)icmpCode << icmpInfo << payloadSource << payloadDestination);
 
  322    src = payload[0] << 8;
 
  324    dst = payload[2] << 8;
 
  328    if (endPoint != 
nullptr)
 
  330        endPoint->
ForwardIcmp(icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
 
  334        NS_LOG_DEBUG(
"no endpoint found source=" << payloadSource
 
  335                                                 << 
", destination=" << payloadDestination
 
  336                                                 << 
", src=" << src << 
", dst=" << dst);
 
 
  348                           const uint8_t payload[8])
 
  350    NS_LOG_FUNCTION(
this << icmpSource << (uint16_t)icmpTtl << (uint16_t)icmpType
 
  351                         << (uint16_t)icmpCode << icmpInfo << payloadSource << payloadDestination);
 
  354    src = payload[0] << 8;
 
  356    dst = payload[2] << 8;
 
  360        m_endPoints6->SimpleLookup(payloadSource, src, payloadDestination, dst);
 
  361    if (endPoint != 
nullptr)
 
  363        endPoint->
ForwardIcmp(icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
 
  367        NS_LOG_DEBUG(
"no endpoint found source=" << payloadSource
 
  368                                                 << 
", destination=" << payloadDestination
 
  369                                                 << 
", src=" << src << 
", dst=" << dst);
 
 
  379    NS_LOG_FUNCTION(
this << packet << incomingTcpHeader << source << destination);
 
  387    packet->PeekHeader(incomingTcpHeader);
 
  389    NS_LOG_LOGIC(
"TcpL4Protocol " << 
this << 
" receiving seq " 
  393                                  << 
" data size " << packet->GetSize());
 
 
  409    NS_LOG_FUNCTION(
this << incomingHeader << incomingSAddr << incomingDAddr);
 
  437        SendPacket(rstPacket, outgoingTcpHeader, incomingDAddr, incomingSAddr);
 
 
  446    NS_LOG_FUNCTION(
this << packet << incomingIpHeader << incomingInterface);
 
  458        return checksumControl;
 
  468    if (endPoints.empty())
 
  472            NS_LOG_LOGIC(
"  No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 " << 
this);
 
  482            return (this->
Receive(packet, ipv6Header, fakeInterface));
 
  487                     << 
" received a packet but" 
  488                        " no endpoints matched." 
  491                     << 
" source IP: " << incomingIpHeader.
GetSource()
 
  501    NS_ASSERT_MSG(endPoints.size() == 1, 
"Demux returned more than one endpoint");
 
  503                                  << 
" received a packet and" 
  504                                     " now forwarding it up to endpoint/socket");
 
  507        ->ForwardUp(packet, incomingIpHeader, incomingTcpHeader.
GetSourcePort(), incomingInterface);
 
 
  534        return checksumControl;
 
  543    if (endPoints.empty())
 
  547                     << 
" received a packet but" 
  548                        " no endpoints matched." 
  551                     << 
" source IP: " << incomingIpHeader.
GetSource()
 
  561    NS_ASSERT_MSG(endPoints.size() == 1, 
"Demux returned more than one endpoint");
 
  563                                  << 
" received a packet and" 
  564                                     " now forwarding it up to endpoint/socket");
 
  567        ->ForwardUp(packet, incomingIpHeader, incomingTcpHeader.
GetSourcePort(), interface);
 
 
  583                                  << packet->GetSize());
 
  595    packet->AddHeader(outgoingHeader);
 
  606        if (ipv4->GetRoutingProtocol())
 
  608            route = ipv4->GetRoutingProtocol()->RouteOutput(packet, header, oif, errno_);
 
  619        NS_FATAL_ERROR(
"Trying to use Tcp on a node without an Ipv4 interface");
 
 
  634                                  << packet->GetSize());
 
  654    packet->AddHeader(outgoingHeader);
 
  665        if (ipv6->GetRoutingProtocol())
 
  667            route = ipv6->GetRoutingProtocol()->RouteOutput(packet, header, oif, errno_);
 
  678        NS_FATAL_ERROR(
"Trying to use Tcp on a node without an Ipv6 interface");
 
 
  743        if (socketItem.second == socket)
 
 
  758        if (socketItem.second == socket)
 
  760            socketItem.second = 
nullptr;
 
 
a polymophic address class
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
static bool IsMatchingType(const Address &addr)
If the address match.
Ipv6Address GetIpv6() const
Get the IPv6 address.
static bool IsMatchingType(const Address &address)
Ipv4Address GetIpv4() const
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
L4 Protocol abstract base class.
Callback< void, Ptr< Packet >, Ipv4Address, Ipv4Address, uint8_t, Ptr< Ipv4Route > > DownTargetCallback
callback to send packets over IPv4
Callback< void, Ptr< Packet >, Ipv6Address, Ipv6Address, uint8_t, Ptr< Ipv6Route > > DownTargetCallback6
callback to send packets over IPv6
Ipv4 addresses are stored in host order in this class.
static Ipv4Address ConvertFrom(const Address &address)
static bool IsMatchingType(const Address &address)
Demultiplexes packets to various transport layer endpoints.
std::list< Ipv4EndPoint * > EndPoints
Container of the IPv4 endpoints.
A representation of an internet endpoint/connection.
void ForwardIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Forward the ICMP packet to the upper level.
Access to the IPv4 forwarding table, interfaces, and configuration.
virtual void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)=0
Describes an IPv6 address.
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones.
Ipv4Address GetIpv4MappedAddress() const
Return the Ipv4 address.
static bool IsMatchingType(const Address &address)
If the Address matches the type.
static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr)
Make the Ipv4-mapped IPv6 address.
Demultiplexer for end points.
std::list< Ipv6EndPoint * > EndPoints
Container of the IPv6 endpoints.
A representation of an IPv6 endpoint/connection.
void ForwardIcmp(Ipv6Address src, uint8_t ttl, uint8_t type, uint8_t code, uint32_t info)
Forward the ICMP packet to the upper level.
Access to the IPv6 forwarding table, interfaces, and configuration.
virtual void Send(Ptr< Packet > packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr< Ipv6Route > route)=0
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers.
IPv6 layer implementation.
static bool ChecksumEnabled()
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
virtual void NotifyNewAggregate()
Notify all Objects aggregated to this one of a new Object being aggregated.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
virtual void DoDispose()
Destructor implementation.
Smart pointer class similar to boost::intrusive_ptr.
Base class for all RTT Estimators.
static TypeId GetTypeId()
Get the type ID.
SocketErrno
Enumeration of the possible errors returned by a socket.
Congestion control abstract class.
static TypeId GetTypeId()
Get the type ID.
TCP socket creation and multiplexing/demultiplexing.
void SetNode(Ptr< Node > node)
Set node associated with this stack.
void SendPacketV4(Ptr< Packet > pkt, const TcpHeader &outgoing, const Ipv4Address &saddr, const Ipv4Address &daddr, Ptr< NetDevice > oif=nullptr) const
Send a packet via TCP (IPv4).
void NoEndPointsFound(const TcpHeader &incomingHeader, const Address &incomingSAddr, const Address &incomingDAddr)
Check if RST packet should be sent, and in case, send it.
bool RemoveSocket(Ptr< TcpSocketBase > socket)
Remove a socket from the internal list.
TypeId m_congestionTypeId
The socket TypeId.
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.
TypeId m_recoveryTypeId
The recovery TypeId.
IpL4Protocol::DownTargetCallback m_downTarget
Callback to send packets over IPv4.
void SetDownTarget6(IpL4Protocol::DownTargetCallback6 cb) override
This method allows a caller to set the current down target callback set for this L4 protocol (IPv6 ca...
void DoDispose() override
Destructor implementation.
Ipv4EndPointDemux * m_endPoints
A list of IPv4 end points.
Ipv6EndPointDemux * m_endPoints6
A list of IPv6 end points.
Ptr< Node > m_node
the node this stack is associated with
static TypeId GetTypeId()
Get the type ID.
void NotifyNewAggregate() override
Setup socket factory and callbacks when aggregated to a node.
Ipv6EndPoint * Allocate6()
Allocate an IPv6 Endpoint.
void DeAllocate(Ipv4EndPoint *endPoint)
Remove an IPv4 Endpoint.
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]) override
Called from lower-level layers to send the ICMP packet up in the stack.
IpL4Protocol::DownTargetCallback GetDownTarget() const override
This method allows a caller to get the current down target callback set for this L4 protocol (IPv4 ca...
~TcpL4Protocol() override
std::unordered_map< uint64_t, Ptr< TcpSocketBase > > m_sockets
Unordered map of socket IDs and corresponding sockets.
void SetDownTarget(IpL4Protocol::DownTargetCallback cb) override
This method allows a caller to set the current down target callback set for this L4 protocol (IPv4 ca...
Ptr< Socket > CreateSocket()
Create a TCP socket using the TypeId set by SocketType attribute.
void SendPacketV6(Ptr< Packet > pkt, const TcpHeader &outgoing, const Ipv6Address &saddr, const Ipv6Address &daddr, Ptr< NetDevice > oif=nullptr) const
Send a packet via TCP (IPv6).
uint64_t m_socketIndex
index of the next socket to be created
IpL4Protocol::DownTargetCallback6 GetDownTarget6() const override
This method allows a caller to get the current down target callback set for this L4 protocol (IPv6 ca...
void SendPacket(Ptr< Packet > pkt, const TcpHeader &outgoing, const Address &saddr, const Address &daddr, Ptr< NetDevice > oif=nullptr) const
Send a packet via TCP (IP-agnostic).
void AddSocket(Ptr< TcpSocketBase > socket)
Make a socket fully operational.
IpL4Protocol::DownTargetCallback6 m_downTarget6
Callback to send packets over IPv6.
IpL4Protocol::RxStatus Receive(Ptr< Packet > p, const Ipv4Header &incomingIpHeader, Ptr< Ipv4Interface > incomingInterface) override
Called from lower-level layers to send the packet up in the stack.
Ipv4EndPoint * Allocate()
Allocate an IPv4 Endpoint.
static constexpr uint8_t PROT_NUMBER
Protocol number (see http://www.iana.org/assignments/protocol-numbers).
int GetProtocolNumber() const override
Returns the protocol number of this protocol.
TypeId m_rttTypeId
The RTT Estimator TypeId.
static TypeId GetTypeId()
Get the type ID.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
std::string GetName() const
Get the name.
AttributeValue implementation for TypeId.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
ObjectPtrContainerValue ObjectMapValue
ObjectMapValue is an alias for ObjectPtrContainerValue.
Ptr< const AttributeAccessor > MakeObjectMapAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
Ptr< const AttributeChecker > MakeObjectMapChecker()
Ptr< const AttributeChecker > MakeTypeIdChecker()
Ptr< const AttributeAccessor > MakeTypeIdAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...