35 #include "ns3/simulator.h"
44 static TypeId tid = TypeId (
"ns3::LocalStreamSocketFd").SetParent<
LocalSocketFd> ();
57 NS_LOG_FUNCTION (
this);
62 : m_state (CONNECTED),
66 NS_LOG_FUNCTION (
this);
72 NS_LOG_FUNCTION (
this);
80 NS_LOG_FUNCTION (
this);
89 NS_LOG_FUNCTION (
this);
90 NS_ASSERT (current != 0);
92 NS_LOG_DEBUG (
"m_state: " <<
m_state);
145 current->
err = EBADF;
154 NS_LOG_FUNCTION (
this << buf << count);
155 NS_ASSERT (current != 0);
157 NS_LOG_DEBUG (
"Write enter state " <<
m_state);
165 current->
err = ENOTCONN;
170 current->
err = EPIPE;
182 NS_LOG_FUNCTION (
this <<
" lg:" << lg);
212 current->
err = EINTR;
224 current->
err = EAGAIN;
240 current->
err = EPIPE;
245 current->
err = ENOMEM;
253 current->
err = EPIPE;
263 NS_LOG_FUNCTION (
this << buf << count);
264 NS_ASSERT (current != 0);
266 NS_LOG_DEBUG (
"Read enter state: " <<
m_state);
270 current->
err = EINVAL;
279 size_t lg =
ReadData ((uint8_t*) buf + filled, count - filled,
false);
319 current->
err = EINTR;
331 current->
err = EAGAIN;
348 current->
err = ENOMEM;
359 NS_LOG_FUNCTION (
this << current << msg << flags);
360 NS_ASSERT (current != 0);
363 for (uint32_t i = 0; i < msg->msg_iovlen; ++i)
365 uint8_t *buf = (uint8_t *) msg->msg_iov[i].iov_base;
366 ssize_t len = msg->msg_iov[i].iov_len;
368 size_t ret =
Read (buf, len);
370 if ((msg->msg_namelen > 0) && (0 != msg->msg_name))
372 memset (msg->msg_name, 0, msg->msg_namelen);
375 msg->msg_namelen = 0;
397 NS_LOG_FUNCTION (
this << current << msg << flags);
398 NS_ASSERT (current != 0);
400 if (msg->msg_name != 0 || msg->msg_namelen != 0)
402 current->
err = EISCONN;
407 for (uint32_t i = 0; i < msg->msg_iovlen; ++i)
409 uint8_t *buf = (uint8_t *) msg->msg_iov[i].iov_base;
410 ssize_t len = msg->msg_iov[i].iov_len;
412 size_t ret =
Write (buf, len);
439 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
440 NS_ASSERT (current != 0);
442 if (level != SOL_SOCKET)
444 current->
err = EINVAL;
453 if ((0 == optval) || (0 == optlen) || (optlen <
sizeof(
struct linger)))
455 current->
err = EINVAL;
458 if (((
struct linger *) optval)->l_onoff != 0)
460 m_linger = (((
struct linger *) optval)->l_linger);
471 NS_LOG_DEBUG (
"LocalStreamSocketFd SO_PASSCRED NOT IMPLEMENTED");
472 current->
err = EINVAL;
479 NS_LOG_DEBUG (
"LocalStreamSocketFd SO_RCVBUF and SO_SNDBUF ignored.");
484 NS_LOG_DEBUG (
"LocalStreamSocketFd SO_RCVLOWAT ignored.");
489 NS_LOG_DEBUG (
"LocalStreamSocketFd SO_SNDLOWAT ignored.");
495 if ((0 == optval) || (0 == optlen) || (optlen <
sizeof(
struct timeval)))
497 current->
err = EINVAL;
508 if ((0 == optval) || (0 == optlen) || (optlen <
sizeof(
struct timeval)))
510 current->
err = EINVAL;
522 current->
err = EINVAL;
529 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
530 NS_ASSERT (current != 0);
532 if (level != SOL_SOCKET)
534 current->
err = EINVAL;
543 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
struct linger)))
545 current->
err = EINVAL;
548 ((
struct linger *) optval)->l_linger =
m_linger;
556 NS_LOG_DEBUG (
"LocalStreamSocketFd SO_PASSCRED NOT IMPLEMENTED");
557 current->
err = EINVAL;
564 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
int)))
566 current->
err = EINVAL;
570 int *ival = (
int*)optval;
574 (*optlen) =
sizeof(int);
581 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(int)))
583 current->
err = EINVAL;
587 int *ival = (
int*)optval;
591 (*optlen) =
sizeof(int);
598 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(int)))
600 current->
err = EINVAL;
604 int *ival = (
int*)optval;
608 (*optlen) =
sizeof(int);
615 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
struct timeval)))
617 current->
err = EINVAL;
621 struct timeval *tv = (
struct timeval*)optval;
630 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
struct timeval)))
632 current->
err = EINVAL;
636 struct timeval *tv = (
struct timeval*)optval;
645 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
int)))
647 current->
err = EINVAL;
651 int *ival = (
int*)optval;
655 (*optlen) =
sizeof(int);
662 current->
err = EINVAL;
672 NS_LOG_FUNCTION (
this);
674 if ((0 == name) || (0 == namelen))
679 struct sockaddr_un address;
681 memset (&address, 0,
sizeof(sockaddr_un));
682 address.sun_family = AF_UNIX;
686 std::string virtualPath =
m_bindPath.substr (root.length () - 1);
688 memcpy (&address.sun_path, virtualPath.c_str (), std::min (108, (
int)virtualPath.length ()));
691 socklen_t len = std::min ((
int) *namelen, (
int)
sizeof(
struct sockaddr_un));
693 memcpy (name, &address, len);
702 NS_LOG_FUNCTION (
this);
704 if ((0 == name) || (0 == namelen))
714 struct sockaddr_un address;
716 memset (&address, 0,
sizeof(sockaddr_un));
717 address.sun_family = AF_UNIX;
721 std::string virtualPath =
m_connectPath.substr (root.length () - 1);
723 memcpy (&address.sun_path, virtualPath.c_str (), std::min (108, (
int)virtualPath.length ()));
726 socklen_t len = std::min ((
int) *namelen, (
int)
sizeof(
struct sockaddr_un));
728 memcpy (name, &address, len);
737 NS_LOG_FUNCTION (
this);
739 if (my_addr->sa_family != AF_UNIX)
750 std::string realPath =
UtilsGetRealFilePath (std::string (((
struct sockaddr_un*) my_addr)->sun_path));
752 struct sockaddr_un realAddr;
754 memset (&realAddr, 0,
sizeof(realAddr));
756 realAddr.sun_family = my_addr->sa_family;
758 memcpy (&(realAddr.sun_path), realPath.c_str (), std::min (108, (
int) realPath.length ()));
760 int realFd = ::socket (AF_UNIX, SOCK_STREAM, 0);
764 int ret = ::bind (realFd, (
struct sockaddr *) &realAddr,
sizeof(realAddr));
784 NS_LOG_FUNCTION (
this << current << my_addr << addrlen);
785 NS_ASSERT (current != 0);
793 std::string realPath =
UtilsGetRealFilePath (std::string (((
struct sockaddr_un*) my_addr)->sun_path));
835 current->
err = EAGAIN;
841 current->
err = ENOENT;
865 NS_LOG_FUNCTION (
this << how);
898 NS_LOG_FUNCTION (
this << current << my_addr << addrlen);
899 NS_ASSERT (current != 0);
909 NS_LOG_DEBUG (
"Accept: incoming queue len:" <<
m_cnxQueue.size ());
935 current->
err = EINTR;
940 current->
err = EAGAIN;
957 current->
err = EMFILE;
969 if ((0 != my_addr) && (0 != addrlen) && ((*addrlen) >=
sizeof (sa_family_t)))
971 my_addr->sa_family = AF_UNIX;
972 *addrlen =
sizeof (sa_family_t);
1013 NS_LOG_FUNCTION (
this <<
" state:" <<
m_state);
1019 NS_LOG_FUNCTION (
this <<
" state:" <<
m_state);
1027 short pi = POLLIN | POLLOUT;
1048 NS_LOG_FUNCTION (sock);
1058 NS_LOG_FUNCTION (sock);
1071 NS_LOG_FUNCTION (
this);