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"
62 #undef NS_LOG_APPEND_CONTEXT
63 #define NS_LOG_APPEND_CONTEXT \
64 if (m_node) { std::clog << " [node " << m_node->GetId () << "] "; }
74 .SetGroupName (
"Internet")
76 .AddAttribute (
"RttEstimatorType",
77 "Type of RttEstimator objects.",
81 .AddAttribute (
"SocketType",
82 "Socket type of TCP objects.",
86 .AddAttribute (
"RecoveryType",
87 "Recovery type of TCP objects.",
91 .AddAttribute (
"SocketList",
"The list of sockets associated to this protocol.",
94 MakeObjectVectorChecker<TcpSocketBase> ())
121 Ptr<Node> node = this->GetObject<Node> ();
122 Ptr<Ipv4> ipv4 = this->GetObject<Ipv4> ();
127 if ((node != 0) && (ipv4 != 0 || ipv6 != 0))
131 tcpFactory->SetTcp (
this);
198 congestionAlgorithmFactory.
SetTypeId (congestionTypeId);
199 recoveryAlgorithmFactory.
SetTypeId (recoveryTypeId);
207 socket->SetTcp (
this);
208 socket->SetRtt (rtt);
209 socket->SetCongestionControlAlgorithm (algo);
210 socket->SetRecoveryAlgorithm (recovery);
255 NS_LOG_FUNCTION (
this << boundNetDevice << localAddress << localPort << peerAddress << peerPort);
257 localAddress, localPort,
258 peerAddress, peerPort);
301 NS_LOG_FUNCTION (
this << boundNetDevice << localAddress << localPort << peerAddress << peerPort);
303 localAddress, localPort,
304 peerAddress, peerPort);
316 uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
318 const uint8_t payload[8])
320 NS_LOG_FUNCTION (
this << icmpSource << (uint16_t) icmpTtl << (uint16_t) icmpType << (uint16_t) icmpCode << icmpInfo
321 << payloadSource << payloadDestination);
323 src = payload[0] << 8;
325 dst = payload[2] << 8;
331 endPoint->
ForwardIcmp (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
335 NS_LOG_DEBUG (
"no endpoint found source=" << payloadSource <<
336 ", destination=" << payloadDestination <<
337 ", src=" << src <<
", dst=" << dst);
343 uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
345 const uint8_t payload[8])
347 NS_LOG_FUNCTION (
this << icmpSource << (uint16_t) icmpTtl << (uint16_t) icmpType << (uint16_t) icmpCode << icmpInfo
348 << payloadSource << payloadDestination);
350 src = payload[0] << 8;
352 dst = payload[2] << 8;
358 endPoint->
ForwardIcmp (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
362 NS_LOG_DEBUG (
"no endpoint found source=" << payloadSource <<
363 ", destination=" << payloadDestination <<
364 ", src=" << src <<
", dst=" << dst);
372 NS_LOG_FUNCTION (
this << packet << incomingTcpHeader << source << destination);
386 <<
" data size " << packet->
GetSize ());
402 NS_LOG_FUNCTION (
this << incomingHeader << incomingSAddr << incomingDAddr);
430 SendPacket (rstPacket, outgoingTcpHeader, incomingDAddr, incomingSAddr);
439 NS_LOG_FUNCTION (
this << packet << incomingIpHeader << incomingInterface);
450 return checksumControl;
460 if (endPoints.empty ())
462 if (this->GetObject<Ipv6L3Protocol> () != 0)
464 NS_LOG_LOGIC (
" No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 " <<
this);
465 Ptr<Ipv6Interface> fakeInterface;
466 Ipv6Header ipv6Header;
467 Ipv6Address src, dst;
471 ipv6Header.SetSource (src);
472 ipv6Header.SetDestination (dst);
473 return (this->
Receive (packet, ipv6Header, fakeInterface));
476 NS_LOG_LOGIC (
"TcpL4Protocol " <<
this <<
" received a packet but"
477 " no endpoints matched." <<
480 " source IP: " << incomingIpHeader.
GetSource () <<
490 NS_ASSERT_MSG (endPoints.size () == 1,
"Demux returned more than one endpoint");
491 NS_LOG_LOGIC (
"TcpL4Protocol " <<
this <<
" received a packet and"
492 " now forwarding it up to endpoint/socket");
494 (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
503 Ipv6Header
const &incomingIpHeader,
504 Ptr<Ipv6Interface> interface)
507 incomingIpHeader.GetDestination ());
509 TcpHeader incomingTcpHeader;
517 incomingIpHeader.GetSource (),
518 incomingIpHeader.GetDestination ());
522 return checksumControl;
527 incomingTcpHeader.GetDestinationPort (),
528 incomingIpHeader.GetSource (),
529 incomingTcpHeader.GetSourcePort (), interface);
530 if (endPoints.empty ())
532 NS_LOG_LOGIC (
"TcpL4Protocol " <<
this <<
" received a packet but"
533 " no endpoints matched." <<
534 " destination IP: " << incomingIpHeader.GetDestination () <<
535 " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
536 " source IP: " << incomingIpHeader.GetSource () <<
537 " source port: "<< incomingTcpHeader.GetSourcePort ());
540 incomingIpHeader.GetDestination ());
545 NS_ASSERT_MSG (endPoints.size () == 1,
"Demux returned more than one endpoint");
546 NS_LOG_LOGIC (
"TcpL4Protocol " <<
this <<
" received a packet and"
547 " now forwarding it up to endpoint/socket");
549 (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
550 incomingTcpHeader.GetSourcePort (), interface);
565 <<
" data size " << packet->
GetSize ());
589 if (ipv4->GetRoutingProtocol () != 0)
591 route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
602 NS_FATAL_ERROR (
"Trying to use Tcp on a node without an Ipv4 interface");
616 <<
" data size " << packet->
GetSize ());
643 if (ipv6->GetRoutingProtocol () != 0)
645 route = ipv6->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
656 NS_FATAL_ERROR (
"Trying to use Tcp on a node without an Ipv6 interface");
710 std::vector<Ptr<TcpSocketBase> >::iterator it =
m_sockets.begin ();
729 std::vector<Ptr<TcpSocketBase> >::iterator it =
m_sockets.begin ();
a polymophic address class
bool IsNull(void) const
Check for null implementation.
void Nullify(void)
Discard the implementation, set it to null.
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
static bool IsMatchingType(const Address &addr)
If the address match.
Ipv6Address GetIpv6(void) const
Get the IPv6 address.
Ipv4Address GetIpv4(void) const
static bool IsMatchingType(const Address &address)
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
L4 Protocol abstract base class.
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.
Ipv4EndPoint * SimpleLookup(Ipv4Address daddr, uint16_t dport, Ipv4Address saddr, uint16_t sport)
simple lookup for a match with all the parameters.
Ipv4EndPoint * Allocate(void)
Allocate a Ipv4EndPoint.
EndPoints Lookup(Ipv4Address daddr, uint16_t dport, Ipv4Address saddr, uint16_t sport, Ptr< Ipv4Interface > incomingInterface)
lookup for a match with all the parameters.
void DeAllocate(Ipv4EndPoint *endPoint)
Remove a end point.
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.
EndPoints Lookup(Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport, Ptr< Ipv6Interface > incomingInterface)
lookup for a match with all the parameters.
std::list< Ipv6EndPoint * > EndPoints
Container of the IPv6 endpoints.
Ipv6EndPoint * Allocate(void)
Allocate a Ipv6EndPoint.
Ipv6EndPoint * SimpleLookup(Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport)
Simple lookup for a four-tuple match.
void DeAllocate(Ipv6EndPoint *endPoint)
Remove a end point.
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(void)
Instantiate subclasses of ns3::Object.
Ptr< Object > Create(void) 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 DoDispose(void)
Destructor implementation.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
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 AddHeader(const Header &header)
Add header to this packet.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Base class for all RTT Estimators.
static TypeId GetTypeId(void)
Get the type ID.
SocketErrno
Enumeration of the possible errors returned by a socket.
Congestion control abstract class.
static TypeId GetTypeId(void)
Get the type ID.
TCP socket creation and multiplexing/demultiplexing.
void SetNode(Ptr< Node > node)
Set node associated with this stack.
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.
virtual int GetProtocolNumber(void) const
Returns the protocol number of this protocol.
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.
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)
TypeId m_recoveryTypeId
The recovery TypeId.
IpL4Protocol::DownTargetCallback m_downTarget
Callback to send packets over IPv4.
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.
Ipv4EndPointDemux * m_endPoints
A list of IPv4 end points.
std::vector< Ptr< TcpSocketBase > > m_sockets
list of sockets
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...
Ipv6EndPointDemux * m_endPoints6
A list of IPv6 end points.
Ptr< Socket > CreateSocket(void)
Create a TCP socket using the TypeId set by SocketType attribute.
Ptr< Node > m_node
the node this stack is associated with
virtual void DoDispose(void)
Destructor implementation.
Ipv4EndPoint * Allocate(void)
Allocate an IPv4 Endpoint.
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...
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 DeAllocate(Ipv4EndPoint *endPoint)
Remove an IPv4 Endpoint.
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)
static const uint8_t PROT_NUMBER
protocol number (0x6)
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 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)
virtual void NotifyNewAggregate()
Setup socket factory and callbacks when aggregated to a node.
static TypeId GetTypeId(void)
Get the type ID.
Ipv6EndPoint * Allocate6(void)
Allocate an IPv6 Endpoint.
void AddSocket(Ptr< TcpSocketBase > socket)
Make a socket fully operational.
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...
IpL4Protocol::DownTargetCallback6 m_downTarget6
Callback to send packets over IPv6.
TypeId m_rttTypeId
The RTT Estimator TypeId.
static TypeId GetTypeId(void)
Get the type ID.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
std::string GetName(void) 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...
Ptr< const AttributeAccessor > MakeObjectVectorAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
Ptr< const AttributeAccessor > MakeTypeIdAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeTypeIdChecker(void)
#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.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...