Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1117)

Unified Diff: src/process-manager/simu-fd.cc

Issue 41043: Add simu_writev, simu_fcntl
Patch Set: Created 14 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b