1 #define _LARGEFILE64_SOURCE 1
19 #include "ns3/event-id.h"
20 #include "ns3/simulator.h"
21 #include "ns3/nstime.h"
24 #include <linux/netlink.h>
25 #include <linux/rtnetlink.h>
27 #include <sys/types.h>
39 #define SOCK_MAX_ADDRESS_SIZE _K_SS_MAXSIZE
41 #define SOCK_MAX_ADDRESS_SIZE 128
44 #define DEFINE_FORWARDER_PATH(name, pathname, ...) \
46 Thread *current = Current (); \
47 NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << pathname); \
48 NS_ASSERT (Current () != 0); \
50 if (std::string (pathname) == std::string ("")) \
52 current->err = ENOENT; \
55 std::string fullpath = UtilsGetRealFilePath (pathname); \
56 int status = ::name (fullpath.c_str (), ## __VA_ARGS__); \
59 current->err = errno; \
72 int status =
dce_open (path, flags, vl);
78 int dce_open (
const char *path,
int flags, ...)
86 mode = va_arg (vl, mode_t);
91 NS_ASSERT (current != 0);
93 if (std::string (path) ==
"")
95 current->
err = ENOENT;
102 current->
err = EMFILE;
107 if ((std::string (path) ==
"/dev/random") || (std::string (path) ==
"/dev/urandom")
108 || (std::string (path) ==
"/dev/srandom"))
116 int realFd = ::open (fullpath.c_str (), flags, mode);
140 return dce_open (path, O_CREAT | O_WRONLY | O_TRUNC, mode);
150 NS_LOG_FUNCTION (
"UNLINK FULL PATH " << fullpath);
167 NS_LOG_FUNCTION (pathname);
198 std::map<int,FileUsage *>::iterator it = current->
process->
openFiles.find (fd);
202 current->
err = EBADF;
230 NS_ASSERT (current != 0);
238 NS_ASSERT (current != 0);
242 ssize_t
dce_send (
int fd,
const void *buf,
size_t len,
int flags)
244 NS_LOG_FUNCTION (fd << buf << len << flags);
245 return dce_sendto (fd, buf, len, flags, 0, 0);
247 ssize_t
dce_sendto (
int fd,
const void *buf,
size_t len,
int flags,
248 const struct sockaddr *to, socklen_t tolen)
250 NS_LOG_FUNCTION (
Current () << fd << buf << len << flags << to << tolen);
255 msg.msg_controllen = 0;
259 iov.iov_base = (
void *)buf;
260 msg.msg_name = (
void *)to;
261 msg.msg_namelen = tolen;
269 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << msg << flags);
270 NS_ASSERT (current != 0);
278 va_start (vl, request);
279 char *argp = va_arg (vl,
char*);
283 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << request << argp);
284 NS_ASSERT (current != 0);
288 ssize_t
dce_write (
int fd,
const void *buf,
size_t count)
292 NS_ASSERT (current != 0);
297 ssize_t
dce_writev (
int fd,
const struct iovec *iov,
int iovcnt)
300 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << iov << iovcnt);
301 NS_ASSERT (current != 0);
305 NS_LOG_DEBUG (
"write error");
306 current->
err = EBADF;
311 for (
int i = 0; i < iovcnt; ++i)
313 count += iov[i].iov_len;
318 current->
err = EINVAL;
322 char buf[count], *bufp = buf;
323 for (
int i = 0; i < iovcnt; ++i)
325 memcpy (bufp, iov[i].iov_base, iov[i].iov_len);
326 bufp += iov[i].iov_len;
330 int retval = unixFd->
Write (buf, count);
339 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << buf << count);
340 NS_ASSERT (current != 0);
348 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << domain << type << protocol);
349 NS_ASSERT (current != 0);
350 NS_ASSERT (manager != 0);
352 Ptr<SocketFdFactory> factory = 0;
354 if (domain != AF_UNIX)
360 if (type != SOCK_DGRAM && type != SOCK_STREAM)
362 current->
err = EINVAL;
367 UnixFd *socket = factory->CreateSocket (domain, type, protocol);
371 current->
err = EINVAL;
378 current->
err = EMFILE;
390 ssize_t
dce_readv (
int fd,
const struct iovec *iov,
int iovcnt)
395 if ((0 == iov)||(iovcnt < 0))
397 current->
err = EINVAL;
400 for (
int b = 0; b < iovcnt; b++)
402 ssize_t r =
dce_read (fd, iov[b].iov_base, iov[b].iov_len);
406 if (!r || (r < (ssize_t)iov[b].iov_len))
435 int dce_bind (
int fd,
const struct sockaddr *my_addr, socklen_t addrlen)
438 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << my_addr << addrlen);
439 NS_ASSERT (current != 0);
443 int dce_connect (
int fd,
const struct sockaddr *my_addr, socklen_t addrlen)
446 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << my_addr << addrlen);
447 NS_ASSERT (current != 0);
455 NS_ASSERT (current != 0);
459 int dce_accept (
int fd,
struct sockaddr *addr, socklen_t *addrlen)
462 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << addr << addrlen);
463 NS_ASSERT (current != 0);
471 NS_ASSERT (current != 0);
475 ssize_t
dce_recv (
int fd,
void *buf,
size_t count,
int flags)
477 NS_LOG_FUNCTION (fd << buf << count << flags);
481 struct sockaddr *from, socklen_t *fromlen)
483 NS_LOG_FUNCTION (fd << buf << len << flags << from << fromlen);
488 msg.msg_controllen = 0;
493 msg.msg_name = address;
496 if (retval != -1 && from != 0)
498 if (*fromlen < msg.msg_namelen)
501 current->
err = EINVAL;
506 *fromlen = msg.msg_namelen;
507 memcpy (from, msg.msg_name, msg.msg_namelen);
515 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << msg << flags);
516 NS_ASSERT (current != 0);
521 const void *optval, socklen_t optlen)
524 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << level << optname << optval << optlen);
525 NS_ASSERT (current != 0);
530 void *optval, socklen_t *optlen)
533 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << level << optname << optval << optlen);
534 NS_ASSERT (current != 0);
541 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << name << namelen);
542 NS_ASSERT (current != 0);
549 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << name << namelen);
550 NS_ASSERT (current != 0);
558 NS_ASSERT (current != 0);
562 current->
err = EBADF;
568 current->
err = EMFILE;
583 NS_ASSERT (current != 0);
586 current->
err = EBADF;
598 current->
err = EBADF;
604 current->
err = EBADF;
615 void *
dce_mmap (
void *addr,
size_t length,
int prot,
int flags,
616 int fd, off_t offset)
618 return dce_mmap64 (addr, length, prot, flags, fd, offset);
621 void *
dce_mmap64 (
void *start,
size_t length,
int prot,
int flags,
622 int fd, off64_t offset)
625 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << start << length << prot << flags << fd << offset);
626 NS_ASSERT (current != 0);
633 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << start << length);
634 NS_ASSERT (current != 0);
635 int retval = ::munmap (start, length);
651 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << fd << offset << whence);
652 NS_ASSERT (current != 0);
660 unsigned long arg = va_arg (vl,
unsigned long);
684 NS_ASSERT (current != 0);
687 int fd =
dce_open (path, O_WRONLY, 0);
700 NS_ASSERT (current != 0);
718 NS_ASSERT (current != 0);
726 NS_ASSERT (current != 0);
731 current->
err = EFAULT;
737 current->
err = EMFILE;
744 current->
err = EMFILE;
755 current->
err = EMFILE;
766 current->
err = EMFILE;
776 pipefd [1] = fdWrite;
780 ssize_t
dce_pread (
int fd,
void *buf,
size_t count, off_t offset)
783 NS_ASSERT (current != 0);
786 off_t currentOffset =
dce_lseek (fd, 0, SEEK_CUR);
787 if (-1 == currentOffset)
791 off_t res =
dce_lseek (fd, offset, SEEK_SET);
794 current->
err = EINVAL;
797 ssize_t ret =
dce_read (fd, buf, count);
803 res =
dce_lseek (fd, currentOffset, SEEK_SET);
804 if (res != currentOffset)
810 ssize_t
dce_pwrite (
int fd,
const void *buf,
size_t count, off_t offset)
813 NS_ASSERT (current != 0);
816 off_t currentOffset =
dce_lseek (fd, 0, SEEK_CUR);
817 if (-1 == currentOffset)
821 off_t res =
dce_lseek (fd, offset, SEEK_SET);
824 current->
err = EINVAL;
827 ssize_t ret =
dce_write (fd, buf, count);
833 res =
dce_lseek (fd, currentOffset, SEEK_SET);
834 if (res != currentOffset)