43 static TypeId tid = TypeId (
"ns3::LocalDatagramSocketFd").SetParent<
LocalSocketFd> ();
66 NS_LOG_FUNCTION (
this);
73 NS_LOG_FUNCTION (
this);
92 NS_LOG_FUNCTION (
this <<
"state:" <<
m_state);
108 NS_LOG_FUNCTION (
this <<
"state:" <<
m_state);
116 ssize_t ret =
ReadData ((uint8_t*) buf, count, peek);
118 if ((ret > 0)&&(0 !=
m_peer))
184 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
185 NS_ASSERT (current != 0);
187 if (level != SOL_SOCKET)
189 current->
err = EINVAL;
197 NS_LOG_DEBUG (
"LocalDatagramSocketFd SO_PASSCRED NOT IMPLEMENTED");
198 current->
err = EINVAL;
205 NS_LOG_DEBUG (
"LocalDatagramSocketFd SO_RCVBUF and SO_SNDBUF ignored.");
210 NS_LOG_DEBUG (
"LocalDatagramSocketFd SO_RCVLOWAT ignored.");
215 NS_LOG_DEBUG (
"LocalDatagramSocketFd SO_SNDLOWAT ignored.");
221 if ((0 == optval) || (0 == optlen) || (optlen <
sizeof(
struct timeval)))
223 current->
err = EINVAL;
234 if ((0 == optval) || (0 == optlen) || (optlen <
sizeof(
struct timeval)))
236 current->
err = EINVAL;
248 current->
err = EINVAL;
256 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
257 NS_ASSERT (current != 0);
259 if (level != SOL_SOCKET)
261 current->
err = EINVAL;
269 NS_LOG_DEBUG (
"LocalDatagramSocketFd SO_PASSCRED NOT IMPLEMENTED");
270 current->
err = EINVAL;
277 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
int)))
279 current->
err = EINVAL;
283 int *ival = (
int*)optval;
287 (*optlen) =
sizeof(int);
294 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(int)))
296 current->
err = EINVAL;
300 int *ival = (
int*)optval;
304 (*optlen) =
sizeof(int);
311 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
struct timeval)))
313 current->
err = EINVAL;
317 struct timeval *tv = (
struct timeval*)optval;
326 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
struct timeval)))
328 current->
err = EINVAL;
332 struct timeval *tv = (
struct timeval*)optval;
341 if ((0 == optval) || (0 == optlen) || ((*optlen) <
sizeof(
int)))
343 current->
err = EINVAL;
347 int *ival = (
int*)optval;
351 (*optlen) =
sizeof(int);
358 current->
err = EINVAL;
369 NS_LOG_FUNCTION (
this);
371 if ((0 == name) || (0 == namelen))
376 struct sockaddr_un address;
378 memset (&address, 0,
sizeof(sockaddr_un));
379 address.sun_family = AF_UNIX;
383 std::string virtualPath =
m_bindPath.substr (root.length () - 1);
385 memcpy (&address.sun_path, virtualPath.c_str (), std::min (108, (
int)virtualPath.length ()));
388 socklen_t len = std::min ((
int) *namelen, (
int)
sizeof(
struct sockaddr_un));
390 memcpy (name, &address, len);
400 NS_LOG_FUNCTION (
this);
402 if ((0 == name) || (0 == namelen))
412 struct sockaddr_un address;
414 memset (&address, 0,
sizeof(sockaddr_un));
415 address.sun_family = AF_UNIX;
419 std::string virtualPath =
m_connectPath.substr (root.length () - 1);
421 memcpy (&address.sun_path, virtualPath.c_str (), std::min (108, (
int)virtualPath.length ()));
424 socklen_t len = std::min ((
int) *namelen, (
int)
sizeof(
struct sockaddr_un));
426 memcpy (name, &address, len);
436 NS_LOG_FUNCTION (
this);
438 if (my_addr->sa_family != AF_UNIX)
449 std::string realPath =
UtilsGetRealFilePath (std::string (((
struct sockaddr_un*) my_addr)->sun_path));
450 struct sockaddr_un realAddr;
452 memset (&realAddr, 0,
sizeof(realAddr));
453 realAddr.sun_family = my_addr->sa_family;
454 memcpy (&(realAddr.sun_path), realPath.c_str (), std::min (108, (
int) realPath.length ()));
456 int realFd = ::socket (AF_UNIX, SOCK_DGRAM, 0);
460 int ret = ::bind (realFd, (
struct sockaddr *) &realAddr,
sizeof(realAddr));
461 NS_LOG_FUNCTION (
this <<
"Bind: " << ret <<
"errno:" <<
errno);
481 NS_LOG_FUNCTION (
this << current << my_addr << addrlen);
482 NS_ASSERT (current != 0);
509 std::string realPath =
UtilsGetRealFilePath (std::string (((
struct sockaddr_un*) my_addr)->sun_path));
531 current->
err = ECONNREFUSED;
540 NS_LOG_FUNCTION (
this);
548 NS_LOG_FUNCTION (
this << how);
582 NS_LOG_FUNCTION (
this);
618 NS_LOG_FUNCTION (
this <<
" state:" <<
m_state);
625 NS_LOG_FUNCTION (
this);
640 for (uint32_t i = 0; i < msg->msg_iovlen; ++i)
642 uint8_t *buf = (uint8_t *) msg->msg_iov[i].iov_base;
643 ssize_t len = msg->msg_iov[i].iov_len;
644 msg->msg_namelen = 0;
646 ssize_t ret =
Read (buf, len, (retval > 0) || (flags & MSG_DONTWAIT), (flags & MSG_PEEK));
647 NS_LOG_FUNCTION (
this <<
"len:" << len <<
" read-> " << ret);
650 NS_LOG_FUNCTION (
this <<
"4");
665 msg->msg_flags |= MSG_TRUNC;
670 if (flags & MSG_DONTWAIT)
681 NS_LOG_FUNCTION (
this <<
m_state);
696 if ((msg->msg_namelen < sizeof (
struct sockaddr_un)) || (0 == msg->msg_name))
701 struct sockaddr_un *addr = (
struct sockaddr_un*) msg->msg_name;
730 for (uint32_t i = 0; i < msg->msg_iovlen; ++i)
732 uint8_t *buf = (uint8_t *) msg->msg_iov[i].iov_base;
733 ssize_t len = msg->msg_iov[i].iov_len;
744 if (flags & MSG_DONTWAIT)
813 NS_LOG_FUNCTION (
this);
816 if (0 == peer || !peer->
IsBinded ())
847 return Read (buf, count,
false,
false);
852 NS_LOG_FUNCTION (
this <<
m_state);
859 NS_LOG_FUNCTION (
this <<
m_state);
866 NS_LOG_FUNCTION (
this <<
m_state);
905 std::set<LocalDatagramSocketFd*> toFree =
m_myPeers;
909 std::set<LocalDatagramSocketFd*>::iterator i;
911 for (i = toFree.begin (); i != toFree.end (); ++i)
913 (*i)->RemoveConnected (
this, andWakeUp);