27 #include "ns3/socket.h"
28 #include "ns3/packet.h"
29 #include "ns3/inet-socket-address.h"
30 #include "ns3/packet-socket-address.h"
31 #include "ns3/packet-socket.h"
32 #include "ns3/uinteger.h"
33 #include "ns3/boolean.h"
34 #include "ns3/simulator.h"
35 #include "ns3/netlink-socket-address.h"
36 #include "ns3/inet6-socket-address.h"
39 #include <linux/icmp.h>
40 #include <netinet/in.h>
41 #include <arpa/inet.h>
43 #include <net/ethernet.h>
44 #include <linux/if_arp.h>
45 #include <linux/netlink.h>
47 #include <linux/netlink.h>
48 #include <sys/ioctl.h>
56 m_sendTimeout (Seconds (0.0)),
57 m_recvTimeout (Seconds (0.0)),
60 m_socket->SetAttributeFailSafe (
"SndBufSize", UintegerValue (126976));
61 m_socket->SetAttributeFailSafe (
"RcvBufSize", UintegerValue (126976));
67 NS_LOG_FUNCTION (
this);
74 NS_LOG_FUNCTION (
this << current << start << length << prot << flags << offset);
75 NS_ASSERT (current != 0);
76 current->
err = ENODEV;
82 NS_LOG_FUNCTION (
this <<
Current () << buf);
84 buf->st_mode = S_IFSOCK;
92 NS_LOG_FUNCTION (
this <<
Current () << buf);
94 buf->st_mode = S_IFSOCK;
104 case Socket::ERROR_ISCONN:
106 case Socket::ERROR_NOTCONN:
108 case Socket::ERROR_MSGSIZE:
110 case Socket::ERROR_AGAIN:
112 case Socket::ERROR_SHUTDOWN:
114 case Socket::ERROR_OPNOTSUPP:
116 case Socket::ERROR_AFNOSUPPORT:
118 case Socket::ERROR_INVAL:
120 case Socket::ERROR_BADF:
122 case Socket::ERROR_NOROUTETOHOST:
124 case Socket::SOCKET_ERRNO_LAST:
125 case Socket::ERROR_NOTERROR:
127 case Socket::ERROR_ADDRINUSE:
130 NS_LOG_ERROR (
"Unknown Errno:" <<
m_socket->GetErrno ());
139 NS_LOG_FUNCTION (
this <<
m_socket << socket);
147 NS_LOG_FUNCTION (
this <<
m_socket << socket);
161 NS_LOG_FUNCTION (
this << current);
162 NS_ASSERT (current != 0);
164 Callback<void, Ptr<Socket> > nil = MakeNullCallback<void, Ptr<Socket> > ();
165 m_socket->SetCloseCallbacks (nil, nil);
190 NS_LOG_FUNCTION (
this << buf << count);
194 msg.msg_controllen = 0;
198 iov.iov_base = (
void*)buf;
201 ssize_t retval =
Sendmsg (&msg, 0);
207 NS_LOG_FUNCTION (
this << buf << count);
211 msg.msg_controllen = 0;
218 ssize_t retval =
Recvmsg (&msg, 0);
224 bool nonBlocking = (
m_statusFlags & O_NONBLOCK) == O_NONBLOCK;
225 flags |= nonBlocking ? MSG_DONTWAIT : 0;
231 bool nonBlocking = (
m_statusFlags & O_NONBLOCK) == O_NONBLOCK;
232 flags |= nonBlocking ? MSG_DONTWAIT : 0;
244 const void *optval, socklen_t optlen)
247 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
248 NS_ASSERT (current != 0);
259 current->
err = EINVAL;
262 uint32_t *data = (uint32_t *)optval;
263 if (!
m_socket->SetAttributeFailSafe (
"IcmpFilter", UintegerValue (*data)))
265 current->
err = ENOPROTOOPT;
270 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_RAW, optname: " << optname);
279 if (optlen !=
sizeof (
struct timeval))
281 current->
err = EINVAL;
284 struct timeval *tv = (
struct timeval *)optval;
289 if (optlen !=
sizeof (
struct timeval))
291 current->
err = EINVAL;
294 struct timeval *tv = (
struct timeval *)optval;
299 if (optlen !=
sizeof (
int))
301 current->
err = EINVAL;
304 int *val = (
int*)optval;
305 if (!
m_socket->SetAttributeFailSafe (
"SndBufSize", UintegerValue (*val)))
307 current->
err = EINVAL;
313 if (optlen !=
sizeof (
int))
315 current->
err = EINVAL;
318 int *val = (
int*)optval;
319 if (!
m_socket->SetAttributeFailSafe (
"RcvBufSize", UintegerValue (*val)))
321 current->
err = EINVAL;
326 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_SOCKET, optname: " << optname);
335 if (optlen !=
sizeof (
int))
337 current->
err = EINVAL;
340 int *v = (
int*)optval;
345 if (optlen !=
sizeof (
int))
347 current->
err = EINVAL;
350 int *v = (
int*)optval;
355 if (optlen !=
sizeof (
int))
357 current->
err = EINVAL;
360 int *v = (
int*)optval;
361 if (!
m_socket->SetAttributeFailSafe (
"IpTtl", UintegerValue (*v)))
363 current->
err = ENOPROTOOPT;
369 if (optlen !=
sizeof (
int))
371 current->
err = EINVAL;
374 int *v = (
int*)optval;
375 if (!
m_socket->SetAttributeFailSafe (
"IpHeaderInclude",
376 BooleanValue (*v ?
true :
false)))
378 current->
err = ENOPROTOOPT;
384 if (optlen !=
sizeof (
int))
386 current->
err = EINVAL;
389 int *v = (
int*)optval;
390 m_socket->SetRecvPktInfo (*v ?
true :
false);
393 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_IP, optname: " << optname);
402 if (optlen !=
sizeof (
int))
404 current->
err = EINVAL;
407 int *v = (
int*)optval;
408 m_socket->SetRecvPktInfo (*v ?
true :
false);
465 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_IPV6, optname: " << optname);
471 NS_LOG_WARN (
"Unsupported sockopt: level = " << level);
472 current->
err = ENOPROTOOPT;
480 void *optval, socklen_t *optlen)
483 NS_LOG_FUNCTION (
this << current << level << optname << optval << optlen);
484 NS_ASSERT (current != 0);
495 current->
err = EINVAL;
499 if (!
m_socket->GetAttributeFailSafe (
"IcmpFilter", data))
501 current->
err = ENOPROTOOPT;
504 uint32_t v = data.Get ();
505 memcpy (optval, (
void*)&v, 4);
509 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_RAW, optname: " << optname);
518 if (*optlen <
sizeof (
struct timeval))
520 current->
err = EINVAL;
523 struct timeval *tv = (
struct timeval *)optval;
525 *optlen =
sizeof (
struct timeval);
529 if (*optlen <
sizeof (
struct timeval))
531 current->
err = EINVAL;
534 struct timeval *tv = (
struct timeval *)optval;
536 *optlen =
sizeof (
struct timeval);
540 if (*optlen <
sizeof (
int))
542 current->
err = EINVAL;
545 int *val = (
int*)optval;
546 UintegerValue attrValue;
547 if (!
m_socket->GetAttributeFailSafe (
"SndBufSize", attrValue))
549 current->
err = EINVAL;
552 *val = attrValue.Get ();
553 *optlen =
sizeof (int);
558 if (*optlen <
sizeof (
int))
560 current->
err = EINVAL;
563 int *val = (
int*)optval;
564 UintegerValue attrValue;
565 if (!
m_socket->GetAttributeFailSafe (
"RcvBufSize", attrValue))
567 current->
err = EINVAL;
570 *val = attrValue.Get ();
571 *optlen =
sizeof (int);
575 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_SOCKET, optname: " << optname);
584 if (*optlen <
sizeof (
int))
586 current->
err = EINVAL;
589 int *v = (
int*)optval;
591 *optlen =
sizeof (int);
595 if (*optlen <
sizeof (
int))
597 current->
err = EINVAL;
600 int *v = (
int*)optval;
602 *optlen =
sizeof (int);
606 if (*optlen <
sizeof (
int))
608 current->
err = EINVAL;
611 int *v = (
int*)optval;
613 if (!
m_socket->GetAttributeFailSafe (
"IpTtl", val))
615 current->
err = ENOPROTOOPT;
619 *optlen =
sizeof (int);
623 if (*optlen !=
sizeof (
int))
625 current->
err = EINVAL;
628 int *v = (
int*)optval;
630 if (!
m_socket->GetAttributeFailSafe (
"IpHeaderInclude", val))
632 current->
err = ENOPROTOOPT;
635 *v = val.Get () ? 1 : 0;
636 *optlen =
sizeof (int);
639 NS_LOG_WARN (
"Unsupported setsockopt requested. level: SOL_IP, optname: " << optname);
650 NS_LOG_FUNCTION (
this << current << name << *namelen);
651 NS_ASSERT (current != 0);
653 int status =
m_socket->GetSockName (ad);
661 current->
err = EINVAL;
676 NS_LOG_FUNCTION (
this << current);
677 NS_ASSERT (current != 0);
679 if (FIONBIO == request)
681 const int *arg = (
const int *) argp;
694 current->
err = EINVAL;
702 if (my_addr->sa_family == AF_INET)
704 const struct sockaddr_in *addr = (
const struct sockaddr_in *)my_addr;
706 ipv4.Set (ntohl (addr->sin_addr.s_addr));
707 uint16_t port = ntohs (addr->sin_port);
708 InetSocketAddress inet = InetSocketAddress (ipv4, port);
711 else if (my_addr->sa_family == AF_INET6)
713 const struct sockaddr_in6 *addr = (
const struct sockaddr_in6 *)my_addr;
715 ipv6.Set ((uint8_t *)addr->sin6_addr.s6_addr);
716 uint16_t port = ntohs (addr->sin6_port);
717 Inet6SocketAddress inet = Inet6SocketAddress (ipv6, port);
720 else if (my_addr->sa_family == AF_NETLINK)
722 const struct sockaddr_nl *addr = (
const struct sockaddr_nl *)my_addr;
727 uint32_t pid = addr->nl_pid;
729 NetlinkSocketAddress nladdress = NetlinkSocketAddress (pid, addr->nl_groups);
737 struct sockaddr *addr, socklen_t *addrlen)
const
739 if (addr == 0 || addrlen == 0)
743 if (InetSocketAddress::IsMatchingType (nsaddr))
745 InetSocketAddress ns_inetaddr = InetSocketAddress::ConvertFrom (nsaddr);
746 if (*addrlen <
sizeof (
struct sockaddr_in))
750 struct sockaddr_in *inet_addr = (
struct sockaddr_in *)addr;
751 memset (inet_addr, 0,
sizeof (
struct sockaddr_in));
752 inet_addr->sin_family = AF_INET;
753 inet_addr->sin_port = htons (ns_inetaddr.GetPort ());
754 inet_addr->sin_addr.s_addr = htonl (ns_inetaddr.GetIpv4 ().Get ());
755 *addrlen =
sizeof(
struct sockaddr_in);
757 else if (Inet6SocketAddress::IsMatchingType (nsaddr))
759 Inet6SocketAddress ns_inetaddr = Inet6SocketAddress::ConvertFrom (nsaddr);
760 if (*addrlen <
sizeof (
struct sockaddr_in6))
764 struct sockaddr_in6 *inet_addr = (
struct sockaddr_in6 *)addr;
765 inet_addr->sin6_family = AF_INET6;
766 inet_addr->sin6_port = htons (ns_inetaddr.GetPort ());
767 ns_inetaddr.GetIpv6 ().GetBytes (inet_addr->sin6_addr.s6_addr);
768 *addrlen =
sizeof(
struct sockaddr_in6);
770 else if (NetlinkSocketAddress::IsMatchingType (nsaddr))
772 NetlinkSocketAddress ns_nladdr = NetlinkSocketAddress::ConvertFrom (nsaddr);
773 NS_ASSERT (*addrlen >=
sizeof (
struct sockaddr_nl));
774 struct sockaddr_nl *nl_addr = (
struct sockaddr_nl *)addr;
775 nl_addr->nl_family = AF_NETLINK;
776 nl_addr->nl_pid = ns_nladdr.GetProcessID ();
777 nl_addr->nl_groups = ns_nladdr.GetGroupsMask ();
778 *addrlen =
sizeof (
struct sockaddr_nl);
791 NS_LOG_FUNCTION (
this << current);
792 NS_ASSERT (current != 0);
811 NS_LOG_FUNCTION (
this << current);
812 NS_ASSERT (current != 0);
855 NS_LOG_FUNCTION (
this << current << offset << whence);
856 NS_ASSERT (current != 0);
857 current->
err = ESPIPE;
864 NS_LOG_FUNCTION (
this << current << dontwait);
867 current->
err = EAGAIN;
875 NS_LOG_DEBUG (
"WaitRecvDoSignal: waiting ...");
877 NS_LOG_DEBUG (
"WaitRecvDoSignal: wait result:" << res);
879 NS_LOG_FUNCTION (
this <<
"DELETING: " << wq);
886 current->
err = EINTR;
894 current->
err = EAGAIN;
916 const struct itimerspec *new_value,
917 struct itimerspec *old_value)
919 NS_LOG_FUNCTION (
this <<
Current () << flags << new_value << old_value);
922 current->
err = EINVAL;
928 NS_LOG_FUNCTION (
this <<
Current () << cur_value);
931 current->
err = EINVAL;
940 Callback<void, Ptr<Socket> > nil = MakeNullCallback<void, Ptr<Socket> > ();
942 Callback<void, Ptr<Socket>,
const Address &> nil2 = MakeNullCallback<void, Ptr<Socket>,
const Address &> ();
943 Callback<bool, Ptr<Socket>,
const Address &> nil3 = MakeNullCallback<bool, Ptr<Socket>,
const Address &> ();
945 m_socket->SetAcceptCallback (nil3, nil2);
947 m_socket->SetConnectCallback (nil, nil);
948 m_socket->SetCloseCallbacks (nil, nil);
950 m_socket->SetRecvCallback (MakeNullCallback<
void, Ptr<Socket> > ());
951 m_socket->SetSendCallback (MakeNullCallback<
void,Ptr<Socket>,uint32_t> ());
961 m_socket->SetAttributeFailSafe (
"SndBufSize", UintegerValue (4096));
962 m_socket->SetAttributeFailSafe (
"RcvBufSize", UintegerValue (4096));
968 struct sockaddr_ll *addr, socklen_t *addrlen)
const
970 if (PacketSocketAddress::IsMatchingType (nsaddr))
972 PacketSocketAddress ll_addr = PacketSocketAddress::ConvertFrom (nsaddr);
973 if (*addrlen <
sizeof (
struct sockaddr_ll))
977 memset (addr, 0,
sizeof (
struct sockaddr_ll));
978 addr->sll_family = AF_PACKET;
979 addr->sll_protocol = htons (ll_addr.GetProtocol ());
980 addr->sll_ifindex = ll_addr.GetSingleDevice () + 1;
981 addr->sll_hatype = 0;
982 ll_addr.GetPhysicalAddress ().CopyAllTo (&(addr->sll_pkttype), 8);
983 *addrlen =
sizeof(
struct sockaddr_ll);
989 found = pac.PeekPacketTag (dnt);
992 if (dnt.GetDeviceName () ==
"NetDevice")
994 addr->sll_hatype = ARPHRD_PPP;
996 else if (dnt.GetDeviceName () ==
"LoopbackNetDevice")
998 addr->sll_hatype = ARPHRD_LOOPBACK;
1000 else if (dnt.GetDeviceName () ==
"CsmaNetDevice")
1002 addr->sll_hatype = ARPHRD_ETHER;
1004 else if (dnt.GetDeviceName () ==
"PointToPointNetDevice")
1006 addr->sll_hatype = ARPHRD_PPP;
1008 else if (dnt.GetDeviceName () ==
"WifiNetDevice")
1010 addr->sll_hatype = ARPHRD_IEEE80211;
1013 found = pac.PeekPacketTag (pst);
1016 addr->sll_pkttype = pst.GetPacketType ();
1029 NS_ASSERT (current != 0);
1030 NS_LOG_FUNCTION (
this << current << length);
1032 current->
err = EINVAL;
1039 Ptr<Packet> p = Create<Packet> (buf, count);