23 #include "ns3/packet.h"
24 #include "ns3/uinteger.h"
25 #include "ns3/event-id.h"
33 #include <netinet/in.h>
34 #include <arpa/inet.h>
39 #include "ns3/inet-socket-address.h"
40 #include "ns3/inet6-socket-address.h"
51 if (my_addr->sa_family == AF_INET)
53 const struct sockaddr_in *addr = (
const struct sockaddr_in *)my_addr;
55 ipv4.Set (ntohl (addr->sin_addr.s_addr));
56 uint16_t port = ntohs (addr->sin_port);
57 InetSocketAddress inet = InetSocketAddress (ipv4, port);
60 else if (my_addr->sa_family == AF_INET6)
62 const struct sockaddr_in6 *addr = (
const struct sockaddr_in6 *)my_addr;
64 ipv6.Set ((uint8_t *)addr->sin6_addr.s6_addr);
65 uint16_t port = ntohs (addr->sin6_port);
66 Inet6SocketAddress inet = Inet6SocketAddress (ipv6, port);
71 NS_LOG_WARN (
"Unsupported address familiy");
78 struct sockaddr *addr, socklen_t *addrlen)
80 if (addr == 0 || addrlen == 0)
84 if (InetSocketAddress::IsMatchingType (nsaddr))
86 InetSocketAddress ns_inetaddr = InetSocketAddress::ConvertFrom (nsaddr);
87 if (*addrlen <
sizeof (
struct sockaddr_in))
91 struct sockaddr_in *inet_addr = (
struct sockaddr_in *)addr;
92 memset (inet_addr, 0,
sizeof (
struct sockaddr_in));
93 inet_addr->sin_family = AF_INET;
94 inet_addr->sin_port = htons (ns_inetaddr.GetPort ());
95 inet_addr->sin_addr.s_addr = htonl (ns_inetaddr.GetIpv4 ().Get ());
96 *addrlen =
sizeof(
struct sockaddr_in);
98 else if (Inet6SocketAddress::IsMatchingType (nsaddr))
100 Inet6SocketAddress ns_inetaddr = Inet6SocketAddress::ConvertFrom (nsaddr);
101 if (*addrlen <
sizeof (
struct sockaddr_in6))
105 struct sockaddr_in6 *inet_addr = (
struct sockaddr_in6 *)addr;
106 inet_addr->sin6_family = AF_INET;
107 inet_addr->sin6_port = htons (ns_inetaddr.GetPort ());
108 ns_inetaddr.GetIpv6 ().GetBytes (inet_addr->sin6_addr.s6_addr);
109 *addrlen =
sizeof(
struct sockaddr_in6);
113 NS_LOG_WARN (
"Unsupported address familiy");
122 static TypeId tid = TypeId (
"ns3::LinuxSocketImpl")
123 .SetParent<Socket> ()
124 .AddConstructor<LinuxSocketImpl> ()
125 .AddAttribute (
"Family",
"Protocol family.",
128 MakeUintegerChecker<uint16_t> ())
129 .AddAttribute (
"SockType",
"Socket type.",
132 MakeUintegerChecker<uint16_t> ())
133 .AddAttribute (
"Protocol",
"Protocol number to match.",
136 MakeUintegerChecker<uint16_t> ())
143 NS_LOG_FUNCTION_NOARGS ();
158 Ptr<DceManager> manager = node->GetObject<
DceManager> ();
167 EventImpl *
event = (EventImpl *)context;
177 Ptr<DceManager> manager = node->GetObject<
DceManager> ();
178 Ptr<TaskManager> taskManager = this->GetObject<TaskManager> ();
179 std::vector<std::string> nullargs;
180 std::vector<std::pair<std::string,std::string> > envs;
181 struct Process *process = manager->CreateProcess (
"dummy-task",
"dummy-stdin", nullargs, envs, 0);
182 struct Thread *thread = manager->CreateThread (process);
190 enum Socket::SocketErrno
193 NS_LOG_FUNCTION_NOARGS ();
197 enum Socket::SocketType
205 return NS3_SOCK_STREAM;
210 return NS3_SOCK_DGRAM;
226 NS_LOG_FUNCTION (
this <<
m_pid);
228 Ptr<DceManager> manager = node->GetObject<
DceManager> ();
231 m_pid = manager->StartTemporaryTask ();
235 manager->ResumeTemporaryTask (
m_pid);
243 NS_LOG_FUNCTION (
this <<
m_pid << pid);
245 Ptr<DceManager> manager = node->GetObject<
DceManager> ();
254 NS_LOG_FUNCTION_NOARGS ();
264 NS_LOG_FUNCTION_NOARGS ();
274 NS_LOG_FUNCTION (
this << address);
276 struct sockaddr_storage my_addr;
277 socklen_t addrlen =
sizeof (my_addr);
278 m_ns3toposix (address, (
struct sockaddr *)&my_addr, &addrlen);
280 int ret = this->
m_kernsock->
Bind ((
struct sockaddr *)&my_addr, addrlen);
288 NS_LOG_FUNCTION_NOARGS ();
295 NS_LOG_FUNCTION_NOARGS ();
302 NS_LOG_FUNCTION_NOARGS ();
312 NS_LOG_FUNCTION (
this << address);
314 struct sockaddr_storage my_addr;
315 socklen_t addrlen =
sizeof (my_addr);
316 m_ns3toposix (address, (
struct sockaddr *)&my_addr, &addrlen);
319 NS_LOG_INFO (
"connect returns " << ret <<
" errno " <<
Current ()->err);
320 if (ret == -1 &&
Current ()->err == EINPROGRESS)
331 NS_LOG_FUNCTION (
this);
334 NS_LOG_DEBUG (
"listen returns " << ret <<
" errno " <<
Current ()->err);
346 NS_LOG_FUNCTION (
this << p << flags);
348 uint8_t *buf =
new uint8_t[p->GetSize ()];
349 p->CopyData (buf, p->GetSize ());
350 int len = p->GetSize ();
355 NS_LOG_INFO (
"send returns " << ret <<
" errno " <<
Current ()->err);
368 NS_LOG_FUNCTION_NOARGS ();
377 NS_LOG_FUNCTION (
this << p << flags << address);
378 uint8_t *buf =
new uint8_t[p->GetSize ()];
379 p->CopyData (buf, p->GetSize ());
380 int len = p->GetSize ();
381 struct sockaddr_storage my_addr;
382 socklen_t addrlen =
sizeof (my_addr);
383 m_ns3toposix (address, (
struct sockaddr *)&my_addr, &addrlen);
388 msg.msg_controllen = 0;
392 iov.iov_base = (
void *)buf;
393 msg.msg_name = (
void *)&my_addr;
394 msg.msg_namelen = addrlen;
400 NS_LOG_INFO (
"sendmsg returns " << ret <<
" errno " <<
Current ()->err);
409 NS_LOG_FUNCTION_NOARGS ();
418 NS_LOG_FUNCTION (
this << maxSize << flags);
424 Address &fromAddress)
426 NS_LOG_FUNCTION (
this << maxSize << flags);
428 struct sockaddr_storage my_addr;
429 socklen_t addrlen =
sizeof (
struct sockaddr_storage);
433 msg.msg_controllen = 0;
436 iov.iov_len =
sizeof (buf);
438 msg.msg_name = (
void *)&my_addr;
439 msg.msg_namelen = addrlen;
445 NS_LOG_DEBUG (
"recvmsg ret " << ret <<
" errno " <<
Current ()->err);
451 Ptr<Packet> p = Create<Packet> (buf, ret);
456 NS_LOG_DEBUG (
"getpeername ret " << ret);
459 fromAddress =
m_posixtons3 ((
struct sockaddr *)&my_addr, addrlen);
467 NS_LOG_FUNCTION_NOARGS ();
474 NS_LOG_FUNCTION (interface << groupAddress);
488 NS_LOG_FUNCTION (interface << groupAddress);
502 NS_LOG_FUNCTION (netdevice->GetIfIndex ());
503 std::ostringstream oss;
504 oss <<
"sim" << netdevice->GetIfIndex ();
506 strncpy ((
char *)&ifr.ifr_name, oss.str ().c_str (),
sizeof (ifr.ifr_name));
511 NS_LOG_INFO (
"sockopt returns " << ret <<
" errno " <<
Current ()->err);
519 NS_LOG_FUNCTION (
this);
521 table->
SetEventMask (POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDHUP);
531 NS_LOG_INFO (
"poll returns " << mask <<
" errno " <<
Current ()->err);
537 mask &= (POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDHUP);
540 Ptr<LinuxSocketFdFactory> factory = 0;
542 Ptr<DceManager> manager = node->GetObject<
DceManager> ();
546 struct sockaddr_storage my_addr;
547 socklen_t addrlen =
sizeof (
struct sockaddr_storage);
550 NS_LOG_INFO (
"notify accept");
551 Ptr<LinuxSocketImpl> newSock = CreateObject<LinuxSocketImpl> ();
552 newSock->SetNode (
m_node);
558 int sock = this->
m_kernsock->
Accept ((
struct sockaddr *)&my_addr, &addrlen);
561 NS_LOG_INFO (
"accept error");
567 kern_sock->
Fcntl (F_SETFL, O_NONBLOCK);
569 newSock->m_kernsock = kern_sock;
570 newSock->m_listening =
false;
571 fromAddress =
m_posixtons3 ((
struct sockaddr *)&my_addr, addrlen);
573 NotifyNewConnectionCreated (newSock, fromAddress);
574 Simulator::ScheduleWithContext (
m_node->GetId (), Seconds (0.0),
580 NS_LOG_INFO (
"notify conn inprogress finish");
581 NotifyConnectionSucceeded ();
584 NS_LOG_FUNCTION (
"CALL>> Wait mask (after conn) " << mask);
585 table->
Wait (Seconds (0));
586 NS_LOG_FUNCTION (
"RTRN<< Wait mask (after conn) " << mask);
591 if (mask & POLLRDHUP || mask & POLLHUP)
593 NS_LOG_FUNCTION (
"socket has closed ?" << mask);
600 else if (mask & POLLIN || mask & POLLERR)
602 NS_LOG_INFO (
"notify recv");
605 else if (mask & POLLOUT)
607 Simulator::ScheduleWithContext (
m_node->GetId (), Seconds (0.0),
608 MakeEvent (&LinuxSocketImpl::NotifySend,
this, 0));
609 NS_LOG_INFO (
"wait send for next poll event");
610 table->
Wait (Seconds (0));
611 NS_LOG_INFO (
"awaken");
618 NS_LOG_INFO (
"wait for next poll event");
619 table->
Wait (Seconds (0));
620 NS_LOG_INFO (
"awaken");
631 NS_LOG_FUNCTION_NOARGS ();
645 NS_LOG_FUNCTION_NOARGS ();
653 NS_LOG_FUNCTION_NOARGS ();
661 NS_LOG_FUNCTION_NOARGS ();
672 kern_sock->Fcntl (F_SETFL, O_NONBLOCK);
676 Simulator::ScheduleWithContext (
m_node->GetId (), Seconds (0.0),