Index: src/process-manager/simu-fd.cc |
=================================================================== |
--- a/src/process-manager/simu-fd.cc |
+++ b/src/process-manager/simu-fd.cc |
@@ -26,8 +26,11 @@ |
#include "ns3/nstime.h" |
#include <fcntl.h> |
#include <errno.h> |
+#include <linux/netlink.h> |
+#include <linux/rtnetlink.h> |
#include <sys/mman.h> |
#include <sys/types.h> |
+#include "ns3/node.h" |
NS_LOG_COMPONENT_DEFINE ("SimuFd"); |
@@ -404,6 +407,41 @@ |
return retval; |
} |
+ssize_t simu_writev (int fd, const struct iovec *iov, int iovcnt) |
+{ |
+ Thread *current = Current (); |
+ NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << iov << iovcnt); |
+ NS_ASSERT (current != 0); |
+ int index = UtilsSearchOpenFd (fd); |
+ if (index == -1) |
+ { |
+ current->err = EBADF; |
+ return -1; |
+ } |
+ |
+ size_t count = 0; |
+ for (int i = 0; i < iovcnt; ++i) |
Mathieu Lacage
2009/04/15 07:16:52
coding style:
for ()
{
// stuff
}
|
+ count += iov[i].iov_len; |
+ |
+ if (count == 0) |
+ { |
+ current->err = EINVAL; |
+ return -1; |
+ } |
+ |
+ char buf[count], *bufp = buf; |
+ for (int i = 0; i < iovcnt; ++i) |
+ { |
+ memcpy (bufp, iov[i].iov_base, iov[i].iov_len); |
+ bufp += iov[i].iov_len; |
+ } |
+ |
+ Ptr<UnixFd> unixFd = current->process->openFiles[index].second; |
+ int retval = unixFd->Write (buf, count); |
+ |
+ return retval; |
+} |
+ |
ssize_t simu_read (int fd, void *buf, size_t count) |
{ |
Thread *current = Current (); |
@@ -426,7 +464,7 @@ |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << domain << type << protocol); |
NS_ASSERT (current != 0); |
NS_ASSERT (manager != 0); |
- NS_ASSERT (domain == PF_INET); |
+ NS_ASSERT (domain == PF_INET || domain == PF_NETLINK || domain == PF_INET6); |
int fd = UtilsAllocateFd (); |
if (fd == -1) |
@@ -438,26 +476,73 @@ |
Ptr<Socket> sock; |
Ptr<UnixSocketFd> socket; |
- switch (type) { |
- case SOCK_DGRAM: { |
- TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory"); |
- Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
- sock = factory->CreateSocket (); |
- socket = Create<UnixDatagramSocketFd> (sock); |
- } break; |
- case SOCK_RAW: { |
- TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"); |
- Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
- sock = factory->CreateSocket (); |
- sock->SetAttribute ("Protocol", UintegerValue (protocol)); |
- socket = Create<UnixDatagramSocketFd> (sock); |
- } break; |
- case SOCK_STREAM: { |
- TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory"); |
- Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
- sock = factory->CreateSocket (); |
- socket = Create<UnixStreamSocketFd> (sock); |
- } break; |
+ if (domain == PF_INET) |
+ { |
+ switch (type) { |
+ case SOCK_DGRAM: { |
+ TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ socket = Create<UnixDatagramSocketFd> (sock); |
+ } break; |
+ case SOCK_RAW: { |
+ TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ sock->SetAttribute ("Protocol", UintegerValue (protocol)); |
+ socket = Create<UnixDatagramSocketFd> (sock); |
+ } break; |
+ case SOCK_STREAM: { |
+ TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ socket = Create<UnixStreamSocketFd> (sock); |
+ } break; |
+ } |
+ } |
+ else if (domain == PF_INET6) |
+ { |
+ switch (type) { |
+ case SOCK_DGRAM: { |
+ TypeId tid = TypeId::LookupByName ("ns3::Udp6SocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ socket = Create<UnixDatagramSocketFd> (sock); |
+ } break; |
+ case SOCK_RAW: { |
+ TypeId tid = TypeId::LookupByName ("ns3::Icmpv6SocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ sock->Bind(); |
+ // sock->SetAttribute ("Protocol", UintegerValue (protocol)); |
+ socket = Create<UnixDatagramSocketFd> (sock); |
+ } break; |
+ case SOCK_STREAM: { |
+ TypeId tid = TypeId::LookupByName ("ns3::Tcp6SocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ socket = Create<UnixStreamSocketFd> (sock); |
+ } break; |
+ } |
+ } |
+ else if (domain == PF_NETLINK) |
+ { |
+ if (type != SOCK_DGRAM && type != SOCK_RAW) |
+ { |
+ current->err = ESOCKTNOSUPPORT; |
+ return -1; |
+ } |
+ /*for now we only support NETLINK_ROUTE*/ |
+ if (protocol != NETLINK_ROUTE) |
+ { |
+ current->err = EPROTONOSUPPORT; |
+ return -1; |
+ } |
+ |
+ TypeId tid= TypeId::LookupByName("ns3::NetlinkSocketFactory"); |
+ Ptr<SocketFactory> factory = manager->GetObject<SocketFactory> (tid); |
+ sock = factory->CreateSocket (); |
+ socket = Create<UnixDatagramSocketFd> (sock); |
} |
current->process->openFiles.push_back (std::make_pair (fd, socket)); |
@@ -775,5 +860,18 @@ |
off_t retval = unixFd->Lseek (offset, whence); |
return retval; |
} |
+int simu_fcntl(int fd, int cmd) |
+{ |
+ NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << fd << cmd); |
+ NS_ASSERT (Current () != 0); |
+ Thread *current = Current (); |
- |
+ int index = UtilsSearchOpenFd (fd); |
+ if (index == -1) |
+ { |
+ current->err = EBADF; |
+ return -1; |
+ } |
+ // Currently NOP for this sys_call |
+ return 0; |
+} |