| 591 | } |
| 592 | |
| 593 | const boost::asio::ip::address GetInterfaceAddress (const std::string & ifname, bool ipv6) |
| 594 | { |
| 595 | #ifdef _WIN32 |
| 596 | LogPrint(eLogError, "NetIface: Cannot get address by interface name, not implemented on WIN32"); |
| 597 | if (ipv6) |
| 598 | return boost::asio::ip::make_address("::1"); |
| 599 | else |
| 600 | return boost::asio::ip::make_address("127.0.0.1"); |
| 601 | #else |
| 602 | int af = (ipv6 ? AF_INET6 : AF_INET); |
| 603 | ifaddrs *addrs; |
| 604 | try |
| 605 | { |
| 606 | if (!getifaddrs(&addrs)) |
| 607 | { |
| 608 | for (auto cur = addrs; cur; cur = cur->ifa_next) |
| 609 | { |
| 610 | std::string cur_ifname(cur->ifa_name); |
| 611 | if (cur_ifname == ifname && cur->ifa_addr && cur->ifa_addr->sa_family == af) |
| 612 | { |
| 613 | // match |
| 614 | char addr[INET6_ADDRSTRLEN]; |
| 615 | memset (addr, 0, INET6_ADDRSTRLEN); |
| 616 | if (af == AF_INET) |
| 617 | inet_ntop(af, &((sockaddr_in *)cur->ifa_addr)->sin_addr, addr, INET6_ADDRSTRLEN); |
| 618 | else |
| 619 | inet_ntop(af, &((sockaddr_in6 *)cur->ifa_addr)->sin6_addr, addr, INET6_ADDRSTRLEN); |
| 620 | freeifaddrs(addrs); |
| 621 | std::string cur_ifaddr(addr); |
| 622 | return boost::asio::ip::make_address(cur_ifaddr); |
| 623 | } |
| 624 | } |
| 625 | } |
| 626 | } |
| 627 | catch (std::exception& ex) |
| 628 | { |
| 629 | LogPrint(eLogError, "NetIface: Exception while searching address using ifaddr: ", ex.what()); |
| 630 | } |
| 631 | |
| 632 | if (addrs) freeifaddrs(addrs); |
| 633 | std::string fallback; |
| 634 | if (ipv6) |
| 635 | { |
| 636 | fallback = "::1"; |
| 637 | LogPrint(eLogWarning, "NetIface: Cannot find IPv6 address for interface ", ifname); |
| 638 | } else { |
| 639 | fallback = "127.0.0.1"; |
| 640 | LogPrint(eLogWarning, "NetIface: Cannot find IPv4 address for interface ", ifname); |
| 641 | } |
| 642 | return boost::asio::ip::make_address(fallback); |
| 643 | #endif |
| 644 | } |
| 645 | |
| 646 | int GetMaxMTU (const boost::asio::ip::address_v6& localAddress) |
| 647 | { |
no test coverage detected