24 #include "ns3/packet.h"
27 #include "socket-factory.h"
34 NS_OBJECT_ENSURE_REGISTERED (Socket);
37 Socket::GetTypeId (
void)
39 static TypeId tid = TypeId (
"ns3::Socket")
40 .SetParent<Object> ();
45 : m_manualIpTos (false),
46 m_manualIpTtl (false),
49 m_manualIpv6Tclass (false),
50 m_manualIpv6HopLimit (false),
51 m_ipv6RecvTclass (false),
52 m_ipv6RecvHopLimit (false)
56 m_recvPktInfo =
false;
77 s = socketFactory->CreateSocket ();
88 m_connectionSucceeded = connectionSucceeded;
89 m_connectionFailed = connectionFailed;
98 m_normalClose = normalClose;
99 m_errorClose = errorClose;
108 m_connectionRequest = connectionRequest;
109 m_newConnectionCreated = newConnectionCreated;
116 m_dataSent = dataSent;
130 m_receivedData = receivedData;
147 p = Create<Packet> (buf, size);
151 p = Create<Packet> (size);
153 return Send (p, flags);
164 p = Create<Packet> (buf, size);
168 p = Create<Packet> (size);
170 return SendTo (p, flags, toAddress);
177 return Recv (std::numeric_limits<uint32_t>::max (), 0);
197 return RecvFrom (std::numeric_limits<uint32_t>::max (), 0, fromAddress);
216 Socket::NotifyConnectionSucceeded (
void)
219 if (!m_connectionSucceeded.IsNull ())
221 m_connectionSucceeded (
this);
226 Socket::NotifyConnectionFailed (
void)
229 if (!m_connectionFailed.IsNull ())
231 m_connectionFailed (
this);
236 Socket::NotifyNormalClose (
void)
239 if (!m_normalClose.IsNull ())
241 m_normalClose (
this);
246 Socket::NotifyErrorClose (
void)
249 if (!m_errorClose.IsNull ())
256 Socket::NotifyConnectionRequest (
const Address &from)
259 if (!m_connectionRequest.IsNull ())
261 return m_connectionRequest (
this, from);
274 Socket::NotifyNewConnectionCreated (Ptr<Socket> socket,
const Address &from)
277 if (!m_newConnectionCreated.IsNull ())
279 m_newConnectionCreated (socket, from);
284 Socket::NotifyDataSent (uint32_t size)
287 if (!m_dataSent.IsNull ())
289 m_dataSent (
this, size);
294 Socket::NotifySend (uint32_t spaceAvailable)
297 if (!m_sendCb.IsNull ())
299 m_sendCb (
this, spaceAvailable);
304 Socket::NotifyDataRecv (
void)
307 if (!m_receivedData.IsNull ())
309 m_receivedData (
this);
317 m_connectionSucceeded = MakeNullCallback<void,Ptr<Socket> > ();
318 m_connectionFailed = MakeNullCallback<void,Ptr<Socket> > ();
319 m_normalClose = MakeNullCallback<void,Ptr<Socket> > ();
320 m_errorClose = MakeNullCallback<void,Ptr<Socket> > ();
321 m_connectionRequest = MakeNullCallback<bool,Ptr<Socket>,
const Address &> ();
322 m_newConnectionCreated = MakeNullCallback<void,Ptr<Socket>,
const Address &> ();
323 m_dataSent = MakeNullCallback<void,Ptr<Socket>, uint32_t> ();
324 m_sendCb = MakeNullCallback<void,Ptr<Socket>, uint32_t> ();
325 m_receivedData = MakeNullCallback<void,Ptr<Socket> > ();
343 NS_ASSERT_MSG (found,
"Socket cannot be bound to a NetDevice not existing on the Node");
345 m_boundnetdevice = netdevice;
353 return m_boundnetdevice;
360 m_recvPktInfo = flag;
366 return m_recvPktInfo;
370 Socket::IsManualIpTos (
void)
const
372 return m_manualIpTos;
376 Socket::IsManualIpv6Tclass (
void)
const
378 return m_manualIpv6Tclass;
382 Socket::IsManualIpTtl (
void)
const
384 return m_manualIpTtl;
388 Socket::IsManualIpv6HopLimit (
void)
const
390 return m_manualIpv6HopLimit;
394 Socket::SetIpTos (uint8_t tos)
398 m_manualIpTos =
true;
403 Socket::GetIpTos (
void)
const
411 m_ipRecvTos = ipv4RecvTos;
421 Socket::SetIpv6Tclass (
int tclass)
427 if (tclass == -1 || tclass < -1 || tclass > 0xff)
430 if (tclass < -1 || tclass > 0xff)
432 NS_LOG_WARN (
"Invalid IPV6_TCLASS value. Using default.");
434 m_manualIpv6Tclass =
false;
439 m_manualIpv6Tclass =
true;
440 m_ipv6Tclass = tclass;
445 Socket::GetIpv6Tclass (
void)
const
453 m_ipv6RecvTclass = ipv6RecvTclass;
459 return m_ipv6RecvTclass;
463 Socket::SetIpTtl (uint8_t ttl)
465 m_manualIpTtl =
true;
470 Socket::GetIpTtl (
void)
const
478 m_ipRecvTtl = ipv4RecvTtl;
488 Socket::SetIpv6HopLimit (uint8_t ipHopLimit)
490 m_manualIpv6HopLimit =
true;
491 m_ipv6HopLimit = ipHopLimit;
495 Socket::GetIpv6HopLimit (
void)
const
497 return m_ipv6HopLimit;
503 m_ipv6RecvHopLimit = ipv6RecvHopLimit;
509 return m_ipv6RecvHopLimit;
516 SocketAddressTag::SocketAddressTag ()
522 SocketAddressTag::SetAddress (Address addr)
529 SocketAddressTag::GetAddress (
void)
const
535 NS_OBJECT_ENSURE_REGISTERED (SocketAddressTag);
538 SocketAddressTag::GetTypeId (
void)
540 static TypeId tid = TypeId (
"ns3::SocketAddressTag")
542 .AddConstructor<SocketAddressTag> ()
573 os <<
"address=" << m_address;
576 SocketIpTtlTag::SocketIpTtlTag ()
582 SocketIpTtlTag::SetTtl (uint8_t ttl)
589 SocketIpTtlTag::GetTtl (
void)
const
595 NS_OBJECT_ENSURE_REGISTERED (SocketIpTtlTag);
598 SocketIpTtlTag::GetTypeId (
void)
600 static TypeId tid = TypeId (
"ns3::SocketIpTtlTag")
602 .AddConstructor<SocketIpTtlTag> ()
634 os <<
"Ttl=" << (uint32_t) m_ttl;
637 SocketIpv6HopLimitTag::SocketIpv6HopLimitTag ()
642 SocketIpv6HopLimitTag::SetHopLimit (uint8_t hopLimit)
644 m_hopLimit = hopLimit;
648 SocketIpv6HopLimitTag::GetHopLimit (
void)
const
653 NS_OBJECT_ENSURE_REGISTERED (SocketIpv6HopLimitTag);
656 SocketIpv6HopLimitTag::GetTypeId (
void)
658 static TypeId tid = TypeId (
"ns3::SocketIpv6HopLimitTag")
660 .AddConstructor<SocketIpv6HopLimitTag> ()
688 os <<
"HopLimit=" << (uint32_t) m_hopLimit;
691 SocketSetDontFragmentTag::SocketSetDontFragmentTag ()
696 SocketSetDontFragmentTag::Enable (
void)
699 m_dontFragment =
true;
702 SocketSetDontFragmentTag::Disable (
void)
705 m_dontFragment =
false;
708 SocketSetDontFragmentTag::IsEnabled (
void)
const
711 return m_dontFragment;
714 NS_OBJECT_ENSURE_REGISTERED (SocketSetDontFragmentTag);
717 SocketSetDontFragmentTag::GetTypeId (
void)
719 static TypeId tid = TypeId (
"ns3::SocketSetDontFragmentTag")
721 .AddConstructor<SocketSetDontFragmentTag> ();
739 i.
WriteU8 (m_dontFragment ? 1 : 0);
745 m_dontFragment = (i.
ReadU8 () == 1) ?
true :
false;
751 os << (m_dontFragment ?
"true" :
"false");
755 SocketIpTosTag::SocketIpTosTag ()
760 SocketIpTosTag::SetTos (uint8_t ipTos)
766 SocketIpTosTag::GetTos (
void)
const
772 SocketIpTosTag::GetTypeId (
void)
774 static TypeId tid = TypeId (
"ns3::SocketIpTosTag")
776 .AddConstructor<SocketIpTosTag> ()
790 return sizeof (uint8_t);
807 os <<
"IP_TOS = " << m_ipTos;
811 SocketIpv6TclassTag::SocketIpv6TclassTag ()
816 SocketIpv6TclassTag::SetTclass (uint8_t tclass)
818 m_ipv6Tclass = tclass;
822 SocketIpv6TclassTag::GetTclass (
void)
const
828 SocketIpv6TclassTag::GetTypeId (
void)
830 static TypeId tid = TypeId (
"ns3::SocketIpv6TclassTag")
832 .AddConstructor<SocketIpv6TclassTag> ()
846 return sizeof (uint8_t);
858 m_ipv6Tclass = i.
ReadU8();
863 os <<
"IPV6_TCLASS = " << m_ipv6Tclass;
virtual void Serialize(TagBuffer i) const
virtual void Print(std::ostream &os) const
#define NS_LOG_FUNCTION(parameters)
virtual void Print(std::ostream &os) const
bool IsIpv6RecvHopLimit(void) const
Ask if the socket is currently passing information about IPv6 Hop Limit up the stack.
virtual void Deserialize(TagBuffer i)
void SetIpv6RecvTclass(bool ipv6RecvTclass)
Tells a socket to pass information about IPv6 Traffic Class up the stack.
virtual uint32_t GetSerializedSize(void) const
Ptr< Packet > Recv(void)
Read a single packet from the socket.
virtual void Serialize(TagBuffer i) const
virtual void Deserialize(TagBuffer i)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual int GetSockName(Address &address) const =0
void SetIpRecvTos(bool ipv4RecvTos)
Tells a socket to pass information about IP Type of Service up the stack.
virtual TypeId GetInstanceTypeId(void) const
uint32_t GetSize(void) const
virtual TypeId GetInstanceTypeId(void) const
void SetCloseCallbacks(Callback< void, Ptr< Socket > > normalClose, Callback< void, Ptr< Socket > > errorClose)
Detect socket recv() events such as graceful shutdown or error.
#define NS_LOG_FUNCTION_NOARGS()
virtual void Serialize(TagBuffer i) const
Object to create transport layer instances that provide a socket API to applications.
virtual void Print(std::ostream &os) const
bool IsRecvPktInfo() const
Get status indicating whether enable/disable packet information to socket.
TAG_BUFFER_INLINE uint8_t ReadU8(void)
a polymophic address class
bool IsIpRecvTos(void) const
Ask if the socket is currently passing information about IP Type of Service up the stack...
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket.
Ptr< NetDevice > GetBoundNetDevice()
Returns socket's bound netdevice, if any.
Ptr< NetDevice > GetDevice(uint32_t index) const
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
virtual void Print(std::ostream &os) const
void Deserialize(TagBuffer buffer)
uint32_t GetSerializedSize(void) const
uint32_t GetNDevices(void) const
virtual uint32_t GetSerializedSize(void) const
virtual void Serialize(TagBuffer i) const
virtual uint32_t GetSerializedSize(void) const
virtual TypeId GetInstanceTypeId(void) const
virtual void Deserialize(TagBuffer i)
TAG_BUFFER_INLINE void WriteU8(uint8_t v)
bool IsIpv6RecvTclass(void) const
Ask if the socket is currently passing information about IPv6 Traffic Class up the stack...
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
void SetAcceptCallback(Callback< bool, Ptr< Socket >, const Address & > connectionRequest, Callback< void, Ptr< Socket >, const Address & > newConnectionCreated)
Accept connection requests from remote hosts.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
void SetDataSentCallback(Callback< void, Ptr< Socket >, uint32_t > dataSent)
Notify application when a packet has been sent from transport protocol (non-standard socket call) ...
virtual void DoDispose(void)
#define NS_ASSERT_MSG(condition, message)
bool IsIpRecvTtl(void) const
Ask if the socket is currently passing information about IP_TTL up the stack.
void Serialize(TagBuffer buffer) const
void SetIpv6RecvHopLimit(bool ipv6RecvHopLimit)
Tells a socket to pass information about IPv6 Hop Limit up the stack.
virtual uint32_t GetSerializedSize(void) const
virtual TypeId GetInstanceTypeId(void) const
virtual void Serialize(TagBuffer i) const
virtual Ptr< Node > GetNode(void) const =0
virtual void Print(std::ostream &os) const
virtual void Deserialize(TagBuffer i)
virtual void Serialize(TagBuffer i) const
void SetIpRecvTtl(bool ipv4RecvTtl)
Tells a socket to pass information about IP_TTL up the stack.
virtual void Deserialize(TagBuffer i)
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
virtual void Deserialize(TagBuffer i)
virtual void Print(std::ostream &os) const
void SetConnectCallback(Callback< void, Ptr< Socket > > connectionSucceeded, Callback< void, Ptr< Socket > > connectionFailed)
Specify callbacks to allow the caller to determine if the connection succeeds of fails.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
virtual uint32_t GetSerializedSize(void) const
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual TypeId GetInstanceTypeId(void) const
virtual uint32_t GetSerializedSize(void) const
Ptr< T > GetObject(void) const
virtual TypeId GetInstanceTypeId(void) const
a unique identifier for an interface.