6 #include "ns3/socket.h"
7 #include "ns3/packet.h"
10 #include "ns3/socket-factory.h"
25 NS_LOG_FUNCTION (
this << sock);
45 NS_LOG_FUNCTION (
this << current << msg << flags <<
m_state);
46 NS_ASSERT (current != 0);
60 current->
err = EINVAL;
73 if (
m_socket->GetRxAvailable () <= 0)
82 uint32_t totalAvailable = 0;
83 uint32_t count = msg->msg_iov[0].iov_len;
84 uint8_t *buf = (uint8_t *)msg->msg_iov[0].iov_base;
87 Ptr<Packet> packet = 0;
89 for (uint32_t i = 0; i < msg->msg_iovlen; i++)
91 totalAvailable += msg->msg_iov[i].iov_len;
99 if (toCopy > totalAvailable)
101 toCopy = totalAvailable;
108 packet =
m_socket->RecvFrom (totalAvailable, flags & ~MSG_DONTWAIT & ~MSG_PEEK, from);
114 NS_ASSERT (packet->GetSize () <= totalAvailable);
115 packet->CopyData (buf, count);
116 toCopy = packet->GetSize ();
118 if (flags & MSG_PEEK)
123 for (uint32_t i = 0; i < msg->msg_iovlen && toCopy > 0; i++)
125 uint32_t len = std::min (toCopy, msg->msg_iov[i].iov_len);
126 memcpy (msg->msg_iov[i].iov_base, buf, len);
154 NS_LOG_FUNCTION (
this << current << msg << flags);
155 NS_ASSERT (current != 0);
157 if (msg->msg_name != 0 || msg->msg_namelen != 0)
159 current->
err = EISCONN;
165 for (uint32_t i = 0; i < msg->msg_iovlen; ++i)
167 uint8_t *buf = (uint8_t *)msg->msg_iov[i].iov_base;
168 ssize_t len = msg->msg_iov[i].iov_len;
171 while (
m_socket->GetTxAvailable () == 0)
173 if (flags & MSG_DONTWAIT)
182 current->
err = EAGAIN;
196 current->
err = ENOTCONN;
203 current->
err = EPIPE;
228 current->
err = EINTR;
240 current->
err = EAGAIN;
246 ssize_t availLen = std::min (len, (ssize_t)
m_socket->GetTxAvailable ());
247 Ptr<Packet> packet = Create<Packet> (buf, availLen);
266 NS_ASSERT (result == availLen);
278 NS_LOG_FUNCTION (
this << current << backlog);
279 NS_ASSERT (current != 0);
295 NS_LOG_FUNCTION (
this << current << my_addr << addrlen <<
GetRecvTimeout ());
296 NS_ASSERT (current != 0);
304 current->
err = EWOULDBLOCK;
313 NS_LOG_DEBUG (
"Accept: waiting ...");
315 NS_LOG_DEBUG (
"Accept: wait result:" << res);
325 current->
err = EINTR;
330 current->
err = EAGAIN;
340 current->
err = EMFILE;
379 ret = (
m_socket->GetRxAvailable () > 0);
411 NS_LOG_FUNCTION (sock << from);
418 NS_LOG_FUNCTION (sock << from);
429 NS_LOG_FUNCTION (
this << current << how);
430 NS_ASSERT (current != 0);
437 else if (how == SHUT_WR)
442 else if (how == SHUT_RDWR)
449 current->
err = EINVAL;
463 NS_LOG_FUNCTION (
this);
468 if (0 == sock->GetSockName (ad))
479 NS_LOG_FUNCTION (
this);
490 NS_LOG_FUNCTION (
this <<
m_state);
506 NS_LOG_FUNCTION (
this <<
m_state);
513 NS_LOG_FUNCTION (
this << current);
514 NS_ASSERT (current != 0);
518 current->
err = EALREADY;
524 TypeId tid = TypeId::LookupByName (
"ns3::TcpSocketFactory");
525 Ptr<SocketFactory> factory = current->
process->
manager->GetObject<SocketFactory> (tid);
527 Ptr<Socket> socket = factory->CreateSocket ();
554 NS_LOG_DEBUG (
"Connect: waiting ...");
556 NS_LOG_DEBUG (
"Connect: wait result:" << res);
566 current->
err = EINTR;
571 current->
err = EAGAIN;
601 NS_LOG_FUNCTION (
this << current << name << *namelen);
602 NS_ASSERT (current != 0);
607 current->
err = EINVAL;
612 current->
err = ENOTCONN;
654 NS_LOG_FUNCTION (
this << current);
655 NS_ASSERT (current != 0);