OLD | NEW |
1 #include "unix-socket-fd.h" | 1 #include "unix-socket-fd.h" |
2 #include "process.h" | 2 #include "process.h" |
3 #include "process-manager.h" | 3 #include "process-manager.h" |
4 #include "utils.h" | 4 #include "utils.h" |
5 #include "waiter.h" | 5 #include "waiter.h" |
6 #include "cmsg.h" | 6 #include "cmsg.h" |
7 #include "sys/simu-socket.h" | 7 #include "sys/simu-socket.h" |
8 #include "ns3/log.h" | 8 #include "ns3/log.h" |
9 #include "ns3/socket.h" | 9 #include "ns3/socket.h" |
10 #include "ns3/packet.h" | 10 #include "ns3/packet.h" |
11 #include "ns3/inet-socket-address.h" | 11 #include "ns3/inet-socket-address.h" |
12 #include "ns3/uinteger.h" | 12 #include "ns3/uinteger.h" |
13 #include "ns3/boolean.h" | 13 #include "ns3/boolean.h" |
14 #include "ns3/simulator.h" | 14 #include "ns3/simulator.h" |
| 15 #ifdef SIMU_NETLINK_IPV6 |
| 16 #include "ns3/netlink-socket-address.h" |
| 17 #include "ns3/netlink-socket.h" |
| 18 #include "ns3/ipv6-address.h" |
| 19 #include "ns3/inet6-socket-address.h" |
| 20 #include "ns3/pointer.h" |
| 21 #include "ns3/icmpv6-socket-impl.h" |
| 22 #endif // SIMU_NETLINK_IPV6 |
15 #include <errno.h> | 23 #include <errno.h> |
16 #include <linux/icmp.h> // need ICMP_FILTER | 24 #include <linux/icmp.h> // need ICMP_FILTER |
| 25 #include <netinet/icmp6.h> // need ICMP6_FILTER |
| 26 #include <linux/netlink.h> |
| 27 #include <linux/rtnetlink.h> |
17 #include <netinet/in.h> | 28 #include <netinet/in.h> |
18 #include <arpa/inet.h> | 29 #include <arpa/inet.h> |
19 #include <sys/mman.h> | 30 #include <sys/mman.h> |
20 | 31 |
21 NS_LOG_COMPONENT_DEFINE ("UnixSocketFd"); | 32 NS_LOG_COMPONENT_DEFINE ("UnixSocketFd"); |
22 | 33 |
23 namespace ns3 { | 34 namespace ns3 { |
24 | 35 |
25 UnixSocketFd::UnixSocketFd (Ptr<Socket> socket) | 36 UnixSocketFd::UnixSocketFd (Ptr<Socket> socket) |
26 : m_socket (socket), | 37 : m_socket (socket), |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 case Socket::ERROR_OPNOTSUPP: | 80 case Socket::ERROR_OPNOTSUPP: |
70 return EOPNOTSUPP; | 81 return EOPNOTSUPP; |
71 case Socket::ERROR_AFNOSUPPORT: | 82 case Socket::ERROR_AFNOSUPPORT: |
72 return EAFNOSUPPORT; | 83 return EAFNOSUPPORT; |
73 case Socket::ERROR_INVAL: | 84 case Socket::ERROR_INVAL: |
74 return EINVAL; | 85 return EINVAL; |
75 case Socket::ERROR_BADF: | 86 case Socket::ERROR_BADF: |
76 return EBADF; | 87 return EBADF; |
77 case Socket::ERROR_NOROUTETOHOST: | 88 case Socket::ERROR_NOROUTETOHOST: |
78 return EHOSTUNREACH; | 89 return EHOSTUNREACH; |
| 90 case Socket::ERROR_NODEV: |
| 91 return ENODEV; |
| 92 case Socket::ERROR_ADDRNOTAVAIL: |
| 93 return EADDRNOTAVAIL; |
79 case Socket::SOCKET_ERRNO_LAST: | 94 case Socket::SOCKET_ERRNO_LAST: |
80 case Socket::ERROR_NOTERROR: | 95 case Socket::ERROR_NOTERROR: |
81 default: | 96 default: |
82 NS_ASSERT (false); | 97 NS_ASSERT (false); |
83 return 0; // quiet compiler | 98 return 0; // quiet compiler |
84 break; | 99 break; |
85 } | 100 } |
86 } | 101 } |
87 void· | 102 void· |
88 UnixSocketFd::RecvSocketData (Ptr<Socket> socket) | 103 UnixSocketFd::RecvSocketData (Ptr<Socket> socket) |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 } | 266 } |
252 int *v = (int*)optval; | 267 int *v = (int*)optval; |
253 if (!m_socket->SetAttributeFailSafe ("IpTtl", UintegerValue (*v))) | 268 if (!m_socket->SetAttributeFailSafe ("IpTtl", UintegerValue (*v))) |
254 { | 269 { |
255 current->err = ENOPROTOOPT; | 270 current->err = ENOPROTOOPT; |
256 return -1; | 271 return -1; |
257 } | 272 } |
258 } break; | 273 } break; |
259 } | 274 } |
260 break; | 275 break; |
| 276 case SOL_IPV6: |
| 277 switch (optname) { |
| 278 case IPV6_RECVPKTINFO: { |
| 279 if (optlen != sizeof (int)) |
| 280 { |
| 281 current->err = EINVAL; |
| 282 return -1; |
| 283 } |
| 284 int *v = (int*)optval; |
| 285 m_recvpktinfo = *v; |
| 286 } break; |
| 287 case IPV6_CHECKSUM: { |
| 288 if (optlen != sizeof (int)) |
| 289 { |
| 290 current->err = EINVAL; |
| 291 return -1; |
| 292 } |
| 293 int *v = (int*)optval; |
| 294 m_sockchecksum = *v; |
| 295 } break; |
| 296 case IPV6_MULTICAST_LOOP: { |
| 297 if (optlen != sizeof (int)) |
| 298 { |
| 299 current->err = EINVAL; |
| 300 return -1; |
| 301 } |
| 302 int *v = (int*)optval; |
| 303 m_multicastloop = *v; |
| 304 } break; |
| 305 case IPV6_UNICAST_HOPS: { |
| 306 if (optlen != sizeof (int)) |
| 307 { |
| 308 current->err = EINVAL; |
| 309 return -1; |
| 310 } |
| 311 int *v = (int*)optval; |
| 312 m_unicasthops = *v; |
| 313 } break; |
| 314 case IPV6_MULTICAST_HOPS: { |
| 315 if (optlen != sizeof (int)) |
| 316 { |
| 317 current->err = EINVAL; |
| 318 return -1; |
| 319 } |
| 320 int *v = (int*)optval; |
| 321 m_multicasthops = *v; |
| 322 } break; |
| 323 case IPV6_RECVHOPLIMIT: { |
| 324 if (optlen != sizeof (int)) |
| 325 { |
| 326 current->err = EINVAL; |
| 327 return -1; |
| 328 } |
| 329 int *v = (int*)optval; |
| 330 m_recvhoplimit = *v; |
| 331 } break; |
| 332 }· |
| 333 break; |
| 334 case SOL_ICMPV6: |
| 335 switch (optname) { |
| 336 case ICMP6_FILTER: { |
| 337 if (optlen != sizeof (struct icmp6_filter)) |
| 338 { |
| 339 current->err = EINVAL; |
| 340 return -1; |
| 341 } |
| 342 #ifdef SIMU_NETLINK_IPV6 |
| 343 struct icmp6_filter *v = (struct icmp6_filter*)optval; |
| 344 if(v){ |
| 345 (dynamic_cast<Icmpv6SocketImpl *>(PeekPointer(m_socket)))->SetIcmp6Filte
r(v); |
| 346 } |
| 347 #endif // SIMU_NETLINK_IPV6 |
| 348 } break; |
| 349 } |
| 350 break; |
| 351 default:{ |
| 352 std::cout << "Unsupported sockopt\n"; |
| 353 current->err = ENOPROTOOPT; |
| 354 return -1; |
| 355 } break; |
261 } | 356 } |
262 return 0; | 357 return 0; |
263 } | 358 } |
264 int· | 359 int· |
265 UnixSocketFd::Getsockopt (int level, int optname, | 360 UnixSocketFd::Getsockopt (int level, int optname, |
266 void *optval, socklen_t *optlen) | 361 void *optval, socklen_t *optlen) |
267 { | 362 { |
268 Thread *current = Current (); | 363 Thread *current = Current (); |
269 NS_LOG_FUNCTION (this << current << level << optname << optval << optlen); | 364 NS_LOG_FUNCTION (this << current << level << optname << optval << optlen); |
270 NS_ASSERT (current != 0); | 365 NS_ASSERT (current != 0); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 { | 508 { |
414 if (my_addr->sa_family == AF_INET) | 509 if (my_addr->sa_family == AF_INET) |
415 { | 510 { |
416 const struct sockaddr_in *addr = (const struct sockaddr_in *)my_addr; | 511 const struct sockaddr_in *addr = (const struct sockaddr_in *)my_addr; |
417 Ipv4Address ipv4; | 512 Ipv4Address ipv4; |
418 ipv4.Set (ntohl (addr->sin_addr.s_addr)); | 513 ipv4.Set (ntohl (addr->sin_addr.s_addr)); |
419 uint16_t port = ntohs (addr->sin_port); | 514 uint16_t port = ntohs (addr->sin_port); |
420 InetSocketAddress inet = InetSocketAddress (ipv4, port); | 515 InetSocketAddress inet = InetSocketAddress (ipv4, port); |
421 return inet; | 516 return inet; |
422 } | 517 } |
423 NS_ASSERT (false); | 518 #ifdef SIMU_NETLINK_IPV6 |
424 return Address (); | 519 else if (my_addr->sa_family == AF_NETLINK ) |
| 520 { |
| 521 const struct sockaddr_nl *addr = (const struct sockaddr_nl *)my_addr; |
| 522 //user space netlink socket has a nozero process id |
| 523 uint32_t pid = addr->nl_pid ? addr->nl_pid : getpid(); |
| 524 NetlinkSocketAddress nladdress = NetlinkSocketAddress(pid, addr->nl_groups
); |
| 525 return nladdress; |
| 526 } |
| 527 else if (my_addr->sa_family == AF_INET6) |
| 528 { |
| 529 const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)my_addr; |
| 530 Ipv6Address ipv6; |
| 531 ipv6.Set ((uint8_t *)addr->sin6_addr.s6_addr); |
| 532 uint16_t port = ntohs (addr->sin6_port); |
| 533 Inet6SocketAddress inet = Inet6SocketAddress (ipv6, port); |
| 534 return inet; |
| 535 } |
| 536 #endif // SIMU_NETLINK_IPV6 |
| 537 else |
| 538 { |
| 539 NS_ASSERT (false); |
| 540 return Address (); |
| 541 } |
425 } | 542 } |
426 int | 543 int |
427 UnixSocketFd::Ns3AddressToPosixAddress(const Address& nsaddr,· | 544 UnixSocketFd::Ns3AddressToPosixAddress(const Address& nsaddr,· |
428 struct sockaddr *addr, socklen_t *addrlen
) const | 545 struct sockaddr *addr, socklen_t *addrlen
) const |
429 { | 546 { |
430 if (addr == 0 || addrlen == 0) | 547 if (addr == 0 || addrlen == 0) |
431 { | 548 { |
432 return 0; | 549 return 0; |
433 } | 550 } |
434 if (InetSocketAddress::IsMatchingType(nsaddr)) | 551 if (InetSocketAddress::IsMatchingType(nsaddr)) |
435 { | 552 { |
436 InetSocketAddress ns_inetaddr = InetSocketAddress::ConvertFrom(nsaddr); | 553 InetSocketAddress ns_inetaddr = InetSocketAddress::ConvertFrom(nsaddr); |
437 if (*addrlen < sizeof (struct sockaddr_in)) | 554 if (*addrlen < sizeof (struct sockaddr_in)) |
438 { | 555 { |
439 return -1; | 556 return -1; |
440 } | 557 } |
441 struct sockaddr_in *inet_addr = (struct sockaddr_in *)addr; | 558 struct sockaddr_in *inet_addr = (struct sockaddr_in *)addr; |
442 inet_addr->sin_family = AF_INET; | 559 inet_addr->sin_family = AF_INET; |
443 inet_addr->sin_port = htons (ns_inetaddr.GetPort ()); | 560 inet_addr->sin_port = htons (ns_inetaddr.GetPort ()); |
444 inet_addr->sin_addr.s_addr = htonl (ns_inetaddr.GetIpv4 ().Get ()); | 561 inet_addr->sin_addr.s_addr = htonl (ns_inetaddr.GetIpv4 ().Get ()); |
445 *addrlen = sizeof(struct sockaddr_in); | 562 *addrlen = sizeof(struct sockaddr_in); |
446 } | 563 } |
| 564 #ifdef SIMU_NETLINK_IPV6 |
| 565 else if (NetlinkSocketAddress::IsMatchingType(nsaddr)) |
| 566 { |
| 567 NetlinkSocketAddress ns_nladdr = NetlinkSocketAddress::ConvertFrom(nsaddr)
; |
| 568 NS_ASSERT (*addrlen >= sizeof (struct sockaddr_nl)); |
| 569 struct sockaddr_nl *nl_addr = (struct sockaddr_nl *)addr; |
| 570 nl_addr->nl_family = AF_NETLINK; |
| 571 nl_addr->nl_pid = ns_nladdr.GetProcessID(); |
| 572 nl_addr->nl_groups = ns_nladdr.GetGroupsMask(); |
| 573 *addrlen = sizeof(struct sockaddr_nl); |
| 574 return 0; |
| 575 } |
| 576 else if (Inet6SocketAddress::IsMatchingType(nsaddr)) |
| 577 { |
| 578 Inet6SocketAddress ns_inet6addr = Inet6SocketAddress::ConvertFrom(nsaddr); |
| 579 if (*addrlen < sizeof (struct sockaddr_in6)) |
| 580 { |
| 581 return -1; |
| 582 } |
| 583 struct sockaddr_in6 *inet6_addr = (struct sockaddr_in6 *)addr; |
| 584 inet6_addr->sin6_family = AF_INET6; |
| 585 inet6_addr->sin6_port = htons (ns_inet6addr.GetPort ()); |
| 586 ns_inet6addr.GetIpv6 ().GetBytes (inet6_addr->sin6_addr.s6_addr); |
| 587 *addrlen = sizeof(struct sockaddr_in6); |
| 588 } |
| 589 #endif // SIMU_NETLINK_IPV6 |
447 else | 590 else |
448 { | 591 { |
449 NS_ASSERT (false); | 592 NS_ASSERT (false); |
450 } | 593 } |
451 return 0; | 594 return 0; |
452 } | 595 } |
453 int· | 596 int· |
454 UnixSocketFd::Bind (const struct sockaddr *my_addr, socklen_t addrlen) | 597 UnixSocketFd::Bind (const struct sockaddr *my_addr, socklen_t addrlen) |
455 { | 598 { |
456 Thread *current = Current (); | 599 Thread *current = Current (); |
(...skipping 26 matching lines...) Expand all Loading... |
483 bool· | 626 bool· |
484 UnixSocketFd::IsRecvErr (void) const | 627 UnixSocketFd::IsRecvErr (void) const |
485 { | 628 { |
486 return m_recverr == 1; | 629 return m_recverr == 1; |
487 } | 630 } |
488 bool· | 631 bool· |
489 UnixSocketFd::IsRecvTtl (void) const | 632 UnixSocketFd::IsRecvTtl (void) const |
490 { | 633 { |
491 return m_recvttl == 1; | 634 return m_recvttl == 1; |
492 } | 635 } |
| 636 bool· |
| 637 UnixSocketFd::IsRecvPktInfo (void) const |
| 638 { |
| 639 return m_recvpktinfo == 1; |
| 640 } |
493 off_t· | 641 off_t· |
494 UnixSocketFd::Lseek (off_t offset, int whence) | 642 UnixSocketFd::Lseek (off_t offset, int whence) |
495 { | 643 { |
496 Thread *current = Current (); | 644 Thread *current = Current (); |
497 NS_LOG_FUNCTION (this << current << offset << whence); | 645 NS_LOG_FUNCTION (this << current << offset << whence); |
498 NS_ASSERT (current != 0); | 646 NS_ASSERT (current != 0); |
499 current->err = ESPIPE; | 647 current->err = ESPIPE; |
500 return -1; | 648 return -1; |
501 } | 649 } |
502 bool | 650 bool |
(...skipping 24 matching lines...) Expand all Loading... |
527 { | 675 { |
528 return m_recvTimeout; | 676 return m_recvTimeout; |
529 } | 677 } |
530 Time· | 678 Time· |
531 UnixSocketFd::GetSendTimeout (void) | 679 UnixSocketFd::GetSendTimeout (void) |
532 { | 680 { |
533 return m_sendTimeout; | 681 return m_sendTimeout; |
534 } | 682 } |
535 | 683 |
536 } // namespace ns3 | 684 } // namespace ns3 |
OLD | NEW |