16 #include "sim/include/sim-init.h"
18 #include "ns3/string.h"
19 #include "ns3/double.h"
21 #include "ns3/net-device.h"
22 #include "ns3/random-variable.h"
23 #include "ns3/event-id.h"
24 #include "ns3/simulator.h"
25 #include "ns3/mac48-address.h"
26 #include "ns3/packet.h"
33 #include <arpa/inet.h>
56 Ptr<LinuxSocketFdFactory> f)
73 static TypeId tid = TypeId (
"ns3::LinuxSocketFdFactory")
75 .AddConstructor<LinuxSocketFdFactory> ()
76 .AddAttribute (
"Library",
"File to load in memory",
77 StringValue (
"liblinux.so"),
80 .AddAttribute (
"ErrorRate",
"The error rate of malloc().",
81 DoubleValue (DoubleValue (0.0)),
83 MakeDoubleChecker<double> ())
84 .AddAttribute (
"RanVar",
"The decision variable attached to this error model.",
85 RandomVariableValue (UniformVariable (0.0, 1.0)),
87 MakeRandomVariableChecker ())
97 TypeId::LookupByNameFailSafe (
"ns3::LteUeNetDevice", &
m_lteUeTid);
102 for (uint32_t i = 0; i <
m_devices.size (); i++)
137 return vfprintf (self->m_logFile, str, args);
144 if (self->m_ranvar.GetValue () <
self->m_rate)
146 NS_LOG_DEBUG (
"return null");
151 size +=
sizeof (size_t);
152 uint8_t *buffer =
self->m_alloc->Malloc (size);
153 memcpy (buffer, &size,
sizeof (
size_t));
154 buffer +=
sizeof (size_t);
161 uint8_t *buffer = (uint8_t*)ptr;
163 buffer -=
sizeof (size_t);
164 memcpy (&size, buffer,
sizeof (
size_t));
165 self->m_alloc->Free (buffer, size);
170 return memcpy (dst, src, size);
175 return memset (dst, value, size);
180 NS_LOG_FUNCTION (kernel <<
function);
182 Ptr<DceManager> manager =
self->GetObject<
DceManager> ();
183 Process *p = manager->SearchProcess (self->m_pid);
189 p->atExitHandlers.push_back (handler);
210 return dce_open (pathname, flags, 0666);
220 return dce_fseek (stream, offset, whence);
240 return dce_fread (ptr, size, nmemb, stream);
258 uint8_t buffer[
sizeof(
unsigned long)];
261 for (uint8_t i = 0; i <
sizeof (u.buffer); i++)
263 u.buffer[i] =
self->
m_variable.GetInteger (0,255);
269 void *context,
void (*pre_fn)(
void),
270 Ptr<EventIdHolder> event)
279 void (*pre_fn)(
void))
282 Ptr<EventIdHolder> ev = Create<EventIdHolder> ();
285 ev->id = manager->ScheduleMain (NanoSeconds (ns),
293 EventId *
event = (EventId *)ev;
294 Simulator::Remove (*event);
298 return Simulator::Now ().GetNanoSeconds ();
304 NS_LOG_FUNCTION (type << context);
321 Task *task =
self->m_manager->Start (callback, context, 1 << 17);
322 struct SimTask *simTask =
self->m_exported->task_create (task, 0);
325 self->m_kernelTasks.push_back (task);
342 struct SimTask *simTask =
self->m_exported->task_create (current, pid);
364 Task *other = (
Task *)self->m_exported->task_get_private (task);
367 return isBlocked ? 1 : 0;
380 *r = dev->Send (p, d, pro);
386 NetDevice *nsDev = (NetDevice *)self->
m_exported->dev_get_private (dev);
387 NS_ASSERT (len >= 14);
391 unsigned char h_dest[6];
392 unsigned char h_source[6];
394 } *hdr = (
struct ethhdr *)data;
397 Ptr<Packet> p = Create<Packet> (data, len);
398 uint16_t protocol = ntohs (hdr->h_proto);
400 dest.CopyFrom (hdr->h_dest);
410 NS_LOG_FUNCTION (
"XXX: Not Yet Implemented " << signalNumber);
416 for (uint32_t i = 0; i <
m_devices.size (); i++)
420 struct SimDevice *dev =
m_devices[i].second;
429 uint16_t protocol,
const Address & from,
430 const Address &to, NetDevice::PacketType type)
432 struct SimDevice *dev =
DevToDev (device);
438 struct SimDevicePacket packet =
m_exported->dev_create_packet (dev, p->GetSize () + 14);
439 p->CopyData (((
unsigned char *)packet.buffer) + 14, p->GetSize ());
442 unsigned char h_dest[6];
443 unsigned char h_source[6];
445 } *hdr = (
struct ethhdr *)packet.buffer;
446 if (device->GetInstanceTypeId () !=
m_lteUeTid)
448 Mac48Address realFrom = Mac48Address::ConvertFrom (from);
449 realFrom.CopyTo (hdr->h_source);
451 Mac48Address realTo = Mac48Address::ConvertFrom (to);
452 realTo.CopyTo (hdr->h_dest);
453 hdr->h_proto = ntohs (protocol);
467 NS_LOG_FUNCTION (device);
468 struct SimDevice *dev =
DevToDev (device);
473 Mac48Address ad = Mac48Address::ConvertFrom (device->GetAddress ());
478 m_exported->dev_set_mtu (dev, device->GetMtu ());
488 EventImpl *
event = (EventImpl *)context;
491 self->m_kernelTasks.remove (current);
513 NS_LOG_FUNCTION (device);
519 if (device->IsMulticast ())
521 flags |= SIM_DEV_MULTICAST;
523 if (device->IsBroadcast ())
525 flags |= SIM_DEV_BROADCAST;
527 if (!device->NeedsArp ())
529 flags |= SIM_DEV_NOARP;
532 struct SimDevice *dev =
m_exported->dev_create (PeekPointer (device), (
enum SimDevFlags)flags);
534 Ptr<LinuxDeviceStateListener> listener = Create <LinuxDeviceStateListener> (device,
this);
538 m_devices.push_back (std::make_pair (device,dev));
539 Ptr<Node> node = GetObject<Node> ();
540 if (device->GetInstanceTypeId () ==
m_lteUeTid)
553 std::vector<std::pair<std::string,struct SimSysFile *> >
558 struct SimSysIterator head;
559 static void ReportStartDir (
const struct SimSysIterator *iter,
const char *dirname)
561 struct MyIterator *
self = (
struct MyIterator *)iter;
562 self->m_stack.push_back (self->m_currentPath);
563 self->m_currentPath +=
"." + std::string (dirname);
565 static void ReportEndDir (
const struct SimSysIterator *iter)
567 struct MyIterator *
self = (
struct MyIterator *)iter;
568 self->m_currentPath =
self->m_stack.back ();
569 self->m_stack.pop_back ();
571 static void ReportFile (
const struct SimSysIterator *iter,
const char *filename,
int flags,
struct SimSysFile *file)
573 struct MyIterator *
self = (
struct MyIterator *)iter;
574 std::string path =
self->m_currentPath +
"." + filename;
575 self->m_list.push_back (std::make_pair (path, file));
577 std::vector<std::string> m_stack;
578 std::vector<std::pair<std::string,struct SimSysFile *> > m_list;
579 std::string m_currentPath;
581 iter.head.report_start_dir = &MyIterator::ReportStartDir;
582 iter.head.report_end_dir = &MyIterator::ReportEndDir;
583 iter.head.report_file = &MyIterator::ReportFile;
585 m_exported->sys_iterate_files ((
struct SimSysIterator *)&iter);
593 NS_LOG_FUNCTION (path << value);
594 std::vector<std::pair<std::string,struct SimSysFile *> > files =
GetSysFileList ();
595 for (uint32_t i = 0; i < files.size (); i++)
597 if (files[i].first == path)
599 const char *s = value.c_str ();
600 int toWrite = value.size ();
602 written =
m_exported->sys_file_write (files[i].second, s, toWrite, 0);
624 NS_LOG_FUNCTION (path);
626 std::vector<std::pair<std::string,struct SimSysFile *> > files =
GetSysFileList ();
627 for (uint32_t i = 0; i < files.size (); i++)
629 if (files[i].first == path)
632 memset (buffer, 0,
sizeof(buffer));
633 m_exported->sys_file_read (files[i].second, buffer,
sizeof(buffer), 0);
634 NS_LOG_FUNCTION (
"sysctl read: " << buffer);
635 ret = std::string (buffer);
647 if (filePath.length () <= 0)
649 std::string line =
"Stack file '";
651 line +=
"' not found ! Please check your DCE_PATH environment variable.";
652 NS_ASSERT_MSG (filePath.length () > 0, line.c_str ());
657 SimInit init = (SimInit) symbol;
660 NS_FATAL_ERROR (
"Oops. Can't find initialization function");
663 struct SimImported imported;
695 Ptr<DceManager> manager = this->GetObject<DceManager> ();
696 m_pid = manager->StartInternalTask ();
698 init (
m_exported, &imported, (
struct SimKernel *)
this);
701 Ptr<Node> node = GetObject<Node> ();
704 Set (
".net.ipv4.conf.all.forwarding",
"1");
705 Set (
".net.ipv4.conf.all.log_martians",
"1");
706 Set (
".net.ipv6.conf.all.forwarding",
"0");
710 std::pair<std::string,std::string> op =
m_earlySysfs.front ();
711 Set (op.first, op.second);
714 NS_LOG_FUNCTION (
this <<
"m_exported " <<
m_exported);
720 Ptr<Node> node = this->GetObject<Node> ();
721 Ptr<LoaderFactory> loaderFactory = this->GetObject<LoaderFactory> ();
722 Ptr<TaskManager> taskManager = this->GetObject<TaskManager> ();
723 if (node != 0 && loaderFactory != 0 && taskManager != 0 &&
m_loader == 0)
726 m_loader = loaderFactory->Create (0, 0, 0);
731 setlinebuf (m_logFile);
735 Simulator::ScheduleWithContext (node->GetId (), Seconds (0.0),
745 struct SimSocket *socket;
747 int retval =
m_exported->sock_socket (domain, type, protocol, &socket);
766 current->err = -retval;
776 ssize_t retval =
m_exported->sock_recvmsg (socket, msg, flags);
780 current->err = -retval;
790 ssize_t retval =
m_exported->sock_sendmsg (socket, msg, flags);
794 current->err = -retval;
804 int retval =
m_exported->sock_getsockname (socket, name, (
int*)namelen);
808 current->err = -retval;
818 int retval =
m_exported->sock_getpeername (socket, name, (
int*)namelen);
822 current->err = -retval;
832 int retval =
m_exported->sock_bind (socket, my_addr, addrlen);
836 current->err = -retval;
843 socklen_t addrlen,
int flags)
845 GET_CURRENT (socket << my_addr << addrlen << flags);
847 int retval =
m_exported->sock_connect (socket, my_addr, addrlen, flags);
851 current->err = -retval;
861 int retval =
m_exported->sock_listen (socket, backlog);
865 current->err = -retval;
875 int retval =
m_exported->sock_shutdown (socket, how);
879 current->err = -retval;
888 struct SimSocket *newSocket;
891 int retval =
m_exported->sock_accept (socket, &newSocket, 0);
895 current->err = -retval;
901 retval =
m_exported->sock_getpeername (newSocket, my_addr, (
int*)addrlen);
904 current->err = -retval;
916 current->err = EMFILE;
923 current->process->openFiles[fd] =
new FileUsage (fd, unixFd);
932 int retval =
m_exported->sock_ioctl (socket, request, argp);
936 current->err = -retval;
943 const void *optval, socklen_t optlen)
945 GET_CURRENT (socket << level << optname << optval << optlen);
947 int retval =
m_exported->sock_setsockopt (socket, level, optname, optval, optlen);
951 current->err = -retval;
958 void *optval, socklen_t *optlen)
960 GET_CURRENT (socket << level << optname << optval << optlen);
962 int retval =
m_exported->sock_getsockopt (socket, level, optname, optval, (
int*)optlen);
966 current->err = -retval;
1008 kernelInOut.
opaque = ptable;
1014 m_exported->sock_poll (socket, &kernelInOut);
1022 return kernelInOut.
ret;