MCPcopy Create free account
hub / github.com/PurpleI2P/i2pd / GetLocalIPV6Address

Function GetLocalIPV6Address

libi2pd/util.cpp:689–767  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

687
688 template<typename CheckAddress>
689 static boost::asio::ip::address_v6 GetLocalIPV6Address (CheckAddress checkAddress)
690 {
691#if defined(_WIN32)
692 ULONG outBufLen = 0;
693 PIP_ADAPTER_ADDRESSES pAddresses = nullptr;
694 PIP_ADAPTER_ADDRESSES pCurrAddresses = nullptr;
695 PIP_ADAPTER_UNICAST_ADDRESS pUnicast = nullptr;
696
697 if (GetAdaptersAddresses(AF_INET6, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen)
698 == ERROR_BUFFER_OVERFLOW)
699 {
700 FREE(pAddresses);
701 pAddresses = (IP_ADAPTER_ADDRESSES*) MALLOC(outBufLen);
702 }
703
704 DWORD dwRetVal = GetAdaptersAddresses(
705 AF_INET6, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen
706 );
707
708 if (dwRetVal != NO_ERROR)
709 {
710 LogPrint(eLogError, "NetIface: GetYggdrasilAddress(): enclosed GetAdaptersAddresses() call has failed");
711 FREE(pAddresses);
712 return boost::asio::ip::address_v6 ();
713 }
714
715 pCurrAddresses = pAddresses;
716 while (pCurrAddresses)
717 {
718 pUnicast = pCurrAddresses->FirstUnicastAddress;
719
720 while (pUnicast != nullptr)
721 {
722 LPSOCKADDR lpAddr = pUnicast->Address.lpSockaddr;
723 sockaddr_in6 *localInterfaceAddress = (sockaddr_in6*) lpAddr;
724 if (checkAddress(localInterfaceAddress->sin6_addr.u.Byte)) {
725 boost::asio::ip::address_v6::bytes_type bytes;
726 memcpy (bytes.data (), &localInterfaceAddress->sin6_addr.u.Byte, 16);
727 FREE(pAddresses);
728 return boost::asio::ip::address_v6 (bytes);
729 }
730 pUnicast = pUnicast->Next;
731 }
732 pCurrAddresses = pCurrAddresses->Next;
733 }
734 LogPrint(eLogWarning, "NetIface: Interface with ipv6 network address not found");
735 FREE(pAddresses);
736 return boost::asio::ip::address_v6 ();
737#else
738 ifaddrs *addrs;
739 try
740 {
741 if (!getifaddrs(&addrs))
742 {
743 for (auto cur = addrs; cur; cur = cur->ifa_next)
744 {
745 if (cur->ifa_addr && cur->ifa_addr->sa_family == AF_INET6)
746 {

Callers 2

GetYggdrasilAddressFunction · 0.85
GetClearnetIPV6AddressFunction · 0.85

Calls 1

LogPrintFunction · 0.85

Tested by

no test coverage detected